diff --git a/doc/mysql.sql b/doc/mysql.sql new file mode 100644 index 0000000..f5653dd --- /dev/null +++ b/doc/mysql.sql @@ -0,0 +1,469 @@ +/* +* 创建用户数据表 + */ +CREATE TABLE IF NOT EXISTS `user_info`( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `user_id` varchar(40) not null comment '用户登录号', + `passwd` varchar(40) not null comment '用户登录密码', + `nick` varchar(30) not null default "kity" comment '用户昵称', + `nick` varchar(200) comment '备注', + `ip` varchar(30) not null default "127.0.0.1" commit '用户当前ip', + `status` varchar(10) not null default "active" comment '该用户的状态 active、unactive、delete', + `role` varchar(100) not null default "nothing" comment '管理者分配的角色', + `role_name` varchar(200) not null default "普通操作员" comment '操作员分配的角色名称', + `create_time` timestamp not null default current_timestamp comment '创建时间', + `update_time` timestamp not null default current_timestamp on update current_timestamp comment '最后一次修改时间', + primary key (`id`), + unique key `u_user_id` (`user_id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理员表'; +insert into user_info (user_id, passwd, nick, status, role) values ("10086", "FFB23F80E5F0DA11ED14BA13FCF528DD", "admin", "active", "nothing"); + +/* +* 创建一级菜单表 + */ +CREATE TABLE IF NOT EXISTS `menu_info`( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `menu_order` int(5) unsigned not null default 0 comment '一级菜单的排名顺序', + `menu_uid` varchar(40) not null comment '一级菜单的唯一标识', + `first_menu` varchar(50) not null comment '一级菜单名称,字符不能超过50', + `second_menu` text comment '二级菜单名称,每个之间用|隔开', + `creater` varchar(20) not null comment '创建者的id', + `status` varchar(10) not null default "active" comment '菜单的状态情况,默认是active', + `create_time` timestamp not null default current_timestamp comment '创建时间', + `update_time` timestamp not null default current_timestamp comment '最近更新时间', + primary key (`id`), + unique key `u_first_menu` (`first_menu`), + unique key `u_menu_uid` (`menu_uid`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存放左侧栏的菜单'; + +/* +* 创建一级菜单表 + */ +CREATE TABLE IF NOT EXISTS `second_menu_info`( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `first_menu_order` int(5) unsigned not null default 0 comment '一级菜单对应的顺序', + `menu_order` int(5) unsigned not null default 0 comment '二级菜单的排名顺序', + `first_menu_uid` varchar(40) not null comment '二级菜单的唯一标识', + `first_menu` varchar(50) not null comment '一级菜单名称,字符不能超过50', + `second_menu_uid` varchar(40) not null comment '二级菜单唯一标识', + `second_menu` varchar(225) not null comment '二级菜单名称', + `second_router` varchar(200) not null comment '二级菜单路由', + `creater` varchar(20) not null comment '创建者的id', + `status` varchar(10) not null default "active" comment '菜单的状态情况,默认是active', + `create_time` timestamp not null default current_timestamp comment '创建时间', + `update_time` timestamp not null default current_timestamp comment '最近更新时间', + primary key (`id`), + unique key `u_second_menu` (`second_menu`), + unique key `u_second_menu_uid` (`second_menu_uid`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存放左侧栏的二级菜单'; + +/* +* 创建权限项表 + */ +CREATE TABLE IF NOT EXISTS `power_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `first_menu_uid` varchar(40) not null comment '一级菜单的唯一标识', + `second_menu_uid` varchar(40) not null comment '二级菜单的唯一标识', + `second_menu` varchar(50) not null comment '二级菜单的名称', + `power_item` varchar(50) not null comment '权限项的名称', + `power_id` varchar(200) not null comment '权限的ID', + `creater` varchar(20) not null comment '创建者的id', + `status` varchar(10) not null default "active" comment '菜单的状态情况,默认是active', + `create_time` timestamp not null default current_timestamp comment '创建时间', + `update_time` timestamp not null default current_timestamp comment '最近更新时间', + primary key (`id`), + unique key `u_power_id` (`power_id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存放控制页面的一些功能操作'; + +/* +* 创建角色 + */ +CREATE TABLE IF NOT EXISTS `role_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `role_name` varchar(100) not null comment '角色名称', + `role_uid` varchar(200) not null comment '角色唯一标识号', + `show_first_menu` text not null comment '可以展示的一级菜单名', + `show_first_uid` text not null comment '可以展示的一级菜单uid', + `show_second_menu` text not null comment '可以展示的二级菜单名', + `show_second_uid` text not null comment '可以展示的二级菜单uid', + `show_power` text not null comment '可以展示的权限项名称', + `show_power_uid` text not null comment '可以展示的权限项uid', + `remark` text not null comment '角色描述', + `creater` varchar(20) not null comment '创建者的id', + `status` varchar(10) not null default "active" comment '菜单的状态情况,默认是active', + `create_time` timestamp not null default current_timestamp comment '创建时间', + `update_time` timestamp not null default current_timestamp comment '最近更新时间', + primary key (`id`), + unique key `u_power_name` (`role_name`), + unique key `u_role_uid` (`role_uid`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色表'; + +/* +* 银行卡管理表 + */ +CREATE TABLE IF NOT EXISTS `bank_card_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `uid` varchar(100) not null comment '唯一标识', + `user_name` varchar(100) not null comment '用户名称', + `bank_name` varchar(100) not null comment '银行名称', + `bank_code` varchar(30) not null comment '银行编码', + `bank_account_type` varchar(20) not null comment '银行账号类型', + `account_name` varchar(50) not null comment '银行账户名称', + `bank_no` varchar(50) not null comment '银行账号', + `identify_card` varchar(100) not null comment '证件类型', + `certificate_no` varchar(100) not null comment '证件号码', + `phone_no` varchar(50) not null comment '手机号码', + `bank_address` varchar(200) not null comment '银行地址', + `create_time` timestamp not null default current_timestamp comment '创建时间', + `update_time` timestamp not null default current_timestamp comment '最近更新时间', + primary key (`id`), + unique `uid` (`uid`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='银行卡表'; + +/* +* 通道数据表 + */ +CREATE TABLE IF NOT EXISTS `road_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `status` varchar(20) not null default "active" '通道状态', + `road_name` varchar(100) not null comment '通道名称', + `road_uid` varchar(100) not null comment '通道唯一id', + `remark` varchar(100) comment '备注', + `product_name` varchar(100) not null comment '上游产品名称', + `product_uid` varchar(100) not null comment '上游产品编号', + `pay_type` varchar(50) not null comment '支付类型', + `basic_fee` double not null comment '基本汇率/成本汇率', + `settle_fee` double not null comment '代付手续费', + `total_limit` double not null comment '通道总额度', + `today_limit` double not null comment '每日最多额度', + `single_min_limit` double not null comment '单笔最小金额', + `single_max_limit` double not null comment '单笔最大金额', + `star_hour` int not null comment '通道开始时间', + `end_hour` int not null comment '通道结束时间', + `params` text comment '参数json格式', + `today_income` decimal(20, 3) not null default 0 comment '当天的收入', + `total_income` decimal(20, 3) not null default 0 comment '通道总收入', + `today_profit` decimal(20, 3) not null default 0 comment '当天的收益', + `total_profit` decimal(20 ,3) not null default 0 comment '通道总收益', + `balance` decimal(20, 3) not null default 0 comment '通道的余额', + `request_all` int default 0 comment '请求总次数', + `request_success` int default 0 comment '请求成功次数', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`), + unique `road_name` (`road_name`), + unique `road_uid` (`road_uid`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='通道数据表'; + +/* +* 通道池数据表 + */ +CREATE TABLE IF NOT EXISTS `road_pool_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `status` varchar(20) not null default "active" comment '通道池状态', + `road_pool_name` varchar(100) not null comment '通道池名称', + `road_pool_code` varchar(100) not null comment '通道池编号', + `road_uid_pool` text comment '通道池里面的通道uid', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`), + unique `road_pool_name` (`road_pool_name`), + unique `road_pool_code` (`road_pool_code`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='通道池'; + +/* +* 商户配置表 + */ +CREATE TABLE IF NOT EXISTS `merchant_info`( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `status` varchar(20) not null default "active" comment '商户状态状态', + `belong_agent_uid` vachar(100) comment '所属代理uid', + `belong_agent_name` vachar(100) comment '所属代理名称', + `merchant_name` varchar(100) not null default '客户' comment '商户名称', + `merchant_uid` varchar(100) not null comment '商户uid', + `merchant_key` varchar(100) not null comment '商户key', + `merchant_secret` varchar(100) not null comment '商户密钥', + `login_account` varchar(100) not null comment '登录账号', + `login_password` varchar(100) not null comment '登录密码', + `auto_settle` varchar(10) not null default "YES" comment '是否自动结算', + `auto_pay_for` varchar(10) not null default "YES" comment '是否自动代付', + `white_ips` text comment '配置ip白名单', + `remark` text comment '备注', + `single_pay_for_road_uid` varchar(100) comment '单代付代付通道uid', + `single_pay_for_road_name` varchar(200) comment '单代付通道名称', + `roll_pay_for_road_code` varchar(100) comment '轮询代付通道编码', + `roll_pay_for_road_name` varchar(200) comment '轮询代付通道名称', + `payfor_fee` double comment '代付手续费', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`), + unique `merchant_uid` (`merchant_uid`), + unique `merchant_name` (`merchant_name`), + unique `merchant_key` (`merchant_key`), + unique `merchant_secret` (`merchant_secret`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商户支付配置表'; + +/* +* 商戶对应通道表 + */ +CREATE TABLE IF NOT EXISTS `merchant_deploy_info`( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `status` varchar(20) not null default "active" comment '商户状态状态', + `merchant_uid` varchar(100) not null comment '商户uid', + `pay_type` varchar(50) comment '支付配置', + `single_road_uid` varchar(100) comment '单通道uid', + `single_road_name` varchar(200) comment '单通道名称', + `single_road_platform_rate` decimal(20,3) not null default 0.000 comment '单通到平台净利率', + `single_road_agent_rate` decimal(20,3) not null default 0.000 comment '单通到代理净利率', + `roll_road_code` varchar(100) comment '轮询通道编码', + `roll_road_name` varchar(200) comment '轮询通道名称', + `roll_road_platform_rate` decimal(20,3) not null default 0.000 comment '轮询通道平台净利率', + `roll_road_agent_rate` decimal(20,3) not null default 0.000 comment '轮询通道代理净利率', + `is_loan` varchar(10) not null default "NO" comment '是否押款', + `loan_rate` decimal(20,3) not null default 0.000 comment '押款比例,默认是0', + `loan_day` int not null default 0 comment '押款的天数,默认0天', + `unfreeze_hour` int not null default 0 comment '每天解款的时间点,默认是凌晨', + `wait_unfreeze_amount` decimal(20,3) comment '等待解款的金额', + `loan_amount` decimal(20,3) comment '押款中的金额', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商户通道配置;\r\n单通道给商户的汇率=single_road_platform_rate+single_road_agent_rate+basic_fee;\r\n轮询通道汇率=roll_road_platform_rate+roll_road_agent_rate+basic_fee;'; + +/* +* 商户对应的每条通道的押款 + */ + CREATE TABLE IF NOT EXISTS `merchant_load_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `status` varchar(20) not null default 'no' comment 'no-没有结算,yes-结算', + `merchant_uid` varchar(100) not null comment '商户uid', + `road_uid` varchar(50) not null comment '通道uid', + `load_date` varchar(50) not null comment '押款日期,格式2019-10-10', + `load_amount` decimal(20,3) not null default 0 comment '押款金额', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商户对应的每条通道的押款信息'; + +/* +* 账户表,记录商户和代理的资金情况 + */ +CREATE TABLE IF NOT EXISTS `account_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `status` varchar(20) not null default "active" comment '状态', + `account_uid` varchar(100) not null comment '账户uid,对应为merchant_uid或者agent_uid', + `account_name` varchar(100) not null comment '账户名称,对应的是merchant_name或者agent_name', + `balance` decimal(20, 3) not null default 0 comment '账户余额', + `settle_amount` decimal(20,3) not null default 0 comment '已经结算了的金额', + `loan_amount` decimal(20,3) not null default 0 comment '押款金额', + `wait_amount` decimal(20,3) not null default 0 comment '待结算资金', + `freeze_amount` decimal(20,3) not null default 0 comment '账户冻结金额', + `payfor_amount` decimal(20,3) not null default 0 comment '账户代付中金额', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`), + unique `account_uid` (`account_uid`), + unique `account_name` (`account_name`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='账户记录表'; + +/* +* 账户动账表,可以追溯每笔资金的动向 + */ +CREATE TABLE IF NOT EXISTS `account_history_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `account_uid` varchar(100) not null comment '账号uid', + `account_name` varchar(100) not null comment '账户名称', + `type` varchar(20) not null default "" comment '减款,加款', + `amount` decimal(20,3) not null default 0 comment '操作对应金额对应的金额', + `balance` decimal(20,3) not null default 0 comment '操作后的当前余额', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='账户账户资金动向表'; + + +/* +* 代理表 + */ +CREATE TABLE IF NOT EXISTS `agent_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `status` varchar(20) not null default "active" comment '代理状态状态', + `agent_name` varchar(100) not null comment '代理名称', + `agent_password` varchar(50) not null comment '代理登录密码', + `pay_password` varchar(50) not null comment '支付密码', + `agent_uid` varchar(100) not null comment '代理编号', + `agent_phone` varchar(15) not null comment '代理手机号', + `agent_remark` text comment '备注', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`), + unique `agent_name` (`agent_name`), + unique `agent_uid` (`agent_uid`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='代理'; + +/* +* 订单表 + */ +CREATE TABLE IF NOT EXISTS `order_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `merchant_order_id` varchar(50) not null comment '下游商户提交过来的订单id', + `shop_name` varchar(100) not null comment '商品名称', + `order_period` varchar(3) not null default "0" comment '订单有效时间,小时制', + `bank_order_id` varchar(50) not null comment '平台自身的订单id', + `bank_trans_id` varchar(50) not null comment '上游返回的订单id', + `order_amount` decimal(20,3) not null default 0 comment '订单提交金额', + `show_amount` decimal(20,3) not null default 0 comment '展示在用户面前待支付的金额', + `fact_amount` decimal(20,3) not null default 0 comment '实际支付金额', + `roll_pool_code` varchar(50) comment '轮询产品编码', + `roll_pool_name` varchar(100) comment '轮询产品名称', + `road_uid` varchar(100) not null comment '通道uid', + `road_name` varchar(200) not null comment '通道名称', + `pay_product_code` varchar(100) not null comment '支付产品编码', + `pay_product_name` varchar(200) not null comment '支付产品名称', + `pay_type_code` varchar(50) not null comment '支付类型编码', + `pay_type_name` varchar(100) not null comment '支付类型名称', + `os_type` varchar(5) not null comment '平台类型,苹果app-0, 安卓app-1,苹果H5-3,安卓H5-4,pc-5', + `status` varchar(20) not null default "wait" comment '等待支付-wait,支付成功-success, 支付失败-failed', + `refund` varchar(5) not null default "no" comment '退款-yes, 没有退款-no', + `refund_time` varchar(100) comment '退款时间', + `freeze` varchar(5) not null default "no" comment '冻结-yes, 没有-no', + `freeze_time` varchar(100) comment '冻结时间', + `unfreeze` varchar(5) not null default "no" comment '解冻-yes,没有-no', + `unfreeze_time` varchar(100) comment '解冻时间', + `return_url` text comment '订单支付后,跳转的地址', + `notify_url` text comment '订单回调给下游的地址', + `merchant_uid` varchar(100) not null comment '商户uid,表示订单是哪个商户的', + `merchant_name` varchar(200) not null comment '商户名称', + `agent_uid` varchar(100) comment '代理uid,表示该商户是谁的代理', + `agent_name` varchar(200) comment '代理名称', + `response` text comment '上游返回的结果', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`), + unique `merchant_order_id` (`merchant_order_id`), + unique `bank_order_id` (`bank_order_id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表'; + +/* +* 订单利润表 + */ + CREATE TABLE IF NOT EXISTS `order_profit_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `merchant_name` varchar(100) not null comment '商户名称', + `merchant_uid` varchar(50) not null comment '商户uid', + `agent_uid` varchar(100) comment '代理uid,表示该商户是谁的代理', + `agent_name` varchar(200) comment '代理名称', + `pay_product_code` varchar(100) not null comment '支付产品编码', + `pay_product_name` varchar(200) not null comment '支付产品名称', + `pay_type_code` varchar(50) not null comment '支付类型编码', + `pay_type_name` varchar(100) not null comment '支付类型名称', + `status` varchar(20) not null default "wait" comment '等待支付-wait,支付成功-success, 支付失败-failed', + `merchant_order_id` varchar(50) not null comment '下游商户提交过来的订单id', + `bank_order_id` varchar(50) not null comment '平台自身的订单id', + `bank_trans_id` varchar(50) not null comment '上游返回的订单id', + `order_amount` decimal(20,3) not null default 0 comment '订单提交金额', + `show_amount` decimal(20,3) not null default 0 comment '展示在用户面前待支付的金额', + `fact_amount` decimal(20,3) not null default 0 comment '实际支付金额', + `user_in_amount` decimal(20,3) not null default 0 comment '商户入账金额', + `all_profit` decimal(20,3) not null default 0 comment '总的利润,包括上游,平台,代理', + `supplier_rate` decimal(20,3) not null default 0 comment '上游的汇率', + `platform_rate` decimal(20,3) not null default 0 comment '平台自己的手续费率', + `agent_rate` decimal(20,3) not null default 0 comment '代理的手续费率', + `supplier_profit` decimal(20,3) not null default 0 comment '上游的利润', + `platform_profit` decimal(20,3) not null default 0 comment '平台利润', + `agent_profit` decimal(20, 3) not null default 0 comment '代理利润', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`), + unique `merchant_order_id` (`merchant_order_id`), + unique `bank_order_id` (`bank_order_id`) + )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单利润表'; + +/* +* 订单结算表 + */ +CREATE TABLE IF NOT EXISTS `order_settle_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `pay_product_code` varchar(100) not null comment '支付产品编码', + `pay_product_name` varchar(200) not null comment '支付产品名称', + `pay_type_code` varchar(50) not null comment '支付类型编码', + `pay_type_name` varchar(100) not null comment '支付类型名称', + `merchant_uid` varchar(100) not null comment '商户uid,表示订单是哪个商户的', + `road_uid` varchar(50) not null comment '通道uid', + `merchant_name` varchar(200) not null comment '商户名称', + `merchant_order_id` varchar(50) not null comment '下游商户提交过来的订单id', + `bank_order_id` varchar(50) not null comment '平台自身的订单id', + `settle_amount` decimal(20,3) not null default 0 comment '结算金额', + `is_allow_settle` varchar(10) not null default 'yes' comment '是否允许结算,允许-yes,不允许-no', + `is_complete_settle` varchar(10) not null default 'no' comment '该笔订单是否结算完毕,没有结算-no,结算完毕-yes', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`), + unique `merchant_order_id` (`merchant_order_id`), + unique `bank_order_id` (`bank_order_id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单结算表'; + +/* +* 回调记录表 + */ +CREATE TABLE IF NOT EXISTS `notify_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `type` varchar(10) not null comment '支付订单-order, 代付订单-payfor', + `bank_order_id` varchar(50) not null comment '系统订单id', + `merchant_order_id` varchar(50) not null comment '下游商户订单id', + `status` varchar(20) not null default "wait" comment '状态字段', + `times` int not null default 0 comment '回调次数', + `url` text comment '回调的url', + `response` text comment '回调返回的结果', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`), + unique `merchant_order_id` (`merchant_order_id`), + unique `bank_order_id` (`bank_order_id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='支付回调'; + +/* +* 代付表 + */ +CREATE TABLE IF NOT EXISTS `payfor_info` ( + `id` int(11) unsigned not null auto_increment comment '主键,自增', + `payfor_uid` varchar(100) not null comment '代付唯一uid', + `merchant_uid` varchar(100) not null comment '发起代付的商户uid', + `merchant_name` varchar(200) not null comment '发起代付的商户名称', + `merchant_order_id` varchar(50) comment '下游代付订单id', + `bank_order_id` varchar(50) not null comment '系统代付订单id', + `bank_trans_id` varchar(50) not null comment '上游返回的代付订单id', + `road_uid` varchar(100) not null comment '所用的代付通道uid', + `road_name` varchar(200) not null comment '所有通道的名称', + `roll_pool_code` varchar(100) comment '所用轮询池编码', + `roll_pool_name` varchar(200) comment '所用轮询池的名称', + `payfor_fee` decimal(20,3) not null default 0 comment '代付手续费', + `payfor_amount` decimal(20,3) not null default 0 comment '代付到账金额', + `payfor_total_amount` decimal(20,3) not null default 0 comment '代付总金额', + `bank_code` varchar(20) not null comment '银行编码', + `bank_name` varchar(100) not null comment '银行名称', + `bank_account_name` varchar(100) not null comment '银行开户名称', + `bank_account_no` varchar(50) not null comment '银行开户账号', + `bank_account_type` int not null default 0 comment '银行卡类型,对私-0,对公-1', + `country` varchar(50) not null default "中国" comment '开户所属国家', + `province` varchar(50) not null default "" comment '银行卡开户所属省', + `city` varchar(50) not null default "" comment '银行卡开户所属城市', + `ares` varchar(50) comment '所属地区', + `bank_account_address` text comment '银行开户具体街道', + `phone_no` varchar(20) not null comment '开户所用手机号', + `give_type` varchar(50) not null default "payfor_road" comment '下发类型,payfor_road-通道打款,payfor_hand-手动打款,payfor_refuse-拒绝打款', + `type` varchar(10) not null default "auto" comment '代付类型,self_api-系统发下, 管理员手动下发给商户-self_merchant,管理自己提现-self_help', + `notify_url` text comment '代付结果回调给下游的地址', + `status` varchar(20) not null default "wait" comment '审核-payfor_confirm,系统处理中-payfor_solving,银行处理中-payfor_banking,代付成功-success, 代付失败-failed', + `is_send` varchar(10) not null default "no" comment '未发送-no,已经发送-yes', + `request_time` timestamp not null comment '发起请求时间', + `response_time` timestamp not null comment '上游做出响应的时间', + `response_content` text comment '代付的最终结果', + `remark` text comment '代付备注', + `update_time` timestamp not null comment '更新时间', + `create_time` timestamp not null comment '创建时间', + primary key (`id`), + unique `payfor_uid` (`payfor_uid`), + unique `merchant_order_id` (`merchant_order_id`), + unique `bank_order_id` (`bank_order_id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='代付表'; \ No newline at end of file diff --git a/doc/安装使用说明.docx b/doc/安装使用说明.docx new file mode 100644 index 0000000..93914a6 Binary files /dev/null and b/doc/安装使用说明.docx differ diff --git a/jhagent/conf/app.conf b/jhagent/conf/app.conf new file mode 100644 index 0000000..53b478d --- /dev/null +++ b/jhagent/conf/app.conf @@ -0,0 +1,17 @@ +appname = jhagent +httpport = 12308 +#runmode = pro +runmode = dev + +#日志配置 +[logs] +# 0 ~ 7, 日志级别 +#level =7 +level =7 +#日志保存路径 +filepath= ./logs/jhagent.log +#需要显示的日志信息 +#separate="["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]" +separate="["emergency","alert","critical","error","warning","notice","info","debug"]" +#日志保存最大天数 +maxdays=10 \ No newline at end of file diff --git a/jhagent/controllers/account_history.go b/jhagent/controllers/account_history.go new file mode 100644 index 0000000..855f8cc --- /dev/null +++ b/jhagent/controllers/account_history.go @@ -0,0 +1,90 @@ +/*************************************************** + ** @Desc : This file for 账户变动 + ** @Time : 19.12.10 10:42 + ** @Author : Joker + ** @File : account_history + ** @Last Modified by : Joker + ** @Last Modified time: 19.12.10 10:42 + ** @Software: GoLand +****************************************************/ +package controllers + +import ( + "juhe/jhagent/sys/enum" + "juhe/service/models" + "strconv" + "strings" +) + +type History struct { + KeepSession +} + +// 账户资产变动列表 +// @router /history/show_history_list_ui +func (c *History) ShowHistoryListUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ranMd5 := encrypt.EncodeMd5([]byte(pubMethod.RandomString(46))) + c.Ctx.SetCookie(enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + c.Data["payType"] = enum.GetHistoryStatus() + c.Data["userName"] = u.AgentName + c.TplName = "history_record.html" +} + +// @router /history/list_history_record/?:params [get,post] +func (c *History) HistoryQueryAndListPage() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + // 分页参数 + page, _ := strconv.Atoi(c.GetString("page")) + limit, _ := strconv.Atoi(c.GetString("limit")) + if limit == 0 { + limit = 15 + } + + // 查询参数 + in := make(map[string]string) + start := strings.TrimSpace(c.GetString("start")) + end := strings.TrimSpace(c.GetString("end")) + status := strings.TrimSpace(c.GetString("status")) + + in["type"] = status + in["account_uid"] = u.AgentUid + + if start != "" { + in["create_time__gte"] = start + } + if end != "" { + in["create_time__lte"] = end + } + + // 计算分页数 + count := models.GetAccountHistoryLenByMap(in) + totalPage := count / limit // 计算总页数 + if count%limit != 0 { // 不满一页的数据按一页计算 + totalPage++ + } + + // 数据获取 + var list []models.AccountHistoryInfo + if page <= totalPage { + list = models.GetAccountHistoryByMap(in, limit, (page-1)*limit) + } + + // 数据回显 + out := make(map[string]interface{}) + out["limit"] = limit // 分页数据 + out["page"] = page + out["totalPage"] = totalPage + out["root"] = list // 显示数据 + + c.Data["json"] = out + c.ServeJSON() + c.StopRun() +} diff --git a/jhagent/controllers/deal_excel.go b/jhagent/controllers/deal_excel.go new file mode 100644 index 0000000..b6edd9c --- /dev/null +++ b/jhagent/controllers/deal_excel.go @@ -0,0 +1,440 @@ +/*************************************************** + ** @Desc : This file for 处理Excel文件 + ** @Time : 19.12.6 16:25 + ** @Author : Joker + ** @File : deal_excel + ** @Last Modified by : Joker + ** @Last Modified time: 19.12.6 16:25 + ** @Software: GoLand +****************************************************/ +package controllers + +import ( + "fmt" + "github.com/tealeg/xlsx" + "juhe/jhagent/sys/enum" + "juhe/jhagent/utils" + "juhe/service/models" + "os" + "recharge/sys" + "strings" + "time" +) + +type DealExcel struct { + KeepSession +} + +// 下载模板 +// @router /excel/download +func (c *DealExcel) DownloadExcelModel() { + ranMd5 := encrypt.EncodeMd5([]byte(pubMethod.RandomString(46))) + c.Ctx.SetCookie(enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + c.Ctx.Output.Download(enum.ExcelModelPath, enum.ExcelModelName) +} + +// 导出订单记录 +// @router /excel/make_order_excel/?:params [get] +func (c *DealExcel) MakeOrderExcel() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + // 查询参数 + in := make(map[string]string) + merchantName := strings.TrimSpace(c.GetString("merchantName")) + start := strings.TrimSpace(c.GetString("start")) + end := strings.TrimSpace(c.GetString("end")) + payType := strings.TrimSpace(c.GetString("pay_type")) + status := strings.TrimSpace(c.GetString("status")) + + in["merchant_name__icontains"] = merchantName + in["pay_type_code"] = payType + in["status"] = status + in["agent_uid"] = u.AgentUid + + if start != "" { + in["update_time__gte"] = start + } + if end != "" { + in["update_time__lte"] = end + } + + var ( + msg = enum.FailedString + flag = enum.FailedFlag + fileName = "trade_order-" + pubMethod.GetNowTimeV2() + pubMethod.RandomString(6) + ".xlsx" + + file *xlsx.File + sheet *xlsx.Sheet + row *xlsx.Row + cell *xlsx.Cell + err error + ) + + // 数据获取 + list := models.GetOrderProfitByMap(in, -1, 0) + if len(list) <= 0 { + msg = "没有检索到数据!" + goto stopRun + } + + // 写入记录 + file = xlsx.NewFile() + sheet, err = file.AddSheet("订单记录") + if err != nil { + utils.LogError(fmt.Sprintf("代理商户:%s 导出订单记录,发生错误:%v", u.AgentName, err)) + msg = enum.FailedToAdmin + goto stopRun + } + + // 第一行 + row = sheet.AddRow() + row.SetHeightCM(1) + cell = row.AddCell() + cell.Value = "平台订单号" + cell = row.AddCell() + cell.Value = "商户订单号" + cell = row.AddCell() + cell.Value = "支付方式" + cell = row.AddCell() + cell.Value = "订单金额" + cell = row.AddCell() + cell.Value = "收入金额" + cell = row.AddCell() + cell.Value = "平台手续费" + cell = row.AddCell() + cell.Value = "代理商手续费" + cell = row.AddCell() + cell.Value = "状 态" + cell = row.AddCell() + cell.Value = "成功支付时间" + for _, v := range list { + addRow := sheet.AddRow() + addCell := addRow.AddCell() + addCell.Value = v.BankOrderId + addCell = addRow.AddCell() + addCell.Value = v.MerchantOrderId + addCell = addRow.AddCell() + addCell.Value = v.PayProductName + addCell = addRow.AddCell() + addCell.Value = fmt.Sprintf("%f", v.OrderAmount) + + var ( + st = "" + t string + ) + switch v.Status { + case "failed": + st = "交易失败" + case "wait": + st = "等待支付" + case "success": + st = "交易成功" + t = v.UpdateTime + } + + addCell = addRow.AddCell() + addCell.Value = fmt.Sprintf("%f", v.UserInAmount) + addCell = addRow.AddCell() + addCell.Value = fmt.Sprintf("%f", v.PlatformProfit) + addCell = addRow.AddCell() + addCell.Value = fmt.Sprintf("%f", v.AgentProfit) + addCell = addRow.AddCell() + addCell.Value = st + addCell = addRow.AddCell() + addCell.Value = t + } + + err = file.Save(enum.ExcelDownloadPath + fileName) + if err != nil { + utils.LogError(fmt.Sprintf("代理商户:%s 导出订单记录,保存文件发生错误:%v", u.AgentName, err)) + msg = enum.FailedToAdmin + goto stopRun + } + + flag = enum.SuccessFlag + msg = fileName + +stopRun: + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + c.ServeJSON() + c.StopRun() +} + +// 下载excel +// @router /excel/download_excel/?:params [get] +func (c *DealExcel) DownloadRecordExcel() { + fileName := c.GetString(":params") + file := enum.ExcelDownloadPath + fileName + + defer func() { + if r := recover(); r != nil { + sys.LogEmergency(file + " 此文件不存在!") + time.Sleep(3 * time.Second) + } + }() + // 删除临时文件 + go func() { + tk := time.NewTicker(5 * time.Minute) + select { + case <-tk.C: + _ = os.Remove(file) + tk.Stop() + } + }() + + c.Ctx.Output.Download(file, fileName) +} + +// 导出投诉记录 +// @router /excel/make_complaint_record_excel/?:params [get] +func (c *DealExcel) MakeComplaintExcel() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + // 查询参数 + in := make(map[string]string) + merchantName := strings.TrimSpace(c.GetString("merchantName")) + start := strings.TrimSpace(c.GetString("start")) + end := strings.TrimSpace(c.GetString("end")) + payType := strings.TrimSpace(c.GetString("pay_type")) + status := strings.TrimSpace(c.GetString("status")) + + in["pay_type_code"] = payType + in["merchant_name__icontains"] = merchantName + if strings.Compare("YES", status) == 0 { + in["freeze"] = enum.YES + } else { + in["refund"] = enum.YES + } + in["agent_uid"] = u.AgentUid + + if start != "" { + in["update_time__gte"] = start + } + if end != "" { + in["update_time__lte"] = end + } + + var ( + msg = enum.FailedString + flag = enum.FailedFlag + fileName = "complaint_order-" + pubMethod.GetNowTimeV2() + pubMethod.RandomString(6) + ".xlsx" + + file *xlsx.File + sheet *xlsx.Sheet + row *xlsx.Row + cell *xlsx.Cell + err error + ) + + // 数据获取 + list := models.GetOrderByMap(in, -1, 0) + if len(list) <= 0 { + msg = "没有检索到数据!" + goto stopRun + } + + // 写入记录 + file = xlsx.NewFile() + sheet, err = file.AddSheet("投诉记录") + if err != nil { + utils.LogError(fmt.Sprintf("代理商户:%s 导出投诉记录,发生错误:%v", u.AgentName, err)) + msg = enum.FailedToAdmin + goto stopRun + } + + // 第一行 + row = sheet.AddRow() + row.SetHeightCM(1) + cell = row.AddCell() + cell.Value = "平台流水号" + cell = row.AddCell() + cell.Value = "商户订单号" + cell = row.AddCell() + cell.Value = "支付方式" + cell = row.AddCell() + cell.Value = "订单金额" + cell = row.AddCell() + cell.Value = "状 态" + cell = row.AddCell() + cell.Value = "冻结时间" + for _, v := range list { + addRow := sheet.AddRow() + addCell := addRow.AddCell() + addCell.Value = v.BankOrderId + addCell = addRow.AddCell() + addCell.Value = v.MerchantOrderId + addCell = addRow.AddCell() + addCell.Value = v.PayProductName + addCell = addRow.AddCell() + addCell.Value = fmt.Sprintf("%f", v.OrderAmount) + + var st = "" + switch v.Freeze { + case "yes": + st = "已冻结" + case "no": + st = "已退款" + } + + addCell = addRow.AddCell() + addCell.Value = st + addCell = addRow.AddCell() + addCell.Value = v.UpdateTime + } + + err = file.Save(enum.ExcelDownloadPath + fileName) + if err != nil { + utils.LogError(fmt.Sprintf("代理商户:%s 导出投诉记录,保存文件发生错误:%v", u.AgentName, err)) + msg = enum.FailedToAdmin + goto stopRun + } + + flag = enum.SuccessFlag + msg = fileName + +stopRun: + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + c.ServeJSON() + c.StopRun() +} + +// 导出提现记录 +// @router /excel/make_withdraw_record_excel/?:params [get] +func (c *DealExcel) MakeWithdrawExcel() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + // 查询参数 + in := make(map[string]string) + start := strings.TrimSpace(c.GetString("start")) + end := strings.TrimSpace(c.GetString("end")) + status := strings.TrimSpace(c.GetString("status")) + + in["status"] = status + in["merchant_uid"] = u.AgentUid + + if start != "" { + in["update_time__gte"] = start + } + if end != "" { + in["update_time__lte"] = end + } + + var ( + msg = enum.FailedString + flag = enum.FailedFlag + fileName = "withdraw_order-" + pubMethod.GetNowTimeV2() + pubMethod.RandomString(6) + ".xlsx" + + file *xlsx.File + sheet *xlsx.Sheet + row *xlsx.Row + cell *xlsx.Cell + err error + ) + + // 数据获取 + list := models.GetPayForByMap(in, -1, 0) + if len(list) <= 0 { + msg = "没有检索到数据!" + goto stopRun + } + + // 写入记录 + file = xlsx.NewFile() + sheet, err = file.AddSheet("提现记录") + if err != nil { + utils.LogError(fmt.Sprintf("代理商户:%s 导出提现记录,发生错误:%v", u.AgentName, err)) + msg = enum.FailedToAdmin + goto stopRun + } + + // 第一行 + row = sheet.AddRow() + row.SetHeightCM(1) + cell = row.AddCell() + cell.Value = "平台订单号" + cell = row.AddCell() + cell.Value = "商户订单号" + cell = row.AddCell() + cell.Value = "结算金额" + cell = row.AddCell() + cell.Value = "手续费" + cell = row.AddCell() + cell.Value = "银行名称" + cell = row.AddCell() + cell.Value = "开户名" + cell = row.AddCell() + cell.Value = "开户账户" + cell = row.AddCell() + cell.Value = "状 态" + cell = row.AddCell() + cell.Value = "创建时间" + cell = row.AddCell() + cell.Value = "打款时间" + cell = row.AddCell() + cell.Value = "备注" + for _, v := range list { + addRow := sheet.AddRow() + addCell := addRow.AddCell() + addCell.Value = v.BankOrderId + addCell = addRow.AddCell() + addCell.Value = v.MerchantOrderId + addCell = addRow.AddCell() + addCell.Value = fmt.Sprintf("%f", v.PayforTotalAmount) + addCell = addRow.AddCell() + addCell.Value = fmt.Sprintf("%f", v.PayforFee) + addCell = addRow.AddCell() + addCell.Value = v.BankName + addCell = addRow.AddCell() + addCell.Value = v.BankAccountName + addCell = addRow.AddCell() + addCell.Value = v.BankAccountNo + + var ( + st = "" + t string + ) + switch v.Status { + case "payfor_confirm": + st = "等待审核" + case "payfor_solving": + st = "系统处理中" + case "payfor_banking": + st = "银行处理中" + case "success": + st = "代付成功" + t = v.UpdateTime + case "failed": + st = "代付失败" + } + + addCell = addRow.AddCell() + addCell.Value = st + addCell = addRow.AddCell() + addCell.Value = v.CreateTime + addCell = addRow.AddCell() + addCell.Value = t + addCell = addRow.AddCell() + addCell.Value = v.Remark + } + + err = file.Save(enum.ExcelDownloadPath + fileName) + if err != nil { + utils.LogError(fmt.Sprintf("代理商户:%s 导出提现记录,保存文件发生错误:%v", u.AgentName, err)) + msg = enum.FailedToAdmin + goto stopRun + } + + flag = enum.SuccessFlag + msg = fileName + +stopRun: + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + c.ServeJSON() + c.StopRun() +} diff --git a/jhagent/controllers/index.go b/jhagent/controllers/index.go new file mode 100644 index 0000000..231f5b8 --- /dev/null +++ b/jhagent/controllers/index.go @@ -0,0 +1,164 @@ +/*************************************************** + ** @Desc : This file for 首页 + ** @Time : 19.11.30 11:49 + ** @Author : Joker + ** @File : index + ** @Last Modified by : Joker + ** @Last Modified time: 19.11.30 11:49 + ** @Software: GoLand +****************************************************/ +package controllers + +import ( + "fmt" + "juhe/jhagent/sys/enum" + "juhe/service/models" +) + +type Index struct { + KeepSession +} + +// 首页 +// @router /index/ui/ [get,post] +func (c *Index) ShowUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + c.Data["userName"] = u.AgentName + c.TplName = "index.html" +} + +// 加载用户账户金额信息 +// @router /index/loadInfo/ +func (c *Index) LoadUserAccountInfo() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ac := models.GetAccountByUid(u.AgentUid) + + info := make(map[string]interface{}) + // 账户余额 + info["balanceAmt"] = pubMethod.FormatFloat64ToString(ac.Balance) + + // 可用余额 + info["settAmount"] = pubMethod.FormatFloat64ToString(ac.WaitAmount) + + // 冻结金额 + info["freezeAmt"] = pubMethod.FormatFloat64ToString(ac.FreezeAmount) + + // 押款金额 + info["amountFrozen"] = pubMethod.FormatFloat64ToString(ac.LoanAmount) + + c.Data["json"] = info + c.ServeJSON() + c.StopRun() +} + +// 加载总订单信息 +// @router /index/load_count_order +func (c *Index) LoadCountOrder() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + md := models.GetMerchantDeployByUid(u.AgentUid) + + type orderInPayWay struct { + PayWayName string // 支付方式名 + OrderCount int // 订单数 + SucOrderCount int // 成功订单数 + SucRate string // 成功率 + } + + ways := make([]orderInPayWay, len(md)) + + for k, v := range md { + in := make(map[string]string) + in["agent_uid"] = u.AgentUid + + ways[k].PayWayName = models.GetRoadInfoByRoadUid(v.SingleRoadUid).ProductName + + in["road_uid"] = v.SingleRoadUid + ways[k].OrderCount = models.GetOrderLenByMap(in) + + in["status"] = enum.SUCCESS + ways[k].SucOrderCount = models.GetOrderLenByMap(in) + + if ways[k].OrderCount == 0 { + ways[k].SucRate = "0" + continue + } + ways[k].SucRate = fmt.Sprintf("%0.4f", float64(ways[k].SucOrderCount)/float64(ways[k].OrderCount)) + } + + c.Data["json"] = ways + c.ServeJSON() + c.StopRun() +} + +// 加载总订单数 +// @router /index/loadOrders +func (c *Index) LoadOrderCount() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + out := make(map[string]interface{}) + + in := make(map[string]string) + in["agent_uid"] = u.AgentUid + out["orders"] = models.GetOrderLenByMap(in) + + in["status"] = enum.SUCCESS + out["suc_orders"] = models.GetOrderLenByMap(in) + + if out["orders"].(int) == 0 { + out["suc_rate"] = 0 + } else { + out["suc_rate"] = fmt.Sprintf("%0.4f", float64(out["suc_orders"].(int))/float64(out["orders"].(int))) + } + + c.Data["json"] = out + c.ServeJSON() + c.StopRun() +} + +// 加载用户支付配置 +// @router /index/show_pay_way_ui +func (c *Index) LoadUserPayWayUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + c.Data["userName"] = u.AgentName + c.TplName = "pay_way.html" +} + +// @router /index/pay_way +func (c *Index) LoadUserPayWay() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + md := models.GetMerchantDeployByUid(u.AgentUid) + + type payConfig struct { + No string // 通道编号 + Name string // 产品名 + PlatRate float64 // 通道费率 + AgentRate float64 // 通道费率 + } + + ways := make([]payConfig, len(md)) + + for k, v := range md { + road := models.GetRoadInfoByRoadUid(v.SingleRoadUid) + ways[k].No = road.RoadUid + + ways[k].Name = road.ProductName + + ways[k].PlatRate = road.BasicFee + v.SingleRoadPlatformRate + v.SingleRoadAgentRate + ways[k].AgentRate = v.SingleRoadAgentRate + } + + c.Data["json"] = ways + c.ServeJSON() + c.StopRun() +} diff --git a/jhagent/controllers/keep_session.go b/jhagent/controllers/keep_session.go new file mode 100644 index 0000000..82971c4 --- /dev/null +++ b/jhagent/controllers/keep_session.go @@ -0,0 +1,51 @@ +/*************************************************** + ** @Desc : This file for 保持会话 + ** @Time : 19.11.29 13:55 + ** @Author : Joker + ** @File : keep_session + ** @Last Modified by : Joker + ** @Last Modified time: 19.11.29 13:55 + ** @Software: GoLand +****************************************************/ +package controllers + +import ( + "github.com/astaxie/beego" + "juhe/jhagent/sys/enum" +) + +type KeepSession struct { + beego.Controller +} + +// 生成随机md5值,客户端和服务端各保存一份 +// 客户端每次请求都将重写md5值 +// 若用户在30分钟内没有操作行为或连续操作时间超过3小时,则自动退出 +func (c *KeepSession) Prepare() { + // 以免session值不是string类型而panic + defer func() { + if err := recover(); err != nil { + c.DelSession(enum.UserSession) + c.Ctx.Redirect(302, "/") + } + }() + + us := c.GetSession(enum.UserSession) + uc := c.GetSession(enum.UserCookie) + if us == nil || uc == nil { + c.DelSession(enum.UserSession) + c.Ctx.Redirect(302, "/") + } + + if uc.(string) == "" { + c.DelSession(enum.UserSession) + c.Ctx.Redirect(302, "/") + } + + _, b := c.Ctx.GetSecureCookie(uc.(string), enum.UserCookie) + //utils.LogNotice(fmt.Sprintf("客户端cookie:%s,服务端cookie:%s", cookie, uc.(string))) + if !b { + c.DelSession(enum.UserSession) + c.Ctx.Redirect(302, "/") + } +} diff --git a/jhagent/controllers/login.go b/jhagent/controllers/login.go new file mode 100644 index 0000000..55a64da --- /dev/null +++ b/jhagent/controllers/login.go @@ -0,0 +1,160 @@ +/*************************************************** + ** @Desc : This file for 用户登录 + ** @Time : 19.11.29 13:52 + ** @Author : Joker + ** @File : login + ** @Last Modified by : Joker + ** @Last Modified time: 19.11.29 13:52 + ** @Software: GoLand +****************************************************/ +package controllers + +import ( + "fmt" + "github.com/astaxie/beego" + "github.com/dchest/captcha" + "juhe/jhagent/sys" + "juhe/jhagent/sys/enum" + "juhe/jhagent/utils" + "juhe/service/models" + "strconv" + "strings" +) + +var pubMethod = sys.PublicMethod{} +var encrypt = utils.Encrypt{} + +type Login struct { + beego.Controller +} + +// @router /login.py/?:params [post] +func (c *Login) UserLogin() { + captchaCode := c.GetString("captchaCode") + captchaId := c.GetString("captchaId") + userName := strings.TrimSpace(c.GetString("userName")) + password := c.GetString("Password") + + var ( + flag = enum.FailedFlag + msg = "" + url = "/" + + pwdMd5 string + ran string + ranMd5 string + + verify bool + u models.AgentInfo + ) + + us := c.GetSession(enum.UserSession) + if us != nil { + url = enum.DoMainUrl + flag = enum.SuccessFlag + goto stopRun + } + + if userName == "" || password == "" { + msg = "登录账号或密码不能为空!" + goto stopRun + } + + verify = captcha.VerifyString(captchaId, captchaCode) + if !verify { + url = strconv.Itoa(enum.FailedFlag) + msg = "验证码不正确!" + goto stopRun + } + + u = models.GetAgentInfoByPhone(userName) + if u.AgentPassword == "" { + msg = "账户信息错误,请联系管理人员!" + goto stopRun + } + + if strings.Compare(enum.ACTIVE, u.Status) != 0 { + msg = "登录账号或密码错误!" + goto stopRun + } + + //验证密码 + pwdMd5 = encrypt.EncodeMd5([]byte(password)) + if strings.Compare(strings.ToUpper(pwdMd5), u.AgentPassword) != 0 { + msg = "登录账号或密码错误!" + goto stopRun + } + + c.SetSession(enum.UserSession, u) + + // 设置客户端用户信息有效保存时间 + ran = pubMethod.RandomString(46) + ranMd5 = encrypt.EncodeMd5([]byte(ran)) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + url = enum.DoMainUrl + flag = enum.SuccessFlag + utils.LogNotice(fmt.Sprintf("【%s】代理商登录成功,请求IP:%s", u.AgentName, c.Ctx.Input.IP())) + +stopRun: + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, url) + c.ServeJSON() + c.StopRun() +} + +// @router / +func (c *Login) Index() { + capt := struct { + CaptchaId string + }{ + captcha.NewLen(4), + } + c.Data["CaptchaId"] = capt.CaptchaId + c.TplName = "login.html" +} + +// 验证输入的验证码 +// @router /verifyCaptcha.py/:value/:chaId [get] +func (c *Login) VerifyCaptcha() { + captchaValue := c.Ctx.Input.Param(":value") + captchaId := c.Ctx.Input.Param(":chaId") + + verify := captcha.VerifyString(captchaId, captchaValue) + if verify { + c.Data["json"] = pubMethod.JsonFormat(enum.SuccessFlag, "", "", "") + } else { + c.Data["json"] = pubMethod.JsonFormat(enum.FailedFlag, "", "验证码不匹配!", "") + } + c.ServeJSON() + c.StopRun() +} + +// 重绘验证码 +// @router /flushCaptcha.py/ [get] +func (c *Login) FlushCaptcha() { + capt := struct { + CaptchaId string + }{ + captcha.NewLen(4), + } + c.Data["json"] = pubMethod.JsonFormat(enum.SuccessFlag, capt.CaptchaId, "验证码不匹配!", "") + c.ServeJSON() + c.StopRun() +} + +// 退出登录 +//@router /loginOut.py +func (c *Login) LoginOut() { + c.DelSession(enum.UserSession) + + c.Data["json"] = pubMethod.JsonFormat(enum.FailedFlag, "", "", "/") + c.ServeJSON() + c.StopRun() +} + +// 对接文档 +//@router /pay_doc.py +func (c *Login) PayDoc() { + c.TplName = "api_doc/pay_doc.html" +} \ No newline at end of file diff --git a/jhagent/controllers/multi_withdraw.go b/jhagent/controllers/multi_withdraw.go new file mode 100644 index 0000000..a4c58d3 --- /dev/null +++ b/jhagent/controllers/multi_withdraw.go @@ -0,0 +1,252 @@ +/*************************************************** + ** @Desc : This file for 批量提现 + ** @Time : 19.12.6 17:07 + ** @Author : Joker + ** @File : multi_withdraw + ** @Last Modified by : Joker + ** @Last Modified time: 19.12.6 17:07 + ** @Software: GoLand +****************************************************/ +package controllers + +import ( + "fmt" + "github.com/rs/xid" + "github.com/tealeg/xlsx" + "juhe/jhagent/sys/enum" + "juhe/jhagent/utils" + "juhe/service/common" + "juhe/service/models" + "path" + "regexp" + "strconv" + "strings" + "time" +) + +type MultiWithdraw struct { + KeepSession +} + +// @router /multi_withdraw/show_multi_ui +func (c *MultiWithdraw) ShowMultiWithdrawUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ranMd5 := encrypt.EncodeMd5([]byte(pubMethod.RandomString(46))) + c.Ctx.SetCookie(enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + c.Data["userName"] = u.AgentName + c.TplName = "withdraw/multi_withdraw.html" +} + +// 申请批量提现 +// @router /multi_withdraw/launch_multi_withdraw/?:params [post] +func (c *Withdraw) LaunchMultiWithdraw() { + mobileCode := strings.TrimSpace(c.GetString("mobileCode")) + file, header, err := c.GetFile("file") + + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + var ( + msg = enum.FailedString + flag = enum.FailedFlag + + b bool + + url string + ) + + fileName := header.Filename + defer file.Close() + split := strings.Split(fileName, ".") + if len(split) < 2 { + msg = "请选择批量文件!" + goto stopRun + } + if strings.Compare(strings.ToLower(split[1]), "xls") != 0 && + strings.Compare(strings.ToLower(split[1]), "xlsx") != 0 { + msg = "仅支持“xls”、“xlsx”格式文件!" + goto stopRun + } + if err != nil { + msg = "请上传批量文件! " + err.Error() + goto stopRun + } + + if u.PayPassword == "" { + msg = "请设置支付密码!" + goto stopRun + } + if strings.Compare(strings.ToUpper(encrypt.EncodeMd5([]byte(mobileCode))), u.PayPassword) != 0 { + msg = "支付密码输入错误!" + goto stopRun + } + + u = models.GetAgentInfoByAgentUid(u.AgentUid) + if strings.Compare(enum.ACTIVE, u.Status) != 0 { + msg = "商户状态异常,请联系管理人员!" + goto stopRun + } + + b, msg = handleFileContent(split[0], u, c) + if b { + flag = enum.SuccessFlag + url = "/withdraw/show_list_ui" + } + +stopRun: + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, url) + c.ServeJSON() + c.StopRun() +} + +func handleFileContent(name string, u models.AgentInfo, c *Withdraw) (bool, string) { + // 重命名文件 + fileName := name + " - " + pubMethod.GetNowTimeV2() + pubMethod.RandomString(4) + ".xlsx" + + // 保存文件 + _ = c.SaveToFile("file", path.Join(enum.ExcelPath, fileName)) + + // 读取文件内容 + xlFile, err := xlsx.OpenFile(enum.ExcelPath + fileName) + if err != nil { + msg := "文件内容错误:" + err.Error() + utils.LogInfo(msg) + return false, msg + } + + // 只读取文档中第一个工作表,忽略其他工作表 + sheet := xlFile.Sheets[0] + line, err := sheet.Row(0).Cells[1].Int() + if err != nil { + msg := "请输入正确的总笔数:" + err.Error() + utils.LogInfo(msg) + return false, msg + } + if line <= 0 { + msg := "请输入正确的总笔数!" + return false, msg + } + if line > 300 { + line = 300 + } + + ac := models.GetAccountByUid(u.AgentUid) + if strings.Compare(enum.ACTIVE, ac.Status) != 0 { + msg := "账户状态异常,请联系管理人员!" + return false, msg + } + // 后台处理文件,不让用户等待 + go func() { + for k, row := range sheet.Rows { + if k == 0 || k == 1 { + continue + } + + // 数据行数不得超过指定行数 + if k == line+2 || k == 301 { + break + } + + // 出现空行,则忽略后面记录 + if row.Cells[0].String() == "" || row.Cells[4].String() == "" { + break + } + + bankAccountType := row.Cells[3].String() + ac := models.GetAccountByUid(u.AgentUid) + b, msg, code := verifyFileContent(row.Cells[0].String(), row.Cells[1].String(), row.Cells[2].String(), bankAccountType, + row.Cells[4].String(), ac) + if !b { + utils.LogInfo(fmt.Sprintf("用户:%s 批量代付中,第 %d 行记录出现错误:%s", u.AgentName, k+1, msg)) + // 账户可用余额不足,终止读取记录 + if code == 5009 { + break + } + continue + } + + if strings.Compare("对公", bankAccountType) == 0 { + bankAccountType = enum.PublicAccount + } else { + bankAccountType = enum.PrivateDebitAccount + } + + money, _ := strconv.ParseFloat(row.Cells[4].String(), 10) + payFor := models.PayforInfo{ + PayforUid: "pppp" + xid.New().String(), + MerchantUid: u.AgentUid, + MerchantName: u.AgentName, + PhoneNo: u.AgentPhone, + MerchantOrderId: xid.New().String(), + BankOrderId: "4444" + xid.New().String(), + PayforFee: common.PAYFOR_FEE, + Type: common.SELF_MERCHANT, + PayforAmount: money, + PayforTotalAmount: money + common.PAYFOR_FEE, + BankCode: "C", + BankName: row.Cells[2].String(), + IsSend: common.NO, + BankAccountName: row.Cells[0].String(), + BankAccountNo: row.Cells[1].String(), + BankAccountType: bankAccountType, + BankAccountAddress: row.Cells[2].String(), + Status: common.PAYFOR_COMFRIM, + CreateTime: pubMethod.GetNowTime(), + UpdateTime: pubMethod.GetNowTime(), + } + + models.InsertPayfor(payFor) + + time.Sleep(500 * time.Millisecond) + } + }() + + return true, "提交成功,等待审核中,请在结算信息中查询状态!" +} + +// 验证文件内容是否规范 +func verifyFileContent(accountName, cardNo, bankAccountAddress, bankAccountType, amount string, ac models.AccountInfo) (bool, string, int) { + if accountName == "" || cardNo == "" { + msg := "账户名或卡号不能为空!" + return false, msg, 5001 + } + // 账户类型 + if strings.Compare("对公", bankAccountType) == 0 { + if bankAccountAddress == "" { + msg := "收款方开户机构名称不能为空!" + return false, msg, 5002 + } + } + if amount == "" { + msg := "金额不能为空!" + return false, msg, 5003 + } + matched, _ := regexp.MatchString(enum.MoneyReg, amount) + if !matched { + msg := "请输入正确的金额!" + return false, msg, 5004 + } + f, err := strconv.ParseFloat(amount, 10) + if err != nil { + msg := "请输入正确的金额! " + err.Error() + return false, msg, 5007 + } + + if f > enum.WithdrawalMaxAmount || f < enum.WithdrawalMinAmount || f+enum.SettlementFee > ac.WaitAmount { + msg := fmt.Sprintf("单笔提现金额超出限制,提现金额:%f,账户可结算余额:%f,提现最小额:%d,最大额:%d,手续费:%d", + f, ac.WaitAmount, enum.WithdrawalMinAmount, enum.WithdrawalMaxAmount, enum.SettlementFee) + return false, msg, 5008 + } + + if f+enum.SettlementFee > ac.Balance || ac.Balance <= 0 { + msg := fmt.Sprintf("账户金额不足,提现金额:%f,账户余额:%f,手续费:%d", + f, ac.Balance, enum.SettlementFee) + return false, msg, 5009 + } + return true, "", 5000 +} diff --git a/jhagent/controllers/trade_record.go b/jhagent/controllers/trade_record.go new file mode 100644 index 0000000..6acfe21 --- /dev/null +++ b/jhagent/controllers/trade_record.go @@ -0,0 +1,177 @@ +/*************************************************** + ** @Desc : This file for 交易记录 + ** @Time : 19.12.2 16:34 + ** @Author : Joker + ** @File : trade_record + ** @Last Modified by : Joker + ** @Last Modified time: 19.12.2 16:34 + ** @Software: GoLand +****************************************************/ +package controllers + +import ( + "juhe/jhagent/sys/enum" + "juhe/service/models" + "strconv" + "strings" +) + +type TradeRecord struct { + KeepSession +} + +// @router /trade/show_ui +func (c *TradeRecord) ShowUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ranMd5 := encrypt.EncodeMd5([]byte(pubMethod.RandomString(46))) + c.Ctx.SetCookie(enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + c.Data["payType"] = enum.GetPayType() + c.Data["status"] = enum.GetOrderStatus() + c.Data["userName"] = u.AgentName + c.TplName = "trade_record.html" +} + +// 订单记录查询分页 +// @router /trade/list/?:params [get] +func (c *TradeRecord) TradeQueryAndListPage() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + // 分页参数 + page, _ := strconv.Atoi(c.GetString("page")) + limit, _ := strconv.Atoi(c.GetString("limit")) + if limit == 0 { + limit = 15 + } + + // 查询参数 + in := make(map[string]string) + merchantNo := strings.TrimSpace(c.GetString("MerchantNo")) + merchantName := strings.TrimSpace(c.GetString("merchantName")) + start := strings.TrimSpace(c.GetString("start")) + end := strings.TrimSpace(c.GetString("end")) + payType := strings.TrimSpace(c.GetString("pay_type")) + status := strings.TrimSpace(c.GetString("status")) + + in["merchant_order_id"] = merchantNo + in["merchant_name__icontains"] = merchantName + in["pay_type_code"] = payType + in["status"] = status + in["agent_uid"] = u.AgentUid + + if start != "" { + in["update_time__gte"] = start + } + if end != "" { + in["update_time_lte"] = end + } + + // 计算分页数 + count := models.GetOrderProfitLenByMap(in) + totalPage := count / limit // 计算总页数 + if count%limit != 0 { // 不满一页的数据按一页计算 + totalPage++ + } + + // 数据获取 + var list []models.OrderProfitInfo + if page <= totalPage { + list = models.GetOrderProfitByMap(in, limit, (page-1)*limit) + } + + // 数据回显 + out := make(map[string]interface{}) + out["limit"] = limit // 分页数据 + out["page"] = page + out["totalPage"] = totalPage + out["root"] = list // 显示数据 + + c.Data["json"] = out + c.ServeJSON() + c.StopRun() +} + +// @router /trade/show_complaint_ui +func (c *TradeRecord) ShowComplaintUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ranMd5 := encrypt.EncodeMd5([]byte(pubMethod.RandomString(46))) + c.Ctx.SetCookie(enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + c.Data["payType"] = enum.GetPayType() + c.Data["status"] = enum.GetComOrderStatus() + c.Data["userName"] = u.AgentName + c.TplName = "complaint_record.html" +} + +// 投诉列表查询分页 +// @router /trade/complaint/?:params [get] +func (c *TradeRecord) ComplaintQueryAndListPage() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + // 分页参数 + page, _ := strconv.Atoi(c.GetString("page")) + limit, _ := strconv.Atoi(c.GetString("limit")) + if limit == 0 { + limit = 15 + } + + // 查询参数 + in := make(map[string]string) + merchantNo := strings.TrimSpace(c.GetString("MerchantNo")) + merchantName := strings.TrimSpace(c.GetString("merchantName")) + start := strings.TrimSpace(c.GetString("start")) + end := strings.TrimSpace(c.GetString("end")) + payType := strings.TrimSpace(c.GetString("pay_type")) + status := strings.TrimSpace(c.GetString("status")) + + in["merchant_order_id"] = merchantNo + in["merchant_name__icontains"] = merchantName + in["pay_type_code"] = payType + if strings.Compare("YES", status) == 0 { + in["freeze"] = enum.YES + } else { + in["refund"] = enum.YES + } + in["agent_uid"] = u.AgentUid + + if start != "" { + in["update_time__gte"] = start + } + if end != "" { + in["update_time__lte"] = end + } + + // 计算分页数 + count := models.GetOrderLenByMap(in) + totalPage := count / limit // 计算总页数 + if count%limit != 0 { // 不满一页的数据按一页计算 + totalPage++ + } + + // 数据获取 + var list []models.OrderInfo + if page <= totalPage { + list = models.GetOrderByMap(in, limit, (page-1)*limit) + } + + // 数据回显 + out := make(map[string]interface{}) + out["limit"] = limit // 分页数据 + out["page"] = page + out["totalPage"] = totalPage + out["root"] = list // 显示数据 + + c.Data["json"] = out + c.ServeJSON() + c.StopRun() +} diff --git a/jhagent/controllers/user_info.go b/jhagent/controllers/user_info.go new file mode 100644 index 0000000..16d9f6e --- /dev/null +++ b/jhagent/controllers/user_info.go @@ -0,0 +1,340 @@ +/*************************************************** + ** @Desc : This file for 用户信息控制 + ** @Time : 19.12.3 10:38 + ** @Author : Joker + ** @File : user_info + ** @Last Modified by : Joker + ** @Last Modified time: 19.12.3 10:38 + ** @Software: GoLand +****************************************************/ +package controllers + +import ( + "juhe/jhagent/sys/enum" + "juhe/service/models" + "regexp" + "strings" +) + +type UserInfo struct { + KeepSession +} + +// @router /user_info/show_modify_ui +func (c *UserInfo) ShowModifyUserInfoUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ranMd5 := encrypt.EncodeMd5([]byte(pubMethod.RandomString(46))) + c.Ctx.SetCookie(enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + c.Data["userName"] = u.AgentName + c.TplName = "modify_userInfo.html" +} + +// 修改用户信息 +// @router /user_info/modify_userInfo/?:params [post] +func (c *UserInfo) ModifyUserInfo() { + or_pwd := strings.TrimSpace(c.GetString("or_pwd")) + new_pwd := strings.TrimSpace(c.GetString("new_pwd")) + confirm_pwd := strings.TrimSpace(c.GetString("confirm_pwd")) + + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + var ( + msg = enum.FailedString + flag = enum.FailedFlag + + md bool + ud bool + pwdMd5 string + ) + + if or_pwd == "" || + new_pwd == "" || + confirm_pwd == "" { + msg = "密码不能为空!" + goto stopRun + } + + pwdMd5 = encrypt.EncodeMd5([]byte(or_pwd)) + if strings.Compare(strings.ToUpper(pwdMd5), u.AgentPassword) != 0 { + msg = "原始密码错误!" + } + + md, _ = regexp.MatchString(enum.PasswordReg, new_pwd) + if !md { + msg = "密码只能输入6-20个以字母开头、可带数字、“_”、“.”的字串!" + goto stopRun + } + + md, _ = regexp.MatchString(enum.PasswordReg, confirm_pwd) + if !md { + msg = "密码只能输入6-20个以字母开头、可带数字、“_”、“.”的字串!" + goto stopRun + } + + if strings.Compare(new_pwd, confirm_pwd) != 0 { + msg = "两次密码不匹配!" + goto stopRun + } + + u.AgentPassword = strings.ToUpper(encrypt.EncodeMd5([]byte(new_pwd))) + u.UpdateTime = pubMethod.GetNowTime() + ud = models.UpdateAgentInfo(u) + if ud { + msg = enum.SuccessString + flag = enum.SuccessFlag + + // 退出重新登录 + c.DelSession(enum.UserSession) + } + +stopRun: + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + c.ServeJSON() + c.StopRun() +} + +// 验证原始密码 +// @router /user_info/confirm_pwd/?:params [post] +func (c *UserInfo) ConfirmOriginPwd() { + ori := strings.TrimSpace(c.GetString("c")) + + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + var ( + msg = enum.FailedString + flag = enum.FailedFlag + ) + + pwdMd5 := encrypt.EncodeMd5([]byte(ori)) + if strings.Compare(strings.ToUpper(pwdMd5), u.AgentPassword) != 0 { + msg = "原始密码错误!" + } else { + flag = enum.SuccessFlag + } + + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + c.ServeJSON() + c.StopRun() +} + +// 设置支付密码 +// @router /user_info/set_pay_password/?:params [post] +func (c *UserInfo) SetPayPassword() { + or_pwd := strings.TrimSpace(c.GetString("or_pwd")) + new_pwd := strings.TrimSpace(c.GetString("new_pwd")) + confirm_pwd := strings.TrimSpace(c.GetString("confirm_pwd")) + + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + var ( + msg = enum.FailedString + flag = enum.FailedFlag + + md bool + ud bool + pwdMd5 string + ) + + if new_pwd == "" || confirm_pwd == "" { + msg = "密码不能为空!" + goto stopRun + } + + if u.PayPassword != "" { + pwdMd5 = encrypt.EncodeMd5([]byte(or_pwd)) + if strings.Compare(strings.ToUpper(pwdMd5), u.AgentPassword) != 0 { + msg = "原始密码错误!" + } + } + + md, _ = regexp.MatchString(enum.PasswordReg, new_pwd) + if !md { + msg = "密码只能输入6-20个以字母开头、可带数字、“_”、“.”的字串!" + goto stopRun + } + + md, _ = regexp.MatchString(enum.PasswordReg, confirm_pwd) + if !md { + msg = "密码只能输入6-20个以字母开头、可带数字、“_”、“.”的字串!" + goto stopRun + } + + if strings.Compare(new_pwd, confirm_pwd) != 0 { + msg = "两次密码不匹配!" + goto stopRun + } + + u.PayPassword = strings.ToUpper(encrypt.EncodeMd5([]byte(new_pwd))) + u.UpdateTime = pubMethod.GetNowTime() + ud = models.UpdateAgentInfo(u) + if ud { + msg = enum.SuccessString + flag = enum.SuccessFlag + + // 重新写入缓存信息 + c.SetSession(enum.UserSession, u) + } + +stopRun: + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + c.ServeJSON() + c.StopRun() +} + +// 验证原始支付密码 +// @router /user_info/confirm_pay_pwd/?:params [post] +func (c *UserInfo) ConfirmOriginPayPwd() { + ori := strings.TrimSpace(c.GetString("c")) + + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + var ( + msg = enum.FailedString + flag = enum.SuccessFlag + ) + + if u.PayPassword != "" { + pwdMd5 := encrypt.EncodeMd5([]byte(ori)) + if strings.Compare(strings.ToUpper(pwdMd5), u.AgentPassword) != 0 { + msg = "原始密码错误!" + flag = enum.FailedFlag + } + } + + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + c.ServeJSON() + c.StopRun() +} + +// 展示用户信息 +// @router /user_info/show_ui +func (c *UserInfo) ShowUserInfoUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ranMd5 := encrypt.EncodeMd5([]byte(pubMethod.RandomString(46))) + c.Ctx.SetCookie(enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + c.Data["userName"] = u.AgentName + c.TplName = "show_userInfo.html" +} + +// 代理商列表 +// @router /user_info/show_merchant_ui +func (c *UserInfo) ShowMerchantUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ranMd5 := encrypt.EncodeMd5([]byte(pubMethod.RandomString(46))) + c.Ctx.SetCookie(enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + c.Data["payType"] = enum.GetPayType() + c.Data["status"] = enum.GetOrderStatus() + c.Data["userName"] = u.AgentName + c.TplName = "merchant.html" +} + +// @router /user_info/merchant_list/?:params [get] +func (c *UserInfo) MerchantQueryAndListPage() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + mt := make(map[string]string) + mt["belong_agent_uid"] = u.AgentUid + mt["status"] = enum.ACTIVE + + // 该代理商下所有正常商户 + merchants := models.GetMerchantByParams(mt, -1, 0) + + type account struct { + UId string + MerchantName string // 商户名 + Mobile string // 手机号 + Balance float64 // 账户余额 + SettleAmount float64 // 已结算金额 + WaitAmount float64 // 待结算金额 + LoanAmount float64 // 押款金额 + FreezeAmount float64 // 账户冻结金额 + PayAmount float64 // 代付中金额 + } + + type deploy struct { + ChannelName string // 通道名 + PlatRate float64 // 平台费率 + AgentRate float64 // 代理商费率 + } + + mtd := make(map[string]string) + mtd["status"] = enum.ACTIVE + var ( + count = 0 // 计算该代理商下的商户有多少个通道 + accounts []account // 每个商户的账户信息 + ) + for _, m := range merchants { + mtd["merchant_uid"] = m.MerchantUid + lens := models.GetMerchantDeployLenByMap(mtd) + count += lens + + ac := models.GetAccountByUid(m.MerchantUid) + accounts = append(accounts, account{ + UId: m.MerchantUid, + MerchantName: m.MerchantName, + Mobile: m.LoginAccount, + Balance: ac.Balance, + SettleAmount: ac.SettleAmount, + WaitAmount: ac.WaitAmount, + LoanAmount: ac.LoanAmount, + FreezeAmount: ac.FreezeAmount, + PayAmount: ac.PayforAmount, + }) + } + + // 每个商户的通道信息 + deploys := make(map[string][]deploy) + if count != 0 { + for _, a := range accounts { + mtd["merchant_uid"] = a.UId + + mdl := models.GetMerchantDeployListByMap(mtd, -1, 0) + for _, m := range mdl { + road := models.GetRoadInfoByRoadUid(m.SingleRoadUid) + fee := road.BasicFee + m.SingleRoadPlatformRate + m.SingleRoadAgentRate + if fee < 0.00000001 { + fee = road.BasicFee + m.RollRoadPlatformRate + m.RollRoadAgentRate + } + afee := m.SingleRoadAgentRate + if afee < 0.00000001 { + afee = m.RollRoadAgentRate + } + deploys[a.UId] = append(deploys[a.UId], deploy{ + ChannelName: road.ProductName, + PlatRate: fee, + AgentRate: afee, + }) + } + } + } + + // 数据回显 + out := make(map[string]interface{}) + out["ac"] = accounts + out["dp"] = deploys + out["count"] = count + + c.Data["json"] = out + c.ServeJSON() + c.StopRun() +} diff --git a/jhagent/controllers/withdraw.go b/jhagent/controllers/withdraw.go new file mode 100644 index 0000000..024fa32 --- /dev/null +++ b/jhagent/controllers/withdraw.go @@ -0,0 +1,274 @@ +/*************************************************** + ** @Desc : This file for 代付申请和记录 + ** @Time : 19.12.4 10:50 + ** @Author : Joker + ** @File : withdraw + ** @Last Modified by : Joker + ** @Last Modified time: 19.12.4 10:50 + ** @Software: GoLand +****************************************************/ +package controllers + +import ( + "fmt" + "github.com/rs/xid" + "juhe/jhagent/sys/enum" + "juhe/jhagent/utils" + "juhe/service/common" + "juhe/service/models" + "regexp" + "strconv" + "strings" +) + +type Withdraw struct { + KeepSession +} + +// @router /withdraw/show_ui +func (c *Withdraw) ShowWithdrawUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ranMd5 := encrypt.EncodeMd5([]byte(pubMethod.RandomString(46))) + c.Ctx.SetCookie(enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + c.Data["bankInfo"] = enum.GetBankInfo() + c.Data["userName"] = u.AgentName + c.TplName = "withdraw/withdraw.html" +} + +// 获取账户提现余额 +// @router /withdraw/balance +func (c *Withdraw) UserBalance() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ac := models.GetAccountByUid(u.AgentUid) + balance := ac.Balance + if balance < 0 { + balance = 0 + } + + out := make(map[string]interface{}) + out["fee"] = enum.SettlementFee + out["balance"] = fmt.Sprintf("%0.2f", balance) + + c.Data["json"] = out + c.ServeJSON() + c.StopRun() +} + +// 验证卡号和金额是否正确 +func verifyAccountAndMoney(bankCode, accountName, cardNo, bankAccountType, province, city, bankAccountAddress, moblieNo, amount string, ac models.AccountInfo) (b bool, msg string) { + if bankCode == "" || accountName == "" || cardNo == "" { + msg = "银行名、账户名或卡号不能为空!" + return false, msg + } + if moblieNo == "" || amount == "" { + msg = "手机号或金额不能为空!" + return false, msg + } + matched, _ := regexp.MatchString(enum.MobileReg, moblieNo) + if !matched { + msg = "请输入正确的手机号!" + return false, msg + } + matched, _ = regexp.MatchString(enum.MoneyReg, amount) + if !matched { + msg = "请输入正确的金额!" + return false, msg + } + f, err := strconv.ParseFloat(amount, 10) + if err != nil { + msg = "请输入正确的金额!" + return false, msg + } + + if strings.Compare(enum.PublicAccount, bankAccountType) == 0 { + if province == "" || city == "" || bankAccountAddress == "" { + msg = "开户行全称、所在省份或所在城市不能为空!" + return false, msg + } + } + + if f > enum.WithdrawalMaxAmount || f < enum.WithdrawalMinAmount || f+enum.SettlementFee > ac.WaitAmount { + utils.LogInfo(fmt.Sprintf("提现金额超出限制,提现金额:%f,账户可结算余额:%f,提现最小额:%d,最大额:%d,手续费:%d", + f, ac.WaitAmount, enum.WithdrawalMinAmount, enum.WithdrawalMaxAmount, enum.SettlementFee)) + msg = "提现金额超出限制!" + return false, msg + } + + if f+enum.SettlementFee > ac.Balance || ac.Balance <= 0 { + utils.LogInfo(fmt.Sprintf("账户金额不足,提现金额:%f,账户余额:%f,手续费:%d", + f, ac.Balance, enum.SettlementFee)) + msg = "账户可用金额不足!" + return false, msg + } + // 由于没有发生错误,必须把msg重置为初始值,而不是空值 + return true, enum.FailedToAdmin +} + +// 单笔提现申请 +// @router /withdraw/launch_single_withdraw/?:params [post] +func (c *Withdraw) LaunchSingleWithdraw() { + bankCode := strings.TrimSpace(c.GetString("bankCode")) + accountName := strings.TrimSpace(c.GetString("accountName")) + cardNo := strings.TrimSpace(c.GetString("cardNo")) + bankAccountType := strings.TrimSpace(c.GetString("bankAccountType")) + province := strings.TrimSpace(c.GetString("province")) + city := strings.TrimSpace(c.GetString("city")) + bankAccountAddress := strings.TrimSpace(c.GetString("bankAccountAddress")) + moblieNo := strings.TrimSpace(c.GetString("moblieNo")) + money := strings.TrimSpace(c.GetString("amount")) + mobileCode := strings.TrimSpace(c.GetString("smsVerifyCode")) + + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + var ( + msg = enum.FailedString + flag = enum.FailedFlag + + matched bool + + amount float64 + + ac models.AccountInfo + sett models.PayforInfo + url string + ) + + if u.PayPassword == "" { + msg = "请设置支付密码!" + goto stopRun + } + if strings.Compare(strings.ToUpper(encrypt.EncodeMd5([]byte(mobileCode))), u.PayPassword) != 0 { + msg = "支付密码输入错误!" + goto stopRun + } + + ac = models.GetAccountByUid(u.AgentUid) + matched, msg = verifyAccountAndMoney(bankCode, accountName, cardNo, bankAccountType, province, city, + bankAccountAddress, moblieNo, money, ac) + if !matched { + goto stopRun + } + + u = models.GetAgentInfoByAgentUid(u.AgentUid) + if strings.Compare(enum.ACTIVE, u.Status) != 0 { + msg = "账户状态异常,请联系管理人员!" + goto stopRun + } + + amount, _ = strconv.ParseFloat(money, 10) + sett = models.PayforInfo{ + PayforUid: "pppp" + xid.New().String(), + MerchantUid: u.AgentUid, + MerchantName: u.AgentName, + PhoneNo: u.AgentPhone, + MerchantOrderId: xid.New().String(), + BankOrderId: "4444" + xid.New().String(), + PayforFee: common.PAYFOR_FEE, + Type: common.SELF_MERCHANT, + PayforAmount: amount, + PayforTotalAmount: amount + common.PAYFOR_FEE, + BankCode: bankCode, + BankName: enum.GetBankInfo()[bankCode], + IsSend: common.NO, + BankAccountName: accountName, + BankAccountNo: cardNo, + BankAccountType: bankAccountType, + BankAccountAddress: province + city + bankAccountAddress, + Status: common.PAYFOR_COMFRIM, + CreateTime: pubMethod.GetNowTime(), + UpdateTime: pubMethod.GetNowTime(), + } + + matched = models.InsertPayfor(sett) + if matched { + flag = enum.SuccessFlag + msg = "提交成功,等待审核中,请在结算信息中查询状态!" + url = "/withdraw/show_list_ui" + } + +stopRun: + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, url) + c.ServeJSON() + c.StopRun() +} + +// 提现列表 +// @router /withdraw/show_list_ui +func (c *Withdraw) ShowListUI() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + ranMd5 := encrypt.EncodeMd5([]byte(pubMethod.RandomString(46))) + c.Ctx.SetCookie(enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.Ctx.SetSecureCookie(ranMd5, enum.UserCookie, ranMd5, enum.CookieExpireTime) + c.SetSession(enum.UserCookie, ranMd5) + + c.Data["payType"] = enum.GetSettlementStatus() + c.Data["userName"] = u.AgentName + c.TplName = "withdraw/withdraw_record.html" +} + +// @router /withdraw/list_record/?:params [get,post] +func (c *Withdraw) WithdrawQueryAndListPage() { + us := c.GetSession(enum.UserSession) + u := us.(models.AgentInfo) + + // 分页参数 + page, _ := strconv.Atoi(c.GetString("page")) + limit, _ := strconv.Atoi(c.GetString("limit")) + if limit == 0 { + limit = 15 + } + + // 查询参数 + in := make(map[string]string) + merchantNo := strings.TrimSpace(c.GetString("MerchantNo")) + bankNo := strings.TrimSpace(c.GetString("BankNo")) + start := strings.TrimSpace(c.GetString("start")) + end := strings.TrimSpace(c.GetString("end")) + status := strings.TrimSpace(c.GetString("status")) + + in["bank_order_id"] = bankNo + in["merchant_order_id"] = merchantNo + in["status"] = status + in["merchant_uid"] = u.AgentUid + + if start != "" { + in["create_time__gte"] = start + } + if end != "" { + in["create_time__lte"] = end + } + + // 计算分页数 + count := models.GetPayForLenByMap(in) + totalPage := count / limit // 计算总页数 + if count%limit != 0 { // 不满一页的数据按一页计算 + totalPage++ + } + + // 数据获取 + var list []models.PayforInfo + if page <= totalPage { + list = models.GetPayForByMap(in, limit, (page-1)*limit) + } + + // 数据回显 + out := make(map[string]interface{}) + out["limit"] = limit // 分页数据 + out["page"] = page + out["totalPage"] = totalPage + out["root"] = list // 显示数据 + + c.Data["json"] = out + c.ServeJSON() + c.StopRun() +} diff --git a/jhagent/main.go b/jhagent/main.go new file mode 100644 index 0000000..3230a8e --- /dev/null +++ b/jhagent/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "github.com/astaxie/beego" + "github.com/astaxie/beego/orm" + _ "juhe/jhagent/routers" + "juhe/jhagent/sys" + "juhe/jhagent/utils" + "juhe/service/service_init" +) + +func init() { + // 初始化日志 + utils.InitLogs() + + // 初始化数据库 + service_init.InitAll() + + // 初始化Session + sys.InitSession() + + // 如果是开发模式,则显示命令信息 + isDev := !(beego.AppConfig.String("runmode") != "dev") + if isDev { + orm.Debug = isDev + } +} + +func main() { + beego.Run() +} diff --git a/jhagent/routers/commentsRouter_controllers.go b/jhagent/routers/commentsRouter_controllers.go new file mode 100644 index 0000000..4f3ad1f --- /dev/null +++ b/jhagent/routers/commentsRouter_controllers.go @@ -0,0 +1,314 @@ +package routers + +import ( + "github.com/astaxie/beego" + "github.com/astaxie/beego/context/param" +) + +func init() { + + beego.GlobalControllerRouter["juhe/jhagent/controllers:DealExcel"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:DealExcel"], + beego.ControllerComments{ + Method: "DownloadExcelModel", + Router: `/excel/download`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:DealExcel"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:DealExcel"], + beego.ControllerComments{ + Method: "DownloadRecordExcel", + Router: `/excel/download_excel/?:params`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:DealExcel"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:DealExcel"], + beego.ControllerComments{ + Method: "MakeComplaintExcel", + Router: `/excel/make_complaint_record_excel/?:params`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:DealExcel"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:DealExcel"], + beego.ControllerComments{ + Method: "MakeOrderExcel", + Router: `/excel/make_order_excel/?:params`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:DealExcel"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:DealExcel"], + beego.ControllerComments{ + Method: "MakeWithdrawExcel", + Router: `/excel/make_withdraw_record_excel/?:params`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:History"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:History"], + beego.ControllerComments{ + Method: "HistoryQueryAndListPage", + Router: `/history/list_history_record/?:params`, + AllowHTTPMethods: []string{"get","post"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:History"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:History"], + beego.ControllerComments{ + Method: "ShowHistoryListUI", + Router: `/history/show_history_list_ui`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"], + beego.ControllerComments{ + Method: "LoadUserAccountInfo", + Router: `/index/loadInfo/`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"], + beego.ControllerComments{ + Method: "LoadOrderCount", + Router: `/index/loadOrders`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"], + beego.ControllerComments{ + Method: "LoadCountOrder", + Router: `/index/load_count_order`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"], + beego.ControllerComments{ + Method: "LoadUserPayWay", + Router: `/index/pay_way`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"], + beego.ControllerComments{ + Method: "LoadUserPayWayUI", + Router: `/index/show_pay_way_ui`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Index"], + beego.ControllerComments{ + Method: "ShowUI", + Router: `/index/ui/`, + AllowHTTPMethods: []string{"get","post"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"], + beego.ControllerComments{ + Method: "Index", + Router: `/`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"], + beego.ControllerComments{ + Method: "FlushCaptcha", + Router: `/flushCaptcha.py/`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"], + beego.ControllerComments{ + Method: "UserLogin", + Router: `/login.py/?:params`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"], + beego.ControllerComments{ + Method: "LoginOut", + Router: `/loginOut.py`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"], + beego.ControllerComments{ + Method: "PayDoc", + Router: `/pay_doc.py`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Login"], + beego.ControllerComments{ + Method: "VerifyCaptcha", + Router: `/verifyCaptcha.py/:value/:chaId`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:MultiWithdraw"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:MultiWithdraw"], + beego.ControllerComments{ + Method: "ShowMultiWithdrawUI", + Router: `/multi_withdraw/show_multi_ui`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:TradeRecord"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:TradeRecord"], + beego.ControllerComments{ + Method: "ComplaintQueryAndListPage", + Router: `/trade/complaint/?:params`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:TradeRecord"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:TradeRecord"], + beego.ControllerComments{ + Method: "TradeQueryAndListPage", + Router: `/trade/list/?:params`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:TradeRecord"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:TradeRecord"], + beego.ControllerComments{ + Method: "ShowComplaintUI", + Router: `/trade/show_complaint_ui`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:TradeRecord"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:TradeRecord"], + beego.ControllerComments{ + Method: "ShowUI", + Router: `/trade/show_ui`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"], + beego.ControllerComments{ + Method: "ConfirmOriginPayPwd", + Router: `/user_info/confirm_pay_pwd/?:params`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"], + beego.ControllerComments{ + Method: "ConfirmOriginPwd", + Router: `/user_info/confirm_pwd/?:params`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"], + beego.ControllerComments{ + Method: "MerchantQueryAndListPage", + Router: `/user_info/merchant_list/?:params`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"], + beego.ControllerComments{ + Method: "ModifyUserInfo", + Router: `/user_info/modify_userInfo/?:params`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"], + beego.ControllerComments{ + Method: "SetPayPassword", + Router: `/user_info/set_pay_password/?:params`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"], + beego.ControllerComments{ + Method: "ShowMerchantUI", + Router: `/user_info/show_merchant_ui`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"], + beego.ControllerComments{ + Method: "ShowModifyUserInfoUI", + Router: `/user_info/show_modify_ui`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:UserInfo"], + beego.ControllerComments{ + Method: "ShowUserInfoUI", + Router: `/user_info/show_ui`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"], + beego.ControllerComments{ + Method: "LaunchMultiWithdraw", + Router: `/multi_withdraw/launch_multi_withdraw/?:params`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"], + beego.ControllerComments{ + Method: "UserBalance", + Router: `/withdraw/balance`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"], + beego.ControllerComments{ + Method: "LaunchSingleWithdraw", + Router: `/withdraw/launch_single_withdraw/?:params`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"], + beego.ControllerComments{ + Method: "WithdrawQueryAndListPage", + Router: `/withdraw/list_record/?:params`, + AllowHTTPMethods: []string{"get","post"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"], + beego.ControllerComments{ + Method: "ShowListUI", + Router: `/withdraw/show_list_ui`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + + beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"] = append(beego.GlobalControllerRouter["juhe/jhagent/controllers:Withdraw"], + beego.ControllerComments{ + Method: "ShowWithdrawUI", + Router: `/withdraw/show_ui`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + +} diff --git a/jhagent/routers/router.go b/jhagent/routers/router.go new file mode 100644 index 0000000..10745ec --- /dev/null +++ b/jhagent/routers/router.go @@ -0,0 +1,23 @@ +package routers + +import ( + "github.com/astaxie/beego" + "github.com/dchest/captcha" + "juhe/jhagent/controllers" +) + +func init() { + //生产登录验证码 + beego.Handler("/img.do/*.png", captcha.Server(130, 40)) + + beego.Include( + &controllers.Login{}, + &controllers.Index{}, + &controllers.TradeRecord{}, + &controllers.UserInfo{}, + &controllers.Withdraw{}, + &controllers.DealExcel{}, + &controllers.MultiWithdraw{}, + &controllers.History{}, + ) +} diff --git a/jhagent/static/css/custom.css b/jhagent/static/css/custom.css new file mode 100644 index 0000000..a4b5576 --- /dev/null +++ b/jhagent/static/css/custom.css @@ -0,0 +1 @@ +/* your styles go here */ \ No newline at end of file diff --git a/jhagent/static/css/fontastic.css b/jhagent/static/css/fontastic.css new file mode 100644 index 0000000..0bc6299 --- /dev/null +++ b/jhagent/static/css/fontastic.css @@ -0,0 +1,121 @@ +@charset "UTF-8"; + +@font-face { + font-family: "dashboard"; + src:url("../fonts/dashboard.eot"); + src:url("../fonts/dashboard.eot?#iefix") format("embedded-opentype"), + url("../fonts/dashboard.woff") format("woff"), + url("../fonts/dashboard.ttf") format("truetype"), + url("../fonts/dashboard.svg#dashboard") format("svg"); + font-weight: normal; + font-style: normal; + +} + +[data-icon]:before { + font-family: "dashboard" !important; + content: attr(data-icon); + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +[class^="icon-"]:before, +[class*=" icon-"]:before { + font-family: "dashboard" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-home:before { + content: "\62"; +} +.icon-form:before { + content: "\61"; +} +.icon-list:before { + content: "\63"; +} +.icon-presentation:before { + content: "\65"; +} +.icon-bill:before { + content: "\66"; +} +.icon-check:before { + content: "\67"; +} +.icon-list-1:before { + content: "\68"; +} +.icon-padnote:before { + content: "\69"; +} +.icon-pencil-case:before { + content: "\6a"; +} +.icon-user:before { + content: "\6b"; +} +.icon-bars:before { + content: "\6c"; +} +.icon-line-chart:before { + content: "\70"; +} +.icon-flask:before { + content: "\6d"; +} +.icon-grid:before { + content: "\6e"; +} +.icon-picture:before { + content: "\6f"; +} +.icon-website:before { + content: "\71"; +} +.icon-screen:before { + content: "\72"; +} +.icon-interface-windows:before { + content: "\73"; +} +.icon-clock:before { + content: "\74"; +} +.icon-rss-feed:before { + content: "\75"; +} +.icon-mail:before { + content: "\64"; +} +.icon-ios-email-outline:before { + content: "\76"; +} +.icon-paper-airplane:before { + content: "\77"; +} +.icon-ios-email:before { + content: "\78"; +} +.icon-page:before { + content: "\41"; +} +.icon-close:before { + content: "\79"; +} +.icon-search:before { + content: "\7a"; +} diff --git a/jhagent/static/css/style.blue.css b/jhagent/static/css/style.blue.css new file mode 100644 index 0000000..c3788fe --- /dev/null +++ b/jhagent/static/css/style.blue.css @@ -0,0 +1,3496 @@ +/* +========================================================== +========================================================== + +Bootstrap 4 Admin Template + +https://bootstrapious.com/p/admin-template + +========================================================== +========================================================== +*/ +/* +* ========================================================== +* GENERAL STYLES +* ========================================================== +*/ +body { + overflow-x: hidden; +} + +a, +i, +span { + display: inline-block; + text-decoration: none; + -webkit-transition: all 0.3s; + transition: all 0.3s; +} + +a:hover, a:focus, +i:hover, +i:focus, +span:hover, +span:focus { + text-decoration: none; +} + +section { + padding: 50px 0; +} + +canvas { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.container-fluid { + padding: 0 30px; +} + +@media (max-width: 575px) { + .container-fluid { + padding: 0 15px; + } +} + +header.page-header { + padding: 20px 0; +} + +table { + font-size: 0.9em; + color: #666; +} + +.card-close { + position: absolute; + top: 15px; + right: 15px; +} + +.card-close .dropdown-toggle { + color: #999; + background: none; + border: none; +} + +.card-close .dropdown-toggle:after { + display: none; +} + +.card-close .dropdown-menu { + border: none; + min-width: auto; + font-size: 0.9em; + border-radius: 0; + -webkit-box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.1), -2px -2px 3px rgba(0, 0, 0, 0.1); + box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.1), -2px -2px 3px rgba(0, 0, 0, 0.1); +} + +.card-close .dropdown-menu a { + color: #999 !important; +} + +.card-close .dropdown-menu a:hover { + background: #2b90d9; + color: #fff !important; +} + +.card-close .dropdown-menu a i { + margin-right: 10px; + -webkit-transition: none; + transition: none; +} + +.content-inner { + position: relative; + width: calc(100% - 250px); + min-height: calc(100vh - 70px); + padding-bottom: 60px; +} + +.content-inner.active { + width: calc(100% - 90px); +} + +.page-header { + background: #fff; + padding: 20px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1); + position: relative; + z-index: 8; +} + +*[class*="icon-"] { + -webkit-transform: translateY(3px); + transform: translateY(3px); +} + +button, +input { + outline: none !important; +} + +.card { + margin-bottom: 30px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); +} + +.card-header { + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.05); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.05); +} + +.card-header h1, +.card-header h2, +.card-header h3, +.card-header h4, +.card-header h5, +.card-header h6 { + margin-bottom: 0; +} + +.breadcrumb-holder { + background: #fff; +} + +.breadcrumb { + background: #fff; + position: relative; + z-index: 7; + border-radius: 0; + padding: 15px 0; + margin-bottom: 0; +} + +.breadcrumb li.breadcrumb-item { + color: #aaa; + font-weight: 300; +} + +/*=== Helpers ===*/ +.text-bold { + font-weight: 700; +} + +.text-small { + font-size: 0.9rem; +} + +.text-xsmall { + font-size: 0.8rem; +} + +.bg-red { + background: #ff7676 !important; + color: #fff; +} + +.bg-red:hover { + color: #fff; +} + +.bg-blue { + background: #85b4f2 !important; + color: #fff; +} + +.bg-blue:hover { + color: #fff; +} + +.bg-yellow { + background: #eef157 !important; + color: #fff; +} + +.bg-yellow:hover { + color: #fff; +} + +.bg-green { + background: #54e69d !important; + color: #fff; +} + +.bg-green:hover { + color: #fff; +} + +.bg-orange { + background: #ffc36d !important; + color: #fff; +} + +.bg-orange:hover { + color: #fff; +} + +.bg-violet { + background: #796AEE !important; + color: #fff; +} + +.bg-violet:hover { + color: #fff; +} + +.bg-gray { + background: #ced4da !important; +} + +.bg-white { + background: #fff !important; +} + +.text-red { + color: #ff7676; +} + +.text-red:hover { + color: #ff7676; +} + +.text-yellow { + color: #eef157; +} + +.text-yellow:hover { + color: #eef157; +} + +.text-green { + color: #54e69d; +} + +.text-green:hover { + color: #54e69d; +} + +.text-orange { + color: #ffc36d; +} + +.text-orange:hover { + color: #ffc36d; +} + +.text-violet { + color: #796AEE; +} + +.text-violet:hover { + color: #796AEE; +} + +.text-blue { + color: #85b4f2; +} + +.text-blue:hover { + color: #85b4f2; +} + +.text-gray { + color: #ced4da; +} + +.text-gray:hover { + color: #ced4da; +} + +.text-uppercase { + letter-spacing: 0.2em; +} + +.lh-2 { + line-height: 2; +} + +.page { + background: #EEF5F9; +} + +.page .text-white { + color: #fff; +} + +.no-padding { + padding: 0 !important; +} + +.no-padding-bottom { + padding-bottom: 0 !important; +} + +.no-padding-top { + padding-top: 0 !important; +} + +.no-margin { + margin: 0 !important; +} + +.no-margin-bottom { + margin-bottom: 0 !important; +} + +.no-margin-top { + margin-top: 0 !important; +} + +.page { + overflow-x: hidden; +} + +.has-shadow { + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); +} + +.badge { + font-weight: 400; +} + +.badge-rounded { + border-radius: 50px; +} + +.list-group-item { + border-right: 0; + border-left: 0; +} + +.list-group-item:first-child, .list-group-item:last-child { + border-radius: 0; +} + +.overflow-hidden { + overflow: hidden; +} + +.tile-link { + position: absolute; + cursor: pointer; + width: 100%; + height: 100%; + left: 0; + top: 0; + z-index: 30; +} + +/* +* ========================================================== +* SIDEBAR +* ========================================================== +*/ +nav.side-navbar { + background: #fff; + min-width: 250px; + max-width: 250px; + color: #686a76; + -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + z-index: 9; + /*==== Sidebar Header ====*/ + /*==== Sidebar Menu ====*/ + /*==== Shrinked Sidebar ====*/ +} + +nav.side-navbar a { + color: inherit; + position: relative; + font-size: 0.9em; +} + +nav.side-navbar a[data-toggle="collapse"]::before { + content: '\f104'; + display: inline-block; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + font-family: 'FontAwesome'; + position: absolute; + top: 50%; + right: 20px; +} + +nav.side-navbar a[aria-expanded="true"] { + background: #EEF5F9; +} + +nav.side-navbar a[aria-expanded="true"]::before { + content: '\f107'; +} + +nav.side-navbar a i { + font-size: 1.2em; + margin-right: 10px; + -webkit-transition: none; + transition: none; +} + +nav.side-navbar .sidebar-header { + padding: 30px 15px; +} + +nav.side-navbar .avatar { + width: 55px; + height: 55px; +} + +nav.side-navbar .title { + margin-left: 10px; +} + +nav.side-navbar .title h1 { + color: #333; +} + +nav.side-navbar .title p { + font-size: 0.9em; + font-weight: 200; + margin-bottom: 0; + color: #aaa; +} + +nav.side-navbar span.heading { + text-transform: uppercase; + font-weight: 400; + margin-left: 20px; + color: #ccc; + font-size: 0.8em; +} + +nav.side-navbar ul { + padding: 15px 0; +} + +nav.side-navbar ul li { + /* submenu item active */ +} + +nav.side-navbar ul li a { + padding: 10px 15px; + text-decoration: none; + display: block; + font-weight: 300; + border-left: 4px solid transparent; +} + +nav.side-navbar ul li a:hover { + background: #2b90d9; + border-left: 4px solid #1c669c; + color: #fff; +} + +nav.side-navbar ul li li a { + padding-left: 50px; + background: #EEF5F9; +} + +nav.side-navbar ul li.active > a { + background: #2b90d9; + color: #fff; + border-left: 4px solid #1c669c; +} + +nav.side-navbar ul li.active > a:hover { + background: #2b90d9; +} + +nav.side-navbar ul li li.active > a { + background: #419bdd; +} + +nav.side-navbar ul li ul { + padding: 0; +} + +nav.side-navbar.shrinked { + min-width: 90px; + max-width: 90px; + text-align: center; +} + +nav.side-navbar.shrinked span.heading { + margin: 0; +} + +nav.side-navbar.shrinked ul li a { + padding: 15px 2px; + border: none; + font-size: 0.8em; + color: #aaa; + -webkit-transition: color 0.3s, background 0.3s; + transition: color 0.3s, background 0.3s; +} + +nav.side-navbar.shrinked ul li a[data-toggle="collapse"]::before { + content: '\f107'; + -webkit-transform: translateX(50%); + transform: translateX(50%); + position: absolute; + top: auto; + right: 50%; + bottom: 0; + left: auto; +} + +nav.side-navbar.shrinked ul li a[data-toggle="collapse"][aria-expanded="true"]::before { + content: '\f106'; +} + +nav.side-navbar.shrinked ul li a:hover { + color: #fff; + border: none; +} + +nav.side-navbar.shrinked ul li a:hover i { + color: #fff; +} + +nav.side-navbar.shrinked ul li a i { + margin-right: 0; + margin-bottom: 2px; + display: block; + font-size: 1rem; + color: #333; + -webkit-transition: color 0.3s; + transition: color 0.3s; +} + +nav.side-navbar.shrinked ul li.active > a { + color: #fff; +} + +nav.side-navbar.shrinked ul li.active > a i { + color: #fff; +} + +nav.side-navbar.shrinked .sidebar-header .title { + display: none; +} + +/* SIDEBAR MEDIAQUERIES ----------------------------------- */ +@media (max-width: 1199px) { + nav.side-navbar { + margin-left: -90px; + min-width: 90px; + max-width: 90px; + text-align: center; + overflow: hidden; + } + nav.side-navbar span.heading { + margin: 0; + } + nav.side-navbar ul li a { + padding: 15px 2px; + border: none; + font-size: 0.8em; + color: #aaa; + -webkit-transition: color 0.3s, background 0.3s; + transition: color 0.3s, background 0.3s; + } + nav.side-navbar ul li a[data-toggle="collapse"]::before { + content: '\f107'; + -webkit-transform: translateX(50%); + transform: translateX(50%); + position: absolute; + top: auto; + right: 50%; + bottom: 0; + left: auto; + } + nav.side-navbar ul li a[data-toggle="collapse"][aria-expanded="true"]::before { + content: '\f106'; + } + nav.side-navbar ul li a:hover { + color: #fff; + border: none; + } + nav.side-navbar ul li a:hover i { + color: #fff; + } + nav.side-navbar ul li a i { + margin-right: 0; + margin-bottom: 5px; + display: block; + font-size: 1.6em; + color: #333; + -webkit-transition: color 0.3s; + transition: color 0.3s; + } + nav.side-navbar ul li.active > a { + color: #fff; + } + nav.side-navbar ul li.active > a i { + color: #fff; + } + nav.side-navbar .sidebar-header .title { + display: none; + } + nav.side-navbar.shrinked { + margin-left: 0; + } + .content-inner { + width: 100%; + } + .content-inner.active { + width: calc(100% - 90px); + } +} + +/* +* ========================================================== +* MAIN NAVBAR +* ========================================================== +*/ +nav.navbar { + background: #2f333e; + padding-top: 15px; + padding-bottom: 15px; + color: #fff; + position: relative; + border-radius: 0; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2); + z-index: 10; + padding-left: 0; + padding-right: 0; + /*==== Toggle Sidebar Btn ====*/ + /*==== Navbar Items ====*/ + /*==== Search Box ====*/ + /*==== Dropdowns ====*/ +} + +nav.navbar .badge { + width: 22px; + height: 22px; + line-height: 22px; + text-align: center; + padding: 0; + border-radius: 50%; +} + +nav.navbar .navbar-holder { + width: 100%; +} + +nav.navbar a { + color: inherit; +} + +nav.navbar .container-fluid { + width: 100%; +} + +nav.navbar .menu-btn { + margin-right: 20px; + font-size: 1.2em; + -webkit-transition: all 0.7s; + transition: all 0.7s; +} + +nav.navbar .menu-btn span { + width: 20px; + height: 2px; + background: #fff; + display: block; + margin: 4px auto 0; + -webkit-transition: all 0.3s cubic-bezier(0.81, -0.33, 0.345, 1.375); + transition: all 0.3s cubic-bezier(0.81, -0.33, 0.345, 1.375); +} + +nav.navbar .menu-btn span:nth-of-type(2) { + position: relative; + width: 35px; + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); +} + +nav.navbar .menu-btn span:nth-of-type(2)::before, nav.navbar .menu-btn span:nth-of-type(2)::after { + content: ''; + width: 6px; + height: 2px; + display: block; + background: #fff; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + top: 2px; + left: 0; + -webkit-transition: all 0.7s; + transition: all 0.7s; +} + +nav.navbar .menu-btn span:nth-of-type(2)::after { + -webkit-transform: rotate(145deg); + transform: rotate(145deg); + position: absolute; + top: -2px; + left: 0; +} + +nav.navbar .menu-btn.active span:first-of-type { + -webkit-transform: translateY(12px); + transform: translateY(12px); +} + +nav.navbar .menu-btn.active span:nth-of-type(2) { + -webkit-transform: none; + transform: none; +} + +nav.navbar .menu-btn.active span:last-of-type { + -webkit-transform: translateY(-12px); + transform: translateY(-12px); +} + +nav.navbar .nav-link { + position: relative; +} + +nav.navbar .nav-link span.badge-corner { + position: absolute; + top: 0; + right: 0; + font-weight: 400; + font-size: 0.7em; +} + +nav.navbar .nav-link.language span { + margin-left: .3rem; + vertical-align: middle; +} + +nav.navbar .nav-link.logout i { + margin-left: 10px; +} + +nav.navbar .nav-menu { + margin-bottom: 0; +} + +nav.navbar .search-box { + width: 100%; + height: 100%; + position: absolute; + top: 0; + right: 0; + padding: 0; + background: #fff; + z-index: 12; + border-radius: 0; + display: none; +} + +nav.navbar .search-box .dismiss { + position: absolute; + top: 50%; + right: 20px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + background: none; + border: none; + cursor: pointer; + font-size: 1.5em; + color: #999; +} + +nav.navbar .search-box form { + height: 100%; +} + +nav.navbar .search-box form input { + height: 100%; + border: none; + padding: 20px; +} + +nav.navbar .dropdown-toggle::after { + border: none !important; + content: '\f107'; + vertical-align: baseline; + font-family: 'FontAwesome'; + margin-left: .3rem; +} + +nav.navbar .dropdown-menu { + right: 0; + min-width: 250px; + left: auto; + margin-top: 15px; + margin-bottom: 0; + padding: 15px 0; + max-width: 400px; + border-radius: 0; + border: none; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -2px 0 2px rgba(0, 0, 0, 0.1); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -2px 0 2px rgba(0, 0, 0, 0.1); +} + +nav.navbar .dropdown-menu .dropdown-item { + background: #fff; + padding: 10px 20px; + font-size: 0.8rem; + color: #777; + width: 100%; +} + +nav.navbar .dropdown-menu .dropdown-item:hover { + background: #f5f5f5; +} + +nav.navbar .dropdown-menu .dropdown-item i { + width: 30px; + height: 30px; + line-height: 30px; + background: #2b90d9; + text-align: center; + color: #fff; + border-radius: 50%; + margin-right: 10px; +} + +nav.navbar .dropdown-menu .dropdown-item small { + margin-left: 40px; +} + +nav.navbar .dropdown-menu span { + position: static; + font-size: 0.9em; + color: #999; +} + +nav.navbar .dropdown-menu strong { + font-weight: 700; +} + +nav.navbar .dropdown-menu .msg-profile { + width: 45px; + height: 45px; + margin-right: 10px; +} + +nav.navbar .dropdown-menu h3 { + font-weight: 500; +} + +/* MAIN NAVBAR MEDIAQUERIES ----------------------------------- */ +@media (max-width: 1199px) { + nav.navbar { + /*==== Toggle Sidebar Btn ====*/ + } + nav.navbar .menu-btn { + margin-right: 20px; + font-size: 1.2em; + -webkit-transition: all 0.7s; + transition: all 0.7s; + } + nav.navbar .menu-btn span:first-of-type { + -webkit-transform: translateY(12px); + transform: translateY(12px); + } + nav.navbar .menu-btn span:nth-of-type(2) { + -webkit-transform: none; + transform: none; + } + nav.navbar .menu-btn span:nth-of-type(2)::before, nav.navbar .menu-btn span:nth-of-type(2)::after { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + nav.navbar .menu-btn span:nth-of-type(2)::after { + -webkit-transform: rotate(145deg); + transform: rotate(145deg); + position: absolute; + top: -2px; + left: 0; + } + nav.navbar .menu-btn span:last-of-type { + -webkit-transform: translateY(-12px); + transform: translateY(-12px); + } + nav.navbar .menu-btn.active span:first-of-type { + -webkit-transform: none; + transform: none; + } + nav.navbar .menu-btn.active span:nth-of-type(2) { + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); + } + nav.navbar .menu-btn.active span:last-of-type { + -webkit-transform: none; + transform: none; + } +} + +@media (max-width: 575px) { + nav.navbar { + font-size: 14px; + } + nav.navbar .badge { + width: 19px; + height: 19px; + } + nav.navbar .nav-item > a { + font-size: 13px; + } + nav.navbar .dropdown-menu { + right: auto; + left: -50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + } +} + +/* +* ========================================================== +* DASHBOARD COUNTS SECTION +* ========================================================== +*/ +section.dashboard-counts .icon { + width: 40px; + height: 40px; + line-height: 40px; + text-align: center; + min-width: 40px; + max-width: 40px; + border-radius: 50%; +} + +section.dashboard-counts .title { + font-size: 1.1em; + font-weight: 300; + color: #777; + margin: 0 20px; +} + +section.dashboard-counts .progress { + margin-top: 10px; + height: 4px; +} + +section.dashboard-counts .number { + font-size: 1.8em; + font-weight: 300; +} + +section.dashboard-counts .number strong { + font-weight: 700; +} + +section.dashboard-counts .row { + padding: 30px 15px; + margin: 0; +} + +section.dashboard-counts div[class*='col-'] .item { + border-right: 1px solid #eee; + padding: 15px 0; +} + +section.dashboard-counts div[class*='col-']:last-of-type .item { + border-right: none; +} + +/* DASHBOARD COUNTS MEDIAQUERIES ------------------------ */ +@media (max-width: 1199px) { + section.dashboard-counts div[class*='col-']:nth-of-type(2) .item { + border-right: none; + } +} + +@media (max-width: 575px) { + section.dashboard-counts div[class*='col-'] .item { + border-right: none; + } +} + +/* +* ========================================================== +* DASHBOARD HEADER SECTION +* ========================================================== +*/ +.statistic { + padding: 20px 15px; + margin-bottom: 15px; +} + +.statistic:last-of-type { + margin-bottom: 0; +} + +.statistic strong { + font-size: 1.5em; + color: #333; + font-weight: 700; + line-height: 1; +} + +.statistic small { + color: #aaa; + text-transform: uppercase; +} + +.statistic .icon { + width: 40px; + height: 40px; + line-height: 40px; + text-align: center; + min-width: 40px; + max-width: 40px; + color: #fff; + border-radius: 50%; + margin-right: 15px; +} + +.chart .title { + padding: 15px 0 0 15px; +} + +.chart .title strong { + font-weight: 700; + font-size: 1.2em; +} + +.chart .title small { + color: #aaa; + text-transform: uppercase; +} + +.chart .line-chart { + width: 100%; + height: 100%; + padding: 20px 0; +} + +.chart .line-chart canvas { + width: calc(100% - 30px) !important; +} + +.chart .bar-chart { + margin-bottom: 15px; +} + +.chart .bar-chart canvas { + padding: 15px; + width: 100%; + margin: 0; +} + +/* DASHBOARD HEADER MEDIAQUERIES ------------------------*/ +@media (max-width: 991px) { + section.dashboard-header div[class*='col-'] { + margin-bottom: 20px; + } +} + +/* +* ========================================================== +* PROJECTS SECTION +* ========================================================== +*/ +.project .row { + margin: 0; + padding: 15px 0; + margin-bottom: 15px; +} + +.project div[class*='col-'] { + border-right: 1px solid #eee; +} + +.project .text h3 { + margin-bottom: 0; + color: #555; +} + +.project .text small { + color: #aaa; + font-size: 0.75em; +} + +.project .project-date span { + font-size: 0.9em; + color: #999; +} + +.project .image { + max-width: 50px; + min-width: 50px; + height: 50px; + margin-right: 15px; +} + +.project .time, +.project .comments, +.project .project-progress { + color: #999; + font-size: 0.9em; + margin-right: 20px; +} + +.project .time i, +.project .comments i, +.project .project-progress i { + margin-right: 5px; +} + +.project .project-progress { + width: 200px; +} + +.project .project-progress .progress { + height: 4px; +} + +.project .card { + margin-bottom: 0; +} + +/* PROJECTS SECTION ------------------------------------- */ +@media (max-width: 991px) { + .project .right-col { + margin-top: 20px; + margin-left: 65px; + } + .project .project-progress { + width: 150px; + } +} + +@media (max-width: 480px) { + .project .project-progress { + display: none; + } +} + +/* +* ========================================================== +* CLIENT SECTION +* ========================================================== +*/ +/*====== Work Amount Box ======*/ +.work-amount .chart { + margin: 40px auto; + position: relative; +} + +.work-amount .chart .text { + display: inline-block; + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.work-amount .chart strong { + font-size: 1.5rem; +} + +.work-amount .chart span { + color: #999; + font-weight: 300; +} + +.work-amount li span { + font-size: 0.85em; + margin-bottom: 10px; + color: #777; + display: block; +} + +.work-amount li span::before { + content: ''; + display: inline-block; + margin-right: 10px; + width: 7px; + height: 7px; + line-height: 7px; + background: #85b4f2; + border-radius: 50%; +} + +/*====== Client Profile Box ======*/ +.client .client-avatar { + width: 100px; + height: 100px; + margin: 0 auto; + position: relative; +} + +.client .client-avatar .status { + content: ''; + display: block; + width: 18px; + height: 18px; + border: 3px solid #fff; + border-radius: 50%; + position: absolute; + right: 4px; + bottom: 4px; +} + +.client .client-title { + margin-top: 20px; +} + +.client .client-title h3 { + font-weight: 500; + color: #555; +} + +.client .client-title span { + font-size: 0.9em; + color: #aaa; + display: block; +} + +.client .client-title a { + padding: 2px 30px; + border-radius: 40px; + background: #54e69d; + color: #fff; + margin-top: 5px; + font-size: 0.9em; + text-decoration: none; +} + +.client .client-title a:hover { + background: #85b4f2; +} + +.client .client-info { + margin-top: 20px; +} + +.client .client-info strong { + font-weight: 700; +} + +.client .client-social { + margin-top: 20px; +} + +.client .client-social a { + color: #aaa; +} + +/*====== Total Overdue Box ======*/ +.overdue .chart canvas { + width: 100% !important; + z-index: 1; +} + +.overdue .card { + margin-bottom: 0; +} + +.overdue .card-body { + padding: 20px; +} + +.overdue .card-body small { + font-weight: 300; + color: #aaa; +} + +.overdue .card-body h3 { + margin-bottom: 5px; +} + +.overdue .number { + font-size: 1.8em; + font-weight: 400; + color: #555; + margin: 35px 0; +} + +/* +* ========================================================== +* FEEDS SECTION +* ========================================================== +*/ +/*====== Checklist Box ======*/ +.checklist label { + font-size: 0.8em; + color: #999; + line-height: 1.8em; + margin-bottom: 0; +} + +.checklist .item { + padding: 20px; +} + +.checklist .item:nth-of-type(even) { + background: #fafafa; +} + +/*====== Trending Articles Box ======*/ +.articles a { + text-decoration: none !important; + display: block; + margin-bottom: 0; + color: #555; +} + +.articles .badge { + font-size: 0.7em; + padding: 5px 10px; + line-height: 1; + margin-left: 10px; +} + +.articles .item { + padding: 20px; +} + +.articles .item:nth-of-type(even) { + background: #fafafa; +} + +.articles .item .image { + min-width: 50px; + max-width: 50px; + height: 50px; + margin-right: 15px; +} + +.articles .item img { + padding: 3px; + border: 1px solid #28a745; +} + +.articles .item h3 { + color: #555; + font-weight: 400; + margin-bottom: 0; +} + +.articles .item small { + color: #aaa; + font-size: 0.75em; +} + +/* +* ========================================================== +* UPDATES SECTION +* ========================================================== +*/ +/*====== Recent Updates Box ======*/ +.recent-updates .item { + padding: 20px; +} + +.recent-updates .item:nth-of-type(even) { + background: #fafafa; +} + +.recent-updates .icon { + margin-right: 10px; +} + +.recent-updates h5 { + margin-bottom: 5px; + color: #333; + font-weight: 400; +} + +.recent-updates p { + font-size: 0.8em; + color: #aaa; + margin-bottom: 0; +} + +.recent-updates .date { + font-size: 0.9em; + color: #adadad; +} + +.recent-updates .date strong { + font-size: 1.4em; + line-height: 0.8em; + display: block; +} + +.recent-updates .date span { + font-size: 0.9em; + font-weight: 300; +} + +/*====== Daily Feeds Box ======*/ +.daily-feeds .item { + padding: 20px; + border-bottom: 1px solid #eee; +} + +.daily-feeds .feed-profile { + max-width: 50px; + min-width: 50px; + margin-right: 10px; +} + +.daily-feeds h5 { + margin-bottom: 0; + color: #555; +} + +.daily-feeds span { + font-size: 0.8em; + color: #999; +} + +.daily-feeds .full-date { + font-size: 0.85em; + color: #aaa; + font-weight: 300; +} + +.daily-feeds .CTAs { + margin-top: 5px; +} + +.daily-feeds .CTAs a { + font-size: 0.7em; + padding: 3px 8px; + margin-right: 5px; +} + +.daily-feeds .CTAs a i { + margin-right: 5px; +} + +.daily-feeds .quote { + background: #fafafa; + margin-top: 5px; + border-radius: 0; + padding: 15px; + margin-left: 60px; +} + +.daily-feeds .quote small { + font-size: 0.75em; + color: #777; +} + +.daily-feeds .date { + font-size: 0.9em; + color: #aaa; +} + +/*====== Recent Activities Box ======*/ +.recent-activities .item { + padding: 0 15px; + border-bottom: 1px solid #eee; +} + +.recent-activities .item div[class*='col-'] { + padding: 15px; +} + +.recent-activities h5 { + font-weight: 400; + color: #333; +} + +.recent-activities p { + font-size: 0.75em; + color: #999; +} + +.recent-activities .icon { + width: 35px; + height: 35px; + line-height: 35px; + background: #f5f5f5; + text-align: center; + display: inline-block; +} + +.recent-activities .date { + font-size: 0.75em; + color: #999; + padding: 10px; +} + +.recent-activities .date-holder { + padding: 0 !important; + border-right: 1px solid #eee; +} + +/* +* ========================================================== +* FOOTER +* ========================================================== +*/ +footer.main-footer { + position: absolute; + bottom: 0; + width: 100%; + background: #2f333e; + color: #fff; + padding: 20px 10px; +} + +footer.main-footer a { + color: inherit; +} + +footer.main-footer p { + margin: 0; + font-size: 0.8em; +} + +/* FOOTER MEDIAQUERIES --------------------------------- */ +@media (max-width: 575px) { + footer.main-footer div[class*='col'] { + text-align: center !important; + } +} + +section.charts div[class*="col-"] { + margin-bottom: 30px; +} + +section.charts header { + padding: 30px 0; +} + +section.charts div[class*="col-"] { + margin-bottom: 0; +} + +/* +* ========================================================== +* LINE CHART +* ========================================================== +*/ +.line-chart-example .card-block { + padding: 20px; +} + +/* +* ========================================================== +* POLAR CHART +* ========================================================== +*/ +/* +* ========================================================== +* POLAR CHART +* ========================================================== +*/ +.polar-chart-example canvas { + max-width: 350px; + max-height: 350px; + margin: 20px auto; +} + +/* +* ========================================================== +* PIE CHART +* ========================================================== +*/ +.pie-chart-example canvas { + max-width: 350px; + max-height: 350px; + margin: 15px auto; +} + +/* +* ========================================================== +* RADAR CHART +* ========================================================== +*/ +.radar-chart-example canvas { + max-width: 350px; + max-height: 350px; + margin: 20px auto; +} + +/* FORMS MEDIAQUERIES -------------------------- */ +@media (max-width: 991px) { + section.charts h2 { + font-size: 1rem; + } +} + +/* +* ========================================================== +* FORMS +* ========================================================== +*/ +.form-control { + height: calc(2.25rem + 2px); + border: 1px solid #dee2e6; + border-radius: 0; + padding: 0.375rem 0.75rem; +} + +.form-control::-moz-placeholder { + font-size: 0.9em; + font-weight: 300; + font-family: "Poppins", sans-serif; + color: #aaa; +} + +.form-control::-webkit-input-placeholder { + font-size: 0.9em; + font-weight: 300; + font-family: "Poppins", sans-serif; + color: #aaa; +} + +.form-control:-ms-input-placeholder { + font-size: 0.9em; + font-weight: 300; + font-family: "Poppins", sans-serif; + color: #aaa; +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #2b90d9; + outline: none; + -webkit-box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.25); + box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.25); +} + +.form-control-sm { + height: calc(1.8125rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-lg { + height: calc(2.875rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; +} + +textarea.form-control { + height: auto; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +select.form-control option { + color: #999; +} + +.input-group .dropdown-menu { + padding: 15px; + color: #777; + border-radius: 0; +} + +.input-group .dropdown-menu a { + padding: 5px 0; + color: inherit; + text-decoration: none; +} + +.input-group .dropdown-menu a:hover { + color: #2b90d9; + background: none; +} + +.input-group-text { + color: #868e96; + background: #f8f9fa; + border-color: #dee2e6; + border-radius: 0; +} + +.input-group-text .checkbox-template, .input-group-text .radio-template { + -webkit-transform: none; + transform: none; +} + +.form-control-label { + font-size: .9rem; + color: #777; +} + +button, input[type='submit'] { + cursor: pointer; + font-family: inherit; + font-weight: 300 !important; +} + +.input-group .dropdown-toggle { + background: #f5f5f5; + color: #777; +} + +.checkbox-template, .radio-template { + -webkit-transform: translateY(3px); + transform: translateY(3px); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + position: relative; +} + +.checkbox-template + label, .radio-template + label { + margin-left: 10px; +} + +.checkbox-template::before, .radio-template::before { + margin-right: 10px; + content: ''; + display: inline-block; + -webkit-transform: translate(-2px, -2px); + transform: translate(-2px, -2px); + width: 18px; + height: 18px; + line-height: 18px; + text-align: center; + background: #dae2e7; + -webkit-transition: all 0.2s; + transition: all 0.2s; +} + +.checkbox-template::after, .radio-template::after { + content: '\f00c'; + width: 12px; + height: 12px; + line-height: 12px; + text-align: center; + display: block; + font-family: 'FontAwesome'; + position: absolute; + top: 1px; + left: 1px; + font-size: 0.7em; + opacity: 0; + -webkit-transition: all 0.2s; + transition: all 0.2s; + color: #fff; +} + +.checkbox-template:checked::before, .radio-template:checked::before { + background: #2b90d9; +} + +.checkbox-template:checked::after, .radio-template:checked::after { + opacity: 1; +} + +.radio-template::before { + border-radius: 50%; + -webkit-transform: translate(-3px, -3px); + transform: translate(-3px, -3px); +} + +.radio-template::after { + width: 6px; + height: 6px; + line-height: 6px; + text-align: center; + position: absolute; + top: 3px; + left: 3px; + border-radius: 50%; + content: ''; +} + +.radio-template:checked::after { + background: #fff; +} + +input.input-material { + width: 100%; + border: none; + border-bottom: 1px solid #eee; + padding: 10px 0; +} + +input.input-material.is-invalid { + border-color: #dc3545 !important; +} + +input.input-material:focus { + border-color: #2b90d9; +} + +input.input-material ~ label { + color: #aaa; + position: absolute; + top: 14px; + left: 0; + cursor: text; + -webkit-transition: all 0.2s; + transition: all 0.2s; + font-weight: 300; +} + +input.input-material ~ label.active { + font-size: 0.8rem; + top: -10px; + color: #2b90d9; +} + +input.input-material.is-invalid ~ label { + color: #dc3545; +} + +.form-group-material { + position: relative; + margin-bottom: 30px; +} + +.modal-content { + border-radius: 0; +} + +.i-checks { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +/* +* ========================================================== +* FORM PAGE +* ========================================================== +*/ +.forms p { + font-size: 0.9em; + color: #555; +} + +.forms form small { + font-size: 0.8em; + color: #999; + font-weight: 300; +} + +.forms .line { + width: 100%; + height: 1px; + border-bottom: 1px dashed #eee; + margin: 30px 0; +} + +/* +* ========================================================== +* LOGIN PAGE +* ========================================================== +*/ +.login-page { + position: relative; +} + +.login-page::before { + content: ''; + width: 100%; + height: 100%; + display: block; + z-index: -1; + background-size: cover; + -webkit-filter: blur(10px); + filter: blur(10px); + z-index: 1; + position: absolute; + top: 0; + right: 0; +} + +.login-page .container { + min-height: 100vh; + z-index: 999; + padding: 20px; + position: relative; +} + +.login-page .form-holder { + width: 100%; + border-radius: 5px; + overflow: hidden; + margin-bottom: 50px; +} + +.login-page .form-holder .info, .login-page .form-holder .form { + min-height: 70vh; + padding: 40px; + height: 100%; +} + +.login-page .form-holder div[class*='col-'] { + padding: 0; +} + +.login-page .form-holder .info { + background: rgba(43, 144, 217, 0.9); + color: #fff; +} + +.login-page .form-holder .info h1 { + font-size: 2.5em; + font-weight: 600; +} + +.login-page .form-holder .info p { + font-weight: 300; +} + +.login-page .form-holder .form .form-group { + position: relative; + margin-bottom: 30px; +} + +.login-page .form-holder .form .content { + width: 100%; +} + +.login-page .form-holder .form form { + width: 100%; + max-width: 400px; +} + +.login-page .form-holder .form #login, .login-page .form-holder .form #register { + margin-bottom: 20px; + cursor: pointer; +} + +.login-page .form-holder .form a.forgot-pass, .login-page .form-holder .form a.signup { + font-size: 0.9em; + color: #85b4f2; +} + +.login-page .form-holder .form small { + color: #aaa; +} + +.login-page .form-holder .form .terms-conditions label { + cursor: pointer; + color: #aaa; + font-size: 0.9em; +} + +.login-page .copyrights { + width: 100%; + z-index: 9999; + position: absolute; + bottom: 0; + left: 0; + color: #fff; +} + +@media (max-width: 991px) { + .login-page .info, .login-page .form { + min-height: auto !important; + } + .login-page .info { + padding-top: 100px !important; + padding-bottom: 100px !important; + } +} + +/* + +===================== +STYLE SWITCHER FOR DEMO +===================== + +*/ +#style-switch-button { + position: fixed; + top: 120px; + right: 0px; + border-radius: 0; + z-index: 12; +} + +#style-switch { + width: 300px; + padding: 20px; + position: fixed; + top: 160px; + right: 0; + background: #fff; + border: solid 1px #ced4da; + z-index: 12; +} + +#style-switch h4 { + color: #495057; +} + +/* ========================================= + THEMING OF BOOTSTRAP COMPONENTS + ========================================= */ +/* + * 1. NAVBAR + */ +.navbar { + padding: 0.5rem 1rem; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover { + color: rgba(0, 0, 0, 0.7); +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-dark .navbar-brand { + color: #fff; +} + +.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover { + color: rgba(255, 255, 255, 0.75); +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} + +/* + * 2. BUTTONS + */ +.btn { + font-weight: 400; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; +} + +.btn:focus, .btn.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.25); + box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.25); +} + +.btn.disabled, .btn:disabled { + opacity: .65; +} + +.btn:not([disabled]):not(.disabled):active, .btn:not([disabled]):not(.disabled).active { + background-image: none; +} + +.btn-primary { + color: color-yiq(#2b90d9); + background-color: #2b90d9; + border-color: #2b90d9; +} + +.btn-primary:hover { + color: color-yiq(#227bbc); + background-color: #227bbc; + border-color: #2074b1; +} + +.btn-primary:focus, .btn-primary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.5); + box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.5); +} + +.btn-primary.disabled, .btn-primary:disabled { + color: color-yiq(#2b90d9); + background-color: #2b90d9; + border-color: #2b90d9; +} + +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, +.show > .btn-primary.dropdown-toggle { + color: color-yiq(#2074b1); + background-color: #2074b1; + border-color: #1e6da6; +} + +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.5); + box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.5); +} + +.btn-secondary { + color: color-yiq(#868e96); + background-color: #868e96; + border-color: #868e96; +} + +.btn-secondary:hover { + color: color-yiq(#727b84); + background-color: #727b84; + border-color: #6c757d; +} + +.btn-secondary:focus, .btn-secondary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-secondary.disabled, .btn-secondary:disabled { + color: color-yiq(#868e96); + background-color: #868e96; + border-color: #868e96; +} + +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, +.show > .btn-secondary.dropdown-toggle { + color: color-yiq(#6c757d); + background-color: #6c757d; + border-color: #666e76; +} + +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-success { + color: color-yiq(#28a745); + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:hover { + color: color-yiq(#218838); + background-color: #218838; + border-color: #1e7e34; +} + +.btn-success:focus, .btn-success.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-success.disabled, .btn-success:disabled { + color: color-yiq(#28a745); + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, +.show > .btn-success.dropdown-toggle { + color: color-yiq(#1e7e34); + background-color: #1e7e34; + border-color: #1c7430; +} + +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-info { + color: color-yiq(#17a2b8); + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:hover { + color: color-yiq(#138496); + background-color: #138496; + border-color: #117a8b; +} + +.btn-info:focus, .btn-info.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-info.disabled, .btn-info:disabled { + color: color-yiq(#17a2b8); + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, +.show > .btn-info.dropdown-toggle { + color: color-yiq(#117a8b); + background-color: #117a8b; + border-color: #10707f; +} + +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-warning { + color: color-yiq(#ffc107); + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:hover { + color: color-yiq(#e0a800); + background-color: #e0a800; + border-color: #d39e00; +} + +.btn-warning:focus, .btn-warning.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-warning.disabled, .btn-warning:disabled { + color: color-yiq(#ffc107); + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, +.show > .btn-warning.dropdown-toggle { + color: color-yiq(#d39e00); + background-color: #d39e00; + border-color: #c69500; +} + +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-danger { + color: color-yiq(#dc3545); + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:hover { + color: color-yiq(#c82333); + background-color: #c82333; + border-color: #bd2130; +} + +.btn-danger:focus, .btn-danger.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-danger.disabled, .btn-danger:disabled { + color: color-yiq(#dc3545); + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, +.show > .btn-danger.dropdown-toggle { + color: color-yiq(#bd2130); + background-color: #bd2130; + border-color: #b21f2d; +} + +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-light { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:hover { + color: color-yiq(#e2e6ea); + background-color: #e2e6ea; + border-color: #dae0e5; +} + +.btn-light:focus, .btn-light.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-light.disabled, .btn-light:disabled { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, +.show > .btn-light.dropdown-toggle { + color: color-yiq(#dae0e5); + background-color: #dae0e5; + border-color: #d3d9df; +} + +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-dark { + color: color-yiq(#343a40); + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:hover { + color: color-yiq(#23272b); + background-color: #23272b; + border-color: #1d2124; +} + +.btn-dark:focus, .btn-dark.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-dark.disabled, .btn-dark:disabled { + color: color-yiq(#343a40); + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, +.show > .btn-dark.dropdown-toggle { + color: color-yiq(#1d2124); + background-color: #1d2124; + border-color: #171a1d; +} + +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-default { + color: color-yiq(#ced4da); + background-color: #ced4da; + border-color: #ced4da; +} + +.btn-default:hover { + color: color-yiq(#b8c1ca); + background-color: #b8c1ca; + border-color: #b1bbc4; +} + +.btn-default:focus, .btn-default.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); + box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); +} + +.btn-default.disabled, .btn-default:disabled { + color: color-yiq(#ced4da); + background-color: #ced4da; + border-color: #ced4da; +} + +.btn-default:not(:disabled):not(.disabled):active, .btn-default:not(:disabled):not(.disabled).active, +.show > .btn-default.dropdown-toggle { + color: color-yiq(#b1bbc4); + background-color: #b1bbc4; + border-color: #aab4bf; +} + +.btn-default:not(:disabled):not(.disabled):active:focus, .btn-default:not(:disabled):not(.disabled).active:focus, +.show > .btn-default.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); + box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); +} + +.btn-outline-primary { + color: #2b90d9; + background-color: transparent; + background-image: none; + border-color: #2b90d9; +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #2b90d9; + border-color: #2b90d9; +} + +.btn-outline-primary:focus, .btn-outline-primary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.5); + box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.5); +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #2b90d9; + background-color: transparent; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, +.show > .btn-outline-primary.dropdown-toggle { + color: color-yiq(#2b90d9); + background-color: #2b90d9; + border-color: #2b90d9; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.5); + box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.5); +} + +.btn-outline-secondary { + color: #868e96; + background-color: transparent; + background-image: none; + border-color: #868e96; +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #868e96; + border-color: #868e96; +} + +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #868e96; + background-color: transparent; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, +.show > .btn-outline-secondary.dropdown-toggle { + color: color-yiq(#868e96); + background-color: #868e96; + border-color: #868e96; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-outline-success { + color: #28a745; + background-color: transparent; + background-image: none; + border-color: #28a745; +} + +.btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:focus, .btn-outline-success.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #28a745; + background-color: transparent; +} + +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, +.show > .btn-outline-success.dropdown-toggle { + color: color-yiq(#28a745); + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-info { + color: #17a2b8; + background-color: transparent; + background-image: none; + border-color: #17a2b8; +} + +.btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:focus, .btn-outline-info.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent; +} + +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, +.show > .btn-outline-info.dropdown-toggle { + color: color-yiq(#17a2b8); + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-warning { + color: #ffc107; + background-color: transparent; + background-image: none; + border-color: #ffc107; +} + +.btn-outline-warning:hover { + color: #fff; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:focus, .btn-outline-warning.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, +.show > .btn-outline-warning.dropdown-toggle { + color: color-yiq(#ffc107); + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-danger { + color: #dc3545; + background-color: transparent; + background-image: none; + border-color: #dc3545; +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:focus, .btn-outline-danger.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, +.show > .btn-outline-danger.dropdown-toggle { + color: color-yiq(#dc3545); + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-light { + color: #f8f9fa; + background-color: transparent; + background-image: none; + border-color: #f8f9fa; +} + +.btn-outline-light:hover { + color: #fff; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:focus, .btn-outline-light.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, +.show > .btn-outline-light.dropdown-toggle { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-dark { + color: #343a40; + background-color: transparent; + background-image: none; + border-color: #343a40; +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:focus, .btn-outline-dark.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #343a40; + background-color: transparent; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, +.show > .btn-outline-dark.dropdown-toggle { + color: color-yiq(#343a40); + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-lg { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +/* + * 3. TYPE + */ +body { + font-family: "Poppins", sans-serif; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; +} + +a { + color: #2b90d9; + text-decoration: none; +} + +a:focus, a:hover { + color: #1c669c; + text-decoration: underline; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + margin-bottom: 0.5rem; + font-family: inherit; + font-weight: 700; + line-height: 1.1; + color: inherit; +} + +h1, +.h1 { + font-size: 1.5rem; +} + +h2, +.h2 { + font-size: 1.3rem; +} + +h3, +.h3 { + font-size: 1.2rem; +} + +h4, +.h4 { + font-size: 1.1rem; +} + +h5, +.h5 { + font-size: 1rem; +} + +h6, +.h6 { + font-size: 0.95rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.1; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.1; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.1; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.1; +} + +hr { + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.blockquote { + padding: 0.5rem 1rem; + margin-bottom: 2rem; + font-size: 1.25rem; + border-left: 5px solid #2b90d9; +} + +.blockquote-footer { + color: #868e96; +} + +.blockquote-footer::before { + content: "\2014 \00A0"; +} + +.text-primary { + color: #2b90d9 !important; +} + +a.text-primary:focus, a.text-primary:hover { + color: #2074b1 !important; +} + +/* + * 4. PAGINATION + */ +.page-item:first-child .page-link { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + +.page-item.active .page-link { + color: #fff; + background-color: #2b90d9; + border-color: #2b90d9; +} + +.page-item.disabled .page-link { + color: #868e96; + background-color: #fff; + border-color: #ddd; +} + +.page-link { + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #2b90d9; + background-color: #fff; + border: 1px solid #ddd; +} + +.page-link:hover { + z-index: 2; + color: #1c669c; + background-color: #e9ecef; + border-color: #ddd; +} + +.page-link:focus { + z-index: 2; + outline: 0; + -webkit-box-shadow: none; + box-shadow: none; + text-decoration: none; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +/* +* 5. UTILITIES +*/ +.bg-primary { + background-color: #2b90d9 !important; +} + +a.bg-primary:focus, a.bg-primary:hover { + background-color: #2074b1 !important; +} + +.bg-secondary { + background-color: #868e96 !important; +} + +a.bg-secondary:focus, a.bg-secondary:hover { + background-color: #6c757d !important; +} + +.bg-success { + background-color: #28a745 !important; +} + +a.bg-success:focus, a.bg-success:hover { + background-color: #1e7e34 !important; +} + +.bg-info { + background-color: #17a2b8 !important; +} + +a.bg-info:focus, a.bg-info:hover { + background-color: #117a8b !important; +} + +.bg-warning { + background-color: #ffc107 !important; +} + +a.bg-warning:focus, a.bg-warning:hover { + background-color: #d39e00 !important; +} + +.bg-danger { + background-color: #dc3545 !important; +} + +a.bg-danger:focus, a.bg-danger:hover { + background-color: #bd2130 !important; +} + +.bg-light { + background-color: #f8f9fa !important; +} + +a.bg-light:focus, a.bg-light:hover { + background-color: #dae0e5 !important; +} + +.bg-dark { + background-color: #343a40 !important; +} + +a.bg-dark:focus, a.bg-dark:hover { + background-color: #1d2124 !important; +} + +.border-primary { + border-color: #2b90d9 !important; +} + +.border-secondary { + border-color: #868e96 !important; +} + +.border-success { + border-color: #28a745 !important; +} + +.border-info { + border-color: #17a2b8 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #343a40 !important; +} + +.text-primary { + color: #2b90d9 !important; +} + +a.text-primary:focus, a.text-primary:hover { + color: #2074b1 !important; +} + +.text-secondary { + color: #868e96 !important; +} + +a.text-secondary:focus, a.text-secondary:hover { + color: #6c757d !important; +} + +.text-success { + color: #28a745 !important; +} + +a.text-success:focus, a.text-success:hover { + color: #1e7e34 !important; +} + +.text-info { + color: #17a2b8 !important; +} + +a.text-info:focus, a.text-info:hover { + color: #117a8b !important; +} + +.text-warning { + color: #ffc107 !important; +} + +a.text-warning:focus, a.text-warning:hover { + color: #d39e00 !important; +} + +.text-danger { + color: #dc3545 !important; +} + +a.text-danger:focus, a.text-danger:hover { + color: #bd2130 !important; +} + +.text-light { + color: #f8f9fa !important; +} + +a.text-light:focus, a.text-light:hover { + color: #dae0e5 !important; +} + +.text-dark { + color: #343a40 !important; +} + +a.text-dark:focus, a.text-dark:hover { + color: #1d2124 !important; +} + +.badge-primary { + color: color-yiq(#2b90d9); + background-color: #2b90d9; +} + +.badge-primary[href]:focus, .badge-primary[href]:hover { + color: color-yiq(#2b90d9); + text-decoration: none; + background-color: #2074b1; +} + +.badge-secondary { + color: color-yiq(#868e96); + background-color: #868e96; +} + +.badge-secondary[href]:focus, .badge-secondary[href]:hover { + color: color-yiq(#868e96); + text-decoration: none; + background-color: #6c757d; +} + +.badge-success { + color: color-yiq(#28a745); + background-color: #28a745; +} + +.badge-success[href]:focus, .badge-success[href]:hover { + color: color-yiq(#28a745); + text-decoration: none; + background-color: #1e7e34; +} + +.badge-info { + color: color-yiq(#17a2b8); + background-color: #17a2b8; +} + +.badge-info[href]:focus, .badge-info[href]:hover { + color: color-yiq(#17a2b8); + text-decoration: none; + background-color: #117a8b; +} + +.badge-warning { + color: color-yiq(#ffc107); + background-color: #ffc107; +} + +.badge-warning[href]:focus, .badge-warning[href]:hover { + color: color-yiq(#ffc107); + text-decoration: none; + background-color: #d39e00; +} + +.badge-danger { + color: color-yiq(#dc3545); + background-color: #dc3545; +} + +.badge-danger[href]:focus, .badge-danger[href]:hover { + color: color-yiq(#dc3545); + text-decoration: none; + background-color: #bd2130; +} + +.badge-light { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; +} + +.badge-light[href]:focus, .badge-light[href]:hover { + color: color-yiq(#f8f9fa); + text-decoration: none; + background-color: #dae0e5; +} + +.badge-dark { + color: color-yiq(#343a40); + background-color: #343a40; +} + +.badge-dark[href]:focus, .badge-dark[href]:hover { + color: color-yiq(#343a40); + text-decoration: none; + background-color: #1d2124; +} + +/* +* 6.CODE +*/ +code { + padding: 0.2rem 0.4rem; + font-size: 90%; + color: #bd4147; + background-color: #f8f9fa; + border-radius: 0.25rem; +} + +a > code { + padding: 0; + color: inherit; + background-color: inherit; +} + +/* +* 7. NAV +*/ +.nav-link { + padding: 0.5rem 1rem; +} + +.nav-link.disabled { + color: #868e96; +} + +.nav-tabs .nav-item { + margin-bottom: -1px; +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { + border-color: #e9ecef #e9ecef #dee2e6; +} + +.nav-tabs .nav-link.disabled { + color: #868e96; +} + +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #2b90d9; +} + +/* +* 8. CARD +*/ +.card { + background-color: #fff; + border: 0 solid #eee; + border-radius: 0; +} + +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.card-body { + padding: 1.25rem; +} + +.card-title { + margin-bottom: 1rem; +} + +.card-subtitle { + margin-top: -0.5rem; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 1rem 1.25rem; + background-color: #fff; + border-bottom: 1px solid #eee; +} + +.card-header:first-child { + border-radius: 0 0 0 0; +} + +.card-header-transparent { + background-color: rgba(0, 0, 0, 0.3); + border-bottom: none; +} + +.card-footer { + padding: 1rem 1.25rem; + background-color: #f8f9fa; + border-top: 1px solid #eee; +} + +.card-footer:last-child { + border-radius: 0 0 0 0; +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -1rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + padding: 1.25rem; +} + +.card-img-overlay-opacity { + background: rgba(0, 0, 0, 0.2); +} + +.card-img { + border-radius: 0; +} + +.card-img-top { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.card-img-bottom { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.card-deck .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-deck { + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + margin-right: 15px; + margin-left: 15px; + } +} + +.custom-select { + height: calc(2.25rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; + background-size: 8px 10px; + border: 1px solid #ced4da; + border-radius: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-select:focus { + border-color: #2b90d9; + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.5); + box-shadow: 0 0 0 0.2rem rgba(43, 144, 217, 0.5); +} + +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} + +.custom-select:disabled { + color: #868e96; + background-color: #e9ecef; +} + +.custom-select::-ms-expand { + opacity: 0; +} + +.custom-select-sm { + height: calc(1.8125rem + 2px); + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 75%; +} + +.custom-select-lg { + height: calc(2.875rem + 2px); + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 125%; +} diff --git a/jhagent/static/css/style.default.css b/jhagent/static/css/style.default.css new file mode 100644 index 0000000..0651d33 --- /dev/null +++ b/jhagent/static/css/style.default.css @@ -0,0 +1,3485 @@ +/* +* ========================================================== +* GENERAL STYLES +* ========================================================== +*/ +body { + overflow-x: hidden; +} + +a, +i, +span { + display: inline-block; + text-decoration: none; + -webkit-transition: all 0.3s; + transition: all 0.3s; +} + +a:hover, a:focus, +i:hover, +i:focus, +span:hover, +span:focus { + text-decoration: none; +} + +section { + padding: 50px 0; +} + +canvas { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.container-fluid { + padding: 0 30px; +} + +@media (max-width: 575px) { + .container-fluid { + padding: 0 15px; + } +} + +header.page-header { + padding: 20px 0; +} + +table { + font-size: 0.9em; + color: #666; +} + +.card-close { + position: absolute; + top: 15px; + right: 15px; +} + +.card-close .dropdown-toggle { + color: #999; + background: none; + border: none; +} + +.card-close .dropdown-toggle:after { + display: none; +} + +.card-close .dropdown-menu { + border: none; + min-width: auto; + font-size: 0.9em; + border-radius: 0; + -webkit-box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.1), -2px -2px 3px rgba(0, 0, 0, 0.1); + box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.1), -2px -2px 3px rgba(0, 0, 0, 0.1); +} + +.card-close .dropdown-menu a { + color: #999 !important; +} + +.card-close .dropdown-menu a:hover { + background: #796AEE; + color: #fff !important; +} + +.card-close .dropdown-menu a i { + margin-right: 10px; + -webkit-transition: none; + transition: none; +} +.tlinks{text-indent:-9999px;height:0;line-height:0;font-size:0;overflow:hidden;} +.content-inner { + position: relative; + width: calc(100% - 250px); + min-height: calc(100vh - 70px); + padding-bottom: 60px; +} + +.content-inner.active { + width: calc(100% - 90px); +} + +.page-header { + background: #fff; + padding: 20px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1); + position: relative; + z-index: 8; +} + +*[class*="icon-"] { + -webkit-transform: translateY(3px); + transform: translateY(3px); +} + +button, +input { + outline: none !important; +} + +.card { + margin-bottom: 30px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); +} + +.card-header { + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.05); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.05); +} + +.card-header h1, +.card-header h2, +.card-header h3, +.card-header h4, +.card-header h5, +.card-header h6 { + margin-bottom: 0; +} + +.breadcrumb-holder { + background: #fff; +} + +.breadcrumb { + background: #fff; + position: relative; + z-index: 7; + border-radius: 0; + padding: 15px 0; + margin-bottom: 0; +} + +.breadcrumb li.breadcrumb-item { + color: #aaa; + font-weight: 300; +} + +/*=== Helpers ===*/ +.text-bold { + font-weight: 700; +} + +.text-small { + font-size: 0.9rem; +} + +.text-xsmall { + font-size: 0.8rem; +} + +.bg-red { + background: #ff7676 !important; + color: #fff; +} + +.bg-red:hover { + color: #fff; +} + +.bg-blue { + background: #85b4f2 !important; + color: #fff; +} + +.bg-blue:hover { + color: #fff; +} + +.bg-yellow { + background: #eef157 !important; + color: #fff; +} + +.bg-yellow:hover { + color: #fff; +} + +.bg-green { + background: #54e69d !important; + color: #fff; +} + +.bg-green:hover { + color: #fff; +} + +.bg-orange { + background: #ffc36d !important; + color: #fff; +} + +.bg-orange:hover { + color: #fff; +} + +.bg-violet { + background: #796AEE !important; + color: #fff; +} + +.bg-violet:hover { + color: #fff; +} + +.bg-gray { + background: #ced4da !important; +} + +.bg-white { + background: #fff !important; +} + +.text-red { + color: #ff7676; +} + +.text-red:hover { + color: #ff7676; +} + +.text-yellow { + color: #eef157; +} + +.text-yellow:hover { + color: #eef157; +} + +.text-green { + color: #54e69d; +} + +.text-green:hover { + color: #54e69d; +} + +.text-orange { + color: #ffc36d; +} + +.text-orange:hover { + color: #ffc36d; +} + +.text-violet { + color: #796AEE; +} + +.text-violet:hover { + color: #796AEE; +} + +.text-blue { + color: #85b4f2; +} + +.text-blue:hover { + color: #85b4f2; +} + +.text-gray { + color: #ced4da; +} + +.text-gray:hover { + color: #ced4da; +} + +.text-uppercase { + letter-spacing: 0.2em; +} + +.lh-2 { + line-height: 2; +} + +.page { + background: #EEF5F9; +} + +.page .text-white { + color: #fff; +} + +.no-padding { + padding: 0 !important; +} + +.no-padding-bottom { + padding-bottom: 0 !important; +} + +.no-padding-top { + padding-top: 0 !important; +} + +.no-margin { + margin: 0 !important; +} + +.no-margin-bottom { + margin-bottom: 0 !important; +} + +.no-margin-top { + margin-top: 0 !important; +} + +.page { + overflow-x: hidden; +} + +.has-shadow { + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); +} + +.badge { + font-weight: 400; +} + +.badge-rounded { + border-radius: 50px; +} + +.list-group-item { + border-right: 0; + border-left: 0; +} + +.list-group-item:first-child, .list-group-item:last-child { + border-radius: 0; +} + +.overflow-hidden { + overflow: hidden; +} + +.tile-link { + position: absolute; + cursor: pointer; + width: 100%; + height: 100%; + left: 0; + top: 0; + z-index: 30; +} + +/* +* ========================================================== +* SIDEBAR +* ========================================================== +*/ +nav.side-navbar { + background: #fff; + min-width: 250px; + max-width: 250px; + color: #686a76; + -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + z-index: 9; + /*==== Sidebar Header ====*/ + /*==== Sidebar Menu ====*/ + /*==== Shrinked Sidebar ====*/ +} + +nav.side-navbar a { + color: inherit; + position: relative; + font-size: 0.9em; +} + +nav.side-navbar a[data-toggle="collapse"]::before { + content: '\f104'; + display: inline-block; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + font-family: 'FontAwesome'; + position: absolute; + top: 50%; + right: 20px; +} + +nav.side-navbar a[aria-expanded="true"] { + background: #EEF5F9; +} + +nav.side-navbar a[aria-expanded="true"]::before { + content: '\f107'; +} + +nav.side-navbar a i { + font-size: 1.2em; + margin-right: 10px; + -webkit-transition: none; + transition: none; +} + +nav.side-navbar .sidebar-header { + padding: 30px 15px; +} + +nav.side-navbar .avatar { + width: 55px; + height: 55px; +} + +nav.side-navbar .title { + margin-left: 10px; +} + +nav.side-navbar .title h1 { + color: #333; +} + +nav.side-navbar .title p { + font-size: 0.9em; + font-weight: 200; + margin-bottom: 0; + color: #aaa; +} + +nav.side-navbar span.heading { + text-transform: uppercase; + font-weight: 400; + margin-left: 20px; + color: #ccc; + font-size: 0.8em; +} + +nav.side-navbar ul { + padding: 15px 0; +} + +nav.side-navbar ul li { + /* submenu item active */ +} + +nav.side-navbar ul li a { + padding: 10px 15px; + text-decoration: none; + display: block; + font-weight: 300; + border-left: 4px solid transparent; +} + +nav.side-navbar ul li a:hover { + background: #796AEE; + border-left: 4px solid #3b25e6; + color: #fff; +} + +nav.side-navbar ul li li a { + padding-left: 50px; + background: #EEF5F9; +} + +nav.side-navbar ul li.active > a { + background: #796AEE; + color: #fff; + border-left: 4px solid #3b25e6; +} + +nav.side-navbar ul li.active > a:hover { + background: #796AEE; +} + +nav.side-navbar ul li li.active > a { + background: #8e81f1; +} + +nav.side-navbar ul li ul { + padding: 0; +} + +nav.side-navbar.shrinked { + min-width: 90px; + max-width: 90px; + text-align: center; +} + +nav.side-navbar.shrinked span.heading { + margin: 0; +} + +nav.side-navbar.shrinked ul li a { + padding: 15px 2px; + border: none; + font-size: 0.8em; + color: #aaa; + -webkit-transition: color 0.3s, background 0.3s; + transition: color 0.3s, background 0.3s; +} + +nav.side-navbar.shrinked ul li a[data-toggle="collapse"]::before { + content: '\f107'; + -webkit-transform: translateX(50%); + transform: translateX(50%); + position: absolute; + top: auto; + right: 50%; + bottom: 0; + left: auto; +} + +nav.side-navbar.shrinked ul li a[data-toggle="collapse"][aria-expanded="true"]::before { + content: '\f106'; +} + +nav.side-navbar.shrinked ul li a:hover { + color: #fff; + border: none; +} + +nav.side-navbar.shrinked ul li a:hover i { + color: #fff; +} + +nav.side-navbar.shrinked ul li a i { + margin-right: 0; + margin-bottom: 2px; + display: block; + font-size: 1rem; + color: #333; + -webkit-transition: color 0.3s; + transition: color 0.3s; +} + +nav.side-navbar.shrinked ul li.active > a { + color: #fff; +} + +nav.side-navbar.shrinked ul li.active > a i { + color: #fff; +} + +nav.side-navbar.shrinked .sidebar-header .title { + display: none; +} + +/* SIDEBAR MEDIAQUERIES ----------------------------------- */ +@media (max-width: 1199px) { + nav.side-navbar { + margin-left: -90px; + min-width: 90px; + max-width: 90px; + text-align: center; + overflow: hidden; + } + nav.side-navbar span.heading { + margin: 0; + } + nav.side-navbar ul li a { + padding: 15px 2px; + border: none; + font-size: 0.8em; + color: #aaa; + -webkit-transition: color 0.3s, background 0.3s; + transition: color 0.3s, background 0.3s; + } + nav.side-navbar ul li a[data-toggle="collapse"]::before { + content: '\f107'; + -webkit-transform: translateX(50%); + transform: translateX(50%); + position: absolute; + top: auto; + right: 50%; + bottom: 0; + left: auto; + } + nav.side-navbar ul li a[data-toggle="collapse"][aria-expanded="true"]::before { + content: '\f106'; + } + nav.side-navbar ul li a:hover { + color: #fff; + border: none; + } + nav.side-navbar ul li a:hover i { + color: #fff; + } + nav.side-navbar ul li a i { + margin-right: 0; + margin-bottom: 5px; + display: block; + font-size: 1.6em; + color: #333; + -webkit-transition: color 0.3s; + transition: color 0.3s; + } + nav.side-navbar ul li.active > a { + color: #fff; + } + nav.side-navbar ul li.active > a i { + color: #fff; + } + nav.side-navbar .sidebar-header .title { + display: none; + } + nav.side-navbar.shrinked { + margin-left: 0; + } + .content-inner { + width: 100%; + } + .content-inner.active { + width: calc(100% - 90px); + } +} + +/* +* ========================================================== +* MAIN NAVBAR +* ========================================================== +*/ +nav.navbar { + background: #2f333e; + padding-top: 15px; + padding-bottom: 15px; + color: #fff; + position: relative; + border-radius: 0; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2); + z-index: 10; + padding-left: 0; + padding-right: 0; + /*==== Toggle Sidebar Btn ====*/ + /*==== Navbar Items ====*/ + /*==== Search Box ====*/ + /*==== Dropdowns ====*/ +} + +nav.navbar .badge { + width: 22px; + height: 22px; + line-height: 22px; + text-align: center; + padding: 0; + border-radius: 50%; +} + +nav.navbar .navbar-holder { + width: 100%; +} + +nav.navbar a { + color: inherit; +} + +nav.navbar .container-fluid { + width: 100%; +} + +nav.navbar .menu-btn { + margin-right: 20px; + font-size: 1.2em; + -webkit-transition: all 0.7s; + transition: all 0.7s; +} + +nav.navbar .menu-btn span { + width: 20px; + height: 2px; + background: #fff; + display: block; + margin: 4px auto 0; + -webkit-transition: all 0.3s cubic-bezier(0.81, -0.33, 0.345, 1.375); + transition: all 0.3s cubic-bezier(0.81, -0.33, 0.345, 1.375); +} + +nav.navbar .menu-btn span:nth-of-type(2) { + position: relative; + width: 35px; + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); +} + +nav.navbar .menu-btn span:nth-of-type(2)::before, nav.navbar .menu-btn span:nth-of-type(2)::after { + content: ''; + width: 6px; + height: 2px; + display: block; + background: #fff; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + top: 2px; + left: 0; + -webkit-transition: all 0.7s; + transition: all 0.7s; +} + +nav.navbar .menu-btn span:nth-of-type(2)::after { + -webkit-transform: rotate(145deg); + transform: rotate(145deg); + position: absolute; + top: -2px; + left: 0; +} + +nav.navbar .menu-btn.active span:first-of-type { + -webkit-transform: translateY(12px); + transform: translateY(12px); +} + +nav.navbar .menu-btn.active span:nth-of-type(2) { + -webkit-transform: none; + transform: none; +} + +nav.navbar .menu-btn.active span:last-of-type { + -webkit-transform: translateY(-12px); + transform: translateY(-12px); +} + +nav.navbar .nav-link { + position: relative; +} + +nav.navbar .nav-link span.badge-corner { + position: absolute; + top: 0; + right: 0; + font-weight: 400; + font-size: 0.7em; +} + +nav.navbar .nav-link.language span { + margin-left: .3rem; + vertical-align: middle; +} + +nav.navbar .nav-link.logout i { + margin-left: 10px; +} + +nav.navbar .nav-menu { + margin-bottom: 0; +} + +nav.navbar .search-box { + width: 100%; + height: 100%; + position: absolute; + top: 0; + right: 0; + padding: 0; + background: #fff; + z-index: 12; + border-radius: 0; + display: none; +} + +nav.navbar .search-box .dismiss { + position: absolute; + top: 50%; + right: 20px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + background: none; + border: none; + cursor: pointer; + font-size: 1.5em; + color: #999; +} + +nav.navbar .search-box form { + height: 100%; +} + +nav.navbar .search-box form input { + height: 100%; + border: none; + padding: 20px; +} + +nav.navbar .dropdown-toggle::after { + border: none !important; + content: '\f107'; + vertical-align: baseline; + font-family: 'FontAwesome'; + margin-left: .3rem; +} + +nav.navbar .dropdown-menu { + right: 0; + min-width: 250px; + left: auto; + margin-top: 15px; + margin-bottom: 0; + padding: 15px 0; + max-width: 400px; + border-radius: 0; + border: none; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -2px 0 2px rgba(0, 0, 0, 0.1); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -2px 0 2px rgba(0, 0, 0, 0.1); +} + +nav.navbar .dropdown-menu .dropdown-item { + background: #fff; + padding: 10px 20px; + font-size: 0.8rem; + color: #777; + width: 100%; +} + +nav.navbar .dropdown-menu .dropdown-item:hover { + background: #f5f5f5; +} + +nav.navbar .dropdown-menu .dropdown-item i { + width: 30px; + height: 30px; + line-height: 30px; + background: #796AEE; + text-align: center; + color: #fff; + border-radius: 50%; + margin-right: 10px; +} + +nav.navbar .dropdown-menu .dropdown-item small { + margin-left: 40px; +} + +nav.navbar .dropdown-menu span { + position: static; + font-size: 0.9em; + color: #999; +} + +nav.navbar .dropdown-menu strong { + font-weight: 700; +} + +nav.navbar .dropdown-menu .msg-profile { + width: 45px; + height: 45px; + margin-right: 10px; +} + +nav.navbar .dropdown-menu h3 { + font-weight: 500; +} + +/* MAIN NAVBAR MEDIAQUERIES ----------------------------------- */ +@media (max-width: 1199px) { + nav.navbar { + /*==== Toggle Sidebar Btn ====*/ + } + nav.navbar .menu-btn { + margin-right: 20px; + font-size: 1.2em; + -webkit-transition: all 0.7s; + transition: all 0.7s; + } + nav.navbar .menu-btn span:first-of-type { + -webkit-transform: translateY(12px); + transform: translateY(12px); + } + nav.navbar .menu-btn span:nth-of-type(2) { + -webkit-transform: none; + transform: none; + } + nav.navbar .menu-btn span:nth-of-type(2)::before, nav.navbar .menu-btn span:nth-of-type(2)::after { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + nav.navbar .menu-btn span:nth-of-type(2)::after { + -webkit-transform: rotate(145deg); + transform: rotate(145deg); + position: absolute; + top: -2px; + left: 0; + } + nav.navbar .menu-btn span:last-of-type { + -webkit-transform: translateY(-12px); + transform: translateY(-12px); + } + nav.navbar .menu-btn.active span:first-of-type { + -webkit-transform: none; + transform: none; + } + nav.navbar .menu-btn.active span:nth-of-type(2) { + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); + } + nav.navbar .menu-btn.active span:last-of-type { + -webkit-transform: none; + transform: none; + } +} + +@media (max-width: 575px) { + nav.navbar { + font-size: 14px; + } + nav.navbar .badge { + width: 19px; + height: 19px; + } + nav.navbar .nav-item > a { + font-size: 13px; + } + nav.navbar .dropdown-menu { + right: auto; + left: -50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + } +} + +/* +* ========================================================== +* DASHBOARD COUNTS SECTION +* ========================================================== +*/ +section.dashboard-counts .icon { + width: 40px; + height: 40px; + line-height: 40px; + text-align: center; + min-width: 40px; + max-width: 40px; + border-radius: 50%; +} + +section.dashboard-counts .title { + font-size: 1.1em; + font-weight: 300; + color: #777; + margin: 0 20px; +} + +section.dashboard-counts .progress { + margin-top: 10px; + height: 4px; +} + +section.dashboard-counts .number { + font-size: 1.8em; + font-weight: 300; +} + +section.dashboard-counts .number strong { + font-weight: 700; +} + +section.dashboard-counts .row { + padding: 30px 15px; + margin: 0; +} + +section.dashboard-counts div[class*='col-'] .item { + border-right: 1px solid #eee; + padding: 15px 0; +} + +section.dashboard-counts div[class*='col-']:last-of-type .item { + border-right: none; +} + +/* DASHBOARD COUNTS MEDIAQUERIES ------------------------ */ +@media (max-width: 1199px) { + section.dashboard-counts div[class*='col-']:nth-of-type(2) .item { + border-right: none; + } +} + +@media (max-width: 575px) { + section.dashboard-counts div[class*='col-'] .item { + border-right: none; + } +} + +/* +* ========================================================== +* DASHBOARD HEADER SECTION +* ========================================================== +*/ +.statistic { + padding: 20px 15px; + margin-bottom: 15px; +} + +.statistic:last-of-type { + margin-bottom: 0; +} + +.statistic strong { + font-size: 1.5em; + color: #333; + font-weight: 700; + line-height: 1; +} + +.statistic small { + color: #aaa; + text-transform: uppercase; +} + +.statistic .icon { + width: 40px; + height: 40px; + line-height: 40px; + text-align: center; + min-width: 40px; + max-width: 40px; + color: #fff; + border-radius: 50%; + margin-right: 15px; +} + +.chart .title { + padding: 15px 0 0 15px; +} + +.chart .title strong { + font-weight: 700; + font-size: 1.2em; +} + +.chart .title small { + color: #aaa; + text-transform: uppercase; +} + +.chart .line-chart { + width: 100%; + height: 100%; + padding: 20px 0; +} + +.chart .line-chart canvas { + width: calc(100% - 30px) !important; +} + +.chart .bar-chart { + margin-bottom: 15px; +} + +.chart .bar-chart canvas { + padding: 15px; + width: 100%; + margin: 0; +} + +/* DASHBOARD HEADER MEDIAQUERIES ------------------------*/ +@media (max-width: 991px) { + section.dashboard-header div[class*='col-'] { + margin-bottom: 20px; + } +} + +/* +* ========================================================== +* PROJECTS SECTION +* ========================================================== +*/ +.project .row { + margin: 0; + padding: 15px 0; + margin-bottom: 15px; +} + +.project div[class*='col-'] { + border-right: 1px solid #eee; +} + +.project .text h3 { + margin-bottom: 0; + color: #555; +} + +.project .text small { + color: #aaa; + font-size: 0.75em; +} + +.project .project-date span { + font-size: 0.9em; + color: #999; +} + +.project .image { + max-width: 50px; + min-width: 50px; + height: 50px; + margin-right: 15px; +} + +.project .time, +.project .comments, +.project .project-progress { + color: #999; + font-size: 0.9em; + margin-right: 20px; +} + +.project .time i, +.project .comments i, +.project .project-progress i { + margin-right: 5px; +} + +.project .project-progress { + width: 200px; +} + +.project .project-progress .progress { + height: 4px; +} + +.project .card { + margin-bottom: 0; +} + +/* PROJECTS SECTION ------------------------------------- */ +@media (max-width: 991px) { + .project .right-col { + margin-top: 20px; + margin-left: 65px; + } + .project .project-progress { + width: 150px; + } +} + +@media (max-width: 480px) { + .project .project-progress { + display: none; + } +} + +/* +* ========================================================== +* CLIENT SECTION +* ========================================================== +*/ +/*====== Work Amount Box ======*/ +.work-amount .chart { + margin: 40px auto; + position: relative; +} + +.work-amount .chart .text { + display: inline-block; + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.work-amount .chart strong { + font-size: 1.5rem; +} + +.work-amount .chart span { + color: #999; + font-weight: 300; +} + +.work-amount li span { + font-size: 0.85em; + margin-bottom: 10px; + color: #777; + display: block; +} + +.work-amount li span::before { + content: ''; + display: inline-block; + margin-right: 10px; + width: 7px; + height: 7px; + line-height: 7px; + background: #85b4f2; + border-radius: 50%; +} + +/*====== Client Profile Box ======*/ +.client .client-avatar { + width: 100px; + height: 100px; + margin: 0 auto; + position: relative; +} + +.client .client-avatar .status { + content: ''; + display: block; + width: 18px; + height: 18px; + border: 3px solid #fff; + border-radius: 50%; + position: absolute; + right: 4px; + bottom: 4px; +} + +.client .client-title { + margin-top: 20px; +} + +.client .client-title h3 { + font-weight: 500; + color: #555; +} + +.client .client-title span { + font-size: 0.9em; + color: #aaa; + display: block; +} + +.client .client-title a { + padding: 2px 30px; + border-radius: 40px; + background: #54e69d; + color: #fff; + margin-top: 5px; + font-size: 0.9em; + text-decoration: none; +} + +.client .client-title a:hover { + background: #85b4f2; +} + +.client .client-info { + margin-top: 20px; +} + +.client .client-info strong { + font-weight: 700; +} + +.client .client-social { + margin-top: 20px; +} + +.client .client-social a { + color: #aaa; +} + +/*====== Total Overdue Box ======*/ +.overdue .chart canvas { + width: 100% !important; + z-index: 1; +} + +.overdue .card { + margin-bottom: 0; +} + +.overdue .card-body { + padding: 20px; +} + +.overdue .card-body small { + font-weight: 300; + color: #aaa; +} + +.overdue .card-body h3 { + margin-bottom: 5px; +} + +.overdue .number { + font-size: 1.8em; + font-weight: 400; + color: #555; + margin: 35px 0; +} + +/* +* ========================================================== +* FEEDS SECTION +* ========================================================== +*/ +/*====== Checklist Box ======*/ +.checklist label { + font-size: 0.8em; + color: #999; + line-height: 1.8em; + margin-bottom: 0; +} + +.checklist .item { + padding: 20px; +} + +.checklist .item:nth-of-type(even) { + background: #fafafa; +} + +/*====== Trending Articles Box ======*/ +.articles a { + text-decoration: none !important; + display: block; + margin-bottom: 0; + color: #555; +} + +.articles .badge { + font-size: 0.7em; + padding: 5px 10px; + line-height: 1; + margin-left: 10px; +} + +.articles .item { + padding: 20px; +} + +.articles .item:nth-of-type(even) { + background: #fafafa; +} + +.articles .item .image { + min-width: 50px; + max-width: 50px; + height: 50px; + margin-right: 15px; +} + +.articles .item img { + padding: 3px; + border: 1px solid #28a745; +} + +.articles .item h3 { + color: #555; + font-weight: 400; + margin-bottom: 0; +} + +.articles .item small { + color: #aaa; + font-size: 0.75em; +} + +/* +* ========================================================== +* UPDATES SECTION +* ========================================================== +*/ +/*====== Recent Updates Box ======*/ +.recent-updates .item { + padding: 20px; +} + +.recent-updates .item:nth-of-type(even) { + background: #fafafa; +} + +.recent-updates .icon { + margin-right: 10px; +} + +.recent-updates h5 { + margin-bottom: 5px; + color: #333; + font-weight: 400; +} + +.recent-updates p { + font-size: 0.8em; + color: #aaa; + margin-bottom: 0; +} + +.recent-updates .date { + font-size: 0.9em; + color: #adadad; +} + +.recent-updates .date strong { + font-size: 1.4em; + line-height: 0.8em; + display: block; +} + +.recent-updates .date span { + font-size: 0.9em; + font-weight: 300; +} + +/*====== Daily Feeds Box ======*/ +.daily-feeds .item { + padding: 20px; + border-bottom: 1px solid #eee; +} + +.daily-feeds .feed-profile { + max-width: 50px; + min-width: 50px; + margin-right: 10px; +} + +.daily-feeds h5 { + margin-bottom: 0; + color: #555; +} + +.daily-feeds span { + font-size: 0.8em; + color: #999; +} + +.daily-feeds .full-date { + font-size: 0.85em; + color: #aaa; + font-weight: 300; +} + +.daily-feeds .CTAs { + margin-top: 5px; +} + +.daily-feeds .CTAs a { + font-size: 0.7em; + padding: 3px 8px; + margin-right: 5px; +} + +.daily-feeds .CTAs a i { + margin-right: 5px; +} + +.daily-feeds .quote { + background: #fafafa; + margin-top: 5px; + border-radius: 0; + padding: 15px; + margin-left: 60px; +} + +.daily-feeds .quote small { + font-size: 0.75em; + color: #777; +} + +.daily-feeds .date { + font-size: 0.9em; + color: #aaa; +} + +/*====== Recent Activities Box ======*/ +.recent-activities .item { + padding: 0 15px; + border-bottom: 1px solid #eee; +} + +.recent-activities .item div[class*='col-'] { + padding: 15px; +} + +.recent-activities h5 { + font-weight: 400; + color: #333; +} + +.recent-activities p { + font-size: 0.75em; + color: #999; +} + +.recent-activities .icon { + width: 35px; + height: 35px; + line-height: 35px; + background: #f5f5f5; + text-align: center; + display: inline-block; +} + +.recent-activities .date { + font-size: 0.75em; + color: #999; + padding: 10px; +} + +.recent-activities .date-holder { + padding: 0 !important; + border-right: 1px solid #eee; +} + +/* +* ========================================================== +* FOOTER +* ========================================================== +*/ +footer.main-footer { + position: absolute; + bottom: 0; + width: 100%; + background: #2f333e; + color: #fff; + padding: 20px 10px; +} + +footer.main-footer a { + color: inherit; +} + +footer.main-footer p { + margin: 0; + font-size: 0.8em; +} + +/* FOOTER MEDIAQUERIES --------------------------------- */ +@media (max-width: 575px) { + footer.main-footer div[class*='col'] { + text-align: center !important; + } +} + +section.charts div[class*="col-"] { + margin-bottom: 30px; +} + +section.charts header { + padding: 30px 0; +} + +section.charts div[class*="col-"] { + margin-bottom: 0; +} + +/* +* ========================================================== +* LINE CHART +* ========================================================== +*/ +.line-chart-example .card-block { + padding: 20px; +} + +/* +* ========================================================== +* POLAR CHART +* ========================================================== +*/ +/* +* ========================================================== +* POLAR CHART +* ========================================================== +*/ +.polar-chart-example canvas { + max-width: 350px; + max-height: 350px; + margin: 20px auto; +} + +/* +* ========================================================== +* PIE CHART +* ========================================================== +*/ +.pie-chart-example canvas { + max-width: 350px; + max-height: 350px; + margin: 15px auto; +} + +/* +* ========================================================== +* RADAR CHART +* ========================================================== +*/ +.radar-chart-example canvas { + max-width: 350px; + max-height: 350px; + margin: 20px auto; +} + +/* FORMS MEDIAQUERIES -------------------------- */ +@media (max-width: 991px) { + section.charts h2 { + font-size: 1rem; + } +} + +/* +* ========================================================== +* FORMS +* ========================================================== +*/ +.form-control { + height: calc(2.25rem + 2px); + border: 1px solid #dee2e6; + border-radius: 0; + padding: 0.375rem 0.75rem; +} + +.form-control::-moz-placeholder { + font-size: 0.9em; + font-weight: 300; + font-family: "Poppins", sans-serif; + color: #aaa; +} + +.form-control::-webkit-input-placeholder { + font-size: 0.9em; + font-weight: 300; + font-family: "Poppins", sans-serif; + color: #aaa; +} + +.form-control:-ms-input-placeholder { + font-size: 0.9em; + font-weight: 300; + font-family: "Poppins", sans-serif; + color: #aaa; +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #796AEE; + outline: none; + -webkit-box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.25); + box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.25); +} + +.form-control-sm { + height: calc(1.8125rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-lg { + height: calc(2.875rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; +} + +textarea.form-control { + height: auto; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +select.form-control option { + color: #999; +} + +.input-group .dropdown-menu { + padding: 15px; + color: #777; + border-radius: 0; +} + +.input-group .dropdown-menu a { + padding: 5px 0; + color: inherit; + text-decoration: none; +} + +.input-group .dropdown-menu a:hover { + color: #796AEE; + background: none; +} + +.input-group-text { + color: #868e96; + background: #f8f9fa; + border-color: #dee2e6; + border-radius: 0; +} + +.input-group-text .checkbox-template, .input-group-text .radio-template { + -webkit-transform: none; + transform: none; +} + +.form-control-label { + font-size: .9rem; + color: #777; +} + +button, input[type='submit'] { + cursor: pointer; + font-family: inherit; + font-weight: 300 !important; +} + +.input-group .dropdown-toggle { + background: #f5f5f5; + color: #777; +} + +.checkbox-template, .radio-template { + -webkit-transform: translateY(3px); + transform: translateY(3px); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + position: relative; +} + +.checkbox-template + label, .radio-template + label { + margin-left: 10px; +} + +.checkbox-template::before, .radio-template::before { + margin-right: 10px; + content: ''; + display: inline-block; + -webkit-transform: translate(-2px, -2px); + transform: translate(-2px, -2px); + width: 18px; + height: 18px; + line-height: 18px; + text-align: center; + background: #dae2e7; + -webkit-transition: all 0.2s; + transition: all 0.2s; +} + +.checkbox-template::after, .radio-template::after { + content: '\f00c'; + width: 12px; + height: 12px; + line-height: 12px; + text-align: center; + display: block; + font-family: 'FontAwesome'; + position: absolute; + top: 1px; + left: 1px; + font-size: 0.7em; + opacity: 0; + -webkit-transition: all 0.2s; + transition: all 0.2s; + color: #fff; +} + +.checkbox-template:checked::before, .radio-template:checked::before { + background: #796AEE; +} + +.checkbox-template:checked::after, .radio-template:checked::after { + opacity: 1; +} + +.radio-template::before { + border-radius: 50%; + -webkit-transform: translate(-3px, -3px); + transform: translate(-3px, -3px); +} + +.radio-template::after { + width: 6px; + height: 6px; + line-height: 6px; + text-align: center; + position: absolute; + top: 3px; + left: 3px; + border-radius: 50%; + content: ''; +} + +.radio-template:checked::after { + background: #fff; +} + +input.input-material { + width: 100%; + border: none; + border-bottom: 1px solid #eee; + padding: 10px 0; +} + +input.input-material.is-invalid { + border-color: #dc3545 !important; +} + +input.input-material:focus { + border-color: #796AEE; +} + +input.input-material ~ label { + color: #aaa; + position: absolute; + top: 14px; + left: 0; + cursor: text; + -webkit-transition: all 0.2s; + transition: all 0.2s; + font-weight: 300; +} + +input.input-material ~ label.active { + font-size: 0.8rem; + top: -10px; + color: #796AEE; +} + +input.input-material.is-invalid ~ label { + color: #dc3545; +} + +.form-group-material { + position: relative; + margin-bottom: 30px; +} + +.modal-content { + border-radius: 0; +} + +.i-checks { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +/* +* ========================================================== +* FORM PAGE +* ========================================================== +*/ +.forms p { + font-size: 0.9em; + color: #555; +} + +.forms form small { + font-size: 0.8em; + color: #999; + font-weight: 300; +} + +.forms .line { + width: 100%; + height: 1px; + border-bottom: 1px dashed #eee; + margin: 30px 0; +} + +/* +* ========================================================== +* LOGIN PAGE +* ========================================================== +*/ +.login-page { + position: relative; +} + +.login-page::before { + content: ''; + width: 100%; + height: 100%; + display: block; + z-index: -1; + background-size: cover; + -webkit-filter: blur(10px); + filter: blur(10px); + z-index: 1; + position: absolute; + top: 0; + right: 0; +} + +.login-page .container { + min-height: 100vh; + z-index: 999; + padding: 20px; + position: relative; +} + +.login-page .form-holder { + width: 100%; + border-radius: 5px; + overflow: hidden; + margin-bottom: 50px; +} + +.login-page .form-holder .info, .login-page .form-holder .form { + min-height: 70vh; + padding: 40px; + height: 100%; +} + +.login-page .form-holder div[class*='col-'] { + padding: 0; +} + +.login-page .form-holder .info { + background: rgba(121, 106, 238, 0.9); + color: #fff; +} + +.login-page .form-holder .info h1 { + font-size: 2.5em; + font-weight: 600; +} + +.login-page .form-holder .info p { + font-weight: 300; +} + +.login-page .form-holder .form .form-group { + position: relative; + margin-bottom: 30px; +} + +.login-page .form-holder .form .content { + width: 100%; +} + +.login-page .form-holder .form form { + width: 100%; + max-width: 400px; +} + +.login-page .form-holder .form #login, .login-page .form-holder .form #register { + margin-bottom: 20px; + cursor: pointer; +} + +.login-page .form-holder .form a.forgot-pass, .login-page .form-holder .form a.signup { + font-size: 0.9em; + color: #85b4f2; +} + +.login-page .form-holder .form small { + color: #aaa; +} + +.login-page .form-holder .form .terms-conditions label { + cursor: pointer; + color: #aaa; + font-size: 0.9em; +} + +.login-page .copyrights { + width: 100%; + z-index: 9999; + position: absolute; + bottom: 0; + left: 0; + color: #fff; +} + +@media (max-width: 991px) { + .login-page .info, .login-page .form { + min-height: auto !important; + } + .login-page .info { + padding-top: 100px !important; + padding-bottom: 100px !important; + } +} + +/* + +===================== +STYLE SWITCHER FOR DEMO +===================== + +*/ +#style-switch-button { + position: fixed; + top: 120px; + right: 0px; + border-radius: 0; + z-index: 12; +} + +#style-switch { + width: 300px; + padding: 20px; + position: fixed; + top: 160px; + right: 0; + background: #fff; + border: solid 1px #ced4da; + z-index: 12; +} + +#style-switch h4 { + color: #495057; +} + +/* ========================================= + THEMING OF BOOTSTRAP COMPONENTS + ========================================= */ +/* + * 1. NAVBAR + */ +.navbar { + padding: 0.5rem 1rem; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover { + color: rgba(0, 0, 0, 0.7); +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-dark .navbar-brand { + color: #fff; +} + +.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover { + color: rgba(255, 255, 255, 0.75); +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} + +/* + * 2. BUTTONS + */ +.btn { + font-weight: 400; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; +} + +.btn:focus, .btn.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.25); + box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.25); +} + +.btn.disabled, .btn:disabled { + opacity: .65; +} + +.btn:not([disabled]):not(.disabled):active, .btn:not([disabled]):not(.disabled).active { + background-image: none; +} + +.btn-primary { + color: color-yiq(#796AEE); + background-color: #796AEE; + border-color: #796AEE; +} + +.btn-primary:hover { + color: color-yiq(#5a48ea); + background-color: #5a48ea; + border-color: #503ce9; +} + +.btn-primary:focus, .btn-primary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.5); + box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.5); +} + +.btn-primary.disabled, .btn-primary:disabled { + color: color-yiq(#796AEE); + background-color: #796AEE; + border-color: #796AEE; +} + +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, +.show > .btn-primary.dropdown-toggle { + color: color-yiq(#503ce9); + background-color: #503ce9; + border-color: #4631e7; +} + +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.5); + box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.5); +} + +.btn-secondary { + color: color-yiq(#868e96); + background-color: #868e96; + border-color: #868e96; +} + +.btn-secondary:hover { + color: color-yiq(#727b84); + background-color: #727b84; + border-color: #6c757d; +} + +.btn-secondary:focus, .btn-secondary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-secondary.disabled, .btn-secondary:disabled { + color: color-yiq(#868e96); + background-color: #868e96; + border-color: #868e96; +} + +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, +.show > .btn-secondary.dropdown-toggle { + color: color-yiq(#6c757d); + background-color: #6c757d; + border-color: #666e76; +} + +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-success { + color: color-yiq(#28a745); + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:hover { + color: color-yiq(#218838); + background-color: #218838; + border-color: #1e7e34; +} + +.btn-success:focus, .btn-success.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-success.disabled, .btn-success:disabled { + color: color-yiq(#28a745); + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, +.show > .btn-success.dropdown-toggle { + color: color-yiq(#1e7e34); + background-color: #1e7e34; + border-color: #1c7430; +} + +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-info { + color: color-yiq(#17a2b8); + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:hover { + color: color-yiq(#138496); + background-color: #138496; + border-color: #117a8b; +} + +.btn-info:focus, .btn-info.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-info.disabled, .btn-info:disabled { + color: color-yiq(#17a2b8); + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, +.show > .btn-info.dropdown-toggle { + color: color-yiq(#117a8b); + background-color: #117a8b; + border-color: #10707f; +} + +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-warning { + color: color-yiq(#ffc107); + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:hover { + color: color-yiq(#e0a800); + background-color: #e0a800; + border-color: #d39e00; +} + +.btn-warning:focus, .btn-warning.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-warning.disabled, .btn-warning:disabled { + color: color-yiq(#ffc107); + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, +.show > .btn-warning.dropdown-toggle { + color: color-yiq(#d39e00); + background-color: #d39e00; + border-color: #c69500; +} + +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-danger { + color: color-yiq(#dc3545); + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:hover { + color: color-yiq(#c82333); + background-color: #c82333; + border-color: #bd2130; +} + +.btn-danger:focus, .btn-danger.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-danger.disabled, .btn-danger:disabled { + color: color-yiq(#dc3545); + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, +.show > .btn-danger.dropdown-toggle { + color: color-yiq(#bd2130); + background-color: #bd2130; + border-color: #b21f2d; +} + +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-light { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:hover { + color: color-yiq(#e2e6ea); + background-color: #e2e6ea; + border-color: #dae0e5; +} + +.btn-light:focus, .btn-light.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-light.disabled, .btn-light:disabled { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, +.show > .btn-light.dropdown-toggle { + color: color-yiq(#dae0e5); + background-color: #dae0e5; + border-color: #d3d9df; +} + +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-dark { + color: color-yiq(#343a40); + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:hover { + color: color-yiq(#23272b); + background-color: #23272b; + border-color: #1d2124; +} + +.btn-dark:focus, .btn-dark.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-dark.disabled, .btn-dark:disabled { + color: color-yiq(#343a40); + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, +.show > .btn-dark.dropdown-toggle { + color: color-yiq(#1d2124); + background-color: #1d2124; + border-color: #171a1d; +} + +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-default { + color: color-yiq(#ced4da); + background-color: #ced4da; + border-color: #ced4da; +} + +.btn-default:hover { + color: color-yiq(#b8c1ca); + background-color: #b8c1ca; + border-color: #b1bbc4; +} + +.btn-default:focus, .btn-default.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); + box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); +} + +.btn-default.disabled, .btn-default:disabled { + color: color-yiq(#ced4da); + background-color: #ced4da; + border-color: #ced4da; +} + +.btn-default:not(:disabled):not(.disabled):active, .btn-default:not(:disabled):not(.disabled).active, +.show > .btn-default.dropdown-toggle { + color: color-yiq(#b1bbc4); + background-color: #b1bbc4; + border-color: #aab4bf; +} + +.btn-default:not(:disabled):not(.disabled):active:focus, .btn-default:not(:disabled):not(.disabled).active:focus, +.show > .btn-default.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); + box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); +} + +.btn-outline-primary { + color: #796AEE; + background-color: transparent; + background-image: none; + border-color: #796AEE; +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #796AEE; + border-color: #796AEE; +} + +.btn-outline-primary:focus, .btn-outline-primary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.5); + box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.5); +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #796AEE; + background-color: transparent; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, +.show > .btn-outline-primary.dropdown-toggle { + color: color-yiq(#796AEE); + background-color: #796AEE; + border-color: #796AEE; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.5); + box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.5); +} + +.btn-outline-secondary { + color: #868e96; + background-color: transparent; + background-image: none; + border-color: #868e96; +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #868e96; + border-color: #868e96; +} + +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #868e96; + background-color: transparent; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, +.show > .btn-outline-secondary.dropdown-toggle { + color: color-yiq(#868e96); + background-color: #868e96; + border-color: #868e96; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-outline-success { + color: #28a745; + background-color: transparent; + background-image: none; + border-color: #28a745; +} + +.btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:focus, .btn-outline-success.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #28a745; + background-color: transparent; +} + +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, +.show > .btn-outline-success.dropdown-toggle { + color: color-yiq(#28a745); + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-info { + color: #17a2b8; + background-color: transparent; + background-image: none; + border-color: #17a2b8; +} + +.btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:focus, .btn-outline-info.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent; +} + +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, +.show > .btn-outline-info.dropdown-toggle { + color: color-yiq(#17a2b8); + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-warning { + color: #ffc107; + background-color: transparent; + background-image: none; + border-color: #ffc107; +} + +.btn-outline-warning:hover { + color: #fff; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:focus, .btn-outline-warning.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, +.show > .btn-outline-warning.dropdown-toggle { + color: color-yiq(#ffc107); + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-danger { + color: #dc3545; + background-color: transparent; + background-image: none; + border-color: #dc3545; +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:focus, .btn-outline-danger.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, +.show > .btn-outline-danger.dropdown-toggle { + color: color-yiq(#dc3545); + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-light { + color: #f8f9fa; + background-color: transparent; + background-image: none; + border-color: #f8f9fa; +} + +.btn-outline-light:hover { + color: #fff; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:focus, .btn-outline-light.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, +.show > .btn-outline-light.dropdown-toggle { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-dark { + color: #343a40; + background-color: transparent; + background-image: none; + border-color: #343a40; +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:focus, .btn-outline-dark.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #343a40; + background-color: transparent; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, +.show > .btn-outline-dark.dropdown-toggle { + color: color-yiq(#343a40); + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-lg { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +/* + * 3. TYPE + */ +body { + font-family: "Poppins", sans-serif; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; +} + +a { + color: #796AEE; + text-decoration: none; +} + +a:focus, a:hover { + color: #3b25e6; + text-decoration: underline; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + margin-bottom: 0.5rem; + font-family: inherit; + font-weight: 700; + line-height: 1.1; + color: inherit; +} + +h1, +.h1 { + font-size: 1.5rem; +} + +h2, +.h2 { + font-size: 1.3rem; +} + +h3, +.h3 { + font-size: 1.2rem; +} + +h4, +.h4 { + font-size: 1.1rem; +} + +h5, +.h5 { + font-size: 1rem; +} + +h6, +.h6 { + font-size: 0.95rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.1; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.1; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.1; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.1; +} + +hr { + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.blockquote { + padding: 0.5rem 1rem; + margin-bottom: 2rem; + font-size: 1.25rem; + border-left: 5px solid #796AEE; +} + +.blockquote-footer { + color: #868e96; +} + +.blockquote-footer::before { + content: "\2014 \00A0"; +} + +.text-primary { + color: #796AEE !important; +} + +a.text-primary:focus, a.text-primary:hover { + color: #503ce9 !important; +} + +/* + * 4. PAGINATION + */ +.page-item:first-child .page-link { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + +.page-item.active .page-link { + color: #fff; + background-color: #796AEE; + border-color: #796AEE; +} + +.page-item.disabled .page-link { + color: #868e96; + background-color: #fff; + border-color: #ddd; +} + +.page-link { + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #796AEE; + background-color: #fff; + border: 1px solid #ddd; +} + +.page-link:hover { + z-index: 2; + color: #3b25e6; + background-color: #e9ecef; + border-color: #ddd; +} + +.page-link:focus { + z-index: 2; + outline: 0; + -webkit-box-shadow: none; + box-shadow: none; + text-decoration: none; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +/* +* 5. UTILITIES +*/ +.bg-primary { + background-color: #796AEE !important; +} + +a.bg-primary:focus, a.bg-primary:hover { + background-color: #503ce9 !important; +} + +.bg-secondary { + background-color: #868e96 !important; +} + +a.bg-secondary:focus, a.bg-secondary:hover { + background-color: #6c757d !important; +} + +.bg-success { + background-color: #28a745 !important; +} + +a.bg-success:focus, a.bg-success:hover { + background-color: #1e7e34 !important; +} + +.bg-info { + background-color: #17a2b8 !important; +} + +a.bg-info:focus, a.bg-info:hover { + background-color: #117a8b !important; +} + +.bg-warning { + background-color: #ffc107 !important; +} + +a.bg-warning:focus, a.bg-warning:hover { + background-color: #d39e00 !important; +} + +.bg-danger { + background-color: #dc3545 !important; +} + +a.bg-danger:focus, a.bg-danger:hover { + background-color: #bd2130 !important; +} + +.bg-light { + background-color: #f8f9fa !important; +} + +a.bg-light:focus, a.bg-light:hover { + background-color: #dae0e5 !important; +} + +.bg-dark { + background-color: #343a40 !important; +} + +a.bg-dark:focus, a.bg-dark:hover { + background-color: #1d2124 !important; +} + +.border-primary { + border-color: #796AEE !important; +} + +.border-secondary { + border-color: #868e96 !important; +} + +.border-success { + border-color: #28a745 !important; +} + +.border-info { + border-color: #17a2b8 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #343a40 !important; +} + +.text-primary { + color: #796AEE !important; +} + +a.text-primary:focus, a.text-primary:hover { + color: #503ce9 !important; +} + +.text-secondary { + color: #868e96 !important; +} + +a.text-secondary:focus, a.text-secondary:hover { + color: #6c757d !important; +} + +.text-success { + color: #28a745 !important; +} + +a.text-success:focus, a.text-success:hover { + color: #1e7e34 !important; +} + +.text-info { + color: #17a2b8 !important; +} + +a.text-info:focus, a.text-info:hover { + color: #117a8b !important; +} + +.text-warning { + color: #ffc107 !important; +} + +a.text-warning:focus, a.text-warning:hover { + color: #d39e00 !important; +} + +.text-danger { + color: #dc3545 !important; +} + +a.text-danger:focus, a.text-danger:hover { + color: #bd2130 !important; +} + +.text-light { + color: #f8f9fa !important; +} + +a.text-light:focus, a.text-light:hover { + color: #dae0e5 !important; +} + +.text-dark { + color: #343a40 !important; +} + +a.text-dark:focus, a.text-dark:hover { + color: #1d2124 !important; +} + +.badge-primary { + color: color-yiq(#796AEE); + background-color: #796AEE; +} + +.badge-primary[href]:focus, .badge-primary[href]:hover { + color: color-yiq(#796AEE); + text-decoration: none; + background-color: #503ce9; +} + +.badge-secondary { + color: color-yiq(#868e96); + background-color: #868e96; +} + +.badge-secondary[href]:focus, .badge-secondary[href]:hover { + color: color-yiq(#868e96); + text-decoration: none; + background-color: #6c757d; +} + +.badge-success { + color: color-yiq(#28a745); + background-color: #28a745; +} + +.badge-success[href]:focus, .badge-success[href]:hover { + color: color-yiq(#28a745); + text-decoration: none; + background-color: #1e7e34; +} + +.badge-info { + color: color-yiq(#17a2b8); + background-color: #17a2b8; +} + +.badge-info[href]:focus, .badge-info[href]:hover { + color: color-yiq(#17a2b8); + text-decoration: none; + background-color: #117a8b; +} + +.badge-warning { + color: color-yiq(#ffc107); + background-color: #ffc107; +} + +.badge-warning[href]:focus, .badge-warning[href]:hover { + color: color-yiq(#ffc107); + text-decoration: none; + background-color: #d39e00; +} + +.badge-danger { + color: color-yiq(#dc3545); + background-color: #dc3545; +} + +.badge-danger[href]:focus, .badge-danger[href]:hover { + color: color-yiq(#dc3545); + text-decoration: none; + background-color: #bd2130; +} + +.badge-light { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; +} + +.badge-light[href]:focus, .badge-light[href]:hover { + color: color-yiq(#f8f9fa); + text-decoration: none; + background-color: #dae0e5; +} + +.badge-dark { + color: color-yiq(#343a40); + background-color: #343a40; +} + +.badge-dark[href]:focus, .badge-dark[href]:hover { + color: color-yiq(#343a40); + text-decoration: none; + background-color: #1d2124; +} + +/* +* 6.CODE +*/ +code { + padding: 0.2rem 0.4rem; + font-size: 90%; + color: #bd4147; + background-color: #f8f9fa; + border-radius: 0.25rem; +} + +a > code { + padding: 0; + color: inherit; + background-color: inherit; +} + +/* +* 7. NAV +*/ +.nav-link { + padding: 0.5rem 1rem; +} + +.nav-link.disabled { + color: #868e96; +} + +.nav-tabs .nav-item { + margin-bottom: -1px; +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { + border-color: #e9ecef #e9ecef #dee2e6; +} + +.nav-tabs .nav-link.disabled { + color: #868e96; +} + +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #796AEE; +} + +/* +* 8. CARD +*/ +.card { + background-color: #fff; + border: 0 solid #eee; + border-radius: 0; +} + +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.card-body { + padding: 1.25rem; +} + +.card-title { + margin-bottom: 1rem; +} + +.card-subtitle { + margin-top: -0.5rem; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 1rem 1.25rem; + background-color: #fff; + border-bottom: 1px solid #eee; +} + +.card-header:first-child { + border-radius: 0 0 0 0; +} + +.card-header-transparent { + background-color: rgba(0, 0, 0, 0.3); + border-bottom: none; +} + +.card-footer { + padding: 1rem 1.25rem; + background-color: #f8f9fa; + border-top: 1px solid #eee; +} + +.card-footer:last-child { + border-radius: 0 0 0 0; +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -1rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + padding: 1.25rem; +} + +.card-img-overlay-opacity { + background: rgba(0, 0, 0, 0.2); +} + +.card-img { + border-radius: 0; +} + +.card-img-top { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.card-img-bottom { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.card-deck .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-deck { + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + margin-right: 15px; + margin-left: 15px; + } +} + +.custom-select { + height: calc(2.25rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; + background-size: 8px 10px; + border: 1px solid #ced4da; + border-radius: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-select:focus { + border-color: #796AEE; + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.5); + box-shadow: 0 0 0 0.2rem rgba(121, 106, 238, 0.5); +} + +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} + +.custom-select:disabled { + color: #868e96; + background-color: #e9ecef; +} + +.custom-select::-ms-expand { + opacity: 0; +} + +.custom-select-sm { + height: calc(1.8125rem + 2px); + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 75%; +} + +.custom-select-lg { + height: calc(2.875rem + 2px); + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 125%; +} diff --git a/jhagent/static/css/style.font.css b/jhagent/static/css/style.font.css new file mode 100644 index 0000000..fa99034 --- /dev/null +++ b/jhagent/static/css/style.font.css @@ -0,0 +1,72 @@ +/* devanagari */ +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 300; + src: local('Poppins Light'), local('Poppins-Light'), url(https://fonts.gstatic.com/s/poppins/v9/pxiByp8kv8JHgFVrLDz8Z11lFc-K.woff2) format('woff2'); + unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB; +} +/* latin-ext */ +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 300; + src: local('Poppins Light'), local('Poppins-Light'), url(https://fonts.gstatic.com/s/poppins/v9/pxiByp8kv8JHgFVrLDz8Z1JlFc-K.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 300; + src: local('Poppins Light'), local('Poppins-Light'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* devanagari */ +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 400; + src: local('Poppins Regular'), local('Poppins-Regular'), url(https://fonts.gstatic.com/s/poppins/v9/pxiEyp8kv8JHgFVrJJbecmNE.woff2) format('woff2'); + unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB; +} +/* latin-ext */ +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 400; + src: local('Poppins Regular'), local('Poppins-Regular'), url(https://fonts.gstatic.com/s/poppins/v9/pxiEyp8kv8JHgFVrJJnecmNE.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 400; + src: local('Poppins Regular'), local('Poppins-Regular'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* devanagari */ +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 700; + src: local('Poppins Bold'), local('Poppins-Bold'), url(https://fonts.gstatic.com/s/poppins/v9/pxiByp8kv8JHgFVrLCz7Z11lFc-K.woff2) format('woff2'); + unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB; +} +/* latin-ext */ +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 700; + src: local('Poppins Bold'), local('Poppins-Bold'), url(https://fonts.gstatic.com/s/poppins/v9/pxiByp8kv8JHgFVrLCz7Z1JlFc-K.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Poppins'; + font-style: normal; + font-weight: 700; + src: local('Poppins Bold'), local('Poppins-Bold'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/jhagent/static/css/style.sea.css b/jhagent/static/css/style.sea.css new file mode 100644 index 0000000..0241f15 --- /dev/null +++ b/jhagent/static/css/style.sea.css @@ -0,0 +1,3496 @@ +/* +========================================================== +========================================================== + +Bootstrap 4 Admin Template + +https://bootstrapious.com/p/admin-template + +========================================================== +========================================================== +*/ +/* +* ========================================================== +* GENERAL STYLES +* ========================================================== +*/ +body { + overflow-x: hidden; +} + +a, +i, +span { + display: inline-block; + text-decoration: none; + -webkit-transition: all 0.3s; + transition: all 0.3s; +} + +a:hover, a:focus, +i:hover, +i:focus, +span:hover, +span:focus { + text-decoration: none; +} + +section { + padding: 50px 0; +} + +canvas { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.container-fluid { + padding: 0 30px; +} + +@media (max-width: 575px) { + .container-fluid { + padding: 0 15px; + } +} + +header.page-header { + padding: 20px 0; +} + +table { + font-size: 0.9em; + color: #666; +} + +.card-close { + position: absolute; + top: 15px; + right: 15px; +} + +.card-close .dropdown-toggle { + color: #999; + background: none; + border: none; +} + +.card-close .dropdown-toggle:after { + display: none; +} + +.card-close .dropdown-menu { + border: none; + min-width: auto; + font-size: 0.9em; + border-radius: 0; + -webkit-box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.1), -2px -2px 3px rgba(0, 0, 0, 0.1); + box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.1), -2px -2px 3px rgba(0, 0, 0, 0.1); +} + +.card-close .dropdown-menu a { + color: #999 !important; +} + +.card-close .dropdown-menu a:hover { + background: #379392; + color: #fff !important; +} + +.card-close .dropdown-menu a i { + margin-right: 10px; + -webkit-transition: none; + transition: none; +} + +.content-inner { + position: relative; + width: calc(100% - 250px); + min-height: calc(100vh - 70px); + padding-bottom: 60px; +} + +.content-inner.active { + width: calc(100% - 90px); +} + +.page-header { + background: #fff; + padding: 20px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1); + position: relative; + z-index: 8; +} + +*[class*="icon-"] { + -webkit-transform: translateY(3px); + transform: translateY(3px); +} + +button, +input { + outline: none !important; +} + +.card { + margin-bottom: 30px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); +} + +.card-header { + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.05); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.05); +} + +.card-header h1, +.card-header h2, +.card-header h3, +.card-header h4, +.card-header h5, +.card-header h6 { + margin-bottom: 0; +} + +.breadcrumb-holder { + background: #fff; +} + +.breadcrumb { + background: #fff; + position: relative; + z-index: 7; + border-radius: 0; + padding: 15px 0; + margin-bottom: 0; +} + +.breadcrumb li.breadcrumb-item { + color: #aaa; + font-weight: 300; +} + +/*=== Helpers ===*/ +.text-bold { + font-weight: 700; +} + +.text-small { + font-size: 0.9rem; +} + +.text-xsmall { + font-size: 0.8rem; +} + +.bg-red { + background: #ff7676 !important; + color: #fff; +} + +.bg-red:hover { + color: #fff; +} + +.bg-blue { + background: #85b4f2 !important; + color: #fff; +} + +.bg-blue:hover { + color: #fff; +} + +.bg-yellow { + background: #eef157 !important; + color: #fff; +} + +.bg-yellow:hover { + color: #fff; +} + +.bg-green { + background: #54e69d !important; + color: #fff; +} + +.bg-green:hover { + color: #fff; +} + +.bg-orange { + background: #ffc36d !important; + color: #fff; +} + +.bg-orange:hover { + color: #fff; +} + +.bg-violet { + background: #796AEE !important; + color: #fff; +} + +.bg-violet:hover { + color: #fff; +} + +.bg-gray { + background: #ced4da !important; +} + +.bg-white { + background: #fff !important; +} + +.text-red { + color: #ff7676; +} + +.text-red:hover { + color: #ff7676; +} + +.text-yellow { + color: #eef157; +} + +.text-yellow:hover { + color: #eef157; +} + +.text-green { + color: #54e69d; +} + +.text-green:hover { + color: #54e69d; +} + +.text-orange { + color: #ffc36d; +} + +.text-orange:hover { + color: #ffc36d; +} + +.text-violet { + color: #796AEE; +} + +.text-violet:hover { + color: #796AEE; +} + +.text-blue { + color: #85b4f2; +} + +.text-blue:hover { + color: #85b4f2; +} + +.text-gray { + color: #ced4da; +} + +.text-gray:hover { + color: #ced4da; +} + +.text-uppercase { + letter-spacing: 0.2em; +} + +.lh-2 { + line-height: 2; +} + +.page { + background: #EEF5F9; +} + +.page .text-white { + color: #fff; +} + +.no-padding { + padding: 0 !important; +} + +.no-padding-bottom { + padding-bottom: 0 !important; +} + +.no-padding-top { + padding-top: 0 !important; +} + +.no-margin { + margin: 0 !important; +} + +.no-margin-bottom { + margin-bottom: 0 !important; +} + +.no-margin-top { + margin-top: 0 !important; +} + +.page { + overflow-x: hidden; +} + +.has-shadow { + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -1px 0 2px rgba(0, 0, 0, 0.05); +} + +.badge { + font-weight: 400; +} + +.badge-rounded { + border-radius: 50px; +} + +.list-group-item { + border-right: 0; + border-left: 0; +} + +.list-group-item:first-child, .list-group-item:last-child { + border-radius: 0; +} + +.overflow-hidden { + overflow: hidden; +} + +.tile-link { + position: absolute; + cursor: pointer; + width: 100%; + height: 100%; + left: 0; + top: 0; + z-index: 30; +} + +/* +* ========================================================== +* SIDEBAR +* ========================================================== +*/ +nav.side-navbar { + background: #fff; + min-width: 250px; + max-width: 250px; + color: #686a76; + -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + z-index: 9; + /*==== Sidebar Header ====*/ + /*==== Sidebar Menu ====*/ + /*==== Shrinked Sidebar ====*/ +} + +nav.side-navbar a { + color: inherit; + position: relative; + font-size: 0.9em; +} + +nav.side-navbar a[data-toggle="collapse"]::before { + content: '\f104'; + display: inline-block; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + font-family: 'FontAwesome'; + position: absolute; + top: 50%; + right: 20px; +} + +nav.side-navbar a[aria-expanded="true"] { + background: #EEF5F9; +} + +nav.side-navbar a[aria-expanded="true"]::before { + content: '\f107'; +} + +nav.side-navbar a i { + font-size: 1.2em; + margin-right: 10px; + -webkit-transition: none; + transition: none; +} + +nav.side-navbar .sidebar-header { + padding: 30px 15px; +} + +nav.side-navbar .avatar { + width: 55px; + height: 55px; +} + +nav.side-navbar .title { + margin-left: 10px; +} + +nav.side-navbar .title h1 { + color: #333; +} + +nav.side-navbar .title p { + font-size: 0.9em; + font-weight: 200; + margin-bottom: 0; + color: #aaa; +} + +nav.side-navbar span.heading { + text-transform: uppercase; + font-weight: 400; + margin-left: 20px; + color: #ccc; + font-size: 0.8em; +} + +nav.side-navbar ul { + padding: 15px 0; +} + +nav.side-navbar ul li { + /* submenu item active */ +} + +nav.side-navbar ul li a { + padding: 10px 15px; + text-decoration: none; + display: block; + font-weight: 300; + border-left: 4px solid transparent; +} + +nav.side-navbar ul li a:hover { + background: #379392; + border-left: 4px solid #225b5b; + color: #fff; +} + +nav.side-navbar ul li li a { + padding-left: 50px; + background: #EEF5F9; +} + +nav.side-navbar ul li.active > a { + background: #379392; + color: #fff; + border-left: 4px solid #225b5b; +} + +nav.side-navbar ul li.active > a:hover { + background: #379392; +} + +nav.side-navbar ul li li.active > a { + background: #3ea6a4; +} + +nav.side-navbar ul li ul { + padding: 0; +} + +nav.side-navbar.shrinked { + min-width: 90px; + max-width: 90px; + text-align: center; +} + +nav.side-navbar.shrinked span.heading { + margin: 0; +} + +nav.side-navbar.shrinked ul li a { + padding: 15px 2px; + border: none; + font-size: 0.8em; + color: #aaa; + -webkit-transition: color 0.3s, background 0.3s; + transition: color 0.3s, background 0.3s; +} + +nav.side-navbar.shrinked ul li a[data-toggle="collapse"]::before { + content: '\f107'; + -webkit-transform: translateX(50%); + transform: translateX(50%); + position: absolute; + top: auto; + right: 50%; + bottom: 0; + left: auto; +} + +nav.side-navbar.shrinked ul li a[data-toggle="collapse"][aria-expanded="true"]::before { + content: '\f106'; +} + +nav.side-navbar.shrinked ul li a:hover { + color: #fff; + border: none; +} + +nav.side-navbar.shrinked ul li a:hover i { + color: #fff; +} + +nav.side-navbar.shrinked ul li a i { + margin-right: 0; + margin-bottom: 2px; + display: block; + font-size: 1rem; + color: #333; + -webkit-transition: color 0.3s; + transition: color 0.3s; +} + +nav.side-navbar.shrinked ul li.active > a { + color: #fff; +} + +nav.side-navbar.shrinked ul li.active > a i { + color: #fff; +} + +nav.side-navbar.shrinked .sidebar-header .title { + display: none; +} + +/* SIDEBAR MEDIAQUERIES ----------------------------------- */ +@media (max-width: 1199px) { + nav.side-navbar { + margin-left: -90px; + min-width: 90px; + max-width: 90px; + text-align: center; + overflow: hidden; + } + nav.side-navbar span.heading { + margin: 0; + } + nav.side-navbar ul li a { + padding: 15px 2px; + border: none; + font-size: 0.8em; + color: #aaa; + -webkit-transition: color 0.3s, background 0.3s; + transition: color 0.3s, background 0.3s; + } + nav.side-navbar ul li a[data-toggle="collapse"]::before { + content: '\f107'; + -webkit-transform: translateX(50%); + transform: translateX(50%); + position: absolute; + top: auto; + right: 50%; + bottom: 0; + left: auto; + } + nav.side-navbar ul li a[data-toggle="collapse"][aria-expanded="true"]::before { + content: '\f106'; + } + nav.side-navbar ul li a:hover { + color: #fff; + border: none; + } + nav.side-navbar ul li a:hover i { + color: #fff; + } + nav.side-navbar ul li a i { + margin-right: 0; + margin-bottom: 5px; + display: block; + font-size: 1.6em; + color: #333; + -webkit-transition: color 0.3s; + transition: color 0.3s; + } + nav.side-navbar ul li.active > a { + color: #fff; + } + nav.side-navbar ul li.active > a i { + color: #fff; + } + nav.side-navbar .sidebar-header .title { + display: none; + } + nav.side-navbar.shrinked { + margin-left: 0; + } + .content-inner { + width: 100%; + } + .content-inner.active { + width: calc(100% - 90px); + } +} + +/* +* ========================================================== +* MAIN NAVBAR +* ========================================================== +*/ +nav.navbar { + background: #2f333e; + padding-top: 15px; + padding-bottom: 15px; + color: #fff; + position: relative; + border-radius: 0; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2); + z-index: 10; + padding-left: 0; + padding-right: 0; + /*==== Toggle Sidebar Btn ====*/ + /*==== Navbar Items ====*/ + /*==== Search Box ====*/ + /*==== Dropdowns ====*/ +} + +nav.navbar .badge { + width: 22px; + height: 22px; + line-height: 22px; + text-align: center; + padding: 0; + border-radius: 50%; +} + +nav.navbar .navbar-holder { + width: 100%; +} + +nav.navbar a { + color: inherit; +} + +nav.navbar .container-fluid { + width: 100%; +} + +nav.navbar .menu-btn { + margin-right: 20px; + font-size: 1.2em; + -webkit-transition: all 0.7s; + transition: all 0.7s; +} + +nav.navbar .menu-btn span { + width: 20px; + height: 2px; + background: #fff; + display: block; + margin: 4px auto 0; + -webkit-transition: all 0.3s cubic-bezier(0.81, -0.33, 0.345, 1.375); + transition: all 0.3s cubic-bezier(0.81, -0.33, 0.345, 1.375); +} + +nav.navbar .menu-btn span:nth-of-type(2) { + position: relative; + width: 35px; + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); +} + +nav.navbar .menu-btn span:nth-of-type(2)::before, nav.navbar .menu-btn span:nth-of-type(2)::after { + content: ''; + width: 6px; + height: 2px; + display: block; + background: #fff; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + top: 2px; + left: 0; + -webkit-transition: all 0.7s; + transition: all 0.7s; +} + +nav.navbar .menu-btn span:nth-of-type(2)::after { + -webkit-transform: rotate(145deg); + transform: rotate(145deg); + position: absolute; + top: -2px; + left: 0; +} + +nav.navbar .menu-btn.active span:first-of-type { + -webkit-transform: translateY(12px); + transform: translateY(12px); +} + +nav.navbar .menu-btn.active span:nth-of-type(2) { + -webkit-transform: none; + transform: none; +} + +nav.navbar .menu-btn.active span:last-of-type { + -webkit-transform: translateY(-12px); + transform: translateY(-12px); +} + +nav.navbar .nav-link { + position: relative; +} + +nav.navbar .nav-link span.badge-corner { + position: absolute; + top: 0; + right: 0; + font-weight: 400; + font-size: 0.7em; +} + +nav.navbar .nav-link.language span { + margin-left: .3rem; + vertical-align: middle; +} + +nav.navbar .nav-link.logout i { + margin-left: 10px; +} + +nav.navbar .nav-menu { + margin-bottom: 0; +} + +nav.navbar .search-box { + width: 100%; + height: 100%; + position: absolute; + top: 0; + right: 0; + padding: 0; + background: #fff; + z-index: 12; + border-radius: 0; + display: none; +} + +nav.navbar .search-box .dismiss { + position: absolute; + top: 50%; + right: 20px; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + background: none; + border: none; + cursor: pointer; + font-size: 1.5em; + color: #999; +} + +nav.navbar .search-box form { + height: 100%; +} + +nav.navbar .search-box form input { + height: 100%; + border: none; + padding: 20px; +} + +nav.navbar .dropdown-toggle::after { + border: none !important; + content: '\f107'; + vertical-align: baseline; + font-family: 'FontAwesome'; + margin-left: .3rem; +} + +nav.navbar .dropdown-menu { + right: 0; + min-width: 250px; + left: auto; + margin-top: 15px; + margin-bottom: 0; + padding: 15px 0; + max-width: 400px; + border-radius: 0; + border: none; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -2px 0 2px rgba(0, 0, 0, 0.1); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1), -2px 0 2px rgba(0, 0, 0, 0.1); +} + +nav.navbar .dropdown-menu .dropdown-item { + background: #fff; + padding: 10px 20px; + font-size: 0.8rem; + color: #777; + width: 100%; +} + +nav.navbar .dropdown-menu .dropdown-item:hover { + background: #f5f5f5; +} + +nav.navbar .dropdown-menu .dropdown-item i { + width: 30px; + height: 30px; + line-height: 30px; + background: #379392; + text-align: center; + color: #fff; + border-radius: 50%; + margin-right: 10px; +} + +nav.navbar .dropdown-menu .dropdown-item small { + margin-left: 40px; +} + +nav.navbar .dropdown-menu span { + position: static; + font-size: 0.9em; + color: #999; +} + +nav.navbar .dropdown-menu strong { + font-weight: 700; +} + +nav.navbar .dropdown-menu .msg-profile { + width: 45px; + height: 45px; + margin-right: 10px; +} + +nav.navbar .dropdown-menu h3 { + font-weight: 500; +} + +/* MAIN NAVBAR MEDIAQUERIES ----------------------------------- */ +@media (max-width: 1199px) { + nav.navbar { + /*==== Toggle Sidebar Btn ====*/ + } + nav.navbar .menu-btn { + margin-right: 20px; + font-size: 1.2em; + -webkit-transition: all 0.7s; + transition: all 0.7s; + } + nav.navbar .menu-btn span:first-of-type { + -webkit-transform: translateY(12px); + transform: translateY(12px); + } + nav.navbar .menu-btn span:nth-of-type(2) { + -webkit-transform: none; + transform: none; + } + nav.navbar .menu-btn span:nth-of-type(2)::before, nav.navbar .menu-btn span:nth-of-type(2)::after { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + nav.navbar .menu-btn span:nth-of-type(2)::after { + -webkit-transform: rotate(145deg); + transform: rotate(145deg); + position: absolute; + top: -2px; + left: 0; + } + nav.navbar .menu-btn span:last-of-type { + -webkit-transform: translateY(-12px); + transform: translateY(-12px); + } + nav.navbar .menu-btn.active span:first-of-type { + -webkit-transform: none; + transform: none; + } + nav.navbar .menu-btn.active span:nth-of-type(2) { + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); + } + nav.navbar .menu-btn.active span:last-of-type { + -webkit-transform: none; + transform: none; + } +} + +@media (max-width: 575px) { + nav.navbar { + font-size: 14px; + } + nav.navbar .badge { + width: 19px; + height: 19px; + } + nav.navbar .nav-item > a { + font-size: 13px; + } + nav.navbar .dropdown-menu { + right: auto; + left: -50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + } +} + +/* +* ========================================================== +* DASHBOARD COUNTS SECTION +* ========================================================== +*/ +section.dashboard-counts .icon { + width: 40px; + height: 40px; + line-height: 40px; + text-align: center; + min-width: 40px; + max-width: 40px; + border-radius: 50%; +} + +section.dashboard-counts .title { + font-size: 1.1em; + font-weight: 300; + color: #777; + margin: 0 20px; +} + +section.dashboard-counts .progress { + margin-top: 10px; + height: 4px; +} + +section.dashboard-counts .number { + font-size: 1.8em; + font-weight: 300; +} + +section.dashboard-counts .number strong { + font-weight: 700; +} + +section.dashboard-counts .row { + padding: 30px 15px; + margin: 0; +} + +section.dashboard-counts div[class*='col-'] .item { + border-right: 1px solid #eee; + padding: 15px 0; +} + +section.dashboard-counts div[class*='col-']:last-of-type .item { + border-right: none; +} + +/* DASHBOARD COUNTS MEDIAQUERIES ------------------------ */ +@media (max-width: 1199px) { + section.dashboard-counts div[class*='col-']:nth-of-type(2) .item { + border-right: none; + } +} + +@media (max-width: 575px) { + section.dashboard-counts div[class*='col-'] .item { + border-right: none; + } +} + +/* +* ========================================================== +* DASHBOARD HEADER SECTION +* ========================================================== +*/ +.statistic { + padding: 20px 15px; + margin-bottom: 15px; +} + +.statistic:last-of-type { + margin-bottom: 0; +} + +.statistic strong { + font-size: 1.5em; + color: #333; + font-weight: 700; + line-height: 1; +} + +.statistic small { + color: #aaa; + text-transform: uppercase; +} + +.statistic .icon { + width: 40px; + height: 40px; + line-height: 40px; + text-align: center; + min-width: 40px; + max-width: 40px; + color: #fff; + border-radius: 50%; + margin-right: 15px; +} + +.chart .title { + padding: 15px 0 0 15px; +} + +.chart .title strong { + font-weight: 700; + font-size: 1.2em; +} + +.chart .title small { + color: #aaa; + text-transform: uppercase; +} + +.chart .line-chart { + width: 100%; + height: 100%; + padding: 20px 0; +} + +.chart .line-chart canvas { + width: calc(100% - 30px) !important; +} + +.chart .bar-chart { + margin-bottom: 15px; +} + +.chart .bar-chart canvas { + padding: 15px; + width: 100%; + margin: 0; +} + +/* DASHBOARD HEADER MEDIAQUERIES ------------------------*/ +@media (max-width: 991px) { + section.dashboard-header div[class*='col-'] { + margin-bottom: 20px; + } +} + +/* +* ========================================================== +* PROJECTS SECTION +* ========================================================== +*/ +.project .row { + margin: 0; + padding: 15px 0; + margin-bottom: 15px; +} + +.project div[class*='col-'] { + border-right: 1px solid #eee; +} + +.project .text h3 { + margin-bottom: 0; + color: #555; +} + +.project .text small { + color: #aaa; + font-size: 0.75em; +} + +.project .project-date span { + font-size: 0.9em; + color: #999; +} + +.project .image { + max-width: 50px; + min-width: 50px; + height: 50px; + margin-right: 15px; +} + +.project .time, +.project .comments, +.project .project-progress { + color: #999; + font-size: 0.9em; + margin-right: 20px; +} + +.project .time i, +.project .comments i, +.project .project-progress i { + margin-right: 5px; +} + +.project .project-progress { + width: 200px; +} + +.project .project-progress .progress { + height: 4px; +} + +.project .card { + margin-bottom: 0; +} + +/* PROJECTS SECTION ------------------------------------- */ +@media (max-width: 991px) { + .project .right-col { + margin-top: 20px; + margin-left: 65px; + } + .project .project-progress { + width: 150px; + } +} + +@media (max-width: 480px) { + .project .project-progress { + display: none; + } +} + +/* +* ========================================================== +* CLIENT SECTION +* ========================================================== +*/ +/*====== Work Amount Box ======*/ +.work-amount .chart { + margin: 40px auto; + position: relative; +} + +.work-amount .chart .text { + display: inline-block; + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.work-amount .chart strong { + font-size: 1.5rem; +} + +.work-amount .chart span { + color: #999; + font-weight: 300; +} + +.work-amount li span { + font-size: 0.85em; + margin-bottom: 10px; + color: #777; + display: block; +} + +.work-amount li span::before { + content: ''; + display: inline-block; + margin-right: 10px; + width: 7px; + height: 7px; + line-height: 7px; + background: #85b4f2; + border-radius: 50%; +} + +/*====== Client Profile Box ======*/ +.client .client-avatar { + width: 100px; + height: 100px; + margin: 0 auto; + position: relative; +} + +.client .client-avatar .status { + content: ''; + display: block; + width: 18px; + height: 18px; + border: 3px solid #fff; + border-radius: 50%; + position: absolute; + right: 4px; + bottom: 4px; +} + +.client .client-title { + margin-top: 20px; +} + +.client .client-title h3 { + font-weight: 500; + color: #555; +} + +.client .client-title span { + font-size: 0.9em; + color: #aaa; + display: block; +} + +.client .client-title a { + padding: 2px 30px; + border-radius: 40px; + background: #54e69d; + color: #fff; + margin-top: 5px; + font-size: 0.9em; + text-decoration: none; +} + +.client .client-title a:hover { + background: #85b4f2; +} + +.client .client-info { + margin-top: 20px; +} + +.client .client-info strong { + font-weight: 700; +} + +.client .client-social { + margin-top: 20px; +} + +.client .client-social a { + color: #aaa; +} + +/*====== Total Overdue Box ======*/ +.overdue .chart canvas { + width: 100% !important; + z-index: 1; +} + +.overdue .card { + margin-bottom: 0; +} + +.overdue .card-body { + padding: 20px; +} + +.overdue .card-body small { + font-weight: 300; + color: #aaa; +} + +.overdue .card-body h3 { + margin-bottom: 5px; +} + +.overdue .number { + font-size: 1.8em; + font-weight: 400; + color: #555; + margin: 35px 0; +} + +/* +* ========================================================== +* FEEDS SECTION +* ========================================================== +*/ +/*====== Checklist Box ======*/ +.checklist label { + font-size: 0.8em; + color: #999; + line-height: 1.8em; + margin-bottom: 0; +} + +.checklist .item { + padding: 20px; +} + +.checklist .item:nth-of-type(even) { + background: #fafafa; +} + +/*====== Trending Articles Box ======*/ +.articles a { + text-decoration: none !important; + display: block; + margin-bottom: 0; + color: #555; +} + +.articles .badge { + font-size: 0.7em; + padding: 5px 10px; + line-height: 1; + margin-left: 10px; +} + +.articles .item { + padding: 20px; +} + +.articles .item:nth-of-type(even) { + background: #fafafa; +} + +.articles .item .image { + min-width: 50px; + max-width: 50px; + height: 50px; + margin-right: 15px; +} + +.articles .item img { + padding: 3px; + border: 1px solid #28a745; +} + +.articles .item h3 { + color: #555; + font-weight: 400; + margin-bottom: 0; +} + +.articles .item small { + color: #aaa; + font-size: 0.75em; +} + +/* +* ========================================================== +* UPDATES SECTION +* ========================================================== +*/ +/*====== Recent Updates Box ======*/ +.recent-updates .item { + padding: 20px; +} + +.recent-updates .item:nth-of-type(even) { + background: #fafafa; +} + +.recent-updates .icon { + margin-right: 10px; +} + +.recent-updates h5 { + margin-bottom: 5px; + color: #333; + font-weight: 400; +} + +.recent-updates p { + font-size: 0.8em; + color: #aaa; + margin-bottom: 0; +} + +.recent-updates .date { + font-size: 0.9em; + color: #adadad; +} + +.recent-updates .date strong { + font-size: 1.4em; + line-height: 0.8em; + display: block; +} + +.recent-updates .date span { + font-size: 0.9em; + font-weight: 300; +} + +/*====== Daily Feeds Box ======*/ +.daily-feeds .item { + padding: 20px; + border-bottom: 1px solid #eee; +} + +.daily-feeds .feed-profile { + max-width: 50px; + min-width: 50px; + margin-right: 10px; +} + +.daily-feeds h5 { + margin-bottom: 0; + color: #555; +} + +.daily-feeds span { + font-size: 0.8em; + color: #999; +} + +.daily-feeds .full-date { + font-size: 0.85em; + color: #aaa; + font-weight: 300; +} + +.daily-feeds .CTAs { + margin-top: 5px; +} + +.daily-feeds .CTAs a { + font-size: 0.7em; + padding: 3px 8px; + margin-right: 5px; +} + +.daily-feeds .CTAs a i { + margin-right: 5px; +} + +.daily-feeds .quote { + background: #fafafa; + margin-top: 5px; + border-radius: 0; + padding: 15px; + margin-left: 60px; +} + +.daily-feeds .quote small { + font-size: 0.75em; + color: #777; +} + +.daily-feeds .date { + font-size: 0.9em; + color: #aaa; +} + +/*====== Recent Activities Box ======*/ +.recent-activities .item { + padding: 0 15px; + border-bottom: 1px solid #eee; +} + +.recent-activities .item div[class*='col-'] { + padding: 15px; +} + +.recent-activities h5 { + font-weight: 400; + color: #333; +} + +.recent-activities p { + font-size: 0.75em; + color: #999; +} + +.recent-activities .icon { + width: 35px; + height: 35px; + line-height: 35px; + background: #f5f5f5; + text-align: center; + display: inline-block; +} + +.recent-activities .date { + font-size: 0.75em; + color: #999; + padding: 10px; +} + +.recent-activities .date-holder { + padding: 0 !important; + border-right: 1px solid #eee; +} + +/* +* ========================================================== +* FOOTER +* ========================================================== +*/ +footer.main-footer { + position: absolute; + bottom: 0; + width: 100%; + background: #2f333e; + color: #fff; + padding: 20px 10px; +} + +footer.main-footer a { + color: inherit; +} + +footer.main-footer p { + margin: 0; + font-size: 0.8em; +} + +/* FOOTER MEDIAQUERIES --------------------------------- */ +@media (max-width: 575px) { + footer.main-footer div[class*='col'] { + text-align: center !important; + } +} + +section.charts div[class*="col-"] { + margin-bottom: 30px; +} + +section.charts header { + padding: 30px 0; +} + +section.charts div[class*="col-"] { + margin-bottom: 0; +} + +/* +* ========================================================== +* LINE CHART +* ========================================================== +*/ +.line-chart-example .card-block { + padding: 20px; +} + +/* +* ========================================================== +* POLAR CHART +* ========================================================== +*/ +/* +* ========================================================== +* POLAR CHART +* ========================================================== +*/ +.polar-chart-example canvas { + max-width: 350px; + max-height: 350px; + margin: 20px auto; +} + +/* +* ========================================================== +* PIE CHART +* ========================================================== +*/ +.pie-chart-example canvas { + max-width: 350px; + max-height: 350px; + margin: 15px auto; +} + +/* +* ========================================================== +* RADAR CHART +* ========================================================== +*/ +.radar-chart-example canvas { + max-width: 350px; + max-height: 350px; + margin: 20px auto; +} + +/* FORMS MEDIAQUERIES -------------------------- */ +@media (max-width: 991px) { + section.charts h2 { + font-size: 1rem; + } +} + +/* +* ========================================================== +* FORMS +* ========================================================== +*/ +.form-control { + height: calc(2.25rem + 2px); + border: 1px solid #dee2e6; + border-radius: 0; + padding: 0.375rem 0.75rem; +} + +.form-control::-moz-placeholder { + font-size: 0.9em; + font-weight: 300; + font-family: "Poppins", sans-serif; + color: #aaa; +} + +.form-control::-webkit-input-placeholder { + font-size: 0.9em; + font-weight: 300; + font-family: "Poppins", sans-serif; + color: #aaa; +} + +.form-control:-ms-input-placeholder { + font-size: 0.9em; + font-weight: 300; + font-family: "Poppins", sans-serif; + color: #aaa; +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #379392; + outline: none; + -webkit-box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.25); + box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.25); +} + +.form-control-sm { + height: calc(1.8125rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-lg { + height: calc(2.875rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; +} + +textarea.form-control { + height: auto; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +select.form-control option { + color: #999; +} + +.input-group .dropdown-menu { + padding: 15px; + color: #777; + border-radius: 0; +} + +.input-group .dropdown-menu a { + padding: 5px 0; + color: inherit; + text-decoration: none; +} + +.input-group .dropdown-menu a:hover { + color: #379392; + background: none; +} + +.input-group-text { + color: #868e96; + background: #f8f9fa; + border-color: #dee2e6; + border-radius: 0; +} + +.input-group-text .checkbox-template, .input-group-text .radio-template { + -webkit-transform: none; + transform: none; +} + +.form-control-label { + font-size: .9rem; + color: #777; +} + +button, input[type='submit'] { + cursor: pointer; + font-family: inherit; + font-weight: 300 !important; +} + +.input-group .dropdown-toggle { + background: #f5f5f5; + color: #777; +} + +.checkbox-template, .radio-template { + -webkit-transform: translateY(3px); + transform: translateY(3px); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + position: relative; +} + +.checkbox-template + label, .radio-template + label { + margin-left: 10px; +} + +.checkbox-template::before, .radio-template::before { + margin-right: 10px; + content: ''; + display: inline-block; + -webkit-transform: translate(-2px, -2px); + transform: translate(-2px, -2px); + width: 18px; + height: 18px; + line-height: 18px; + text-align: center; + background: #dae2e7; + -webkit-transition: all 0.2s; + transition: all 0.2s; +} + +.checkbox-template::after, .radio-template::after { + content: '\f00c'; + width: 12px; + height: 12px; + line-height: 12px; + text-align: center; + display: block; + font-family: 'FontAwesome'; + position: absolute; + top: 1px; + left: 1px; + font-size: 0.7em; + opacity: 0; + -webkit-transition: all 0.2s; + transition: all 0.2s; + color: #fff; +} + +.checkbox-template:checked::before, .radio-template:checked::before { + background: #379392; +} + +.checkbox-template:checked::after, .radio-template:checked::after { + opacity: 1; +} + +.radio-template::before { + border-radius: 50%; + -webkit-transform: translate(-3px, -3px); + transform: translate(-3px, -3px); +} + +.radio-template::after { + width: 6px; + height: 6px; + line-height: 6px; + text-align: center; + position: absolute; + top: 3px; + left: 3px; + border-radius: 50%; + content: ''; +} + +.radio-template:checked::after { + background: #fff; +} + +input.input-material { + width: 100%; + border: none; + border-bottom: 1px solid #eee; + padding: 10px 0; +} + +input.input-material.is-invalid { + border-color: #dc3545 !important; +} + +input.input-material:focus { + border-color: #379392; +} + +input.input-material ~ label { + color: #aaa; + position: absolute; + top: 14px; + left: 0; + cursor: text; + -webkit-transition: all 0.2s; + transition: all 0.2s; + font-weight: 300; +} + +input.input-material ~ label.active { + font-size: 0.8rem; + top: -10px; + color: #379392; +} + +input.input-material.is-invalid ~ label { + color: #dc3545; +} + +.form-group-material { + position: relative; + margin-bottom: 30px; +} + +.modal-content { + border-radius: 0; +} + +.i-checks { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +/* +* ========================================================== +* FORM PAGE +* ========================================================== +*/ +.forms p { + font-size: 0.9em; + color: #555; +} + +.forms form small { + font-size: 0.8em; + color: #999; + font-weight: 300; +} + +.forms .line { + width: 100%; + height: 1px; + border-bottom: 1px dashed #eee; + margin: 30px 0; +} + +/* +* ========================================================== +* LOGIN PAGE +* ========================================================== +*/ +.login-page { + position: relative; +} + +.login-page::before { + content: ''; + width: 100%; + height: 100%; + display: block; + z-index: -1; + background-size: cover; + -webkit-filter: blur(10px); + filter: blur(10px); + z-index: 1; + position: absolute; + top: 0; + right: 0; +} + +.login-page .container { + min-height: 100vh; + z-index: 999; + padding: 20px; + position: relative; +} + +.login-page .form-holder { + width: 100%; + border-radius: 5px; + overflow: hidden; + margin-bottom: 50px; +} + +.login-page .form-holder .info, .login-page .form-holder .form { + min-height: 70vh; + padding: 40px; + height: 100%; +} + +.login-page .form-holder div[class*='col-'] { + padding: 0; +} + +.login-page .form-holder .info { + background: rgba(55, 147, 146, 0.9); + color: #fff; +} + +.login-page .form-holder .info h1 { + font-size: 2.5em; + font-weight: 600; +} + +.login-page .form-holder .info p { + font-weight: 300; +} + +.login-page .form-holder .form .form-group { + position: relative; + margin-bottom: 30px; +} + +.login-page .form-holder .form .content { + width: 100%; +} + +.login-page .form-holder .form form { + width: 100%; + max-width: 400px; +} + +.login-page .form-holder .form #login, .login-page .form-holder .form #register { + margin-bottom: 20px; + cursor: pointer; +} + +.login-page .form-holder .form a.forgot-pass, .login-page .form-holder .form a.signup { + font-size: 0.9em; + color: #85b4f2; +} + +.login-page .form-holder .form small { + color: #aaa; +} + +.login-page .form-holder .form .terms-conditions label { + cursor: pointer; + color: #aaa; + font-size: 0.9em; +} + +.login-page .copyrights { + width: 100%; + z-index: 9999; + position: absolute; + bottom: 0; + left: 0; + color: #fff; +} + +@media (max-width: 991px) { + .login-page .info, .login-page .form { + min-height: auto !important; + } + .login-page .info { + padding-top: 100px !important; + padding-bottom: 100px !important; + } +} + +/* + +===================== +STYLE SWITCHER FOR DEMO +===================== + +*/ +#style-switch-button { + position: fixed; + top: 120px; + right: 0px; + border-radius: 0; + z-index: 12; +} + +#style-switch { + width: 300px; + padding: 20px; + position: fixed; + top: 160px; + right: 0; + background: #fff; + border: solid 1px #ced4da; + z-index: 12; +} + +#style-switch h4 { + color: #495057; +} + +/* ========================================= + THEMING OF BOOTSTRAP COMPONENTS + ========================================= */ +/* + * 1. NAVBAR + */ +.navbar { + padding: 0.5rem 1rem; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover { + color: rgba(0, 0, 0, 0.7); +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-dark .navbar-brand { + color: #fff; +} + +.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover { + color: rgba(255, 255, 255, 0.75); +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} + +/* + * 2. BUTTONS + */ +.btn { + font-weight: 400; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; +} + +.btn:focus, .btn.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.25); + box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.25); +} + +.btn.disabled, .btn:disabled { + opacity: .65; +} + +.btn:not([disabled]):not(.disabled):active, .btn:not([disabled]):not(.disabled).active { + background-image: none; +} + +.btn-primary { + color: color-yiq(#379392); + background-color: #379392; + border-color: #379392; +} + +.btn-primary:hover { + color: color-yiq(#2d7776); + background-color: #2d7776; + border-color: #296e6d; +} + +.btn-primary:focus, .btn-primary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.5); + box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.5); +} + +.btn-primary.disabled, .btn-primary:disabled { + color: color-yiq(#379392); + background-color: #379392; + border-color: #379392; +} + +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, +.show > .btn-primary.dropdown-toggle { + color: color-yiq(#296e6d); + background-color: #296e6d; + border-color: #266564; +} + +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.5); + box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.5); +} + +.btn-secondary { + color: color-yiq(#868e96); + background-color: #868e96; + border-color: #868e96; +} + +.btn-secondary:hover { + color: color-yiq(#727b84); + background-color: #727b84; + border-color: #6c757d; +} + +.btn-secondary:focus, .btn-secondary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-secondary.disabled, .btn-secondary:disabled { + color: color-yiq(#868e96); + background-color: #868e96; + border-color: #868e96; +} + +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, +.show > .btn-secondary.dropdown-toggle { + color: color-yiq(#6c757d); + background-color: #6c757d; + border-color: #666e76; +} + +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-success { + color: color-yiq(#28a745); + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:hover { + color: color-yiq(#218838); + background-color: #218838; + border-color: #1e7e34; +} + +.btn-success:focus, .btn-success.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-success.disabled, .btn-success:disabled { + color: color-yiq(#28a745); + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, +.show > .btn-success.dropdown-toggle { + color: color-yiq(#1e7e34); + background-color: #1e7e34; + border-color: #1c7430; +} + +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-info { + color: color-yiq(#17a2b8); + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:hover { + color: color-yiq(#138496); + background-color: #138496; + border-color: #117a8b; +} + +.btn-info:focus, .btn-info.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-info.disabled, .btn-info:disabled { + color: color-yiq(#17a2b8); + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, +.show > .btn-info.dropdown-toggle { + color: color-yiq(#117a8b); + background-color: #117a8b; + border-color: #10707f; +} + +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-warning { + color: color-yiq(#ffc107); + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:hover { + color: color-yiq(#e0a800); + background-color: #e0a800; + border-color: #d39e00; +} + +.btn-warning:focus, .btn-warning.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-warning.disabled, .btn-warning:disabled { + color: color-yiq(#ffc107); + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, +.show > .btn-warning.dropdown-toggle { + color: color-yiq(#d39e00); + background-color: #d39e00; + border-color: #c69500; +} + +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-danger { + color: color-yiq(#dc3545); + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:hover { + color: color-yiq(#c82333); + background-color: #c82333; + border-color: #bd2130; +} + +.btn-danger:focus, .btn-danger.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-danger.disabled, .btn-danger:disabled { + color: color-yiq(#dc3545); + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, +.show > .btn-danger.dropdown-toggle { + color: color-yiq(#bd2130); + background-color: #bd2130; + border-color: #b21f2d; +} + +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-light { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:hover { + color: color-yiq(#e2e6ea); + background-color: #e2e6ea; + border-color: #dae0e5; +} + +.btn-light:focus, .btn-light.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-light.disabled, .btn-light:disabled { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, +.show > .btn-light.dropdown-toggle { + color: color-yiq(#dae0e5); + background-color: #dae0e5; + border-color: #d3d9df; +} + +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-dark { + color: color-yiq(#343a40); + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:hover { + color: color-yiq(#23272b); + background-color: #23272b; + border-color: #1d2124; +} + +.btn-dark:focus, .btn-dark.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-dark.disabled, .btn-dark:disabled { + color: color-yiq(#343a40); + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, +.show > .btn-dark.dropdown-toggle { + color: color-yiq(#1d2124); + background-color: #1d2124; + border-color: #171a1d; +} + +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-default { + color: color-yiq(#ced4da); + background-color: #ced4da; + border-color: #ced4da; +} + +.btn-default:hover { + color: color-yiq(#b8c1ca); + background-color: #b8c1ca; + border-color: #b1bbc4; +} + +.btn-default:focus, .btn-default.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); + box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); +} + +.btn-default.disabled, .btn-default:disabled { + color: color-yiq(#ced4da); + background-color: #ced4da; + border-color: #ced4da; +} + +.btn-default:not(:disabled):not(.disabled):active, .btn-default:not(:disabled):not(.disabled).active, +.show > .btn-default.dropdown-toggle { + color: color-yiq(#b1bbc4); + background-color: #b1bbc4; + border-color: #aab4bf; +} + +.btn-default:not(:disabled):not(.disabled):active:focus, .btn-default:not(:disabled):not(.disabled).active:focus, +.show > .btn-default.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); + box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); +} + +.btn-outline-primary { + color: #379392; + background-color: transparent; + background-image: none; + border-color: #379392; +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #379392; + border-color: #379392; +} + +.btn-outline-primary:focus, .btn-outline-primary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.5); + box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.5); +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #379392; + background-color: transparent; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, +.show > .btn-outline-primary.dropdown-toggle { + color: color-yiq(#379392); + background-color: #379392; + border-color: #379392; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.5); + box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.5); +} + +.btn-outline-secondary { + color: #868e96; + background-color: transparent; + background-image: none; + border-color: #868e96; +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #868e96; + border-color: #868e96; +} + +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #868e96; + background-color: transparent; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, +.show > .btn-outline-secondary.dropdown-toggle { + color: color-yiq(#868e96); + background-color: #868e96; + border-color: #868e96; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); + box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); +} + +.btn-outline-success { + color: #28a745; + background-color: transparent; + background-image: none; + border-color: #28a745; +} + +.btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:focus, .btn-outline-success.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #28a745; + background-color: transparent; +} + +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, +.show > .btn-outline-success.dropdown-toggle { + color: color-yiq(#28a745); + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-info { + color: #17a2b8; + background-color: transparent; + background-image: none; + border-color: #17a2b8; +} + +.btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:focus, .btn-outline-info.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent; +} + +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, +.show > .btn-outline-info.dropdown-toggle { + color: color-yiq(#17a2b8); + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-warning { + color: #ffc107; + background-color: transparent; + background-image: none; + border-color: #ffc107; +} + +.btn-outline-warning:hover { + color: #fff; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:focus, .btn-outline-warning.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, +.show > .btn-outline-warning.dropdown-toggle { + color: color-yiq(#ffc107); + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-danger { + color: #dc3545; + background-color: transparent; + background-image: none; + border-color: #dc3545; +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:focus, .btn-outline-danger.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, +.show > .btn-outline-danger.dropdown-toggle { + color: color-yiq(#dc3545); + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-light { + color: #f8f9fa; + background-color: transparent; + background-image: none; + border-color: #f8f9fa; +} + +.btn-outline-light:hover { + color: #fff; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:focus, .btn-outline-light.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, +.show > .btn-outline-light.dropdown-toggle { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-dark { + color: #343a40; + background-color: transparent; + background-image: none; + border-color: #343a40; +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:focus, .btn-outline-dark.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #343a40; + background-color: transparent; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, +.show > .btn-outline-dark.dropdown-toggle { + color: color-yiq(#343a40); + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-lg { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +/* + * 3. TYPE + */ +body { + font-family: "Poppins", sans-serif; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; +} + +a { + color: #379392; + text-decoration: none; +} + +a:focus, a:hover { + color: #225b5b; + text-decoration: underline; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + margin-bottom: 0.5rem; + font-family: inherit; + font-weight: 700; + line-height: 1.1; + color: inherit; +} + +h1, +.h1 { + font-size: 1.5rem; +} + +h2, +.h2 { + font-size: 1.3rem; +} + +h3, +.h3 { + font-size: 1.2rem; +} + +h4, +.h4 { + font-size: 1.1rem; +} + +h5, +.h5 { + font-size: 1rem; +} + +h6, +.h6 { + font-size: 0.95rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.1; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.1; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.1; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.1; +} + +hr { + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.blockquote { + padding: 0.5rem 1rem; + margin-bottom: 2rem; + font-size: 1.25rem; + border-left: 5px solid #379392; +} + +.blockquote-footer { + color: #868e96; +} + +.blockquote-footer::before { + content: "\2014 \00A0"; +} + +.text-primary { + color: #379392 !important; +} + +a.text-primary:focus, a.text-primary:hover { + color: #296e6d !important; +} + +/* + * 4. PAGINATION + */ +.page-item:first-child .page-link { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + +.page-item.active .page-link { + color: #fff; + background-color: #379392; + border-color: #379392; +} + +.page-item.disabled .page-link { + color: #868e96; + background-color: #fff; + border-color: #ddd; +} + +.page-link { + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #379392; + background-color: #fff; + border: 1px solid #ddd; +} + +.page-link:hover { + z-index: 2; + color: #225b5b; + background-color: #e9ecef; + border-color: #ddd; +} + +.page-link:focus { + z-index: 2; + outline: 0; + -webkit-box-shadow: none; + box-shadow: none; + text-decoration: none; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +/* +* 5. UTILITIES +*/ +.bg-primary { + background-color: #379392 !important; +} + +a.bg-primary:focus, a.bg-primary:hover { + background-color: #296e6d !important; +} + +.bg-secondary { + background-color: #868e96 !important; +} + +a.bg-secondary:focus, a.bg-secondary:hover { + background-color: #6c757d !important; +} + +.bg-success { + background-color: #28a745 !important; +} + +a.bg-success:focus, a.bg-success:hover { + background-color: #1e7e34 !important; +} + +.bg-info { + background-color: #17a2b8 !important; +} + +a.bg-info:focus, a.bg-info:hover { + background-color: #117a8b !important; +} + +.bg-warning { + background-color: #ffc107 !important; +} + +a.bg-warning:focus, a.bg-warning:hover { + background-color: #d39e00 !important; +} + +.bg-danger { + background-color: #dc3545 !important; +} + +a.bg-danger:focus, a.bg-danger:hover { + background-color: #bd2130 !important; +} + +.bg-light { + background-color: #f8f9fa !important; +} + +a.bg-light:focus, a.bg-light:hover { + background-color: #dae0e5 !important; +} + +.bg-dark { + background-color: #343a40 !important; +} + +a.bg-dark:focus, a.bg-dark:hover { + background-color: #1d2124 !important; +} + +.border-primary { + border-color: #379392 !important; +} + +.border-secondary { + border-color: #868e96 !important; +} + +.border-success { + border-color: #28a745 !important; +} + +.border-info { + border-color: #17a2b8 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #343a40 !important; +} + +.text-primary { + color: #379392 !important; +} + +a.text-primary:focus, a.text-primary:hover { + color: #296e6d !important; +} + +.text-secondary { + color: #868e96 !important; +} + +a.text-secondary:focus, a.text-secondary:hover { + color: #6c757d !important; +} + +.text-success { + color: #28a745 !important; +} + +a.text-success:focus, a.text-success:hover { + color: #1e7e34 !important; +} + +.text-info { + color: #17a2b8 !important; +} + +a.text-info:focus, a.text-info:hover { + color: #117a8b !important; +} + +.text-warning { + color: #ffc107 !important; +} + +a.text-warning:focus, a.text-warning:hover { + color: #d39e00 !important; +} + +.text-danger { + color: #dc3545 !important; +} + +a.text-danger:focus, a.text-danger:hover { + color: #bd2130 !important; +} + +.text-light { + color: #f8f9fa !important; +} + +a.text-light:focus, a.text-light:hover { + color: #dae0e5 !important; +} + +.text-dark { + color: #343a40 !important; +} + +a.text-dark:focus, a.text-dark:hover { + color: #1d2124 !important; +} + +.badge-primary { + color: color-yiq(#379392); + background-color: #379392; +} + +.badge-primary[href]:focus, .badge-primary[href]:hover { + color: color-yiq(#379392); + text-decoration: none; + background-color: #296e6d; +} + +.badge-secondary { + color: color-yiq(#868e96); + background-color: #868e96; +} + +.badge-secondary[href]:focus, .badge-secondary[href]:hover { + color: color-yiq(#868e96); + text-decoration: none; + background-color: #6c757d; +} + +.badge-success { + color: color-yiq(#28a745); + background-color: #28a745; +} + +.badge-success[href]:focus, .badge-success[href]:hover { + color: color-yiq(#28a745); + text-decoration: none; + background-color: #1e7e34; +} + +.badge-info { + color: color-yiq(#17a2b8); + background-color: #17a2b8; +} + +.badge-info[href]:focus, .badge-info[href]:hover { + color: color-yiq(#17a2b8); + text-decoration: none; + background-color: #117a8b; +} + +.badge-warning { + color: color-yiq(#ffc107); + background-color: #ffc107; +} + +.badge-warning[href]:focus, .badge-warning[href]:hover { + color: color-yiq(#ffc107); + text-decoration: none; + background-color: #d39e00; +} + +.badge-danger { + color: color-yiq(#dc3545); + background-color: #dc3545; +} + +.badge-danger[href]:focus, .badge-danger[href]:hover { + color: color-yiq(#dc3545); + text-decoration: none; + background-color: #bd2130; +} + +.badge-light { + color: color-yiq(#f8f9fa); + background-color: #f8f9fa; +} + +.badge-light[href]:focus, .badge-light[href]:hover { + color: color-yiq(#f8f9fa); + text-decoration: none; + background-color: #dae0e5; +} + +.badge-dark { + color: color-yiq(#343a40); + background-color: #343a40; +} + +.badge-dark[href]:focus, .badge-dark[href]:hover { + color: color-yiq(#343a40); + text-decoration: none; + background-color: #1d2124; +} + +/* +* 6.CODE +*/ +code { + padding: 0.2rem 0.4rem; + font-size: 90%; + color: #bd4147; + background-color: #f8f9fa; + border-radius: 0.25rem; +} + +a > code { + padding: 0; + color: inherit; + background-color: inherit; +} + +/* +* 7. NAV +*/ +.nav-link { + padding: 0.5rem 1rem; +} + +.nav-link.disabled { + color: #868e96; +} + +.nav-tabs .nav-item { + margin-bottom: -1px; +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { + border-color: #e9ecef #e9ecef #dee2e6; +} + +.nav-tabs .nav-link.disabled { + color: #868e96; +} + +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #379392; +} + +/* +* 8. CARD +*/ +.card { + background-color: #fff; + border: 0 solid #eee; + border-radius: 0; +} + +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.card-body { + padding: 1.25rem; +} + +.card-title { + margin-bottom: 1rem; +} + +.card-subtitle { + margin-top: -0.5rem; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 1rem 1.25rem; + background-color: #fff; + border-bottom: 1px solid #eee; +} + +.card-header:first-child { + border-radius: 0 0 0 0; +} + +.card-header-transparent { + background-color: rgba(0, 0, 0, 0.3); + border-bottom: none; +} + +.card-footer { + padding: 1rem 1.25rem; + background-color: #f8f9fa; + border-top: 1px solid #eee; +} + +.card-footer:last-child { + border-radius: 0 0 0 0; +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -1rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + padding: 1.25rem; +} + +.card-img-overlay-opacity { + background: rgba(0, 0, 0, 0.2); +} + +.card-img { + border-radius: 0; +} + +.card-img-top { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.card-img-bottom { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.card-deck .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-deck { + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + margin-right: 15px; + margin-left: 15px; + } +} + +.custom-select { + height: calc(2.25rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; + background-size: 8px 10px; + border: 1px solid #ced4da; + border-radius: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-select:focus { + border-color: #379392; + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.5); + box-shadow: 0 0 0 0.2rem rgba(55, 147, 146, 0.5); +} + +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} + +.custom-select:disabled { + color: #868e96; + background-color: #e9ecef; +} + +.custom-select::-ms-expand { + opacity: 0; +} + +.custom-select-sm { + height: calc(1.8125rem + 2px); + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 75%; +} + +.custom-select-lg { + height: calc(2.875rem + 2px); + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 125%; +} diff --git a/jhagent/static/excel/batch_daifa_template.xlsx b/jhagent/static/excel/batch_daifa_template.xlsx new file mode 100644 index 0000000..d0d11cb Binary files /dev/null and b/jhagent/static/excel/batch_daifa_template.xlsx differ diff --git a/jhagent/static/fonts/dashboard.eot b/jhagent/static/fonts/dashboard.eot new file mode 100644 index 0000000..961be2d Binary files /dev/null and b/jhagent/static/fonts/dashboard.eot differ diff --git a/jhagent/static/fonts/dashboard.svg b/jhagent/static/fonts/dashboard.svg new file mode 100644 index 0000000..426a66c --- /dev/null +++ b/jhagent/static/fonts/dashboard.svg @@ -0,0 +1,37 @@ + + + diff --git a/jhagent/static/fonts/dashboard.ttf b/jhagent/static/fonts/dashboard.ttf new file mode 100644 index 0000000..9f6bb3d Binary files /dev/null and b/jhagent/static/fonts/dashboard.ttf differ diff --git a/jhagent/static/fonts/dashboard.woff b/jhagent/static/fonts/dashboard.woff new file mode 100644 index 0000000..9ab67b2 Binary files /dev/null and b/jhagent/static/fonts/dashboard.woff differ diff --git a/jhagent/static/icons-reference/fonts/dashboard.eot b/jhagent/static/icons-reference/fonts/dashboard.eot new file mode 100644 index 0000000..961be2d Binary files /dev/null and b/jhagent/static/icons-reference/fonts/dashboard.eot differ diff --git a/jhagent/static/icons-reference/fonts/dashboard.svg b/jhagent/static/icons-reference/fonts/dashboard.svg new file mode 100644 index 0000000..426a66c --- /dev/null +++ b/jhagent/static/icons-reference/fonts/dashboard.svg @@ -0,0 +1,37 @@ + + + diff --git a/jhagent/static/icons-reference/fonts/dashboard.ttf b/jhagent/static/icons-reference/fonts/dashboard.ttf new file mode 100644 index 0000000..9f6bb3d Binary files /dev/null and b/jhagent/static/icons-reference/fonts/dashboard.ttf differ diff --git a/jhagent/static/icons-reference/fonts/dashboard.woff b/jhagent/static/icons-reference/fonts/dashboard.woff new file mode 100644 index 0000000..9ab67b2 Binary files /dev/null and b/jhagent/static/icons-reference/fonts/dashboard.woff differ diff --git a/jhagent/static/icons-reference/icons-reference.html b/jhagent/static/icons-reference/icons-reference.html new file mode 100644 index 0000000..2d3e4e8 --- /dev/null +++ b/jhagent/static/icons-reference/icons-reference.html @@ -0,0 +1,256 @@ + + +
+ + + +This font was created withFontastic
+