This commit is contained in:
송대일 committed 2026-01-30 17:20:52 +09:00
commit 21b6332c9c
459 files changed
+190743

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
<?php
// /www/kngil/index.php
declare(strict_types=1);
// ---------------------------------
// 1. 기본 상수
// ---------------------------------
define('ROOT', __DIR__);
define('SKIN_PATH', ROOT.'/skin');
// ---------------------------------
// 2. 페이지 결정
// ---------------------------------
$page = $_GET['page'] ?? 'index';
// 파일명 보안 필터
$page = preg_replace('/[^a-zA-Z0-9_\-]/', '', $page);
// ---------------------------------
// 3. skin 파일 매핑
// ---------------------------------
$viewFile = SKIN_PATH.'/'.$page.'.php';
// ---------------------------------
// 4. 존재 여부 체크
// ---------------------------------
if (!is_file($viewFile)) {
http_response_code(404);
exit('404 NOT FOUND');
}
// ---------------------------------
// 5. 화면 위임
// ---------------------------------
require $viewFile;
+24
View File
@@ -0,0 +1,24 @@
# --------------------------------------------------
# 기본 보안 설정
# --------------------------------------------------
# 디렉토리 목록 노출 방지
Options -Indexes
# 기본 인덱스 파일 고정
DirectoryIndex index.php
# 서버 정보 노출 방지
ServerSignature Off
# --------------------------------------------------
# 민감 파일 직접 접근 차단
# --------------------------------------------------
<FilesMatch "\.(env|ini|log|sql|bak|sh|inc)$">
Require all denied
</FilesMatch>
# --------------------------------------------------
# PHP 설정 (가능한 경우)
# --------------------------------------------------
php_flag display_errors Off
+39
View File
@@ -0,0 +1,39 @@
<?php
// /auth/oauth-callback.php
$code = $_POST['code'] ?? null;
if (!$code) {
echo 'Invalid callback';
exit;
}
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>로그인 처리중...</title>
</head>
<body>
<script>
fetch('/api/auth/verify-login.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'include',
body: JSON.stringify({
code: <?= json_encode($code) ?>
})
})
.then(res => res.json())
.then(result => {
if (window.opener) {
window.opener.postMessage({
type: result.status === 'success' ? 'LOGIN_SUCCESS' : 'LOGIN_FAIL',
payload: result.user || result.message
}, location.origin);
}
window.close();
});
</script>
</body>
</html>
+1
View File
@@ -0,0 +1 @@
Options -Indexes
+165
View File
@@ -0,0 +1,165 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
header('Content-Type: application/json; charset=utf-8');
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
require_once __DIR__ . '/db_conn.php';
/* =================================================
0. 로그인 / 권한 체크
================================================= */
if (!isset($_SESSION['login'])) {
echo json_encode([
'status' => 'error',
'message' => '로그인이 필요합니다.'
]);
exit;
}
$auth = $_SESSION['login']['auth_bc'] ?? '';
if (!in_array($auth, ['BS100100', 'BS100200'])) {
echo json_encode([
'status' => 'error',
'message' => '접근 권한이 없습니다.'
]);
exit;
}
/* =================================================
공통 입력
================================================= */
$input = json_decode(file_get_contents('php://input'), true) ?? [];
$action = $_GET['action'] ?? $input['action'] ?? 'list';
try {
switch ($action) {
case 'user_list':
// 🔥 상단에서 선택한 회사
$target_member_id = $_GET['member_id'] ?? '';
if (!$target_member_id) {
throw new Exception('member_id 누락');
}
$stmt = $pdo->prepare("
SELECT *
FROM kngil.sp_users_r(
:member_id,
'',
'',
''
)
");
$stmt->execute([
':member_id' => $target_member_id
]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $i => &$r) {
$r['recid'] = $i + 1;
}
echo json_encode([
'status' => 'success',
'records' => $rows
]);
break;
/* =================================================
1. 통합 회원 목록 조회
- 모든 회사(member) 조회
================================================= */
case 'list':
$sql = "SELECT * FROM kngil.sp_member_sys_r('', '', '');";
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
$i = 1;
foreach ($rows as &$r) {
$r['recid'] = $i++;
}
echo json_encode([
'status' => 'success',
'records' => $rows
]);
break;
/* =================================================
2. 회원 정보 수정 (회사 단위)
- tel / email / 사업자번호 / 회사명
================================================= */
case 'save':
$updates = $input['updates'] ?? [];
if (!$updates) {
throw new Exception('저장할 데이터가 없습니다.');
}
$pdo->beginTransaction();
$stmtU = $pdo->prepare("
SELECT kngil.sp_member_sys_u(
:member_id::varchar,
:tel_no::varchar,
:email::varchar,
:bs_no::varchar,
:co_nm::varchar,
:mid::varchar
) AS result
");
foreach ($updates as $r) {
if (empty($r['member_id'])) {
throw new Exception('member_id 누락');
}
$stmtU->execute([
':member_id' => $r['member_id'],
':tel_no' => $r['tel_no'] ?? null,
':email' => $r['email'] ?? null,
':bs_no' => $r['bs_no'] ?? null,
':co_nm' => $r['co_nm'] ?? null,
':mid' => $_SESSION['login']['user_id']
]);
$result = $stmtU->fetchColumn();
if (strpos($result, 'ERROR') === 0) {
throw new Exception($result);
}
}
$pdo->commit();
echo json_encode([
'status' => 'success'
]);
break;
default:
throw new Exception('Invalid action');
}
} catch (Exception $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
echo json_encode([
'status' => 'error',
'message' => $e->getMessage()
]);
}
+261
View File
@@ -0,0 +1,261 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
header('Content-Type: application/json; charset=utf-8');
/* =========================
로그인 / 권한 가드
========================= */
require_once __DIR__ . '/adm_guard.php';
require_once __DIR__ . '/db_conn.php';
/* =========================
세션 기준 값 (중요)
========================= */
$login = $_SESSION['login'];
$auth_bc = $login['auth_bc']; // 권한코드
$member_id = $login['member_id']; // 회사ID
/* =========================
입력
========================= */
$input = json_decode(file_get_contents('php://input'), true) ?? [];
$action = $_GET['action'] ?? $input['action'] ?? 'list';
/* =========================
권한 플래그
========================= */
$isAdmin = in_array($auth_bc, ['BS100100','BS100200','BS100300'], true);
try {
switch ($action) {
/* =========================
0. 공통코드 조회 (콤보)
========================= */
case 'base_code':
$main_cd = $_GET['main_cd'] ?? $input['main_cd'] ?? '';
if (!$main_cd) {
throw new Exception('main_cd가 필요합니다.');
}
$stmt = $pdo->prepare("
SELECT *
FROM kngil.fn_base_cd(:main_cd)
");
$stmt->execute([
':main_cd' => $main_cd
]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([
'status' => 'success',
'items' => $rows // [{id, text}]
]);
break;
/* =========================
1. 사용자 목록 조회
========================= */
case 'list':
$schType = $_GET['sch_type'] ?? '';
$schKeyword = $_GET['sch_keyword'] ?? '';
$schUseYn = $_GET['sch_use_yn'] ?? '';
// 기본값
$sch_id = '';
$sch_nm = '';
$sch_dept = '';
if ($schKeyword !== '') {
switch ($schType) {
case 'id':
$sch_id = $schKeyword;
break;
case 'name':
$sch_nm = $schKeyword;
break;
case 'dept':
$sch_dept = $schKeyword;
break;
default: // 전체
$sch_id = $schKeyword;
$sch_nm = $schKeyword;
$sch_dept = $schKeyword;
}
}
$sql = "
SELECT *
FROM kngil.sp_users_r(
:member_id,
:user_nm,
:dept_nm,
:use_yn
);
";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':member_id' => $member_id,
':user_nm' => $_GET['user_nm'] ?? '',
':dept_nm' => $_GET['dept_nm'] ?? '',
':use_yn' => $_GET['use_yn'] ?? ''
]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$i = 1;
foreach ($rows as &$r) {
$r['recid'] = $i++;
}
echo json_encode([
'status' => 'success',
'member_id' => $member_id,
'records' => $rows
]);
break;
/* =========================
2. 사용자 저장
========================= */
case 'save':
$inserts = $input['inserts'] ?? [];
$updates = $input['updates'] ?? [];
if (!$inserts && !$updates) {
throw new Exception('저장할 데이터가 없습니다.');
}
$pdo->beginTransaction();
// INSERT
if ($inserts) {
$stmtI = $pdo->prepare("
SELECT kngil.sp_users_i(
:member_id,:user_id,:user_pw,:user_nm,:dept_nm,
:posit_nm,:tel_no,:email,:auth_bc,:use_yn,:rmks,:cid
)
");
foreach ($inserts as $r) {
$stmtI->execute([
':member_id' => $member_id,
':user_id' => $r['user_id'],
':user_pw' => $r['user_pw'] ?? '0000',
':user_nm' => $r['user_nm'],
':dept_nm' => $r['dept_nm'],
':posit_nm' => $r['posit_nm'] ?? '',
':tel_no' => $r['tel_no'],
':email' => $r['email'],
':auth_bc' => $r['auth_bc'],
':use_yn' => $r['use_yn'],
':rmks' => $r['rmks'] ?? '',
':cid' => $r['cid'] ?? 'SYSTEM'
]);
}
}
// UPDATE
if ($updates) {
$stmtU = $pdo->prepare("
SELECT kngil.sp_users_u(
:member_id,:user_id,:user_pw,:user_nm,:dept_nm,
:posit_nm,:tel_no,:email,:auth_bc,:use_yn,:rmks,:mid
)
");
foreach ($updates as $r) {
$stmtU->execute([
':member_id' => $member_id,
':user_id' => $r['user_id'],
':user_pw' => null,
':user_nm' => $r['user_nm'],
':dept_nm' => $r['dept_nm'],
':posit_nm' => $r['posit_nm'] ?? '',
':tel_no' => $r['tel_no'],
':email' => $r['email'],
':auth_bc' => $r['auth_bc'],
':use_yn' => $r['use_yn'],
':rmks' => $r['rmks'] ?? '',
':mid' => $r['mid'] ?? 'SYSTEM'
]);
}
}
$pdo->commit();
echo json_encode(['status'=>'success']);
break;
/* =========================
3. 사용자 삭제 (비활성)
========================= */
case 'delete':
$ids = $input['ids'] ?? [];
if (!$ids) throw new Exception('삭제 대상이 없습니다.');
$sql = "SELECT kngil.sp_users_d(:member_id, :user_id)";
$stmt = $pdo->prepare($sql);
foreach ($ids as $uid) {
$stmt->execute([
':member_id' => $member_id,
':user_id' => $uid
]);
}
echo json_encode(['status'=>'success']);
break;
/* =========================
4. 회원 총 구매 면적 조회
========================= */
case 'total_area':
$sql = "
SELECT COALESCE(SUM(sum_area), 0) AS total_area
FROM kngil.sp_buy_item_history_r(:member_id, '', NULL, NULL)
";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':member_id' => $member_id
]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo json_encode([
'status' => 'success',
'member_id' => $member_id,
'total_area' => (int)$row['total_area']
]);
break;
default:
throw new Exception('잘못된 요청');
}
} catch (Exception $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
http_response_code(500);
echo json_encode([
'status' => 'error',
'message' => $e->getMessage()
]);
}
+393
View File
@@ -0,0 +1,393 @@
<?php
ini_set('display_errors', 0);
error_reporting(0);
header('Content-Type: application/json; charset=utf-8');
/* =========================
로그인 / 권한 가드
========================= */
require_once __DIR__ . '/adm_guard.php';
require_once __DIR__ . '/db_conn.php';
/* =========================
세션 기준 값
========================= */
$login = $_SESSION['login'];
$auth_bc = $login['auth_bc']; // 권한코드
$member_id = $login['member_id']; // 회사ID
$user_id = $login['user_id'] ?? 'SYSTEM';
/* =========================
권한 정의 (단순화 버전)
========================= */
$isAdmin = in_array(
$auth_bc,
['BS100100','BS100200','BS100300','BS100400'],
true
);
/* =========================
입력
========================= */
$input = json_decode(file_get_contents('php://input'), true) ?? [];
$action = $_GET['action'] ?? $input['action'] ?? 'list';
try {
switch ($action) {
/* =========================
0. 공통코드 조회
========================= */
case 'base_code':
$main_cd = $_GET['main_cd'] ?? $input['main_cd'] ?? '';
if (!$main_cd) {
throw new Exception('main_cd가 필요합니다.');
}
$stmt = $pdo->prepare("
SELECT *
FROM kngil.fn_base_cd(:main_cd)
");
$stmt->execute([':main_cd' => $main_cd]);
echo json_encode([
'status' => 'success',
'items' => $stmt->fetchAll(PDO::FETCH_ASSOC)
]);
break;
/* =========================
1. 사용자 목록 조회
========================= */
case 'list':
// 조회 대상 member_id 결정
$target_member_id = $member_id; // 기본: 세션 기준
// 관리자 / 개발자만 GET member_id 허용
if ($isAdmin && !empty($_GET['member_id'])) {
$target_member_id = $_GET['member_id'];
}
$stmt = $pdo->prepare("
SELECT *
FROM kngil.sp_users_r(
:member_id,
:user_nm,
:dept_nm,
:use_yn
)
");
$stmt->execute([
':member_id' => $target_member_id,
':user_nm' => $_GET['user_nm'] ?? '',
':dept_nm' => $_GET['dept_nm'] ?? '',
':use_yn' => $_GET['use_yn'] ?? ''
]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $i => &$r) {
$r['recid'] = $i + 1;
}
echo json_encode([
'status' => 'success',
'member_id' => $target_member_id,
'records' => $rows
]);
break;
/* =========================
2. 사용자 저장
========================= */
case 'save':
if (!$isAdmin) {
throw new Exception('저장 권한이 없습니다.');
}
$inserts = $input['inserts'] ?? [];
$updates = $input['updates'] ?? [];
if (!$inserts && !$updates) {
throw new Exception('저장할 데이터가 없습니다.');
}
$pdo->beginTransaction();
/* ---------- INSERT ---------- */
if ($inserts) {
$stmtI = $pdo->prepare("
SELECT kngil.sp_users_i(
:member_id,:user_id,:user_pw,:user_nm,:dept_nm,
:posit_nm,:tel_no,:email,:auth_bc,:use_yn,:rmks,:cid
)
");
foreach ($inserts as $r) {
$stmtI->execute([
':member_id' => $member_id,
':user_id' => $r['user_id'],
':user_pw' => $r['user_pw'] ?? '0000',
':user_nm' => $r['user_nm'],
':dept_nm' => $r['dept_nm'],
':posit_nm' => $r['posit_nm'] ?? '',
':tel_no' => $r['tel_no'],
':email' => $r['email'],
':auth_bc' => is_array($r['auth_bc'])
? ($r['auth_bc']['id'] ?? '')
: $r['auth_bc'],
':use_yn' => is_array($r['use_yn'])
? ($r['use_yn']['id'] ?? 'Y')
: $r['use_yn'],
':rmks' => $r['rmks'] ?? '',
':cid' => $user_id
]);
}
}
/* ---------- UPDATE ---------- */
if ($updates) {
$stmtChk = $pdo->prepare("
SELECT 1
FROM kngil.users
WHERE member_id = :member_id
AND user_id = :user_id
");
$stmtU = $pdo->prepare("
SELECT kngil.sp_users_u(
:member_id,:user_id,NULL,:user_nm,:dept_nm,
:posit_nm,:tel_no,:email,:auth_bc,:use_yn,:rmks,:mid
)
");
foreach ($updates as $r) {
// 회사 탈출 방지
$stmtChk->execute([
':member_id' => $member_id,
':user_id' => $r['user_id']
]);
if (!$stmtChk->fetchColumn()) {
throw new Exception('권한 없는 사용자 수정 시도');
}
$stmtU->execute([
':member_id' => $member_id,
':user_id' => $r['user_id'],
':user_nm' => $r['user_nm'],
':dept_nm' => $r['dept_nm'],
':posit_nm' => $r['posit_nm'] ?? '',
':tel_no' => $r['tel_no'],
':email' => $r['email'],
':auth_bc' => $r['auth_bc'],
':use_yn' => $r['use_yn'],
':rmks' => $r['rmks'] ?? '',
':mid' => $user_id
]);
}
}
$pdo->commit();
echo json_encode(['status' => 'success']);
break;
/* =========================
3. 사용자 삭제 (비활성)
========================= */
case 'delete':
if (!$isAdmin) {
throw new Exception('삭제 권한이 없습니다.');
}
$ids = $input['ids'] ?? [];
if (!$ids) {
throw new Exception('삭제 대상이 없습니다.');
}
$stmt = $pdo->prepare("
SELECT kngil.sp_users_d(:member_id, :user_id)
");
foreach ($ids as $uid) {
$stmt->execute([
':member_id' => $member_id,
':user_id' => $uid
]);
}
echo json_encode(['status' => 'success']);
break;
/* =========================
4. 회원 총 구매 면적
========================= */
case 'total_area':
$stmt = $pdo->prepare("
SELECT COALESCE(SUM(sum_area),0)
FROM kngil.sp_buy_item_history_r(:member_id, '', NULL, NULL)
");
$stmt->execute([':member_id' => $member_id]);
echo json_encode([
'status' => 'success',
'total_area' => (int)$stmt->fetchColumn()
]);
break;
/* =========================
5. CSV 일괄 계정생성
========================= */
case 'bulk_create':
if (!$isAdmin) {
throw new Exception('일괄 생성 권한이 없습니다.');
}
$target_member_id = $input['member_id'] ?? '';
$csv_url = $input['csv_url'] ?? '';
if (!$target_member_id || !$csv_url) {
throw new Exception('필수 파라미터 누락');
}
// CSV 다운로드
$csv = @file_get_contents($csv_url);
if ($csv === false) {
throw new Exception('CSV 파일을 불러올 수 없습니다.');
}
$lines = array_map('str_getcsv', explode("\n", trim($csv)));
// 헤더 제거 (첫 줄)
array_shift($lines);
$success = 0;
$fail = 0;
$errors = [];
$stmt = $pdo->prepare("
SELECT kngil.sp_users_i(
:member_id,:user_id,:user_pw,:user_nm,:dept_nm,
'',:tel_no,:email,:auth_bc,:use_yn,'',
:cid
)
");
foreach ($lines as $i => $row) {
if (count($row) < 8) {
$fail++;
$errors[] = "라인 ".($i+2).": 컬럼 수 부족";
continue;
}
[
$user_id,
$user_pw,
$user_nm,
$tel_no,
$email,
$dept_nm,
$use_txt,
$auth_txt
] = array_map('trim', $row);
/* ---------- 값 정규화 ---------- */
$use_yn = 'Y'; // 항상 사용
$auth_bc = 'BS100500'; // 일반 권한
/* ---------- 중복 체크 ---------- */
// ID 중복 (대소문자 무시)
$chk = $pdo->prepare("
SELECT 1 FROM kngil.users
WHERE LOWER(user_id) = LOWER(:uid)
");
$chk->execute([':uid' => $user_id]);
if ($chk->fetchColumn()) {
$fail++;
$errors[] = "라인 ".($i+2).": ID 중복 ($user_id)";
continue;
}
// 전화번호 중복
$chk = $pdo->prepare("
SELECT 1 FROM kngil.users
WHERE tel_no = :tel
");
$chk->execute([':tel' => $tel_no]);
if ($chk->fetchColumn()) {
$fail++;
$errors[] = "라인 ".($i+2).": 연락처 중복 ($tel_no)";
continue;
}
/* ---------- 프로시저 호출 ---------- */
try {
$stmt->execute([
':member_id' => $target_member_id,
':user_id' => $user_id,
':user_pw' => $user_pw ?: '0000',
':user_nm' => $user_nm,
':dept_nm' => $dept_nm,
':tel_no' => $tel_no,
':email' => $email,
':auth_bc' => $auth_bc,
':use_yn' => $use_yn,
':cid' => $user_id // 생성자
]);
$result = $stmt->fetchColumn(); // ⭐ 필수
if ($result !== 'SUCCESS') {
$fail++;
$errors[] = "라인 ".($i+2).": ".$result;
continue;
}
$success++;
} catch (Exception $e) {
$fail++;
$errors[] = "라인 ".($i+2).": ".$e->getMessage();
}
}
echo json_encode([
'status' => 'success',
'success_cnt' => $success,
'fail_cnt' => $fail,
'errors' => $errors
]);
break;
default:
throw new Exception('잘못된 요청');
}
} catch (Exception $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
http_response_code(403);
echo json_encode([
'status' => 'error',
'message' => $e->getMessage()
]);
}
+27
View File
@@ -0,0 +1,27 @@
<?php
// 1. DB 연결 (절대 경로 혹은 상대 경로 확인)
require_once 'db_conn.php';
header('Content-Type: application/json');
try {
// 2. 프로시저 호출 (컬럼명: itm_cd, itm_nm, area, itm_amt 등)
$stmt = $pdo->prepare("SELECT * FROM kngil.sp_fa_comments_r()");
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 3. W2UI를 위해 각 행에 'recid' 필드 강제 주입
$records = [];
foreach ($rows as $row) {
$row['recid'] = $row['fa_id']; // 상품코드를 고유 키로 지정
$records[] = $row;
}
// 4. 순수 JSON만 출력 (다른 echo나 공백이 섞이면 에러 발생)
echo json_encode($records);
} catch (PDOException $e) {
// 에러 발생 시 그리드가 이해할 수 있게 JSON으로 출력
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>
+58
View File
@@ -0,0 +1,58 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
header('Content-Type: application/json; charset=utf-8');
/* =========================
로그인 / 권한 가드
========================= */
require_once __DIR__ . '/adm_guard.php';
require_once __DIR__ . '/db_conn.php';
/* =========================
세션 기준 값
========================= */
$login = $_SESSION['login'];
$auth_bc = $login['auth_bc']; // 권한코드
$member_id = $login['member_id']; // 회사ID
$user_id = $login['user_id'] ?? 'SYSTEM';
error_reporting(E_ALL);
ini_set('display_errors', 1);
header('Content-Type: application/json; charset=utf-8');
// JSON 데이터 읽기
$input = json_decode(file_get_contents('php://input'), true);
try {
// 2. $pdo 변수가 있는지 확인 (DB 연결 확인)
if (!isset($pdo)) {
throw new Exception('데이터베이스 연결 설정($pdo)을 찾을 수 없습니다.');
}
$ids = $input['ids'] ?? [];
if (empty($ids)) {
throw new Exception('삭제 대상이 없습니다.');
}
$pdo->beginTransaction();
// 3. 삭제 실행
$stmt = $pdo->prepare("SELECT kngil.sp_fa_comments_d(:fa_id)");
foreach ($ids as $code) {
$stmt->execute([':fa_id' => $code]);
}
$pdo->commit();
echo json_encode(['status' => 'success']);
} catch (Exception $e) {
if (isset($pdo) && $pdo->inTransaction()) {
$pdo->rollBack();
}
// 기존 출력물 제거 후 깨끗한 JSON만 출력
if (ob_get_length()) ob_clean();
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>
+94
View File
@@ -0,0 +1,94 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
header('Content-Type: application/json; charset=utf-8');
/* =========================
로그인 / 권한 가드
========================= */
require_once __DIR__ . '/adm_guard.php';
require_once __DIR__ . '/db_conn.php';
/* =========================
세션 기준 값
========================= */
$login = $_SESSION['login'];
$auth_bc = $login['auth_bc']; // 권한코드
$member_id = $login['member_id']; // 회사ID
$user_id = $login['user_id'] ?? 'SYSTEM';
/* =========================
입력
========================= */
$input = json_decode(file_get_contents('php://input'), true) ?? [];
$action = $_GET['action'] ?? $input['action'] ?? 'list';
try {
switch ($action) {
case 'save':
// $isAdmin 에러를 방지하기 위해 잠시 주석 처리하거나 true로 설정
// if (!$isAdmin) throw new Exception('권한이 없습니다.');
$inserts = $input['inserts'] ?? [];
$updates = $input['updates'] ?? [];
$pdo->beginTransaction();
/* ---------- 신규 추가(INSERT) ---------- */
if ($inserts) {
// 호출 시 파라미터 개수와 이름을 정확히 맞춤
$stmtI = $pdo->prepare("SELECT kngil.sp_fa_comments_i(:fa_subject, :fa_content, :sq_no, :use_yn, :cid)");
foreach ($inserts as $r) {
$stmtI->execute([
':fa_subject' => $r['fa_subject'] ?? '', // 데이터가 없으면 빈 글자라도 보냄
':fa_content' => $r['fa_content'] ?? '',
':sq_no' => $r['sq_no'] ?? 0,
':use_yn' => $r['use_yn'] ?? 'Y',
':cid' => $user_id
]);
}
}
/* ---------- 수정(UPDATE) ---------- */
if ($updates) {
$stmtU = $pdo->prepare("SELECT kngil.sp_fa_comments_u(:fa_id, :fa_subject, :fa_content, :sq_no, :use_yn, :mid)");
foreach ($updates as $r) {
$stmtU->execute([
':fa_id' => $r['fa_id'] ?? '',
':fa_subject' => $r['fa_subject'] ?? '', // 데이터가 없으면 빈 글자라도 보냄
':fa_content' => $r['fa_content'] ?? '',
':sq_no' => $r['sq_no'] ?? 0,
':use_yn' => $r['use_yn'] ?? 'Y',
':mid' => $user_id
]);
}
}
$pdo->commit();
echo json_encode(['status' => 'success']);
break;
default:
throw new Exception('잘못된 요청');
}
}
catch (Exception $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
http_response_code(403);
echo json_encode([
'status' => 'error',
'message' => $e->getMessage()
]);
}
+36
View File
@@ -0,0 +1,36 @@
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
/* =========================
1. 로그인 체크
========================= */
if (empty($_SESSION['login'])) {
header('Location: /kngil/skin/index.php');
exit;
}
/* =========================
2. 권한 체크
========================= */
$auth_bc = $_SESSION['login']['auth_bc'] ?? '';
$ALLOW_AUTH = [
'BS100100', // 개발자
'BS100200', // 관리자
'BS100300', // 메인
'BS100400', // 서브
];
if (!in_array($auth_bc, $ALLOW_AUTH, true)) {
http_response_code(403);
echo '접근 권한이 없습니다.';
exit;
}
/* =========================
3. 권한 플래그 (중요)
========================= */
define('IS_SUPER_ADMIN', in_array($auth_bc, ['BS100100','BS100200'], true));
define('IS_COMPANY_ADMIN', in_array($auth_bc, ['BS100300','BS100400'], true));
+27
View File
@@ -0,0 +1,27 @@
<?php
// 1. DB 연결 (절대 경로 혹은 상대 경로 확인)
require_once 'db_conn.php';
header('Content-Type: application/json');
try {
// 2. 프로시저 호출 (컬럼명: itm_cd, itm_nm, area, itm_amt 등)
$stmt = $pdo->prepare("SELECT * FROM kngil.sp_item_r()");
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 3. W2UI를 위해 각 행에 'recid' 필드 강제 주입
$records = [];
foreach ($rows as $row) {
$row['recid'] = $row['itm_cd']; // 상품코드를 고유 키로 지정
$records[] = $row;
}
// 4. 순수 JSON만 출력 (다른 echo나 공백이 섞이면 에러 발생)
echo json_encode($records);
} catch (PDOException $e) {
// 에러 발생 시 그리드가 이해할 수 있게 JSON으로 출력
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>
+58
View File
@@ -0,0 +1,58 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
header('Content-Type: application/json; charset=utf-8');
/* =========================
로그인 / 권한 가드
========================= */
require_once __DIR__ . '/adm_guard.php';
require_once __DIR__ . '/db_conn.php';
/* =========================
세션 기준 값
========================= */
$login = $_SESSION['login'];
$auth_bc = $login['auth_bc']; // 권한코드
$member_id = $login['member_id']; // 회사ID
$user_id = $login['user_id'] ?? 'SYSTEM';
error_reporting(E_ALL);
ini_set('display_errors', 1);
header('Content-Type: application/json; charset=utf-8');
// JSON 데이터 읽기
$input = json_decode(file_get_contents('php://input'), true);
try {
// 2. $pdo 변수가 있는지 확인 (DB 연결 확인)
if (!isset($pdo)) {
throw new Exception('데이터베이스 연결 설정($pdo)을 찾을 수 없습니다.');
}
$ids = $input['ids'] ?? [];
if (empty($ids)) {
throw new Exception('삭제 대상이 없습니다.');
}
$pdo->beginTransaction();
// 3. 삭제 실행
$stmt = $pdo->prepare("SELECT kngil.sp_item_d(:itm_cd)");
foreach ($ids as $code) {
$stmt->execute([':itm_cd' => $code]);
}
$pdo->commit();
echo json_encode(['status' => 'success']);
} catch (Exception $e) {
if (isset($pdo) && $pdo->inTransaction()) {
$pdo->rollBack();
}
// 기존 출력물 제거 후 깨끗한 JSON만 출력
if (ob_get_length()) ob_clean();
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>
+97
View File
@@ -0,0 +1,97 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
header('Content-Type: application/json; charset=utf-8');
/* =========================
로그인 / 권한 가드
========================= */
require_once __DIR__ . '/adm_guard.php';
require_once __DIR__ . '/db_conn.php';
/* =========================
세션 기준 값
========================= */
$login = $_SESSION['login'];
$auth_bc = $login['auth_bc']; // 권한코드
$member_id = $login['member_id']; // 회사ID
$user_id = $login['user_id'] ?? 'SYSTEM';
/* =========================
입력
========================= */
$input = json_decode(file_get_contents('php://input'), true) ?? [];
$action = $_GET['action'] ?? $input['action'] ?? 'list';
try {
switch ($action) {
case 'save':
// $isAdmin 에러를 방지하기 위해 잠시 주석 처리하거나 true로 설정
// if (!$isAdmin) throw new Exception('권한이 없습니다.');
$inserts = $input['inserts'] ?? [];
$updates = $input['updates'] ?? [];
$pdo->beginTransaction();
/* ---------- 신규 추가(INSERT) ---------- */
if ($inserts) {
// 호출 시 파라미터 개수와 이름을 정확히 맞춤
$stmtI = $pdo->prepare("SELECT kngil.sp_item_i(:itm_cd, :itm_nm, :area, :itm_amt, :use_yn, :rmks, :cid)");
foreach ($inserts as $r) {
$stmtI->execute([
':itm_cd' => $r['itm_cd'] ?? '', // 데이터가 없으면 빈 글자라도 보냄
':itm_nm' => $r['itm_nm'] ?? '',
':area' => $r['area'] ?? 0,
':itm_amt' => $r['itm_amt'] ?? 0,
':use_yn' => $r['use_yn'] ?? 'Y',
':rmks' => $r['rmks'] ?? '',
':cid' => $user_id
]);
}
}
/* ---------- 수정(UPDATE) ---------- */
if ($updates) {
$stmtU = $pdo->prepare("SELECT kngil.sp_item_u(:itm_cd, :itm_nm, :area, :itm_amt, :use_yn, :rmks, :mid)");
foreach ($updates as $r) {
$stmtU->execute([
':itm_cd' => $r['itm_cd'] ?? '',
':itm_nm' => $r['itm_nm'] ?? '',
':area' => $r['area'] ?? 0,
':itm_amt' => $r['itm_amt'] ?? 0,
':use_yn' => $r['use_yn'] ?? 'Y',
':rmks' => $r['rmks'] ?? '',
':mid' => $user_id
]);
}
}
$pdo->commit();
echo json_encode(['status' => 'success']);
break;
default:
throw new Exception('잘못된 요청');
}
}
catch (Exception $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
http_response_code(403);
echo json_encode([
'status' => 'error',
'message' => $e->getMessage()
]);
}
+45
View File
@@ -0,0 +1,45 @@
<?php
// 1. DB 연결
require_once 'db_conn.php';
header('Content-Type: application/json');
try {
// 클라이언트(JS)로부터 전달받은 검색 조건 (POST 또는 GET 방식에 맞춰 수정)
$p_member_id = $_POST['member_id'] ?? '';
$p_member_nm = $_POST['member_nm'] ?? '';
// 날짜가 빈 값('')으로 오면 반드시 null로 치환해야 PostgreSQL date 타입 에러가 안 납니다.
$p_fbuy_dt = (!empty($_POST['fbuy_dt'])) ? $_POST['fbuy_dt'] : null;
$p_tbuy_dt = (!empty($_POST['tbuy_dt'])) ? $_POST['tbuy_dt'] : null;
// 2. 프로시저 호출 - 파라미터 자리에 ?를 사용합니다.
$stmt = $pdo->prepare("SELECT * FROM kngil.sp_buy_item_history_r(?, ?, ?, ?)");
// 파라미터 순서대로 배열에 담아 실행합니다.
$stmt->execute([
$p_member_id,
$p_member_nm,
$p_fbuy_dt,
$p_tbuy_dt
]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 3. W2UI를 위해 각 행에 'recid' 필드 강제 주입
$records = [];
foreach ($rows as $row) {
// 복합키(member_id + sp_no)를 조합하여 유일한 recid 생성
$row['recid'] = $row['member_id'] . '_' . $row['sq_no'];
$records[] = $row;
}
// 4. 결과 출력
echo json_encode($records);
} catch (PDOException $e) {
// HTTP 상태 코드를 500으로 설정하여 클라이언트가 에러임을 인지하게 할 수 있습니다.
http_response_code(500);
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>
+209
View File
@@ -0,0 +1,209 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/db_conn.php';
$input = json_decode(file_get_contents('php://input'), true);
$action = $input['action'] ?? '';
$member_id = $input['member_id'] ?? '';
if (!$action || !$member_id) {
http_response_code(400);
echo json_encode([
'status' => 'error',
'message' => '필수값 누락'
]);
exit;
}
try {
/* =========================
조회 (R)
========================= */
if ($action === 'list') {
$buy_date = $input['buy_date'] ?? '';
if (!$buy_date) {
throw new Exception('구매일 누락');
}
$stmt = $pdo->prepare("
SELECT *
FROM kngil.sp_buy_item_r(:member_id, :buy_date)
");
$stmt->execute([
'member_id' => $member_id,
'buy_date' => $buy_date
]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$i = 1;
foreach ($rows as &$r) {
$r['recid'] = $i++;
}
echo json_encode([
'status' => 'success',
'records' => $rows
]);
exit;
}
/* =========================
즉시 삭제 (D)
========================= */
if ($action === 'delete') {
$sq_no = $input['sq_no'] ?? null;
if (!$sq_no) {
throw new Exception('삭제 대상 누락');
}
$pdo->prepare("
SELECT kngil.sp_buy_item_d(
:member_id,
:sq_no
)
")->execute([
'member_id' => $member_id,
'sq_no' => $sq_no
]);
echo json_encode([
'status' => 'success'
]);
exit;
}
/* =========================
저장 (C / U)
========================= */
if ($action === 'save') {
$buy_date = $input['buy_date'] ?? '';
$items = $input['items'] ?? [];
if (!$buy_date) {
throw new Exception('구매일 누락');
}
$pdo->beginTransaction();
foreach ($items as $row) {
$end_dt = empty($row['end_dt']) ? null : $row['end_dt'];
// INSERT
if (!empty($row['_new'])) {
$pdo->prepare("
SELECT kngil.sp_buy_item_i(
:member_id::character varying,
:buy_dt::date,
:itm_cd::character varying,
:itm_qty::numeric,
:itm_area::numeric,
:add_area::numeric,
(:itm_area + :add_area)::numeric,
:itm_amt::numeric,
:dis_rt::numeric,
:buy_amt::numeric,
:vat_amt::numeric,
:sum_amt::numeric,
:end_dt::date,
:ok_yn::character varying,
:rmks::character varying,
:cid::character varying
)
")->execute([
'member_id' => $member_id,
'buy_dt' => $buy_date,
'itm_cd' => $row['itm_cd'],
'itm_qty' => $row['itm_qty'],
'itm_area' => $row['itm_area'],
'add_area' => $row['add_area'] ?? 0,
'itm_amt' => $row['itm_amt'],
'dis_rt' => $row['dis_rt'],
'buy_amt' => $row['buy_amt'],
'vat_amt' => $row['vat_amt'],
'sum_amt' => $row['sum_amt'],
'end_dt' => $end_dt,
'ok_yn' => $row['ok_yn'],
'rmks' => $row['rmks'] ?? '',
'cid' => 'ADMIN'
]);
continue;
}
// UPDATE
if (!empty($row['_existing']) && !empty($row['sq_no'])) {
$pdo->prepare("
SELECT kngil.sp_buy_item_u(
:member_id::character varying,
:sq_no::integer,
:buy_dt::date,
:itm_cd::character varying,
:itm_qty::numeric,
:itm_area::numeric,
:add_area::numeric,
(:itm_area + :add_area)::numeric,
:itm_amt::numeric,
:dis_rt::numeric,
:buy_amt::numeric,
:vat_amt::numeric,
:sum_amt::numeric,
:end_dt::date,
:ok_yn::character varying,
:rmks::character varying,
:mid::character varying
)
")->execute([
'member_id' => $member_id,
'sq_no' => $row['sq_no'],
'buy_dt' => $buy_date,
'itm_cd' => $row['itm_cd'],
'itm_qty' => $row['itm_qty'],
'itm_area' => $row['itm_area'],
'add_area' => $row['add_area'] ?? 0,
'itm_amt' => $row['itm_amt'],
'dis_rt' => $row['dis_rt'],
'buy_amt' => $row['buy_amt'],
'vat_amt' => $row['vat_amt'],
'sum_amt' => $row['sum_amt'],
'end_dt' => $end_dt,
'ok_yn' => $row['ok_yn'],
'rmks' => $row['rmks'] ?? '',
'mid' => 'ADMIN'
]);
}
}
$pdo->commit();
echo json_encode([
'status' => 'success'
]);
exit;
}
throw new Exception('Invalid action');
} catch (Exception $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
http_response_code(500);
echo json_encode([
'status' => 'error',
'message' => $e->getMessage()
]);
}
+41
View File
@@ -0,0 +1,41 @@
<?php
// 1. DB 연결
require_once 'db_conn.php';
header('Content-Type: application/json');
try {
// JS의 URLSearchParams에서 보낸 키값과 일치시켜야 합니다.
$p_member_id = $_POST['member_id'] ?? '';
$p_user_nm = $_POST['user_nm'] ?? '';
$p_dept_nm = $_POST['dept_nm'] ?? '';
// 2. 프로시저 호출
// PostgreSQL 함수 호출 시 파라미터가 비어있으면 전체 조회가 되도록 설계됨
$stmt = $pdo->prepare("SELECT * FROM kngil.sp_use_history(?, ?, ?)");
$stmt->execute([
$p_member_id,
$p_user_nm,
$p_dept_nm
]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 3. W2UI를 위해 각 행에 'recid' 필드 주입
$records = [];
foreach ($rows as $index => $row) {
// user_id와 sq_no 조합으로 유일키 생성 (권장)
// 만약 데이터가 없을 경우를 대비해 $index를 활용할 수도 있음
$row['recid'] = ($row['user_id'] ?? 'unknown') . '_' . ($row['sq_no'] ?? $index);
$records[] = $row;
}
// 4. 결과 출력
echo json_encode($records, JSON_UNESCAPED_UNICODE); // 한글 깨짐 방지
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>
+13
View File
@@ -0,0 +1,13 @@
<?php
$dsn = "pgsql:host=172.16.9.44;port=5432;dbname=KNGIL";
$user = "postgres";
$pass = "erpteam1!";
try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
// echo "PostgreSQL 연결 성공 🎉";
} catch (PDOException $e) {
echo $e->getMessage();
}
+23
View File
@@ -0,0 +1,23 @@
<?php
require_once 'db_conn.php';
header('Content-Type: application/json');
// URL 파라미터로 group_id를 받습니다. (예: get_base_cd.php?group_id=BS210)
$group_id = isset($_GET['group_id']) ? $_GET['group_id'] : '';
if (empty($group_id)) {
echo json_encode([]);
exit;
}
try {
// 파라미터(? 처리)를 사용하여 보안을 강화하고 재사용성을 높입니다.
$stmt = $pdo->prepare("SELECT id, text FROM kngil.fn_base_cd(?)");
$stmt->execute([$group_id]);
$items = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($items);
} catch (PDOException $e) {
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>
+160
View File
@@ -0,0 +1,160 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
header('Content-Type: application/json');
$data = json_decode(file_get_contents('php://input'), true);
$action = $data['action'] ?? '';
/* =================================================
아이디 중복확인 (fn_user_id_check 사용)
================================================= */
if ($action === 'check_id') {
$userId = trim($data['userId'] ?? '');
if (!preg_match('/^[a-zA-Z][a-zA-Z0-9]{3,11}$/', $userId)) {
echo json_encode([
'available' => false,
'message' => '아이디 형식 오류'
]);
exit;
}
$stmt = $pdo->prepare("
SELECT kngil.fn_user_id_check(:user_id)
");
$stmt->execute([
':user_id' => $userId
]);
$result = trim($stmt->fetchColumn());
if (strpos($result, 'SUCCESS') === 0) {
echo json_encode([
'available' => true,
'message' => '사용 가능한 아이디입니다.'
]);
} else {
echo json_encode([
'available' => false,
'message' => '이미 존재하는 아이디입니다.'
]);
}
exit;
}
/* =================================================
1. 필수값 검증
================================================= */
$required = [
'memberType', // 회원유형
'userId',
'password',
'userName',
'email',
'phone'
];
foreach ($required as $k) {
if (empty($data[$k])) {
echo json_encode([
'success' => false,
'message' => '필수 항목이 누락되었습니다.'
]);
exit;
}
}
/* =================================================
2. 회원유형 → co_bc 매핑
================================================= */
/*
기업회원 : '1'
개인회원 : '2'
→ 실제 코드값은 여기서 통제
*/
$co_bc = ($data['memberType'] === '1')
? 'CB100100' // 기업
: 'CB100200'; // 개인
/* =================================================
3. 비밀번호 규칙 + 암호화
================================================= */
if (!preg_match('/^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*]).{12,}$/', $data['password'])) {
echo json_encode([
'success' => false,
'message' => '비밀번호 규칙이 올바르지 않습니다.'
]);
exit;
}
$hashedPw = password_hash($data['password'], PASSWORD_DEFAULT);
/* =================================================
4. 이메일 형식
================================================= */
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
echo json_encode([
'success' => false,
'message' => '이메일 형식 오류'
]);
exit;
}
/* =================================================
5. 프로시저 호출
================================================= */
try {
$stmt = $pdo->prepare("
SELECT kngil.sp_member_i(
:p_co_bc,
:p_member_id,
:p_user_pw,
:p_member_nm,
:p_email,
:p_tel_no,
:p_co_nm,
:p_dept_nm,
:p_cid
) AS result
");
$stmt->execute([
':p_co_bc' => $co_bc,
':p_member_id' => $data['userId'],
':p_user_pw' => $hashedPw,
':p_member_nm' => $data['userName'],
':p_email' => $data['email'],
':p_tel_no' => $data['phone'],
':p_co_nm' => $data['company'] ?? null,
':p_dept_nm' => $data['department'] ?? null,
':p_cid' => $data['userId']
]);
$result = $stmt->fetchColumn();
if ($result === 'SUCCESS') {
echo json_encode([
'success' => true
]);
} else {
echo json_encode([
'success' => false,
'message' => $result
]);
}
} catch (Exception $e) {
echo json_encode([
'success' => false,
'message' => '서버 오류'
]);
}
echo json_encode([
'success' => false,
'message' => 'Invalid action'
]);
exit;
+203
View File
@@ -0,0 +1,203 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
header('Content-Type: application/json');
/* =========================
로그 함수
========================= */
function join_log($label, $data = null) {
$logFile = $_SERVER['DOCUMENT_ROOT'].'/kngil/log/join.log';
$time = date('Y-m-d H:i:s');
$log = "[$time] $label\n";
if ($data !== null) {
$log .= print_r($data, true);
}
$log .= "\n-----------------------------\n";
file_put_contents($logFile, $log, FILE_APPEND);
}
/* =========================
JSON 입력 파싱
========================= */
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
join_log('RAW INPUT', $raw);
join_log('PARSED DATA', $data);
$action = $data['action'] ?? null;
join_log('ACTION', $action);
if (!$action) {
echo json_encode([
'success' => false,
'message' => 'Invalid action'
]);
exit;
}
/* =================================================
1. 아이디 중복확인
================================================= */
if ($action === 'check_id') {
$userId = trim($data['userId'] ?? '');
join_log('CHECK_ID userId', $userId);
if (!preg_match('/^[a-zA-Z][a-zA-Z0-9]{3,11}$/', $userId)) {
echo json_encode([
'available' => false,
'message' => '아이디 형식 오류'
]);
exit;
}
$stmt = $pdo->prepare("
SELECT kngil.fn_user_id_check(:user_id)
");
$stmt->execute([':user_id' => $userId]);
$result = trim($stmt->fetchColumn());
join_log('CHECK_ID RESULT', $result);
if (strpos($result, 'SUCCESS') === 0) {
echo json_encode([
'available' => true,
'message' => '사용 가능한 아이디입니다.'
]);
} else {
echo json_encode([
'available' => false,
'message' => '이미 존재하는 아이디입니다.'
]);
}
exit;
}
/* =================================================
2. 회원가입
================================================= */
if ($action !== 'signup') {
echo json_encode([
'success' => false,
'message' => 'Invalid action'
]);
exit;
}
/* =================================================
3. 필수값 검증
================================================= */
$required = ['memberType','userId','password','userName','email','phone'];
foreach ($required as $k) {
if (empty($data[$k])) {
join_log('REQUIRED MISSING', $k);
echo json_encode([
'success' => false,
'message' => '필수 항목이 누락되었습니다.'
]);
exit;
}
}
/* =================================================
4. 회원유형 → co_bc
================================================= */
$memberType = $data['memberType'] ?? '2';
$co_bc = ($memberType === '1') ? 'CB100100' : 'CB100200';
join_log('co_bc', $co_bc);
/* =================================================
5. 비밀번호 규칙 (8자)
================================================= */
if (!preg_match('/^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$/', $data['password'])) {
join_log('PASSWORD INVALID');
echo json_encode([
'success' => false,
'message' => '비밀번호 규칙이 올바르지 않습니다.'
]);
exit;
}
$userPw = $data['password'];
/* =================================================
6. 이메일 검증
================================================= */
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
join_log('EMAIL INVALID', $data['email']);
echo json_encode([
'success' => false,
'message' => '이메일 형식 오류'
]);
exit;
}
/* =================================================
7. 프로시저 호출
================================================= */
try {
join_log('SIGNUP PARAMS', [
'memberType' => $memberType,
'userId' => $data['userId'],
'userName' => $data['userName'],
'email' => $data['email'],
'phone' => $data['phone'],
'company' => $data['company'] ?? null,
'department' => $data['department'] ?? null,
]);
$stmt = $pdo->prepare("
SELECT kngil.sp_member_i(
:p_co_bc,
:p_member_id,
:p_user_pw,
:p_member_nm,
:p_email,
:p_tel_no,
:p_co_nm,
:p_dept_nm,
:p_cid
)
");
$stmt->execute([
':p_co_bc' => $co_bc,
':p_member_id' => $data['userId'],
':p_user_pw' => $userPw,
':p_member_nm' => $data['userName'],
':p_email' => $data['email'],
':p_tel_no' => $data['phone'],
':p_co_nm' => $data['company'] ?? null,
':p_dept_nm' => $data['department'] ?? null,
':p_cid' => $data['userId']
]);
$result = trim($stmt->fetchColumn());
join_log('PROC RESULT', $result);
if ($result === 'SUCCESS') {
join_log('SIGNUP SUCCESS', $data['userId']);
echo json_encode(['success' => true]);
} else {
join_log('SIGNUP FAIL', $result);
echo json_encode([
'success' => false,
'message' => $result
]);
}
} catch (Throwable $e) {
join_log('EXCEPTION', $e->getMessage());
echo json_encode([
'success' => false,
'message' => '서버 오류'
]);
}
exit;
+68
View File
@@ -0,0 +1,68 @@
<?php
session_start();
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
$input = json_decode(file_get_contents('php://input'), true);
$id = trim($input['id'] ?? '');
$pw = trim($input['pw'] ?? '');
if ($id === '' || $pw === '') {
echo json_encode([
'status' => 'error',
'message' => '아이디와 비밀번호를 입력하세요.'
]);
exit;
}
$stmt = $pdo->prepare("
SELECT
u.member_id,
u.user_id,
u.user_pw,
u.user_nm,
u.auth_bc,
u.dept_nm,
m.co_nm,
u.tel_no,
u.email
FROM kngil.users u
LEFT JOIN kngil.members m
ON u.member_id = m.member_id
WHERE LOWER(u.user_id) = LOWER(:id)
AND u.use_yn = 'Y'
LIMIT 1
");
$stmt->execute([':id' => $id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user) {
echo json_encode([
'status' => 'error',
'message' => '존재하지 않는 아이디입니다.'
]);
exit;
}
// 현재 구조상 평문 비교
if ($user['user_pw'] !== $pw) {
echo json_encode([
'status' => 'error',
'message' => '비밀번호가 올바르지 않습니다.'
]);
exit;
}
// ✅ 로그인 성공
$_SESSION['login'] = [
'member_id' => $user['member_id'],
'user_id' => $user['user_id'],
'user_nm' => $user['user_nm'],
'auth_bc' => $user['auth_bc'],
'co_nm' => $user['co_nm'] ?? null,
'dept_nm' => $user['dept_nm'] ?? null,
'tel_no' => $user['tel_no'] ?? null,
'email' => $user['email'] ?? null
];
echo json_encode(['status' => 'success']);
+179
View File
@@ -0,0 +1,179 @@
<?php
/**
* Sentinel SMS 매직링크 테스트 (PHP)
* - phoneNumber: 01086270921 (고정)
* - system: kngil
* - secret_key: MY_SECRET_KEY
*/
header('Content-Type: application/json; charset=utf-8');
/* =========================
설정값
========================= */
$AUTH_SERVER = 'http://61.98.205.242:8075';
$SYSTEM = 'kngil';
$SECRET_KEY = '9f3b2e7a0a4f1f25c41c8c2367d04d54a89a2a5b2b189d63a99a0b874db4b27f';
$PHONE = '01086270921';
/* =========================
JWT 생성 (HS256)
========================= */
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function create_jwt($payload, $secret) {
$header = ['alg'=>'HS256','typ'=>'JWT'];
$segments = [];
$segments[] = base64url_encode(json_encode($header));
$segments[] = base64url_encode(json_encode($payload));
$signing_input = implode('.', $segments);
$signature = hash_hmac('sha256', $signing_input, $secret, true);
$segments[] = base64url_encode($signature);
return implode('.', $segments);
}
/* =========================
cURL 요청 함수
========================= */
function curl_json($url, $method='GET', $headers=[], $body=null) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $body,
CURLOPT_TIMEOUT => 10
]);
$response = curl_exec($ch);
$err = curl_error($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($err) {
throw new Exception($err);
}
return [$code, $response];
}
/* =========================
MODE 분기
========================= */
$mode = $_GET['mode'] ?? 'request';
try {
/* =========================
1️⃣ 매직링크 발급 요청
========================= */
if ($mode === 'request') {
// JWT payload (3분 유효)
$payload = [
'system' => $SYSTEM,
'iat' => time(),
'exp' => time() + 180
];
$jwt = create_jwt($payload, $SECRET_KEY);
[$code, $res] = curl_json(
$AUTH_SERVER.'/auth/sentinel',
'POST',
[
'Authorization: Bearer '.$jwt,
'Content-Type: application/json'
],
json_encode([
'phoneNumber' => $PHONE
])
);
echo json_encode([
'step' => 'sentinel_request',
'http_code' => $code,
'response' => json_decode($res, true)
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
exit;
}
/* =========================
2️⃣ 매직링크 상태 확인
========================= */
if ($mode === 'status') {
$token = $_GET['token'] ?? '';
if (!$token) {
throw new Exception('token 필요');
}
$payload = [
'system' => $SYSTEM,
'iat' => time(),
'exp' => time() + 180
];
$jwt = create_jwt($payload, $SECRET_KEY);
[$code, $res] = curl_json(
$AUTH_SERVER.'/auth/status?token='.$token,
'GET',
[
'Authorization: Bearer '.$jwt
]
);
$data = json_decode($res, true);
// 🔴 여기부터가 "로그인 처리"
if (!empty($data['loggedIn'])) {
$stmt = $pdo->prepare("
SELECT member_id, user_id, user_nm, auth_bc
FROM kngil.users
WHERE REPLACE(tel_no, '-', '') = :phone
AND use_yn = 'Y'
LIMIT 1
");
$stmt->execute([':phone' => $PHONE]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user) {
throw new Exception('해당 번호로 등록된 사용자 없음');
}
$_SESSION['login'] = [
'member_id' => $user['member_id'],
'user_id' => $user['user_id'],
'user_nm' => $user['user_nm'],
'auth_bc' => $user['auth_bc']
];
echo json_encode([
'status' => 'success',
'message' => '자동 로그인 완료'
]);
exit;
}
echo json_encode([
'status' => 'pending'
]);
exit;
}
} catch (Exception $e) {
echo json_encode([
'error' => true,
'message' => $e->getMessage()
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
+212
View File
@@ -0,0 +1,212 @@
<?php
/**
* Sentinel SMS 매직링크 로그인 (PHP)
* - system: kngil
* - secret_key: MY_SECRET_KEY
*/
session_start();
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
header('Content-Type: application/json; charset=utf-8');
/* =========================
설정값
========================= */
$AUTH_SERVER = 'http://61.98.205.242:8075';
$SYSTEM = 'kngil';
$SECRET_KEY = '9f3b2e7a0a4f1f25c41c8c2367d04d54a89a2a5b2b189d63a99a0b874db4b27f';
/* =========================
입력 처리
========================= */
$input = json_decode(file_get_contents('php://input'), true) ?? [];
$mode = $_GET['mode'] ?? $input['mode'] ?? '';
/* =========================
JWT 생성 (HS256)
========================= */
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function create_jwt($payload, $secret) {
$header = ['alg' => 'HS256', 'typ' => 'JWT'];
$segments = [];
$segments[] = base64url_encode(json_encode($header));
$segments[] = base64url_encode(json_encode($payload));
$signing_input = implode('.', $segments);
$signature = hash_hmac('sha256', $signing_input, $secret, true);
$segments[] = base64url_encode($signature);
return implode('.', $segments);
}
/* =========================
cURL JSON 요청
========================= */
function curl_json($url, $method = 'GET', $headers = [], $body = null) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $body,
CURLOPT_TIMEOUT => 10
]);
$response = curl_exec($ch);
$err = curl_error($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($err) {
throw new Exception($err);
}
return [$code, $response];
}
try {
/* =========================
1️⃣ 매직링크 발급 요청
========================= */
if ($mode === 'request') {
$rawPhone = $input['phone'] ?? '';
$phone = preg_replace('/[^0-9]/', '', $rawPhone);
if (!$phone) {
echo json_encode([
'status' => 'error',
'message' => '휴대폰 번호를 입력하세요.'
]);
exit;
}
// JWT payload (3분 유효)
$payload = [
'system' => $SYSTEM,
'iat' => time(),
'exp' => time() + 180
];
$jwt = create_jwt($payload, $SECRET_KEY);
[$code, $res] = curl_json(
$AUTH_SERVER . '/auth/sentinel',
'POST',
[
'Authorization: Bearer ' . $jwt,
'Content-Type: application/json'
],
json_encode([
'phoneNumber' => $phone
])
);
$result = json_decode($res, true);
if (empty($result['token'])) {
throw new Exception('Sentinel token 발급 실패');
}
// ✅ token 반드시 저장
$_SESSION['sms_login'] = [
'phone' => $phone,
'token' => $result['token']
];
echo json_encode([
'status' => 'success'
]);
exit;
}
/* =========================
2️⃣ 매직링크 상태 확인 → 자동 로그인
========================= */
if ($mode === 'status') {
if (
empty($_SESSION['sms_login']['token']) ||
empty($_SESSION['sms_login']['phone'])
) {
echo json_encode(['status' => 'pending']);
exit;
}
$token = $_SESSION['sms_login']['token'];
$phone = $_SESSION['sms_login']['phone'];
$payload = [
'system' => $SYSTEM,
'iat' => time(),
'exp' => time() + 180
];
$jwt = create_jwt($payload, $SECRET_KEY);
[$code, $res] = curl_json(
$AUTH_SERVER . '/auth/status?token=' . $token,
'GET',
[
'Authorization: Bearer ' . $jwt
]
);
$data = json_decode($res, true);
// 🔴 인증 완료 시 로그인 처리
if (!empty($data['loggedIn'])) {
$stmt = $pdo->prepare("
SELECT
member_id,
user_id,
user_nm,
auth_bc
FROM kngil.users
WHERE REPLACE(tel_no, '-', '') = :phone
AND use_yn = 'Y'
LIMIT 1
");
$stmt->execute([':phone' => $phone]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user) {
throw new Exception('해당 번호로 등록된 사용자 없음');
}
// ✅ 기존 PW 로그인과 동일
$_SESSION['login'] = [
'member_id' => $user['member_id'],
'user_id' => $user['user_id'],
'user_nm' => $user['user_nm'],
'auth_bc' => $user['auth_bc']
];
unset($_SESSION['sms_login']);
echo json_encode([
'status' => 'success',
'message' => '자동 로그인 완료'
], JSON_UNESCAPED_UNICODE);
exit;
}
echo json_encode(['status' => 'pending']);
exit;
}
} catch (Exception $e) {
echo json_encode([
'error' => true,
'message' => $e->getMessage()
], JSON_UNESCAPED_UNICODE);
}
+6
View File
@@ -0,0 +1,6 @@
<?php
session_start();
session_destroy();
header('Location: /kngil/skin/index.php');
exit;
+40
View File
@@ -0,0 +1,40 @@
<?php
//mypage01.php
session_start();
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
if (!isset($_SESSION['login'])) {
http_response_code(401);
echo json_encode(['status' => 'error', 'message' => '로그인이 필요합니다.']);
exit;
}
$input = json_decode(file_get_contents('php://input'), true);
$pw = trim($input['pw'] ?? '');
if ($pw === '') {
echo json_encode(['status' => 'error', 'message' => '비밀번호를 입력하세요.']);
exit;
}
$userId = $_SESSION['login']['user_id'];
$stmt = $pdo->prepare("
SELECT user_pw
FROM kngil.users
WHERE user_id = :user_id
AND use_yn = 'Y'
");
$stmt->execute([':user_id' => $userId]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user || $user['user_pw'] !== $pw) {
echo json_encode(['status' => 'error', 'message' => '비밀번호가 올바르지 않습니다.']);
exit;
}
// ✅ 비밀번호 재인증 성공
$_SESSION['mypage_verified'] = true;
echo json_encode(['status' => 'success']);
+90
View File
@@ -0,0 +1,90 @@
<?php
session_start();
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
header('Content-Type: application/json');
if (!isset($_SESSION['login'])) {
http_response_code(401);
echo json_encode(['status' => 'error', 'message' => '로그인이 필요합니다.']);
exit;
}
if (empty($_SESSION['mypage_verified'])) {
http_response_code(403);
echo json_encode(['status' => 'error', 'message' => '마이페이지 인증이 필요합니다.']);
exit;
}
$userId = $_SESSION['login']['user_id'];
/* =========================
페이징 파라미터
========================= */
$page = max(1, intval($_GET['page'] ?? 1));
$pageSize = 5;
$offset = ($page - 1) * $pageSize;
try {
/* =========================
1. 내 정보
========================= */
$stmt = $pdo->prepare("SELECT * FROM kngil.sp_users_my_r(:user_id)");
$stmt->execute([':user_id' => $userId]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user) {
echo json_encode(['status' => 'error', 'message' => '사용자 정보 없음']);
exit;
}
/* =========================
2. 전체 건수
========================= */
$cntStmt = $pdo->prepare("
SELECT COUNT(*)
FROM kngil.use_history
WHERE user_id = :user_id
");
$cntStmt->execute([':user_id' => $userId]);
$totalCount = (int)$cntStmt->fetchColumn();
$totalPages = (int)ceil($totalCount / $pageSize);
/* =========================
3. 현재 페이지 데이터
========================= */
$histStmt = $pdo->prepare("
SELECT *
FROM kngil.sp_users_my_history(:user_id)
OFFSET :offset
LIMIT :limit
");
$histStmt->bindValue(':user_id', $userId, PDO::PARAM_STR);
$histStmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$histStmt->bindValue(':limit', $pageSize, PDO::PARAM_INT);
$histStmt->execute();
$history = $histStmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([
'status' => 'success',
'user' => $user,
'history' => $history,
'pagination' => [
'page' => $page,
'pageSize' => $pageSize,
'totalCount' => $totalCount,
'totalPages' => $totalPages
]
]);
} catch (Exception $e) {
http_response_code(500);
echo json_encode([
'status' => 'error',
'message' => '서버 오류',
'detail' => $e->getMessage()
]);
}
+139
View File
@@ -0,0 +1,139 @@
<?php
session_start();
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
header('Content-Type: application/json');
// 로그인 체크
if (!isset($_SESSION['login'])) {
http_response_code(401);
echo json_encode(['status' => 'error', 'message' => '로그인이 필요합니다.']);
exit;
}
// 2차 인증 체크
if (empty($_SESSION['mypage_verified'])) {
http_response_code(403);
echo json_encode(['status' => 'error', 'message' => '마이페이지 인증이 필요합니다.']);
exit;
}
$userId = $_SESSION['login']['user_id'];
$memberId = $_SESSION['login']['member_id'];
/* ==================================================
GET : 회원정보 조회 (mypage03 열릴 때)
================================================== */
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
try {
$stmt = $pdo->prepare("
SELECT *
FROM kngil.sp_users_r(
:member_id,
'',
'',
'Y'
)
WHERE user_id = :user_id
LIMIT 1
");
$stmt->execute([
':member_id' => $memberId,
':user_id' => $userId
]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$row) {
echo json_encode(['status' => 'error', 'message' => '회원정보를 찾을 수 없습니다.']);
exit;
}
echo json_encode([
'status' => 'success',
'data' => $row
]);
exit;
} catch (Exception $e) {
http_response_code(500);
echo json_encode([
'status' => 'error',
'message' => '조회 중 오류 발생',
'detail' => $e->getMessage()
]);
exit;
}
}
/* ==================================================
POST : 회원정보 수정
================================================== */
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
$userPw = trim($input['password'] ?? '');
$email = trim($input['email'] ?? '');
$deptNm = trim($input['dept_nm'] ?? '');
// 전화번호는 이번 단계에서 수정 안 함
$tel_no = trim($input['tel_no'] ?? '');
if ($email === '') {
echo json_encode(['status' => 'error', 'message' => '이메일은 필수입니다.']);
exit;
}
if ($userPw !== '' && strlen($userPw) < 8) {
echo json_encode(['status' => 'error', 'message' => '비밀번호는 8자 이상이어야 합니다.']);
exit;
}
try {
$stmt = $pdo->prepare("
SELECT kngil.sp_users_my_u(
:user_id,
:user_pw,
:email,
:tel_no,
:dept_nm,
:mid
)
");
$stmt->execute([
':user_id' => $userId,
':user_pw' => $userPw,
':email' => $email,
':tel_no' => $tel_no,
':dept_nm' => $deptNm,
':mid' => $userId
]);
$result = $stmt->fetchColumn();
if ($result !== 'SUCCESS') {
echo json_encode(['status' => 'error', 'message' => $result]);
exit;
}
echo json_encode(['status' => 'success']);
exit;
} catch (Exception $e) {
http_response_code(500);
echo json_encode([
'status' => 'error',
'message' => '저장 중 오류 발생',
'detail' => $e->getMessage()
]);
exit;
}
}
// 허용되지 않은 메서드
http_response_code(405);
echo json_encode(['status' => 'error', 'message' => 'Invalid request']);
+110
View File
@@ -0,0 +1,110 @@
<?php
session_start();
header('Content-Type: application/json');
if (empty($_SESSION['login'])) {
echo json_encode(['status'=>'error','message'=>'로그인 필요']);
exit;
}
require_once __DIR__.'/db_conn.php';
$postId = (int)($_POST['postId'] ?? 0);
$content = trim($_POST['comment'] ?? '');
if ($postId < 1 || ($content === '' && empty($_FILES['images']))) {
echo json_encode(['status'=>'error','message'=>'내용 없음']);
exit;
}
$user = $_SESSION['login'];
try {
$pdo->beginTransaction();
/* =========================
1) 댓글 INSERT
========================= */
$stmt = $pdo->prepare("
INSERT INTO kngil.qa_comments
(post_id, commenter, user_nm, content, cdt_dt)
VALUES
(:post_id, :commenter, :user_nm, :content, NOW())
RETURNING comment_id
");
$stmt->execute([
':post_id' => $postId,
':commenter' => $user['user_id'],
':user_nm' => $user['user_nm'],
':content' => $content
]);
$commentId = $stmt->fetchColumn();
/* =========================
2) 이미지 업로드
========================= */
$images = [];
if (!empty($_FILES['images']['name'][0])) {
$uploadDir = $_SERVER['DOCUMENT_ROOT'].'/kngil/uploads/comment/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
foreach ($_FILES['images']['name'] as $i => $name) {
if ($_FILES['images']['error'][$i] !== UPLOAD_ERR_OK) continue;
$tmp = $_FILES['images']['tmp_name'][$i];
$size = $_FILES['images']['size'][$i];
$ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
$save = time().'_'.bin2hex(random_bytes(4)).'.'.$ext;
$fullPath = $uploadDir.$save;
move_uploaded_file($tmp, $fullPath);
$path = '/kngil/uploads/comment/'.$save;
// 🔥 DB 구조에 맞게 INSERT
$pdo->prepare("
INSERT INTO kngil.qa_comment_images
(comment_id, file_name, file_path, thumb_path, file_size, uploaded_at)
VALUES
(:comment_id, :file_name, :file_path, :thumb_path, :file_size, NOW())
")->execute([
':comment_id' => $commentId,
':file_name' => $name,
':file_path' => $path,
':thumb_path' => $path, // 지금은 동일 (추후 썸네일 분리 가능)
':file_size' => $size
]);
$images[] = [
'thumb' => $path,
'full' => $path,
'name' => $name
];
}
}
$pdo->commit();
echo json_encode([
'status' => 'ok',
'comment_id' => $commentId,
'comment_text' => $content,
'user_name' => $user['user_nm'],
'login_id' => $user['user_id'],
'created_at' => date('Y-m-d H:i'),
'images' => $images
]);
} catch (Exception $e) {
$pdo->rollBack();
echo json_encode([
'status' => 'error',
'message' => $e->getMessage()
]);
}
+33
View File
@@ -0,0 +1,33 @@
<?php
session_start();
header('Content-Type: application/json');
require_once __DIR__.'/db_conn.php';
if (empty($_SESSION['login'])) {
echo json_encode(['status'=>'error','message'=>'로그인 필요']);
exit;
}
$id = (int)($_POST['commentId'] ?? 0);
$userId = $_SESSION['login']['user_id'];
if ($id < 1) {
echo json_encode(['status'=>'error','message'=>'잘못된 요청']);
exit;
}
// 관리자 or 본인
$isAdmin = function_exists('is_qna_admin') && is_qna_admin();
$sql = $isAdmin
? "DELETE FROM kngil.qa_comments WHERE comment_id = :id"
: "DELETE FROM kngil.qa_comments WHERE comment_id = :id AND commenter = :user";
$stmt = $pdo->prepare($sql);
$params = [':id'=>$id];
if (!$isAdmin) $params[':user'] = $userId;
$stmt->execute($params);
echo json_encode(['status'=>'ok']);
+34
View File
@@ -0,0 +1,34 @@
<?php
session_start();
header('Content-Type: application/json');
require_once __DIR__.'/db_conn.php';
if (empty($_SESSION['login'])) {
echo json_encode(['status'=>'error','message'=>'로그인 필요']);
exit;
}
$id = (int)($_POST['commentId'] ?? 0);
$content = trim($_POST['comment'] ?? '');
if ($id < 1 || $content === '') {
echo json_encode(['status'=>'error','message'=>'잘못된 요청']);
exit;
}
// 본인 댓글만 수정
$stmt = $pdo->prepare("
UPDATE kngil.qa_comments
SET content = :content,
mdt_dt = NOW()
WHERE comment_id = :id
AND commenter = :user
");
$stmt->execute([
':content' => $content,
':id' => $id,
':user' => $_SESSION['login']['user_id']
]);
echo json_encode(['status'=>'ok']);
+233
View File
@@ -0,0 +1,233 @@
<?php
// kngil/bbs/qa_detail.php
ini_set('display_errors', 1);
error_reporting(E_ALL);
/* ===============================
1. 세션 & 로그인 체크
=============================== */
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
if (empty($_SESSION['login'])) {
echo "<script>
alert('로그인 후 이용 가능합니다.');
location.href = '/kngil/skin/qa_list.skin.php';
</script>";
exit;
}
$login = $_SESSION['login'];
$me = $login['user_id'] ?? '';
$auth = $login['auth_bc'] ?? '';
$isAdmin = in_array($auth, ['BS100100', 'BS100200']); // 개발자/관리자
/* ===============================
2. DB 연결 (PostgreSQL)
=============================== */
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
/* ===============================
4. 삭제 처리
=============================== */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'delete') {
$postId = (int)($_POST['post_id'] ?? 0);
if ($postId < 1) {
die('잘못된 요청입니다.');
}
// 글 조회
$stmt = $pdo->prepare("
SELECT post_id, user_id, stat_bc
FROM kngil.qa_posts
WHERE post_id = :pid
");
$stmt->execute([':pid' => $postId]);
$post = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$post) {
die('존재하지 않는 글입니다.');
}
// 상태 제한 (검토중 / 완료면 삭제 불가)
if (in_array($post['stat_bc'], ['REVIEW', 'DONE']) && !$isAdmin) {
die('검토중이거나 답변 완료된 글은 삭제할 수 없습니다.');
}
// 권한 체크 (본인 or 관리자)
if (!$isAdmin && $post['user_id'] !== $loginUser['user_id']) {
die('삭제 권한이 없습니다.');
}
try {
$pdo->beginTransaction();
// 1️⃣ 첨부파일 삭제
$fs = $pdo->prepare("
SELECT save_path
FROM kngil.qa_attachments
WHERE post_id = :pid
");
$fs->execute([':pid' => $postId]);
foreach ($fs->fetchAll() as $f) {
$file = $_SERVER['DOCUMENT_ROOT'] . $f['save_path'];
if (is_file($file)) unlink($file);
}
$pdo->prepare("DELETE FROM kngil.qa_attachments WHERE post_id = ?")
->execute([$postId]);
// 2️⃣ 댓글 삭제
$pdo->prepare("DELETE FROM kngil.qa_comments WHERE post_id = ?")
->execute([$postId]);
// 3️⃣ 본문 삭제
$pdo->prepare("DELETE FROM kngil.qa_posts WHERE post_id = ?")
->execute([$postId]);
$pdo->commit();
header("Location: /kngil/skin/qa_list.skin.php");
exit;
} catch (Exception $e) {
$pdo->rollBack();
die('삭제 중 오류 발생: ' . $e->getMessage());
}
}
/* ===============================
3. post_id 검증
=============================== */
$postId = (int)($_GET['id'] ?? 0);
if ($postId < 1) {
exit('잘못된 접근입니다.');
}
/* ===============================
5. 글 조회
=============================== */
$stmt = $pdo->prepare("
SELECT
p.post_id,
p.user_id,
p.user_nm,
p.tel_no,
p.category,
p.co_nm,
p.dept_nm,
p.title,
p.content,
p.attachment,
p.stat_bc,
p.is_secret,
p.complete_form,
p.cdt_dt,
p.mid_dt,
p.is_read_admin,
u.email
FROM kngil.qa_posts p
LEFT JOIN kngil.users u
ON p.user_id = u.user_id
WHERE p.post_id = :pid
");
$stmt->execute([':pid' => $postId]);
$post = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$post) {
exit('존재하지 않는 글입니다.');
}
/* ===============================
6. 비밀글 접근 제어
=============================== */
if ($post['is_secret'] === 'Y' && $post['user_id'] !== $me && !$isAdmin) {
exit('⚠️ 비밀글은 작성자 또는 관리자만 확인할 수 있습니다.');
}
/* ===============================
7. 관리자 열람 처리
=============================== */
if ($isAdmin && $post['is_read_admin'] === 'N') {
$pdo->prepare("
UPDATE kngil.qa_posts
SET is_read_admin = 'Y'
WHERE post_id = :pid
")->execute([':pid' => $postId]);
}
/* ===============================
8. 라벨 매핑
=============================== */
$STATUS_LABELS = [
'WAIT' => '문의접수',
'REVIEW'=> '검토중',
'DONE' => '답변완료'
];
$CATEGORY_LABELS = [
'general' => '일반문의',
'improvement' => '개선문의',
'error' => '오류문의',
'notice' => '공지사항'
];
$post['status_label'] = $STATUS_LABELS[$post['stat_bc']] ?? $post['stat_bc'];
$post['category_label'] = $CATEGORY_LABELS[$post['category']] ?? $post['category'];
$post['display_name'] = $post['user_nm'];
/* ===============================
9. 첨부파일 조회
=============================== */
$af = $pdo->prepare("
SELECT
id,
ori_name,
save_path,
file_size,
uploaded_at
FROM kngil.qa_attachments
WHERE post_id = :pid
ORDER BY id ASC
");
$af->execute([':pid' => $postId]);
$attachments = $af->fetchAll(PDO::FETCH_ASSOC);
/* ===============================
10. 댓글 조회 (일단 구조만)
=============================== */
$stmt = $pdo->prepare("
SELECT
comment_id,
post_id,
commenter,
content,
user_nm,
cdt_dt
FROM kngil.qa_comments
WHERE post_id = :post_id
ORDER BY cdt_dt ASC
");
$stmt->execute([
':post_id' => $postId
]);
$comments = $stmt->fetchAll(PDO::FETCH_ASSOC);
/* ===============================
11. 소유자 여부 (수정 버튼용)
=============================== */
$isOwner = ($post['user_id'] === $me);
/* ===============================
12. 스킨 렌더링
=============================== */
include $_SERVER['DOCUMENT_ROOT'].'/kngil/skin/qa_detail.skin.php';
+152
View File
@@ -0,0 +1,152 @@
<?php
/**
* Q&A 리스트 컨트롤러
* - 스킨: /kngil/skin/qa_list.skin.php
*/
ini_set('display_errors', 1);
error_reporting(E_ALL);
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
/* =========================
1. 입력값 정리
========================= */
$page = max(1, (int)($_GET['page'] ?? 1));
$pageSize = 15;
$offset = ($page - 1) * $pageSize;
$search = trim($_GET['q'] ?? '');
$cats = $_GET['cat'] ?? []; // 배열
$writer = $_GET['writer'] ?? ''; // me
$status = $_GET['status'] ?? 'all'; // 상태
$isLogin = !empty($_SESSION['login']);
$loginUserId = $_SESSION['login']['user_id'] ?? null;
/* =========================
2. WHERE 조건 구성
========================= */
$where = [];
$params = [];
/* 카테고리 */
if (!empty($cats) && !in_array('all', $cats, true)) {
$catKeys = [];
foreach ($cats as $i => $cat) {
$key = ":cat{$i}";
$catKeys[] = $key;
$params[$key] = $cat;
}
$where[] = "p.category IN (" . implode(',', $catKeys) . ")";
}
/* 내가 작성한 글 */
if ($writer === 'me' && $loginUserId) {
$where[] = "p.user_id = :me";
$params[':me'] = $loginUserId;
}
/* 상태 */
if ($status !== 'all') {
$where[] = "p.stat_bc = :status";
$params[':status'] = $status;
}
/* 검색 (제목 + 내용) */
if ($search !== '') {
$where[] = "(p.title ILIKE :q OR p.content ILIKE :q)";
$params[':q'] = "%{$search}%";
}
$whereSql = $where ? 'WHERE ' . implode(' AND ', $where) : '';
/* =========================
3. 전체 건수
========================= */
$countSql = "
SELECT COUNT(*)
FROM kngil.qa_posts p
{$whereSql}
";
$stmt = $pdo->prepare($countSql);
$stmt->execute($params);
$totalCount = (int)$stmt->fetchColumn();
/* =========================
4. 리스트 조회
========================= */
$listSql = "
SELECT
p.post_id,
p.category,
p.title,
p.user_nm,
p.co_nm,
p.dept_nm,
p.stat_bc AS status,
p.is_secret,
p.cdt_dt AS created_at,
-- 댓글 수
(
SELECT COUNT(*)
FROM kngil.qa_comments c
WHERE c.post_id = p.post_id
) AS comment_count,
-- 첨부파일 수
(
SELECT COUNT(*)
FROM kngil.qa_attachments a
WHERE a.post_id = p.post_id
) AS file_count
FROM kngil.qa_posts p
{$whereSql}
ORDER BY
(p.category = 'notice') DESC,
p.post_id DESC
LIMIT :limit OFFSET :offset
";
$stmt = $pdo->prepare($listSql);
/* 바인딩 */
foreach ($params as $k => $v) {
$stmt->bindValue($k, $v);
}
$stmt->bindValue(':limit', $pageSize, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$posts = $stmt->fetchAll(PDO::FETCH_ASSOC);
/* =========================
5. 표시용 가공
========================= */
foreach ($posts as &$row) {
// 회사 표시
$row['display_company'] = $row['co_nm'] ?? '';
// 작성자 표시
$row['display_name'] = $row['user_nm'] ?? $row['user_id'];
// 날짜 포맷
$row['created_at'] = substr($row['created_at'], 0, 10);
}
unset($row);
/* =========================
6. 페이징 계산
========================= */
$totalPages = (int)ceil($totalCount / $pageSize);
/* =========================
7. 스킨 렌더링
========================= */
include $_SERVER['DOCUMENT_ROOT'].'/kngil/skin/qa_list.skin.php';
+50
View File
@@ -0,0 +1,50 @@
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/adm_guard.php';
/* =========================
1. 관리자 권한 체크
========================= */
if (!defined('IS_SUPER_ADMIN') || !IS_SUPER_ADMIN) {
http_response_code(403);
exit('권한이 없습니다.');
}
/* =========================
2. 파라미터 체크
========================= */
$postId = (int)($_POST['post_id'] ?? 0);
$status = $_POST['status'] ?? '';
$ALLOW_STATUS = ['new','review','deep','patch','done'];
if ($postId < 1 || !in_array($status, $ALLOW_STATUS, true)) {
exit('잘못된 요청입니다.');
}
/* =========================
3. 상태 업데이트
========================= */
try {
$stmt = $pdo->prepare("
UPDATE kngil.qa_posts
SET stat_bc = :status,
mid_dt = NOW()
WHERE post_id = :pid
");
$stmt->execute([
':status' => $status,
':pid' => $postId
]);
// 상세 페이지로 복귀
header("Location: /kngil/bbs/qa_detail.php?id={$postId}");
exit;
} catch (Exception $e) {
exit('DB 오류: '.$e->getMessage());
}
+231
View File
@@ -0,0 +1,231 @@
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
/* ===============================
1. 세션 & 로그인 체크
=============================== */
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// echo '<pre>';
// var_dump($_SESSION['login']);
// exit;
if (empty($_SESSION['login'])) {
echo "<script>
alert('로그인이 필요합니다.');
location.href = '/kngil/skin/qa_list.skin.php';
</script>";
exit;
}
$loginUser = $_SESSION['login'];
/* ===============================
2. DB 연결
=============================== */
require_once $_SERVER['DOCUMENT_ROOT'].'/kngil/bbs/db_conn.php';
/* ===============================
3. 수정 여부 판단
=============================== */
$postId = isset($_GET['id']) ? (int)$_GET['id'] : 0;
$isEdit = $postId > 0;
/* ===============================
4. 수정 모드 – 기존 글 로드
=============================== */
$post = [
'category' => '',
'title' => '',
'content' => '',
'is_secret' => 'N',
];
if ($isEdit) {
$stmt = $pdo->prepare("SELECT * FROM kngil.qa_posts WHERE post_id = :pid");
$stmt->execute([':pid' => $postId]);
$post = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$post) {
die('존재하지 않는 글입니다.');
}
// 작성자 본인만 수정 가능
if ($post['user_id'] !== ($loginUser['user_id'] ?? '')) {
die('수정 권한이 없습니다.');
}
}
/* ===============================
5. 첨부파일 업로드
=============================== */
function handle_file_uploads(PDO $pdo, int $postId)
{
if (empty($_FILES['attach']['name'][0])) return;
$uploadDir = $_SERVER['DOCUMENT_ROOT'] . '/kngil/uploads/qa/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
$allowExt = ['jpg','jpeg','png','gif','pdf','hwp','doc','docx','xls','xlsx','zip'];
foreach ($_FILES['attach']['name'] as $i => $oriName) {
if ($_FILES['attach']['error'][$i] !== UPLOAD_ERR_OK) continue;
$tmp = $_FILES['attach']['tmp_name'][$i];
$size = $_FILES['attach']['size'][$i];
$ext = strtolower(pathinfo($oriName, PATHINFO_EXTENSION));
if (!in_array($ext, $allowExt)) continue;
if ($size > 30 * 1024 * 1024) continue;
$saveName = time() . '_' . bin2hex(random_bytes(6)) . '.' . $ext;
$savePath = $uploadDir . $saveName;
if (!move_uploaded_file($tmp, $savePath)) continue;
$stmt = $pdo->prepare("
INSERT INTO kngil.qa_attachments (
post_id,
ori_name,
save_path,
file_size,
uploaded_at
) VALUES (
:post_id,
:ori_name,
:save_path,
:file_size,
NOW()
)
");
$stmt->execute([
':post_id' => $postId,
':ori_name' => $oriName,
':save_path' => '/kngil/uploads/qa/' . $saveName,
':file_size' => $size
]);
}
}
/* ===============================
6. POST 처리 (등록 / 수정)
=============================== */
$errors = [];
$secret = 'N';
$category = '';
$title = '';
$content = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$category = trim($_POST['category'] ?? '');
$title = trim($_POST['title'] ?? '');
$content = trim($_POST['content'] ?? '');
$secret = isset($_POST['secret']) ? 'Y' : 'N';
if ($category === '') $errors[] = '구분을 선택하세요.';
if ($title === '') $errors[] = '제목을 입력하세요.';
if ($content === '') $errors[] = '내용을 입력하세요.';
// 첨부파일명만 저장 (실파일 저장은 추후 분리 가능)
$attachment = null;
if (!empty($_FILES['attach']['name'][0])) {
$attachment = implode(',', $_FILES['attach']['name']);
}
if (empty($errors)) {
try {
if ($isEdit) {
/* ---------- UPDATE ---------- */
$stmt = $pdo->prepare("
UPDATE kngil.qa_posts
SET category = :category,
title = :title,
content = :content,
is_secret = :is_secret,
mid_dt = NOW()
WHERE post_id = :pid
");
$stmt->execute([
':category' => $category,
':title' => $title,
':content' => $content,
':is_secret' => $secret, // 'Y' or 'N'
':pid' => $postId
]);
handle_file_uploads($pdo, $postId);
} else {
/* ---------- INSERT ---------- */
$stmt = $pdo->prepare("
INSERT INTO kngil.qa_posts (
user_id,
user_nm,
tel_no,
co_nm,
dept_nm,
category,
title,
content,
is_secret,
stat_bc,
is_read_admin,
cdt_dt
) VALUES (
:user_id,
:user_nm,
:tel_no,
:co_nm,
:dept_nm,
:category,
:title,
:content,
:is_secret,
'wait',
'N',
NOW()
)
RETURNING post_id
");
// var_dump($loginUser);
// exit;
$stmt->execute([
':user_id' => $loginUser['user_id'],
':user_nm' => $loginUser['user_nm'],
':tel_no' => $loginUser['tel_no'] ?? null,
':co_nm' => $loginUser['co_nm'] ?? null,
':dept_nm' => $loginUser['dept_nm'] ?? null,
':category' => $category,
':title' => $title,
':content' => $content,
':is_secret' => $secret
]);
$postId = $stmt->fetchColumn();
handle_file_uploads($pdo, $postId);
}
header("Location: /kngil/bbs/qa_detail.php?id={$postId}");
exit;
} catch (Exception $e) {
$errors[] = 'DB 오류: ' . $e->getMessage();
}
}
}
/* ===============================
7. 화면 출력
=============================== */
include $_SERVER['DOCUMENT_ROOT'].'/kngil/skin/qa_write.skin.php';
+223
View File
@@ -0,0 +1,223 @@
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
header("Content-Type: application/json; charset=utf-8");
/* -----------------------------------------------------
🔵 DB 연결
----------------------------------------------------- */
try {
$pdo = new PDO(
"mysql:host=localhost;dbname=egbim;charset=utf8mb4",
"egbim",
"baron3840!!",
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]
);
} catch (Exception $e) {
echo json_encode(["status" => "fail", "message" => "DB 연결 실패"]);
exit;
}
/* -----------------------------------------------------
🔵 공통 날짜 변환 함수 (MM/DD/YYYY → YYYY-MM-DD)
----------------------------------------------------- */
function normalize_date($dateStr) {
if (!$dateStr) return null;
// 이미 YYYY-MM-DD라면 그대로 반환
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $dateStr)) {
return $dateStr;
}
// MM/DD/YYYY → YYYY-MM-DD (한자리/두자리 모두 허용)
if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $dateStr, $m)) {
$month = str_pad($m[1], 2, '0', STR_PAD_LEFT);
$day = str_pad($m[2], 2, '0', STR_PAD_LEFT);
return "{$m[3]}-$month-$day";
}
// 형식 이상하면 null 리턴
return null;
}
/* -----------------------------------------------------
🔵 요청 액션
----------------------------------------------------- */
$action = $_POST['action'] ?? $_GET['action'] ?? "";
/* =====================================================
1) LIST
===================================================== */
if ($action === "list") {
$stmt = $pdo->query("
SELECT r.*, m.emp_name
FROM sales_results r
LEFT JOIN sales_members m ON r.emp_no = m.emp_no
ORDER BY r.seq_no DESC
");
echo json_encode([
"status" => "ok",
"records" => $stmt->fetchAll()
]);
exit;
}
/* =====================================================
2) INSERT (seq_no 자동 증가)
===================================================== */
if ($action === "insert") {
$sales_date = normalize_date($_POST['sales_date']);
if (!$sales_date) {
echo json_encode([
"status" => "error",
"message" => "실적일(sales_date) 형식 오류. YYYY-MM-DD 또는 MM/DD/YYYY 로 입력하세요."
]);
exit;
}
$next_seq = $pdo->query("SELECT IFNULL(MAX(seq_no), 0) + 1 FROM sales_results")->fetchColumn();
// 🔥 서버에서 총금액 계산
$qty = (int)($_POST['quantity'] ?? 0);
$unit = (int)($_POST['unit_price'] ?? 0);
$discount = (int)($_POST['discount'] ?? 0);
$total_amount = ($qty * $unit) - $discount;
if ($total_amount < 0) $total_amount = 0;
$stmt = $pdo->prepare("
INSERT INTO sales_results
(seq_no, sales_date, emp_no, client_code, product_code, quantity, unit_price, discount, total_amount, remarks)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
");
$stmt->execute([
$next_seq,
$sales_date,
$_POST['emp_no'],
$_POST['client_code'],
$_POST['product_code'],
$qty,
$unit,
$discount,
$total_amount, // 🔥 클라이언트 값 무시, 서버 계산값 넣기
$_POST['remarks']
]);
echo json_encode(["status" => "ok"]);
exit;
}
/* =====================================================
3) UPDATE
===================================================== */
if ($action === "update") {
$seq_no = $_POST['seq_no'] ?? '';
if (!$seq_no) {
echo json_encode(["status" => "error", "message" => "seq_no 누락"]);
exit;
}
unset($_POST['action'], $_POST['seq_no']);
/* -----------------------------
🔵 날짜 변환 (MM/DD/YYYY → YYYY-MM-DD)
----------------------------- */
if (!empty($_POST['sales_date'])) {
$date = normalize_date($_POST['sales_date']);
if (!$date) {
echo json_encode(["status" => "error", "message" => "실적일(sales_date) 형식 오류"]);
exit;
}
$_POST['sales_date'] = $date;
}
/* --------------------------------------------------
🔥 quantity / unit_price / discount 변경 여부 확인
----------------------------------------------------- */
$qtyChanged = array_key_exists('quantity', $_POST);
$unitChanged = array_key_exists('unit_price', $_POST);
$discountChanged = array_key_exists('discount', $_POST);
if ($qtyChanged || $unitChanged || $discountChanged) {
// 기존 값 가져오기
$old = $pdo->prepare("
SELECT quantity, unit_price, discount
FROM sales_results
WHERE seq_no = ?
");
$old->execute([$seq_no]);
$oldData = $old->fetch();
// 새 값이 있으면 새 값 사용, 없으면 기존 값 사용
$qty = isset($_POST['quantity']) ? (int)$_POST['quantity'] : (int)$oldData['quantity'];
$unit = isset($_POST['unit_price']) ? (int)$_POST['unit_price'] : (int)$oldData['unit_price'];
$discount = isset($_POST['discount']) ? (int)$_POST['discount'] : (int)$oldData['discount'];
// 서버에서 총금액 재계산
$total_amount = ($qty * $unit) - $discount;
if ($total_amount < 0) $total_amount = 0;
$_POST['total_amount'] = $total_amount; // 🔥 강제 반영
}
/* -----------------------------
🔵 Partial Update (빈값은 무시)
----------------------------- */
$fields = [];
$params = [];
foreach ($_POST as $key => $val) {
// NULL, 빈문자, undefined는 UPDATE 안함
if ($val === '' || $val === null || $val === 'undefined') {
continue;
}
$fields[] = "$key = ?";
$params[] = $val;
}
if (!empty($fields)) {
$sql = "UPDATE sales_results SET "
. implode(", ", $fields)
. ", updated_at = NOW()
WHERE seq_no = ?";
$params[] = $seq_no;
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
}
echo json_encode(["status" => "ok"]);
exit;
}
/* =====================================================
4) DELETE
===================================================== */
if ($action === "delete") {
$stmt = $pdo->prepare("DELETE FROM sales_results WHERE seq_no = ?");
$stmt->execute([$_POST['seq_no']]);
echo json_encode(["status" => "ok"]);
exit;
}
/* =====================================================
요청 없음
===================================================== */
echo json_encode(["status" => "fail", "message" => "잘못된 요청"]);
exit;
?>
+219
View File
@@ -0,0 +1,219 @@
/* ==================================================
adm_style.clean.css
외부용 관리자 페이지 덮어쓰기 전용
기존 adm_style.css 수정 금지
================================================== */
/* ---------- 기본 톤 ---------- */
body {
background: #f8fafc;
color: #111827;
}
/* ---------- 카드 공통 ---------- */
.card {
border-radius: 14px;
border-color: #e5e7eb;
background: #ffffff;
}
/* ---------- 관리자 요약 영역 ---------- */
.adm-summary {
border: 1px solid #e5e7eb !important;
border-radius: 14px;
background: #ffffff;
box-shadow: 0 1px 2px rgba(0,0,0,0.04);
}
.adm-summary .adm-row {
padding: 10px 16px;
border-bottom: 1px solid #e5e7eb;
}
.adm-summary .adm-row:last-child {
border-bottom: none;
}
.adm-summary .label {
color: #6b7280;
font-weight: 500;
}
.adm-summary .value.bold {
color: #111827;
font-weight: 700;
}
/* ---------- 사용량 바 ---------- */
.usage-box {
width: 520px;
}
.usage-text {
font-size: 12px;
color: #6b7280;
}
.usage-bar {
height: 10px;
border-radius: 999px;
background: #e5e7eb;
overflow: hidden;
margin-top: 6px;
}
.usage-used {
background: #2563eb !important;
height: 100%;
}
.usage-remain {
display: none;
}
/* ---------- 검색 영역 ---------- */
.adm-search {
background: #ffffff;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 10px 14px;
}
.adm-search input,
.adm-search select {
height: 36px;
border-radius: 8px;
border: 1px solid #e5e7eb;
}
/* ---------- 상단 타이틀 ---------- */
.adm-title {
font-size: 22px;
font-weight: 700;
margin: 20px 0;
}
/* ---------- 상단 보조 버튼 ---------- */
.adm-title-actions button {
background: #f3f4f6;
border: 1px solid #e5e7eb;
color: #374151;
border-radius: 8px;
}
.adm-title-actions button:hover {
background: #e5e7eb;
}
/* ---------- 저장 버튼 ---------- */
#btnSave_comp {
background: #2563eb !important;
border-color: #2563eb !important;
color: #ffffff !important;
border-radius: 8px;
}
#btnSave_comp:hover {
background: #1d4ed8 !important;
}
/* ---------- 삭제 버튼 ---------- */
#btnDelete {
background: transparent !important;
color: #dc2626 !important;
border-color: #dc2626 !important;
border-radius: 8px;
}
#btnDelete:hover {
background: #fee2e2 !important;
}
/* ---------- 추가 버튼 ---------- */
#btnAdd {
background: transparent !important;
color: #16a34a !important;
border-color: #16a34a !important;
border-radius: 8px;
}
#btnAdd:hover {
background: #ecfdf5 !important;
}
/* ---------- 일괄 생성 버튼 ---------- */
#btnBulkCreate {
background: #f3f4f6 !important;
color: #374151 !important;
border-color: #e5e7eb !important;
border-radius: 8px;
}
/* ---------- Grid 카드 ---------- */
.grid-card {
border-radius: 14px;
overflow: hidden;
}
/* ---------- w2ui Grid 외부용 ---------- */
.w2ui-grid {
border-radius: 14px;
overflow: hidden;
border: 1px solid #e5e7eb;
}
.w2ui-grid-header {
background: #f9fafb !important;
font-weight: 600;
}
.w2ui-grid-records tr {
height: 44px;
}
/* ---------- 홈 버튼 ---------- */
.btn-home-fixed {
background: #111827;
border-radius: 10px;
}
.btn-home-fixed:hover {
background: #000000;
}
/* ===============================
외부 사용자용 레이아웃 폭 제한
=============================== */
/* 페이지 전체 폭 컨테이너 효과 */
body {
background: #f8fafc; /* 살짝 밝은 배경 */
}
/* 관리자 페이지 실 컨텐츠 폭 제한 */
.adm-title,
.adm-summary,
.adm-search,
.card {
max-width: 1400px; /* ← 여기만 조절 */
margin-left: auto;
margin-right: auto;
}
/* 카드 간 간격 통일 */
.card {
border-radius: 12px;
}
/* 검색 영역도 카드 느낌 */
.adm-search {
background: #fff;
padding: 12px 16px;
border-radius: 12px;
border: 1px solid #e5e7eb;
}
/* 버튼 그룹 정리 */
.adm-search button {
white-space: nowrap;
}
+532
View File
@@ -0,0 +1,532 @@
/*---------------20260119---------------*/
/* ===============================
서비스 등록 팝업
=============================== */
.service-popup {
padding: 10px;
font-size: 13px;
}
/* 상단 */
.service-top {
display: flex;
gap: 16px;
margin-bottom: 12px;
}
/* 회원 정보 */
.service-member {
flex: 1;
border: 1px solid #ddd;
padding: 10px;
background: #fafafa;
}
.service-member > div {
margin-bottom: 4px;
}
.purchase-date {
margin-top: 8px;
}
/* 상품 선택 */
.service-product {
width: 420px;
border: 1px solid #ddd;
padding: 10px;
background: #fff;
}
.service-product .title {
font-weight: bold;
margin-bottom: 6px;
}
/* 저장 / 삭제 바 */
.service-save-bar {
display: flex;
justify-content: flex-end;
align-items: center;
margin: 12px 0;
}
.service-save-bar .btn-delete {
padding: 6px 14px;
font-size: 13px;
font-weight: 600;
border-radius: 4px;
border: none;
background: rgb(247, 74, 52);
color: #fff;
}
.service-save-bar .btn-delete:hover {
background: #d32f2f;
}
.service-save-bar .btn-save {
padding: 6px 14px;
font-size: 13px;
font-weight: 600;
border-radius: 4px;
border: none;
background: rgb(70, 58, 248);
color: #fff;
}
.service-save-bar .btn-save:hover {
background: #3c04f3;
}
.service-save-bar .right-actions {
display: flex;
gap: 8px; /* 삭제-저장 간격 */
}
/* Grid */
.service-grid {
margin-top: 10px;
}
/* 합계 */
.service-summary {
display: flex;
justify-content: flex-end;
gap: 20px;
padding: 10px;
border-top: 2px solid #ccc;
margin-top: 8px;
font-weight: bold;
}
/* ===============================
상품등록
=============================== */
.product-wrap {
max-width: 900px;
margin: 40px auto;
border: 1px solid #aaa;
background: #fff;
}
.product-header {
background: #f2f2f2;
padding: 10px 14px;
font-size: 16px;
font-weight: 700;
text-align: center;
position: relative;
}
.product-header .btn-close {
position: absolute;
right: 10px;
top: 8px;
cursor: pointer;
}
.product-toolbar {
padding: 8px 10px;
border-bottom: 1px solid #ccc;
display: flex;
gap: 6px;
}
.product-toolbar button {
padding: 4px 10px;
font-size: 13px;
}
/* ===============================
Grid 액션 바(슈퍼관리자 상단)
=============================== */
/* 검색 + 저장 버튼 한 줄 정렬 */
/* 전체 한 줄 */
.super-search-wrap {
display: flex;
align-items: center;
gap: 10px;
margin: 10px 20px;
}
/* 좌측 검색 그룹 */
.super-search {
display: flex;
align-items: center;
gap: 8px;
}
/* 검색 입력 공통 */
.super-search select,
.super-search input {
height: 34px;
padding: 0 10px;
font-size: 13px;
border-radius: 6px;
border: 1px solid #d1d5db;
}
/* 검색 버튼 */
#btnSearch {
height: 34px;
padding: 0 14px;
border-radius: 6px;
border: 1px solid #2563eb;
background: #2563eb;
color: #374151;
cursor: pointer;
}
#btnSearch:hover,
#btnSearch:focus,
#btnSearch:active {
background: #ffffff;
color: #374151;
border: 1px solid #2563eb;
box-shadow: none;
outline: none;
}
/* 🔥 저장 버튼을 오른쪽 끝으로 */
#btnSave {
margin-left: auto;
height: 34px;
padding: 0 16px;
border-radius: 6px;
border: 1px solid #2563eb;
background: #2563eb;
color: #fff;
cursor: pointer;
}
#btnSave:hover {
background: #1d4ed8;
}
#schMemberStatus {
width: 130px;
}
#schMemberName {
width: 160px;
}
#schRemainArea {
width: 160px;
text-align: right;
}
#btnSuperSearch {
margin-left: auto;
height: 34px;
padding: 0 16px;
font-size: 13px;
border-radius: 6px;
border: 1px solid #2563eb;
background: #2563eb;
color: #fff;
cursor: pointer;
}
#btnSuperSearch:hover {
background: #1d4ed8;
}
.grid-action-bar {
display: flex;
justify-content: flex-end;
margin-bottom: 6px;
}
.btn-save {
padding: 6px 14px;
font-size: 13px;
font-weight: 600;
border-radius: 4px;
border: none;
background: #2f80ed;
color: #fff;
}
.btn-save:hover {
background: #1f66d1;
}
/* ===============================
관리자 요약 영역 (거래처관리자 상단)
=============================== */
.adm-summary {
border: 2px solid #1f6fd8;
font-size: 13px;
padding: 0;
}
.adm-row {
display: flex;
align-items: center;
padding: 6px 10px;
border-bottom: 1px solid #1f6fd8;
}
.adm-row:last-child {
border-bottom: none;
}
.adm-item {
display: flex;
align-items: center;
margin-right: 20px;
}
.adm-item.right {
margin-left: auto;
}
.label {
font-weight: 600;
margin-right: 6px;
}
.value {
margin-right: 8px;
}
.value.bold {
font-weight: 700;
}
/* 사용량 */
.adm-row.usage {
align-items: flex-start;
}
.usage-box {
margin-left: auto;
width: 520px;
}
.usage-text {
display: flex;
justify-content: space-between;
font-size: 12px;
margin-bottom: 4px;
}
.usage-bar {
display: flex;
height: 22px;
background: #eee;
border-radius: 3px;
overflow: hidden;
font-size: 12px;
font-weight: 700;
color: #fff;
margin-top: 6px;
}
.usage-used {
background: #ff6b6b;
text-align: center;
line-height: 22px;
width: 60%;
height: 100%;
float: left;
}
.usage-remain {
background: #4caf50;
text-align: center;
line-height: 22px;
width: 40%;
height: 100%;
float: left;
}
/*검색영역*/
.adm-search {
display: flex;
align-items: center;
gap: 6px;
margin: 0 20px 10px;
}
.adm-search input,
.adm-search select {
height: 32px;
padding: 0 8px;
font-size: 13px;
border-radius: 6px;
border: 1px solid #d1d5db;
background: #fff;
width: 120px;
}
.adm-search button {
height: 32px;
padding: 0 10px;
font-size: 13px;
border-radius: 6px;
border: 1px solid #d1d5db;
background: #ffffff;
cursor: pointer;
margin-left: 0;
}
.adm-search button:hover {
background: #f9fafb;
}
#btnSave_comp {
background: #2563eb;
border-color: #2563eb;
color: #fff;
margin-left: auto;
}
#btnSave_comp:hover {
background: #1d4ed8;
}
#btnDelete {
color: #dc2626;
border-color: #dc2626;
}
#btnDelete:hover {
background: #fee2e2;
}
#btnSearch {
margin-left: auto;
background: #f3f4f6;
margin-left: 4px;
}
#btnAdd {
border-color: #22c55e;
color: #22c55e;
}
#btnAdd:hover {
background: #ecfdf5;
}
/* 좌측 상단 홈 버튼 - 타이틀 높이 기준 정렬 */
.btn-home-fixed {
position: fixed;
top: 14px;
left: 16px;
z-index: 2000;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
background: #000;
color: #fff;
border-radius: 8px;
}
/* ⭐ 반드시 SVG 크기 제한 */
.btn-home-fixed .icon-home {
width: 20px;
height: 20px;
}
.adm-member-input {
width: 140px;
margin-right: 6px;
}
.btn-bulk {
margin-right: 12px;
background: #555;
color: #080808;
}
/* ===============================
관리자 페이지 타이틀 (슈퍼&거래처)
=============================== */
.adm-title {
position: relative;
text-align: center;
font-size: 24px;
font-weight: 700;
margin: 12px 0 16px;
}
/* 우측 상단 버튼 */
.adm-title-actions {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
display: flex;
gap: 8px;
}
/* 구매이력 버튼 */
.btn-history {
padding: 6px 14px;
font-size: 13px;
border: 1px solid #999;
background: #f5f5f5;
cursor: pointer;
right: 0;
}
.btn-history:hover {
background: #e9e9e9;
}
/* 상품등록 버튼 (강조 스타일) */
.btn-product {
padding: 6px 14px;
font-size: 13px;
border: 1px solid #1f6fd8;
background: #1f6fd8;
color: #fff;
cursor: pointer;
}
.btn-product:hover {
background: #185bb0;
}
.btn-service {
padding: 6px 14px;
font-size: 13px;
border: 1px solid #444;
background: #444;
color: #fff;
}
/* ===============================
공통
=============================== */
body {
font-size: 13px;
}
.card {
background: #fff;
border: 1px solid #ddd;
padding: 16px 20px;
margin-bottom: 16px;
}
/* 버튼 공통 */
button {
cursor: pointer;
}
+3700
View File
File diff suppressed because it is too large. Load diff
+456
View File
@@ -0,0 +1,456 @@
@charset "utf-8";
/* 초기화 */
html {overflow-y:scroll}
body {margin:0;padding:0;font-size:0.95em;_font-family:'Malgun Gothic', dotum, sans-serif;background:#fff}
html, h1, h2, h3, h4, h5, h6, form, fieldset, img {margin:0;padding:0;border:0}
h1, h2, h3, h4, h5, h6 {font-size:1em;_font-family:'Malgun Gothic', dotum, sans-serif}
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {display:block}
ul, dl,dt,dd {margin:0;padding:0;list-style:none}
legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden}
label, input, button, select, img {vertical-align:middle;font-size:1em}
input, button {margin:0;padding:0;_font-family:'Malgun Gothic', dotum, sans-serif;font-size:1em}
input[type="submit"] {cursor:pointer}
button {cursor:pointer}
textarea, select {_font-family:'Malgun Gothic', dotum, sans-serif;font-size:1em}
select {margin:0}
p {margin:0;padding:0;word-break:break-all}
hr {display:none}
pre {overflow-x:scroll;font-size:1.1em}
a {color:#000;text-decoration:none}
*, :after, :before {
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}
input[type=text],input[type=password], textarea {
-webkit-transition:all 0.30s ease-in-out;
-moz-transition:all 0.30s ease-in-out;
-ms-transition:all 0.30s ease-in-out;
-o-transition:all 0.30s ease-in-out;
outline:none;
}
input[type=text]:focus,input[type=password]:focus, textarea:focus,select:focus {
-webkit-box-shadow:0 0 5px #9ed4ff;
-moz-box-shadow:0 0 5px #9ed4ff;
box-shadow:0 0 5px #9ed4ff;
border:1px solid #558ab7 !important;
}
.placeholdersjs {color:#aaa !important}
/* 레이아웃 크기 지정 */
#hd, #wrapper, #ft {min-width:1200px}
#hd_pop,
#hd_wrapper,
#tnb .inner,
#gnb .gnb_wrap,
#container_wr,
#ft_wr {width:1200px}
/* 팝업레이어 */
#hd_pop {z-index:1000;position:relative;margin:0 auto;height:0}
#hd_pop h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
.hd_pops {position:absolute;border:1px solid #e9e9e9;background:#fff}
.hd_pops img {max-width:100%}
.hd_pops_con {}
.hd_pops_footer {padding:0;background:#000;color:#fff;text-align:left;position:relative}
.hd_pops_footer:after {display:block;visibility:hidden;clear:both;content:""}
.hd_pops_footer button {padding:10px;border:0;color:#fff}
.hd_pops_footer .hd_pops_reject {background:#000;text-align:left}
.hd_pops_footer .hd_pops_close {background:#393939;position:absolute;top:0;right:0}
/* 상단 레이아웃 */
#hd {background:#212020}
#hd_h1 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#tnb {border-bottom:1px solid #383838;margin:0 auto}
#tnb:after {display:block;visibility:hidden;clear:both;content:""}
#tnb .inner {margin:0 auto}
#hd_wrapper {position:relative;margin:0 auto;height:140px;zoom:1}
#hd_wrapper:after {display:block;visibility:hidden;clear:both;content:""}
#logo {float:left;padding:30px 0 0}
.hd_sch_wr {float:left;padding:30px 0;width:445px;margin-left:65px}
#hd_sch h3 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#hd_sch {border-radius:30px;overflow:hidden}
#hd_sch #sch_stx {float:left;width:385px;height:45px;padding-left:10px;border-radius:30px 0 0 30px;background:#2c2c2c;border:0;border-right:0;font-size:1.25em;color:#fff}
#hd_sch #sch_submit {float:left;width:60px;height:45px;border:0;background:#2c2c2c;color:#fff;border-radius:0 30px 30px 0;cursor:pointer;font-size:16px}
#hd_define {float:left}
#hd_define:after {display:block;visibility:hidden;clear:both;content:""}
#hd_define li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px}
#hd_define li:last-child {padding-right:0;margin-right:0;border-right:0}
#hd_define li a {display:inline-block;color:#919191}
#hd_define li.active a {color:#fff}
#hd_qnb {float:right;text-align:right}
#hd_qnb:after {display:block;visibility:hidden;clear:both;content:""}
#hd_qnb li {float:left;font-size:1.083em;line-height:14px;border-right:1px solid #4a4a4a;position:relative;text-align:center;margin:15px 10px 15px 0;padding-right:10px}
#hd_qnb li:last-child {padding-right:0;margin-right:0;border-right:0}
#hd_qnb li span {display:block;margin-top:5px;font-size:0.92em}
#hd_qnb li a {display:inline-block;color:#919191}
#hd_qnb .visit .visit-num {display:inline-block;line-height:16px;padding:0 5px;margin-left:5px;border-radius:10px;background:#da22f5;color:#fff;font-size:10px}
.hd_login {position:absolute;right:0;top:60px}
.hd_login li {float:left;margin:0 5px;border-left:1px solid #616161;padding-left:10px;line-height:13px}
.hd_login li:first-child {border-left:0}
.hd_login a {color:#fff}
/* 메인메뉴 */
#gnb {position:relative;background:#fff}
#gnb > h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#gnb .gnb_wrap {margin:0 auto;position:relative}
#gnb .gnb_wrap:hover, #gnb .gnb_wrap:focus, #gnb .gnb_wrap:active{z-index:3}
#gnb #gnb_1dul {font-size:1.083em;padding:0;border-bottom:1px solid #e0e2e5;zoom:1}
#gnb ul:after {display:block;visibility:hidden;clear:both;content:""}
#gnb .gnb_1dli {float:left;line-height:55px;padding:0px;position:relative}
#gnb .gnb_1dli:hover > a {color:#3a8afd;
-webkit-transition:background-color 2s ease-out;
-moz-transition:background-color 0.3s ease-out;
-o-transition:background-color 0.3s ease-out;
transition:background-color 0.3s ease-out}
.gnb_1dli .bg {position:absolute;top:24px;right:8px;display:inline-block;width:10px;height:10px;overflow:hidden;background:url('../img/gnb_bg2.gif') no-repeat 50% 50%;text-indent:-999px}
.gnb_1da {display:block;font-weight:bold;padding:0 15px;color:#080808;text-decoration:none}
.gnb_1dli.gnb_al_li_plus .gnb_1da{padding-right:25px}
.gnb_2dli:first-child {border:0}
.gnb_2dul {display:none;position:absolute;top:54px;min-width:140px;padding-top:2px}
.gnb_2dul .gnb_2dul_box {border:1px solid #e0e2e5;border-top:0;padding:0;
-webkit-box-shadow:0px 1px 5px rgba(97, 97, 97, 0.2);
-moz-box-shadow:0px 1px 5px rgba(97, 97, 97, 0.2);
box-shadow:0px 1px 5px rgba(97, 97, 97, 0.2)}
.gnb_2da {display:block;padding:0 10px;line-height:40px;background:#fff;color:#080808;text-align:left;text-decoration:none}
a.gnb_2da:hover {color:#3a8afd;background:#f7f7f8;
-moz-transition:all 0.3s ease-out;
-o-transition:all 0.3s ease-out;
transition:all 0.3s ease-out}
.gnb_1dli_air .gnb_2da {}
.gnb_1dli_on .gnb_2da {}
.gnb_2da:focus, .gnb_2da:hover {color:#fff}
.gnb_1dli_over .gnb_2dul {display:block;left:0}
.gnb_1dli_over2 .gnb_2dul {display:block;right:0}
.gnb_wrap .gnb_empty {padding:10px 0;width:100%;text-align:center;line-height:2.7em;color:#080808}
.gnb_wrap .gnb_empty a {color:#3a8afd;text-decoration:underline}
.gnb_wrap .gnb_al_ul .gnb_empty, .gnb_wrap .gnb_al_ul .gnb_empty a {color:#555}
#gnb .gnb_menu_btn {background:#4158d1;color:#fff;width:50px;height:55px;border:0;vertical-align:top;font-size:18px}
#gnb .gnb_close_btn {background:#fff;color:#b6b9bb;width:50px;height:50px;border:0;vertical-align:top;font-size:18px;position:absolute;top:0;right:0}
#gnb .gnb_mnal {float:right;padding:0}
#gnb_all {display:none;position:absolute;border:1px solid #c5d6da;width:100%;background:#fff;z-index:1000;-webkit-box-shadow:0 2px 5px rgba(0,0,0,0.2);
-moz-box-shadow:0 2px 5px rgba(0,0,0,0.2);
box-shadow:0 2px 5px rgba(0,0,0,0.2)}
#gnb_all h2 {font-size:1.3em;padding:15px 20px;border-bottom:1px solid #e7eeef}
#gnb_all .gnb_al_ul:after {display:block;visibility:hidden;clear:both;content:""}
#gnb_all .gnb_al_ul > li:nth-child(5n+1) {border-left:0}
#gnb_all .gnb_al_li {float:left;width:20%;min-height:150px;padding:20px;border-left:1px solid #e7eeef}
#gnb_all .gnb_al_li .gnb_al_a {font-size:1.2em;display:block;position:relative;margin-bottom:10px;font-weight:bold;color:#3a8afd}
#gnb_all .gnb_al_li li {line-height:2em}
#gnb_all .gnb_al_li li a {color:#555}
#gnb_all_bg {display:none;background:rgba(0,0,0,0.1);width:100%;height:100%;position:fixed;left:0;top:0;z-index:999}
/* 중간 레이아웃 */
#wrapper {}
#container_wr:after {display:block;visibility:hidden;clear:both;content:""}
#container_wr {margin:0 auto;zoom:1}
#aside {float:right;width:235px;padding:0;height:100%;margin:20px 0 20px 20px}
#container {position:relative;float:left;min-height:500px;height:auto !important;margin:20px 0;font-size:1em;width:930px;zoom:1}
#container:after {display:block;visibility:hidden;clear:both;content:""}
#container_title {font-size:1.333em;margin:0 auto;font-weight:bold}
#container_title span {margin:0 auto 10px;display:block;line-height:30px}
.lt_wr {width:32%}
.lt_wr:nth-child(3n+1) {clear:both}
.latest_wr {margin-bottom:20px}
.latest_wr:after {display:block;visibility:hidden;clear:both;content:""}
.latest_top_wr {margin:0 -10px 20px}
.latest_top_wr:after {display:block;visibility:hidden;clear:both;content:""}
/* 하단 레이아웃 */
#ft {background:#212020;margin:0 auto;text-align:center}
#ft h1 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#ft_wr {max-width:1240px;margin:0;padding:40px 0;position:relative;display:inline-block;text-align:left}
#ft_wr:after {display:block;visibility:hidden;clear:both;content:""}
#ft_wr .ft_cnt {width:25%;float:left;padding:0 20px}
#ft_link {text-align:left}
#ft_link a {display:block;color:#fff;line-height:2em;font-weight:bold}
#ft_company h2 {font-size:1.2em;margin-bottom:20px}
#ft_company {font-weight:normal;color:#e3e3e3;line-height:2em}
#ft_catch {margin:20px 0 10px}
#ft_copy {text-align:center;width:1200px;margin:0 auto;padding:20px 0;color:#5b5b5b;font-size:0.92em;border-top:1px solid #383838}
#top_btn {position:fixed;bottom:20px;right:20px;width:50px;height:50px;line-height:46px;border:2px solid #333;color:#333;text-align:center;font-size:15px;z-index:90;background:rgba(255,255,255,0.5)}
#top_btn:hover {border-color:#3059c7;background:#3059c7;color:#fff}
/* 게시물 선택복사 선택이동 */
#copymove {}
#copymove .win_desc {text-align:center;display:block}
#copymove .tbl_wrap {margin:20px}
#copymove .win_btn {padding:0 20px 20px}
.copymove_current {float:right;background:#ff3061;padding:5px;color:#fff;border-radius:3px}
.copymove_currentbg {background:#f4f4f4}
/* 화면낭독기 사용자용 */
#hd_login_msg {position:absolute;top:0;left:0;font-size:0;line-height:0;overflow:hidden}
.msg_sound_only, .sound_only {display:inline-block !important;position:absolute;top:0;left:0;width:0;height:0;margin:0 !important;padding:0 !important;font-size:0;line-height:0;border:0 !important;overflow:hidden !important}
/* 본문 바로가기 */
#skip_to_container a {z-index:100000;position:absolute;top:0;left:0;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden}
#skip_to_container a:focus, #skip_to_container a:active {width:100%;height:75px;background:#21272e;color:#fff;font-size:2em;font-weight:bold;text-align:center;text-decoration:none;line-height:3.3em}
/* ie6 이미지 너비 지정 */
.img_fix {width:100%;height:auto}
/* 캡챠 자동등록(입력)방지 기본 -pc */
#captcha {display:inline-block;position:relative}
#captcha legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden}
#captcha #captcha_img {height:40px;border:1px solid #898989;vertical-align:top;padding:0;margin:0}
#captcha #captcha_mp3 {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../../../img/captcha2.png') no-repeat;text-indent:-999px;border-radius:3px}
#captcha #captcha_reload {margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../../../img/captcha2.png') no-repeat 0 -40px;text-indent:-999px;border-radius:3px}
#captcha #captcha_key {margin:0 0 0 3px;padding:0 5px;width:90px;height:40px;border:1px solid #ccc;background:#fff;font-size:1.333em;font-weight:bold;text-align:center;border-radius:3px;vertical-align:top}
#captcha #captcha_info {display:block;margin:5px 0 0;font-size:0.95em;letter-spacing:-0.1em}
/* 캡챠 자동등록(입력)방지 기본 - mobile */
#captcha.m_captcha audio {display:block;margin:0 0 5px;width:187px}
#captcha.m_captcha #captcha_img {width:160px;height:60px;border:1px solid #e9e9e9;margin-bottom:3px;margin-top:5px;display:block}
#captcha.m_captcha #captcha_reload {position:static;margin:0;padding:0;width:40px;height:40px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer;background:url('../../../img/captcha2.png') no-repeat 0 -40px;text-indent:-999px}
#captcha.m_captcha #captcha_reload span {display:none}
#captcha.m_captcha #captcha_key {margin:0;padding:0 5px;width:115px;height:29px;border:1px solid #b8c9c2;background:#f7f7f7;font-size:1.333em;font-weight:bold;text-align:center;line-height:29px;margin-left:3px}
#captcha.m_captcha #captcha_info {display:block;margin:5px 0 0;font-size:0.95em;letter-spacing:-0.1em}
#captcha.m_captcha #captcha_mp3 {width:31px;height:31px;background:url('../../../img/captcha2.png') no-repeat 0 0 ; vertical-align:top;overflow:hidden;cursor:pointer;text-indent:-9999px;border:none}
/* ckeditor 단축키 */
.cke_sc {margin:0 0 5px;text-align:right}
.btn_cke_sc {display:inline-block;padding:0 10px;height:23px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none;line-height:1.9em;vertical-align:middle;cursor:pointer}
.cke_sc_def {margin:0 0 5px;padding:10px;border:1px solid #ccc;background:#f7f7f7;text-align:center}
.cke_sc_def dl {margin:0 0 5px;text-align:left;zoom:1}
.cke_sc_def dl:after {display:block;visibility:hidden;clear:both;content:""}
.cke_sc_def dt, .cke_sc_def dd {float:left;margin:0;padding:5px 0;border-bottom:1px solid #e9e9e9}
.cke_sc_def dt {width:20%;font-weight:bold}
.cke_sc_def dd {width:30%}
/* ckeditor 태그 기본값 */
#bo_v_con ul {display:block;list-style-type:disc;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px}
#bo_v_con ol {display:block;list-style-type:decimal;margin-top:1em;margin-bottom:1em;margin-left:0;margin-right:0;padding-left:40px}
#bo_v_con li {display:list-item}
/* 버튼 */
a.btn,.btn {line-height:35px;height:35px;padding:0 10px;text-align:center;font-weight:bold;border:0;font-size:1.4em;
-webkit-transition:background-color 0.3s ease-out;
-moz-transition:background-color 0.3s ease-out;
-o-transition:background-color 0.3s ease-out;
transition:background-color 0.3s ease-out}
a.btn01 {display:inline-block;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none;vertical-align:middle}
a.btn01:focus, a.btn01:hover {text-decoration:none}
button.btn01 {display:inline-block;margin:0;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none}
a.btn02 {display:inline-block;padding:7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none;vertical-align:middle}
a.btn02:focus, .btn02:hover {text-decoration:none}
button.btn02 {display:inline-block;margin:0;padding:7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none}
.btn_confirm {text-align:right} /* 서식단계 진행 */
.btn_submit {border:0;background:#3a8afd;color:#000;cursor:pointer;border-radius:3px}
.btn_submit:hover {background:#2375eb}
.btn_close {border:1px solid #dcdcdc;cursor:pointer;border-radius:3px;background:#fff}
a.btn_close {text-align:center;line-height:50px}
a.btn_cancel {display:inline-block;background:#969696;color:#fff;text-decoration:none;vertical-align:middle}
button.btn_cancel {display:inline-block;background:#969696;color:#fff;text-decoration:none;vertical-align:middle}
.btn_cancel:hover {background:#aaa}
a.btn_frmline, button.btn_frmline {display:inline-block;width:128px;padding:0 5px;height:40px;border:0;background:#434a54;border-radius:3px;color:#fff;text-decoration:none;vertical-align:top} /* 우편번호검색버튼 등 */
a.btn_frmline {}
button.btn_frmline {font-size:1em}
/* 게시판용 버튼 */
a.btn_b01,.btn_b01 {display:inline-block;color:#bababa;text-decoration:none;vertical-align:middle;border:0;background:transparent}
.btn_b01:hover, .btn_b01:hover {color:#000}
a.btn_b02,.btn_b02 {display:inline-block;background:#253dbe;padding:0 10px;color:#fff;text-decoration:none;border:0;vertical-align:middle}
a.btn_b02:hover, .btn_b02:hover {background:#0025eb}
a.btn_b03, .btn_b03 {display:inline-block;background:#fff;border:1px solid #b9bdd3;color:#646982;text-decoration:none;vertical-align:middle}
a.btn_b03:hover, .btn_b03:hover {background:#ebedf6}
a.btn_b04, .btn_b04 {display:inline-block;background:#fff;border:1px solid #ccc;color:#707070;text-decoration:none;vertical-align:middle}
a.btn_b04:hover, .btn_b04:hover {color:#333;background:#f9f9f9}
a.btn_admin,.btn_admin {display:inline-block;color:#d13f4a;text-decoration:none;vertical-align:middle} /* 관리자 전용 버튼 */
.btn_admin:hover, a.btn_admin:hover {color:#ff3746}
/* 기본테이블 */
.tbl_wrap table {width:100%;border-collapse:collapse;border-spacing:0 5px;background:#fff;border-top:1px solid #ececec;border-bottom:1px solid #ececec}
.tbl_wrap caption {padding:10px 0;font-weight:bold;text-align:left}
.tbl_head01 {margin:0 0 10px}
.tbl_head01 caption {padding:0;font-size:0;line-height:0;overflow:hidden}
.tbl_head01 thead th {padding:20px 0;font-weight:normal;text-align:center;border-bottom:1px solid #ececec;height:40px}
.tbl_head01 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */
.tbl_head01 tfoot th, .tbl_head01 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center}
.tbl_head01 tbody th {padding:8px 0;border-bottom:1px solid #e8e8e8}
.tbl_head01 td {color:#666;padding:10px 5px;border-top:1px solid #ecf0f1;border-bottom:1px solid #ecf0f1;line-height:1.4em;height:60px;word-break:break-all}
.tbl_head01 tbody tr:hover td {background:#fafafa}
.tbl_head01 a:hover {text-decoration:underline}
.tbl_head02 {margin:0 0 10px}
.tbl_head02 caption {padding:0;font-size:0;line-height:0;overflow:hidden}
.tbl_head02 thead th {padding:5px 0;border-top:1px solid #d1dee2;border-bottom:1px solid #d1dee2;background:#e5ecef;color:#383838;font-size:0.95em;text-align:center;letter-spacing:-0.1em}
.tbl_head02 thead a {color:#383838}
.tbl_head02 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */
.tbl_head02 tfoot th, .tbl_head02 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center}
.tbl_head02 tbody th {padding:5px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;background:#fff}
.tbl_head02 td {padding:5px 3px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;background:#fff;line-height:1.4em;word-break:break-all}
.tbl_head02 a {}
/* 폼 테이블 */
.tbl_frm01 {margin:0 0 20px}
.tbl_frm01 table {width:100%;border-collapse:collapse;border-spacing:0}
.tbl_frm01 th {width:70px;padding:7px 13px;border:1px solid #e9e9e9;border-left:0;background:#f5f8f9;text-align:left}
.tbl_frm01 td {padding:7px 10px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;background:transparent}
.wr_content textarea,.tbl_frm01 textarea,.form_01 textarea, .frm_input {border:1px solid #d0d3db;background:#fff;color:#000;vertical-align:middle;border-radius:3px;padding:5px;
-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075);
}
.tbl_frm01 textarea {padding:2px 2px 3px}
.frm_input {height:40px}
.full_input {width:100%}
.half_input {width:49.5%}
.twopart_input {width:385px;margin-right:10px}
.tbl_frm01 textarea, .write_div textarea {width:100%;height:100px}
.tbl_frm01 a {text-decoration:none}
.tbl_frm01 .frm_file {display:block;margin-bottom:5px}
.tbl_frm01 .frm_info {display:block;padding:0 0 5px;line-height:1.4em}
/*기본 리스트*/
.list_01 ul {border-top:1px solid #ececec}
.list_01 li {border-bottom:1px solid #ececec;background:#fff;padding:10px 15px;list-style:none;position:relative}
.list_01 li:nth-child(odd) {background:#f6f6f6}
.list_01 li:after {display:block;visibility:hidden;clear:both;content:""}
.list_01 li:hover {background:#f9f9f9}
.list_01 li.empty_li {text-align:center;padding:20px 0;color:#666}
/*폼 리스트*/
.form_01 h2 {font-size:1.167em}
.form_01 li {margin-bottom:10px}
.form_01 ul:after,
.form_01 li:after {display:block;visibility:hidden;clear:both;content:""}
.form_01 .left_input {float:left}
.form_01 .margin_input {margin-right:1%}
.form_01 textarea {height:100px;width:100%}
.form_01 .frm_label {display:inline-block;width:130px}
/* 자료 없는 목록 */
.empty_table {padding:50px 0 !important;text-align:center}
.empty_list {padding:20px 0 !important;color:#666;text-align:center}
/* 필수입력 */
.required, textarea.required {background-image:url('../img/require.png') !important;background-repeat:no-repeat !important;background-position:right top !important}
/* 테이블 항목별 정의 */
.td_board {width:80px;text-align:center}
.td_category {width:80px;text-align:center}
.td_chk {width:30px;text-align:center}
.td_date {width:60px;text-align:center}
.td_datetime {width:110px;text-align:center}
.td_group {width:80px;text-align:center}
.td_mb_id {width:100px;text-align:center}
.td_mng {width:80px;text-align:center}
.td_name {width:100px;text-align:left}
.td_nick {width:100px;text-align:center}
.td_num {width:50px;text-align:center}
.td_numbig {width:80px;text-align:center}
.td_stat {width:60px;text-align:center}
.txt_active {color:#5d910b}
.txt_done {color:#e8180c}
.txt_expired {color:#ccc}
.txt_rdy {color:#8abc2a}
/* 새창 기본 스타일 */
.new_win {position:relative}
.new_win .tbl_wrap {margin:0 20px}
.new_win #win_title {font-size:1.3em;height:50px;line-height:30px;padding:10px 20px;background:#fff;color:#000;-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);
-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);
box-shadow:0 1px 10px rgba(0,0,0,.1)}
.new_win #win_title .sv {font-size:0.75em;line-height:1.2em}
.new_win .win_ul {margin-bottom:15px;padding:0 20px}
.new_win .win_ul:after {display:block;visibility:hidden;clear:both;content:""}
.new_win .win_ul li {float:left;background:#fff;text-align:center;padding:0 10px;border:1px solid #d6e9ff;border-radius:30px;margin-left:5px}
.new_win .win_ul li:first-child {margin-left:0}
.new_win .win_ul li a {display:block;padding:8px 0;color:#6794d3}
.new_win .win_ul .selected {background:#3a8afd;border-color:#3a8afd;position:relative;z-index:5}
.new_win .win_ul .selected a {color:#fff;font-weight:bold}
.new_win .win_desc {position:relative;margin:10px;border-radius:5px;font-size:1em;background:#f2838f;color:#fff;line-height:50px;text-align:left;padding:0 20px}
.new_win .win_desc i {font-size:1.2em;vertical-align:baseline}
.new_win .win_desc:after {content:"";position:absolute;left:0;top:0;width:4px;height:50px;background:#da4453;border-radius:3px 0 0 3px}
.new_win .frm_info {font-size:0.92em;color:#919191}
.new_win .win_total {float:right;display:inline-block;line-height:30px;font-weight:normal;font-size:0.75em;color:#3a8afd;background:#f6f6f6;padding:0 10px;border-radius:5px}
.new_win .new_win_con {margin:20px 0;padding:20px}
.new_win .new_win_con:after {display:block;visibility:hidden;clear:both;content:""}
.new_win .new_win_con2 {margin:20px 0}
.new_win .btn_confirm:after {display:block;visibility:hidden;clear:both;content:""}
.new_win .win_btn {text-align:center}
.new_win .cert_btn {margin-bottom:30px;text-align:center}
.new_win .btn_close {padding:0 20px;height:45px;overflow:hidden;cursor:pointer}
.new_win .btn_submit {padding:0 20px;height:45px;font-weight:bold;font-size:1.083em}
/* 검색결과 색상 */
.sch_word {color:#fff;background:#ff005a;padding:2px 5px 3px;line-height:18px;margin:0 2px}
/* 자바스크립트 alert 대안 */
#validation_check {margin:100px auto;width:500px}
#validation_check h1 {margin-bottom:20px;font-size:1.3em}
#validation_check p {margin-bottom:20px;padding:30px 20px;border:1px solid #e9e9e9;background:#fff}
/* 사이드뷰 */
.sv_wrap {position:relative;font-weight:normal}
.sv_wrap .sv {z-index:1000;display:none;margin:5px 0 0;font-size:0.92em;background:#333;
-webkit-box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2);
-moz-box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2);
box-shadow:2px 2px 3px 0px rgba(0,0,0,0.2)}
.sv_wrap .sv:before {content:"";position:absolute;top:-6px;left:15px;width:0;height:0;border-style:solid;border-width:0 6px 6px 6px;border-color:transparent transparent #333 transparent}
.sv_wrap .sv a {display:inline-block;margin:0;padding:0 10px;line-height:30px;width:100px;font-weight:normal;color:#bbb}
.sv_wrap .sv a:hover {background:#000;color:#fff}
.sv_member {color:#333}
.sv_on {display:block !important;position:absolute;top:23px;left:0px;width:auto;height:auto}
.sv_nojs .sv {display:block}
/* 페이징 */
.pg_wrap {clear:both;float:left;display:inline-block}
.pg_wrap:after {display:block;visibility:hidden;clear:both;content:""}
.pg {text-align:center}
.pg_page, .pg_current {display:inline-block;vertical-align:middle;background:#eee;border:1px solid #eee}
.pg a:focus, .pg a:hover {text-decoration:none}
.pg_page {color:#959595;font-size:1.083em;height:30px;line-height:28px;padding:0 5px;min-width:30px;text-decoration:none;border-radius:3px}
.pg_page:hover {background-color:#fafafa}
.pg_start {text-indent:-999px;overflow:hidden;background:url('../img/btn_first.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee}
.pg_prev {text-indent:-999px;overflow:hidden;background:url('../img/btn_prev.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee}
.pg_end {text-indent:-999px;overflow:hidden;background:url('../img/btn_end.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee}
.pg_next {text-indent:-999px;overflow:hidden;background:url('../img/btn_next.gif') no-repeat 50% 50% #eee;padding:0;border:1px solid #eee}
.pg_start:hover,.pg_prev:hover,.pg_end:hover,.pg_next:hover {background-color:#fafafa}
.pg_current {display:inline-block;background:#3a8afd;border:1px solid #3a8afd;color:#fff;font-weight:bold;height:30px;line-height:30px;padding:0 10px;min-width:30px;border-radius:3px}
/* cheditor 이슈 */
.cheditor-popup-window *, .cheditor-popup-window :after, .cheditor-popup-window :before {
-webkit-box-sizing:content-box;
-moz-box-sizing:content-box;
box-sizing:content-box;
}
/* Mobile화면으로 */
#device_change {display:block;margin:0.3em;padding:0.5em 0;border:1px solid #eee;border-radius:2em;background:#fff;color:#000;font-size:2em;text-decoration:none;text-align:center}
+49
View File
@@ -0,0 +1,49 @@
@charset "utf-8";
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 100;
src: url(/kngil/fonts/faq/NotoKR-Thin/notokr-thin.woff2) format('woff2'),
url(/kngil/fonts/faq/NotoKR-Thin/notokr-thin.woff) format('woff'),
url(/kngil/fonts/faq/NotoKR-Thin/notokr-thin.otf) format('opentype');
}
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 300;
src: url(/kngil/fonts/faq/NotoKR-Light/notokr-light.woff2) format('woff2'),
url(/kngil/fonts/faq/NotoKR-Light/notokr-light.woff) format('woff'),
url(/kngil/fonts/faq/NotoKR-Light/notokr-light.otf) format('opentype');
}
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 400;
src: url(/kngil/fonts/faq/NotoKR-Regular/notokr-regular.woff2) format('woff2'),
url(/kngil/fonts/faq/NotoKR-Regular/notokr-regular.woff) format('woff'),
url(/kngil/fonts/faq/NotoKR-Regular/notokr-regular.otf) format('opentype');
}
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 500;
src: url(/kngil/fonts/faq/NotoKR-Medium/notokr-medium.woff2) format('woff2'),
url(/kngil/fonts/faq/NotoKR-Medium/notokr-medium.woff) format('woff'),
url(/kngil/fonts/faq/NotoKR-Medium/notokr-medium.otf) format('opentype');
}
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 700;
src: url(/kngil/fonts/faq/NotoKR-Bold/notokr-bold.woff2) format('woff2'),
url(/kngil/fonts/faq/NotoKR-Bold/notokr-bold.woff) format('woff'),
url(/kngil/fonts/faq/NotoKR-Bold/notokr-bold.otf) format('opentype');
}
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 900;
src: url(/kngil/fonts/faq/NotoKR-Black/notokr-black.woff2) format('woff2'),
url(/kngil/fonts/faq/NotoKR-Black/notokr-black.woff) format('woff'),
url(/kngil/fonts/faq/NotoKR-Black/notokr-black.otf) format('opentype');
}
+47
View File
@@ -0,0 +1,47 @@
@charset "utf-8";
/* Reset */
* {box-sizing: border-box;}
html, body, h1, h2, h3, h4, h5, h6, div, p, pre, code, address, ul, ol, li, menu, nav, section, article, aside,
dl ,dt, dd, table, thead, tbody, tfoot, label, caption, th, td, form, fieldset, legend, hr, input, button, textarea, object, figure, figcaption {margin:0; padding:0;}
html, body {width:100%; height:100%; font-family: 'Noto Sans KR', sans-serif; }
body {background:#fff; min-width:360px; -webkit-text-size-adjust:none;word-wrap:break-word;word-break:break-all;}
body, input, select, textarea, button {background:none; border:none;}
button {background: none; cursor: pointer; user-select: none;}
ul, ol, li {list-style:none;}
table {width:100%;border-spacing:0;border-collapse:collapse;}
img, fieldset {border:0;}
address, cite, code {font-style:normal;font-weight:normal;}
em {font-style:normal;font-weight:bold;}
i {font-style: normal;}
label, img, input, select, textarea, button {font-family:inherit; vertical-align:middle;}
caption, legend {line-height:0;font-size:1px;overflow:hidden;}
hr{display:none;}
main, header, section, nav, footer, aside, article, figure {display:block;}
a {color:inherit; text-decoration:none;}
a:hover {text-decoration:none;}
/* Form */
input[type=text]::placeholder, input::-webkit-input-placeholder{font-weight:500; color:#bdbdbd;}
select:focus,
textarea:focus,
input:focus {border: 1; outline: none;}
input[type=text][readonly],
input[type=text][readonly]:focus {border:1;}
input[type=tel][readonly],
input[type=password][readonly],
input[type=email][readonly],
input[type=search][readonly],
input[type=tel][disabled],
input[type=text][disabled],
input[type=password][disabled],
input[type=search][disabled],
input[type=email][disabled] {border-color:#c0c0c0; color:#666; -webkit-appearance:none; font-size:16px;}
textarea[readonly],
textarea[disabled] {padding:11px; font-size:16px; color:#666; font-weight:normal; line-height:140%; height:78px; background:#eaeaea;border:1px solid #c0c0c0;}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
File diff suppressed because it is too large. Load diff
+33
View File
@@ -0,0 +1,33 @@
@charset "utf-8";
#bo_cate {margin-bottom:28px}
#bo_cate h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
#bo_cate ul {zoom:1}
#bo_cate ul:after {display:block;visibility:hidden;clear:both;content:""}
#bo_cate li {display:inline-block;padding:2px}
#bo_cate a {display:block;line-height:28px;padding:5px 15px;border-radius:30px;border:1px solid #d6e9ff;color:#6794d3}
#bo_cate a:focus, #bo_cate a:hover, #bo_cate a:active {text-decoration:none;background:#3a8afd;color:#fff}
#bo_cate #bo_cate_on {z-index:2;background:#3a8afd;color:#fff;font-weight:bold;border:1px solid #3a8afd;
-webkit-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
-moz-box-shadow:inset 0 2px 5px rgb(33, 135, 202);
box-shadow:inset 0 2px 5px rgb(33, 135, 202)}
#faq_wrap {margin:10px 0 30px}
#faq_wrap h2 {position:absolute;font-size:0;line-height:0;overflow:hidden}
.faq_admin {text-align:right}
#faq_wrap ol {margin:0;padding:0;list-style:none}
#faq_wrap li {border-bottom:1px solid #ececec;background:#fff;position:relative}
#faq_wrap li:first-child {border-top:1px solid #ececec}
#faq_wrap li h3 {min-height:50px;line-height:30px;padding:15px;padding-left:50px;position:relative}
#faq_wrap li h3 .tit_btn {position:absolute;right:15px;top:15px;border:0;width:30px;height:30px;background:#fff;color:#c5cdd8;font-size:1.2em}
#faq_wrap li h3 .tit_bg {display:inline-block;position:absolute;top:15px;left:15px;text-align:center;color:#000;font-size:1.6em}
#faq_wrap li h3.faq_li_open a {color:#3a8afd}
#faq_con .con_inner {display:none;padding:5px 5px 20px 50px}
#faq_con .con_inner .tit_bg {display:inline-block;position:absolute;top:10px;left:10px;text-align:center;background:#777;color:#fff;border-radius:50%;width:30px;line-height:30px;height:30px}
#faq_con .con_inner .closer_btn {position:absolute;right:15px;top:15px;border:0;width:30px;height:30px;background:#fff;color:#3a8afd;font-size:1.2em}
#faq_sch {background:#f7f7f7;padding:30px;text-align:center;margin:0 0 10px}
#faq_sch .sch_tit {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden}
#faq_sch .frm_input {border:1px solid #d0d3db;width:300px;height:45px;border-radius:0;border-radius:3px}
#faq_sch .btn_submit {padding:0 10px;height:45px;width:88px;font-size:1.083em;font-weight:bold;color:#fff;background:#434a54}
+1
View File
@@ -0,0 +1 @@
[data-aos][data-aos][data-aos-duration="50"],body[data-aos-duration="50"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay="50"],body[data-aos-delay="50"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="50"].aos-animate,body[data-aos-delay="50"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration="100"],body[data-aos-duration="100"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay="100"],body[data-aos-delay="100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="100"].aos-animate,body[data-aos-delay="100"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration="150"],body[data-aos-duration="150"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay="150"],body[data-aos-delay="150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="150"].aos-animate,body[data-aos-delay="150"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration="200"],body[data-aos-duration="200"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay="200"],body[data-aos-delay="200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="200"].aos-animate,body[data-aos-delay="200"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration="250"],body[data-aos-duration="250"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay="250"],body[data-aos-delay="250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="250"].aos-animate,body[data-aos-delay="250"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration="300"],body[data-aos-duration="300"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay="300"],body[data-aos-delay="300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="300"].aos-animate,body[data-aos-delay="300"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration="350"],body[data-aos-duration="350"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay="350"],body[data-aos-delay="350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="350"].aos-animate,body[data-aos-delay="350"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration="400"],body[data-aos-duration="400"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay="400"],body[data-aos-delay="400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="400"].aos-animate,body[data-aos-delay="400"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration="450"],body[data-aos-duration="450"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay="450"],body[data-aos-delay="450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="450"].aos-animate,body[data-aos-delay="450"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration="500"],body[data-aos-duration="500"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay="500"],body[data-aos-delay="500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="500"].aos-animate,body[data-aos-delay="500"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration="550"],body[data-aos-duration="550"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay="550"],body[data-aos-delay="550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="550"].aos-animate,body[data-aos-delay="550"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration="600"],body[data-aos-duration="600"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay="600"],body[data-aos-delay="600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="600"].aos-animate,body[data-aos-delay="600"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration="650"],body[data-aos-duration="650"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay="650"],body[data-aos-delay="650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="650"].aos-animate,body[data-aos-delay="650"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration="700"],body[data-aos-duration="700"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay="700"],body[data-aos-delay="700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="700"].aos-animate,body[data-aos-delay="700"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration="750"],body[data-aos-duration="750"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay="750"],body[data-aos-delay="750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="750"].aos-animate,body[dLine truncated
+1
View File
@@ -0,0 +1 @@
.mCustomScrollbar{-ms-touch-action:pinch-zoom;touch-action:pinch-zoom}.mCustomScrollbar.mCS_no_scrollbar,.mCustomScrollbar.mCS_touch_action{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_verticaLine truncated
+1
View File
@@ -0,0 +1 @@
html.lenis,html.lenis body{height:auto}.lenis.lenis-smooth{scroll-behavior:auto !important}.lenis.lenis-smooth [data-lenis-prevent]{overscroll-behavior:contain}.lenis.lenis-stopped{overflow:hidden}.lenis.lenis-smooth iframe{pointer-events:none}
+13
View File
@@ -0,0 +1,13 @@
/**
* Swiper 11.2.5
* Most modern mobile touch slider and framework with hardware accelerated transitions
* https://swiperjs.com
*
* Copyright 2014-2025 Vladimir Kharlampidi
*
* Released under the MIT License
*
* Released on: March 3, 2025
*/
@font-face{font-family:swiper-icons;src:url('data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA');font-weight:400;font-style:normal}:root{--swiper-theme-color:#007aff}:host{position:relative;display:block;margin-left:auto;margin-right:auto;z-index:1}.swiper{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1;display:block}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;transition-timing-function:var(--swiper-wrapper-transition-timing-function,initial);box-sizing:content-box}.swiper-android .swiper-slide,.swiper-ios .swiper-slide,.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform;display:block}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden .swiper-slide{transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d .swiper-slide{transform-style:preserve-3d}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-css-mode.swiper-horizontal>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-css-mode.swiper-vertical>.swiper-wrapper{scroll-snap-type:y mandatory}.swiper-css-mode.swiper-free-mode>.swiper-wrapper{scroll-snap-type:none}.swiper-css-mode.swiper-free-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:none}.swiper-css-mode.swiper-centered>.swiper-wrapper::before{content:'';flex-shrink:0;order:9999}.swiper-css-mode.swiper-centered>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center;scroll-snap-stop:always}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper::before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper::before{width:100%;min-width:1px;height:var(--swiper-Line truncated
+4
View File
@@ -0,0 +1,4 @@
/*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/@font-face{font-family:'FontAwesome';src:url('/kngil/fonts/fontawesome-webfont.eot?v=4.7.0');src:url('/kngil/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('/kngil/fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('/kngil/fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('/kngil/fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('/kngil/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-wiLine truncated
+49
View File
@@ -0,0 +1,49 @@
@charset "utf-8";
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 100;
src: url(/kngil/fonts/qa/NotoKR-Thin/notokr-thin.woff2) format('woff2'),
url(/kngil/fonts/qa/font/NotoKR-Thin/notokr-thin.woff) format('woff'),
url(/kngil/fonts/qa/font/NotoKR-Thin/notokr-thin.otf) format('opentype');
}
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 300;
src: url(/kngil/fonts/qa/NotoKR-Light/notokr-light.woff2) format('woff2'),
url(/kngil/fonts/qa/NotoKR-Light/notokr-light.woff) format('woff'),
url(/kngil/fonts/qa/NotoKR-Light/notokr-light.otf) format('opentype');
}
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 400;
src: url(/kngil/fonts/qa/NotoKR-Regular/notokr-regular.woff2) format('woff2'),
url(/kngil/fonts/qa/NotoKR-Regular/notokr-regular.woff) format('woff'),
url(/kngil/fonts/qa/NotoKR-Regular/notokr-regular.otf) format('opentype');
}
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 500;
src: url(/kngil/fonts/qa/NotoKR-Medium/notokr-medium.woff2) format('woff2'),
url(/kngil/fonts/qa/NotoKR-Medium/notokr-medium.woff) format('woff'),
url(/kngil/fonts/qa/NotoKR-Medium/notokr-medium.otf) format('opentype');
}
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 700;
src: url(/kngil/fonts/qa/NotoKR-Bold/notokr-bold.woff2) format('woff2'),
url(/kngil/fonts/qa/NotoKR-Bold/notokr-bold.woff) format('woff'),
url(/kngil/fonts/qa/NotoKR-Bold/notokr-bold.otf) format('opentype');
}
@font-face {
font-family: 'Noto Sans KR';
font-style: normal;
font-weight: 900;
src: url(/kngil/fonts/qa/NotoKR-Black/notokr-black.woff2) format('woff2'),
url(/kngil/fonts/qa/NotoKR-Black/notokr-black.woff) format('woff'),
url(/kngil/fonts/qa/NotoKR-Black/notokr-black.otf) format('opentype');
}
+47
View File
@@ -0,0 +1,47 @@
@charset "utf-8";
/* Reset */
* {box-sizing: border-box;}
html, body, h1, h2, h3, h4, h5, h6, div, p, pre, code, address, ul, ol, li, menu, nav, section, article, aside,
dl ,dt, dd, table, thead, tbody, tfoot, label, caption, th, td, form, fieldset, legend, hr, input, button, textarea, object, figure, figcaption {margin:0; padding:0;}
html, body {width:100%; height:100%; font-family: 'Noto Sans KR', sans-serif; }
body {background:#fff; min-width:360px; -webkit-text-size-adjust:none;word-wrap:break-word;word-break:break-all;}
body, input, select, textarea, button {background:none; border:none;}
button {background: none; cursor: pointer; user-select: none;}
ul, ol, li {list-style:none;}
table {width:100%;border-spacing:0;border-collapse:collapse;}
img, fieldset {border:0;}
address, cite, code {font-style:normal;font-weight:normal;}
em {font-style:normal;font-weight:bold;}
i {font-style: normal;}
label, img, input, select, textarea, button {font-family:inherit; vertical-align:middle;}
caption, legend {line-height:0;font-size:1px;overflow:hidden;}
hr{display:none;}
main, header, section, nav, footer, aside, article, figure {display:block;}
a {color:inherit; text-decoration:none;}
a:hover {text-decoration:none;}
/* Form */
input[type=text]::placeholder, input::-webkit-input-placeholder{font-weight:500; color:#bdbdbd;}
select:focus,
textarea:focus,
input:focus {border: 1; outline: none;}
input[type=text][readonly],
input[type=text][readonly]:focus {border:1;}
input[type=tel][readonly],
input[type=password][readonly],
input[type=email][readonly],
input[type=search][readonly],
input[type=tel][disabled],
input[type=text][disabled],
input[type=password][disabled],
input[type=search][disabled],
input[type=email][disabled] {border-color:#c0c0c0; color:#666; -webkit-appearance:none; font-size:16px;}
textarea[readonly],
textarea[disabled] {padding:11px; font-size:16px; color:#666; font-weight:normal; line-height:140%; height:78px; background:#eaeaea;border:1px solid #c0c0c0;}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
File diff suppressed because it is too large. Load diff
+7249
View File
File diff suppressed because it is too large. Load diff
Binary file not shown.
@@ -0,0 +1,5 @@
# Font Squirrel Font-face Generator Configuration File
# Upload this file to the generator to recreate the settings
# you used to create these fonts.
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
File diff suppressed because it is too large. Load diff
Binary file not shown.
File diff suppressed because it is too large. Load diff

After

Width:  |  Height:  |  Size: 685 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,7 @@
(function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:"fast",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId="#"+this.id;if(param.defaultContent==''){param.defaultContent=1;}
if(typeof param.defaultContent=="number")
{var defaultTab=$(thisId+" .tabs li:eq("+(param.defaultContent-1)+") a").attr('href').substr(1);}else{var defaultTab=param.defaultContent;}
$(thisId+" .tabs li a").each(function(){var tabToHide=$(this).attr('href').substr(1);$("#"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+" .easytabs-tab-content").hide();}
function changeContent(tabId){hideAll();$(thisId+" .tabs li").removeClass(param.activeClass);$(thisId+" .tabs li a[href=#"+tabId+"]").closest('li').addClass(param.activeClass);if(param.fadeSpeed!="none")
{$(thisId+" #"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+" #"+tabId).show();}}
$(thisId+" .tabs li").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery);
@@ -0,0 +1,129 @@
/*Notes about grid:
Columns: 12
Grid Width: 825px
Column Width: 55px
Gutter Width: 15px
-------------------------------*/
.section {margin-bottom: 18px;
}
.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}
.section {*zoom: 1;}
.section .firstcolumn,
.section .firstcol {margin-left: 0;}
/* Border on left hand side of a column. */
.border {
padding-left: 7px;
margin-left: 7px;
border-left: 1px solid #eee;
}
/* Border with more whitespace, spans one column. */
.colborder {
padding-left: 42px;
margin-left: 42px;
border-left: 1px solid #eee;
}
/* The Grid Classes */
.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12
{margin-left: 15px;float: left;display: inline; overflow: hidden;}
.width1, .grid1, .span-1 {width: 55px;}
.width1_2cols,.grid1_2cols {width: 20px;}
.width1_3cols,.grid1_3cols {width: 8px;}
.width1_4cols,.grid1_4cols {width: 2px;}
.input_width1 {width: 49px;}
.width2, .grid2, .span-2 {width: 125px;}
.width2_3cols,.grid2_3cols {width: 31px;}
.width2_4cols,.grid2_4cols {width: 20px;}
.input_width2 {width: 119px;}
.width3, .grid3, .span-3 {width: 195px;}
.width3_2cols,.grid3_2cols {width: 90px;}
.width3_4cols,.grid3_4cols {width: 37px;}
.input_width3 {width: 189px;}
.width4, .grid4, .span-4 {width: 265px;}
.width4_3cols,.grid4_3cols {width: 78px;}
.input_width4 {width: 259px;}
.width5, .grid5, .span-5 {width: 335px;}
.width5_2cols,.grid5_2cols {width: 160px;}
.width5_3cols,.grid5_3cols {width: 101px;}
.width5_4cols,.grid5_4cols {width: 72px;}
.input_width5 {width: 329px;}
.width6, .grid6, .span-6 {width: 405px;}
.width6_4cols,.grid6_4cols {width: 90px;}
.input_width6 {width: 399px;}
.width7, .grid7, .span-7 {width: 475px;}
.width7_2cols,.grid7_2cols {width: 230px;}
.width7_3cols,.grid7_3cols {width: 148px;}
.width7_4cols,.grid7_4cols {width: 107px;}
.input_width7 {width: 469px;}
.width8, .grid8, .span-8 {width: 545px;}
.width8_3cols,.grid8_3cols {width: 171px;}
.input_width8 {width: 539px;}
.width9, .grid9, .span-9 {width: 615px;}
.width9_2cols,.grid9_2cols {width: 300px;}
.width9_4cols,.grid9_4cols {width: 142px;}
.input_width9 {width: 609px;}
.width10, .grid10, .span-10 {width: 685px;}
.width10_3cols,.grid10_3cols {width: 218px;}
.width10_4cols,.grid10_4cols {width: 160px;}
.input_width10 {width: 679px;}
.width11, .grid11, .span-11 {width: 755px;}
.width11_2cols,.grid11_2cols {width: 370px;}
.width11_3cols,.grid11_3cols {width: 241px;}
.width11_4cols,.grid11_4cols {width: 177px;}
.input_width11 {width: 749px;}
.width12, .grid12, .span-12 {width: 825px;}
.input_width12 {width: 819px;}
/* Subdivided grid spaces */
.emptycols_left1, .prepend-1 {padding-left: 70px;}
.emptycols_right1, .append-1 {padding-right: 70px;}
.emptycols_left2, .prepend-2 {padding-left: 140px;}
.emptycols_right2, .append-2 {padding-right: 140px;}
.emptycols_left3, .prepend-3 {padding-left: 210px;}
.emptycols_right3, .append-3 {padding-right: 210px;}
.emptycols_left4, .prepend-4 {padding-left: 280px;}
.emptycols_right4, .append-4 {padding-right: 280px;}
.emptycols_left5, .prepend-5 {padding-left: 350px;}
.emptycols_right5, .append-5 {padding-right: 350px;}
.emptycols_left6, .prepend-6 {padding-left: 420px;}
.emptycols_right6, .append-6 {padding-right: 420px;}
.emptycols_left7, .prepend-7 {padding-left: 490px;}
.emptycols_right7, .append-7 {padding-right: 490px;}
.emptycols_left8, .prepend-8 {padding-left: 560px;}
.emptycols_right8, .append-8 {padding-right: 560px;}
.emptycols_left9, .prepend-9 {padding-left: 630px;}
.emptycols_right9, .append-9 {padding-right: 630px;}
.emptycols_left10, .prepend-10 {padding-left: 700px;}
.emptycols_right10, .append-10 {padding-right: 700px;}
.emptycols_left11, .prepend-11 {padding-left: 770px;}
.emptycols_right11, .append-11 {padding-right: 770px;}
.pull-1 {margin-left: -70px;}
.push-1 {margin-right: -70px;margin-left: 18px;float: right;}
.pull-2 {margin-left: -140px;}
.push-2 {margin-right: -140px;margin-left: 18px;float: right;}
.pull-3 {margin-left: -210px;}
.push-3 {margin-right: -210px;margin-left: 18px;float: right;}
.pull-4 {margin-left: -280px;}
.push-4 {margin-right: -280px;margin-left: 18px;float: right;}
@@ -0,0 +1,396 @@
@import url('grid_12-825-55-15.css');
/*
CSS Reset by Eric Meyer - Released under Public Domain
http://meyerweb.com/eric/tools/css/reset/
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center, dl, dt, dd, ol, ul, li,
fieldset, form, label, legend, table,
caption, tbody, tfoot, thead, tr, th, td
{margin: 0;padding: 0;border: 0;outline: 0;
font-size: 100%;vertical-align: baseline;
background: transparent;}
body {line-height: 1;}
ol, ul {list-style: none;}
blockquote, q {quotes: none;}
blockquote:before, blockquote:after,
q:before, q:after {content: ''; content: none;}
:focus {outline: 0;}
ins {text-decoration: none;}
del {text-decoration: line-through;}
table {border-collapse: collapse;border-spacing: 0;}
body {
color: #000;
background-color: #dcdcdc;
}
a {
text-decoration: none;
color: #1883ba;
}
h1{
font-size: 32px;
font-weight: normal;
font-style: normal;
margin-bottom: 18px;
}
h2{
font-size: 18px;
}
#container {
width: 865px;
margin: 0px auto;
}
#header {
padding: 20px;
font-size: 36px;
background-color: #000;
color: #fff;
}
#header span {
color: #666;
}
#main_content {
background-color: #fff;
padding: 60px 20px 20px;
}
#footer p {
margin: 0;
padding-top: 10px;
padding-bottom: 50px;
color: #333;
font: 10px Arial, sans-serif;
}
.tabs {
width: 100%;
height: 31px;
background-color: #444;
}
.tabs li {
float: left;
margin: 0;
overflow: hidden;
background-color: #444;
}
.tabs li a {
display: block;
color: #fff;
text-decoration: none;
font: bold 11px/11px 'Arial';
text-transform: uppercase;
padding: 10px 15px;
border-right: 1px solid #fff;
}
.tabs li a:hover {
background-color: #00b3ff;
}
.tabs li.active a {
color: #000;
background-color: #fff;
}
div.huge {
font-size: 120px;
line-height: 1em;
padding: 0;
letter-spacing: -.02em;
overflow: hidden;
}
div.glyph_range {
font-size: 72px;
line-height: 1.1em;
}
.size10{ font-size: 10px; }
.size11{ font-size: 11px; }
.size12{ font-size: 12px; }
.size13{ font-size: 13px; }
.size14{ font-size: 14px; }
.size16{ font-size: 16px; }
.size18{ font-size: 18px; }
.size20{ font-size: 20px; }
.size24{ font-size: 24px; }
.size30{ font-size: 30px; }
.size36{ font-size: 36px; }
.size48{ font-size: 48px; }
.size60{ font-size: 60px; }
.size72{ font-size: 72px; }
.size90{ font-size: 90px; }
.psample_row1 { height: 120px;}
.psample_row1 { height: 120px;}
.psample_row2 { height: 160px;}
.psample_row3 { height: 160px;}
.psample_row4 { height: 160px;}
.psample {
overflow: hidden;
position: relative;
}
.psample p {
line-height: 1.3em;
display: block;
overflow: hidden;
margin: 0;
}
.psample span {
margin-right: .5em;
}
.white_blend {
width: 100%;
height: 61px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);
position: absolute;
bottom: 0;
}
.black_blend {
width: 100%;
height: 61px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);
position: absolute;
bottom: 0;
}
.fullreverse {
background: #000 !important;
color: #fff !important;
margin-left: -20px;
padding-left: 20px;
margin-right: -20px;
padding-right: 20px;
padding: 20px;
margin-bottom:0;
}
.sample_table td {
padding-top: 3px;
padding-bottom:5px;
padding-left: 5px;
vertical-align: middle;
line-height: 1.2em;
}
.sample_table td:first-child {
background-color: #eee;
text-align: right;
padding-right: 5px;
padding-left: 0;
padding: 5px;
font: 11px/12px "Courier New", Courier, mono;
}
code {
white-space: pre;
background-color: #eee;
display: block;
padding: 10px;
margin-bottom: 18px;
overflow: auto;
}
.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;}
.box {
padding: 18px;
margin-bottom: 18px;
background: #eee;
}
.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;}
#bodycomparison {
position: relative;
overflow: hidden;
font-size: 72px;
height: 90px;
white-space: nowrap;
}
#bodycomparison div{
font-size: 72px;
line-height: 90px;
display: inline;
margin: 0 15px 0 0;
padding: 0;
}
#bodycomparison div span{
font: 10px Arial;
position: absolute;
left: 0;
}
#xheight {
float: none;
position: absolute;
color: #d9f3ff;
font-size: 72px;
line-height: 90px;
}
.fontbody {
position: relative;
}
.arialbody{
font-family: Arial;
position: relative;
}
.verdanabody{
font-family: Verdana;
position: relative;
}
.georgiabody{
font-family: Georgia;
position: relative;
}
/* @group Layout page
*/
#layout h1 {
font-size: 36px;
line-height: 42px;
font-weight: normal;
font-style: normal;
}
#layout h2 {
font-size: 24px;
line-height: 23px;
font-weight: normal;
font-style: normal;
}
#layout h3 {
font-size: 22px;
line-height: 1.4em;
margin-top: 1em;
font-weight: normal;
font-style: normal;
}
#layout p.byline {
font-size: 12px;
margin-top: 18px;
line-height: 12px;
margin-bottom: 0;
}
#layout p {
font-size: 14px;
line-height: 21px;
margin-bottom: .5em;
}
#layout p.large{
font-size: 18px;
line-height: 26px;
}
#layout .sidebar p{
font-size: 12px;
line-height: 1.4em;
}
#layout p.caption {
font-size: 10px;
margin-top: -16px;
margin-bottom: 18px;
}
/* @end */
/* @group Glyphs */
#glyph_chart div{
background-color: #d9f3ff;
color: black;
float: left;
font-size: 36px;
height: 1.2em;
line-height: 1.2em;
margin-bottom: 1px;
margin-right: 1px;
text-align: center;
width: 1.2em;
position: relative;
padding: .6em .2em .2em;
}
#glyph_chart div p {
position: absolute;
left: 0;
top: 0;
display: block;
text-align: center;
font: bold 9px Arial, sans-serif;
background-color: #3a768f;
width: 100%;
color: #fff;
padding: 2px 0;
}
#glyphs h1 {
font-family: Arial, sans-serif;
}
/* @end */
/* @group Installing */
#installing {
font: 13px Arial, sans-serif;
}
#installing p,
#glyphs p{
line-height: 1.2em;
margin-bottom: 18px;
font: 13px Arial, sans-serif;
}
#installing h3{
font-size: 15px;
margin-top: 18px;
}
/* @end */
#rendering h1 {
font-family: Arial, sans-serif;
}
.render_table td {
font: 11px "Courier New", Courier, mono;
vertical-align: middle;
}
+16
View File
@@ -0,0 +1,16 @@
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on April 28, 2015 */
@font-face {
font-family: 'notokr-black';
src: url('notokr-black.eot');
src: url('notokr-black.eot?#iefix') format('embedded-opentype'),
url('notokr-black.woff2') format('woff2'),
url('notokr-black.woff') format('woff'),
url('notokr-black.ttf') format('truetype'),
url('notokr-black.svg#notokr-black') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -0,0 +1,5 @@
# Font Squirrel Font-face Generator Configuration File
# Upload this file to the generator to recreate the settings
# you used to create these fonts.
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
File diff suppressed because it is too large. Load diff
Binary file not shown.
File diff suppressed because it is too large. Load diff

After

Width:  |  Height:  |  Size: 687 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,7 @@
(function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:"fast",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId="#"+this.id;if(param.defaultContent==''){param.defaultContent=1;}
if(typeof param.defaultContent=="number")
{var defaultTab=$(thisId+" .tabs li:eq("+(param.defaultContent-1)+") a").attr('href').substr(1);}else{var defaultTab=param.defaultContent;}
$(thisId+" .tabs li a").each(function(){var tabToHide=$(this).attr('href').substr(1);$("#"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+" .easytabs-tab-content").hide();}
function changeContent(tabId){hideAll();$(thisId+" .tabs li").removeClass(param.activeClass);$(thisId+" .tabs li a[href=#"+tabId+"]").closest('li').addClass(param.activeClass);if(param.fadeSpeed!="none")
{$(thisId+" #"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+" #"+tabId).show();}}
$(thisId+" .tabs li").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery);
@@ -0,0 +1,129 @@
/*Notes about grid:
Columns: 12
Grid Width: 825px
Column Width: 55px
Gutter Width: 15px
-------------------------------*/
.section {margin-bottom: 18px;
}
.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}
.section {*zoom: 1;}
.section .firstcolumn,
.section .firstcol {margin-left: 0;}
/* Border on left hand side of a column. */
.border {
padding-left: 7px;
margin-left: 7px;
border-left: 1px solid #eee;
}
/* Border with more whitespace, spans one column. */
.colborder {
padding-left: 42px;
margin-left: 42px;
border-left: 1px solid #eee;
}
/* The Grid Classes */
.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12
{margin-left: 15px;float: left;display: inline; overflow: hidden;}
.width1, .grid1, .span-1 {width: 55px;}
.width1_2cols,.grid1_2cols {width: 20px;}
.width1_3cols,.grid1_3cols {width: 8px;}
.width1_4cols,.grid1_4cols {width: 2px;}
.input_width1 {width: 49px;}
.width2, .grid2, .span-2 {width: 125px;}
.width2_3cols,.grid2_3cols {width: 31px;}
.width2_4cols,.grid2_4cols {width: 20px;}
.input_width2 {width: 119px;}
.width3, .grid3, .span-3 {width: 195px;}
.width3_2cols,.grid3_2cols {width: 90px;}
.width3_4cols,.grid3_4cols {width: 37px;}
.input_width3 {width: 189px;}
.width4, .grid4, .span-4 {width: 265px;}
.width4_3cols,.grid4_3cols {width: 78px;}
.input_width4 {width: 259px;}
.width5, .grid5, .span-5 {width: 335px;}
.width5_2cols,.grid5_2cols {width: 160px;}
.width5_3cols,.grid5_3cols {width: 101px;}
.width5_4cols,.grid5_4cols {width: 72px;}
.input_width5 {width: 329px;}
.width6, .grid6, .span-6 {width: 405px;}
.width6_4cols,.grid6_4cols {width: 90px;}
.input_width6 {width: 399px;}
.width7, .grid7, .span-7 {width: 475px;}
.width7_2cols,.grid7_2cols {width: 230px;}
.width7_3cols,.grid7_3cols {width: 148px;}
.width7_4cols,.grid7_4cols {width: 107px;}
.input_width7 {width: 469px;}
.width8, .grid8, .span-8 {width: 545px;}
.width8_3cols,.grid8_3cols {width: 171px;}
.input_width8 {width: 539px;}
.width9, .grid9, .span-9 {width: 615px;}
.width9_2cols,.grid9_2cols {width: 300px;}
.width9_4cols,.grid9_4cols {width: 142px;}
.input_width9 {width: 609px;}
.width10, .grid10, .span-10 {width: 685px;}
.width10_3cols,.grid10_3cols {width: 218px;}
.width10_4cols,.grid10_4cols {width: 160px;}
.input_width10 {width: 679px;}
.width11, .grid11, .span-11 {width: 755px;}
.width11_2cols,.grid11_2cols {width: 370px;}
.width11_3cols,.grid11_3cols {width: 241px;}
.width11_4cols,.grid11_4cols {width: 177px;}
.input_width11 {width: 749px;}
.width12, .grid12, .span-12 {width: 825px;}
.input_width12 {width: 819px;}
/* Subdivided grid spaces */
.emptycols_left1, .prepend-1 {padding-left: 70px;}
.emptycols_right1, .append-1 {padding-right: 70px;}
.emptycols_left2, .prepend-2 {padding-left: 140px;}
.emptycols_right2, .append-2 {padding-right: 140px;}
.emptycols_left3, .prepend-3 {padding-left: 210px;}
.emptycols_right3, .append-3 {padding-right: 210px;}
.emptycols_left4, .prepend-4 {padding-left: 280px;}
.emptycols_right4, .append-4 {padding-right: 280px;}
.emptycols_left5, .prepend-5 {padding-left: 350px;}
.emptycols_right5, .append-5 {padding-right: 350px;}
.emptycols_left6, .prepend-6 {padding-left: 420px;}
.emptycols_right6, .append-6 {padding-right: 420px;}
.emptycols_left7, .prepend-7 {padding-left: 490px;}
.emptycols_right7, .append-7 {padding-right: 490px;}
.emptycols_left8, .prepend-8 {padding-left: 560px;}
.emptycols_right8, .append-8 {padding-right: 560px;}
.emptycols_left9, .prepend-9 {padding-left: 630px;}
.emptycols_right9, .append-9 {padding-right: 630px;}
.emptycols_left10, .prepend-10 {padding-left: 700px;}
.emptycols_right10, .append-10 {padding-right: 700px;}
.emptycols_left11, .prepend-11 {padding-left: 770px;}
.emptycols_right11, .append-11 {padding-right: 770px;}
.pull-1 {margin-left: -70px;}
.push-1 {margin-right: -70px;margin-left: 18px;float: right;}
.pull-2 {margin-left: -140px;}
.push-2 {margin-right: -140px;margin-left: 18px;float: right;}
.pull-3 {margin-left: -210px;}
.push-3 {margin-right: -210px;margin-left: 18px;float: right;}
.pull-4 {margin-left: -280px;}
.push-4 {margin-right: -280px;margin-left: 18px;float: right;}
@@ -0,0 +1,396 @@
@import url('grid_12-825-55-15.css');
/*
CSS Reset by Eric Meyer - Released under Public Domain
http://meyerweb.com/eric/tools/css/reset/
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center, dl, dt, dd, ol, ul, li,
fieldset, form, label, legend, table,
caption, tbody, tfoot, thead, tr, th, td
{margin: 0;padding: 0;border: 0;outline: 0;
font-size: 100%;vertical-align: baseline;
background: transparent;}
body {line-height: 1;}
ol, ul {list-style: none;}
blockquote, q {quotes: none;}
blockquote:before, blockquote:after,
q:before, q:after {content: ''; content: none;}
:focus {outline: 0;}
ins {text-decoration: none;}
del {text-decoration: line-through;}
table {border-collapse: collapse;border-spacing: 0;}
body {
color: #000;
background-color: #dcdcdc;
}
a {
text-decoration: none;
color: #1883ba;
}
h1{
font-size: 32px;
font-weight: normal;
font-style: normal;
margin-bottom: 18px;
}
h2{
font-size: 18px;
}
#container {
width: 865px;
margin: 0px auto;
}
#header {
padding: 20px;
font-size: 36px;
background-color: #000;
color: #fff;
}
#header span {
color: #666;
}
#main_content {
background-color: #fff;
padding: 60px 20px 20px;
}
#footer p {
margin: 0;
padding-top: 10px;
padding-bottom: 50px;
color: #333;
font: 10px Arial, sans-serif;
}
.tabs {
width: 100%;
height: 31px;
background-color: #444;
}
.tabs li {
float: left;
margin: 0;
overflow: hidden;
background-color: #444;
}
.tabs li a {
display: block;
color: #fff;
text-decoration: none;
font: bold 11px/11px 'Arial';
text-transform: uppercase;
padding: 10px 15px;
border-right: 1px solid #fff;
}
.tabs li a:hover {
background-color: #00b3ff;
}
.tabs li.active a {
color: #000;
background-color: #fff;
}
div.huge {
font-size: 120px;
line-height: 1em;
padding: 0;
letter-spacing: -.02em;
overflow: hidden;
}
div.glyph_range {
font-size: 72px;
line-height: 1.1em;
}
.size10{ font-size: 10px; }
.size11{ font-size: 11px; }
.size12{ font-size: 12px; }
.size13{ font-size: 13px; }
.size14{ font-size: 14px; }
.size16{ font-size: 16px; }
.size18{ font-size: 18px; }
.size20{ font-size: 20px; }
.size24{ font-size: 24px; }
.size30{ font-size: 30px; }
.size36{ font-size: 36px; }
.size48{ font-size: 48px; }
.size60{ font-size: 60px; }
.size72{ font-size: 72px; }
.size90{ font-size: 90px; }
.psample_row1 { height: 120px;}
.psample_row1 { height: 120px;}
.psample_row2 { height: 160px;}
.psample_row3 { height: 160px;}
.psample_row4 { height: 160px;}
.psample {
overflow: hidden;
position: relative;
}
.psample p {
line-height: 1.3em;
display: block;
overflow: hidden;
margin: 0;
}
.psample span {
margin-right: .5em;
}
.white_blend {
width: 100%;
height: 61px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);
position: absolute;
bottom: 0;
}
.black_blend {
width: 100%;
height: 61px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);
position: absolute;
bottom: 0;
}
.fullreverse {
background: #000 !important;
color: #fff !important;
margin-left: -20px;
padding-left: 20px;
margin-right: -20px;
padding-right: 20px;
padding: 20px;
margin-bottom:0;
}
.sample_table td {
padding-top: 3px;
padding-bottom:5px;
padding-left: 5px;
vertical-align: middle;
line-height: 1.2em;
}
.sample_table td:first-child {
background-color: #eee;
text-align: right;
padding-right: 5px;
padding-left: 0;
padding: 5px;
font: 11px/12px "Courier New", Courier, mono;
}
code {
white-space: pre;
background-color: #eee;
display: block;
padding: 10px;
margin-bottom: 18px;
overflow: auto;
}
.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;}
.box {
padding: 18px;
margin-bottom: 18px;
background: #eee;
}
.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;}
#bodycomparison {
position: relative;
overflow: hidden;
font-size: 72px;
height: 90px;
white-space: nowrap;
}
#bodycomparison div{
font-size: 72px;
line-height: 90px;
display: inline;
margin: 0 15px 0 0;
padding: 0;
}
#bodycomparison div span{
font: 10px Arial;
position: absolute;
left: 0;
}
#xheight {
float: none;
position: absolute;
color: #d9f3ff;
font-size: 72px;
line-height: 90px;
}
.fontbody {
position: relative;
}
.arialbody{
font-family: Arial;
position: relative;
}
.verdanabody{
font-family: Verdana;
position: relative;
}
.georgiabody{
font-family: Georgia;
position: relative;
}
/* @group Layout page
*/
#layout h1 {
font-size: 36px;
line-height: 42px;
font-weight: normal;
font-style: normal;
}
#layout h2 {
font-size: 24px;
line-height: 23px;
font-weight: normal;
font-style: normal;
}
#layout h3 {
font-size: 22px;
line-height: 1.4em;
margin-top: 1em;
font-weight: normal;
font-style: normal;
}
#layout p.byline {
font-size: 12px;
margin-top: 18px;
line-height: 12px;
margin-bottom: 0;
}
#layout p {
font-size: 14px;
line-height: 21px;
margin-bottom: .5em;
}
#layout p.large{
font-size: 18px;
line-height: 26px;
}
#layout .sidebar p{
font-size: 12px;
line-height: 1.4em;
}
#layout p.caption {
font-size: 10px;
margin-top: -16px;
margin-bottom: 18px;
}
/* @end */
/* @group Glyphs */
#glyph_chart div{
background-color: #d9f3ff;
color: black;
float: left;
font-size: 36px;
height: 1.2em;
line-height: 1.2em;
margin-bottom: 1px;
margin-right: 1px;
text-align: center;
width: 1.2em;
position: relative;
padding: .6em .2em .2em;
}
#glyph_chart div p {
position: absolute;
left: 0;
top: 0;
display: block;
text-align: center;
font: bold 9px Arial, sans-serif;
background-color: #3a768f;
width: 100%;
color: #fff;
padding: 2px 0;
}
#glyphs h1 {
font-family: Arial, sans-serif;
}
/* @end */
/* @group Installing */
#installing {
font: 13px Arial, sans-serif;
}
#installing p,
#glyphs p{
line-height: 1.2em;
margin-bottom: 18px;
font: 13px Arial, sans-serif;
}
#installing h3{
font-size: 15px;
margin-top: 18px;
}
/* @end */
#rendering h1 {
font-family: Arial, sans-serif;
}
.render_table td {
font: 11px "Courier New", Courier, mono;
vertical-align: middle;
}
+16
View File
@@ -0,0 +1,16 @@
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on April 28, 2015 */
@font-face {
font-family: 'notokr-bold';
src: url('notokr-bold.eot');
src: url('notokr-bold.eot?#iefix') format('embedded-opentype'),
url('notokr-bold.woff2') format('woff2'),
url('notokr-bold.woff') format('woff'),
url('notokr-bold.ttf') format('truetype'),
url('notokr-bold.svg#notokr-bold') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -0,0 +1,5 @@
# Font Squirrel Font-face Generator Configuration File
# Upload this file to the generator to recreate the settings
# you used to create these fonts.
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
File diff suppressed because it is too large. Load diff
Binary file not shown.
File diff suppressed because it is too large. Load diff

After

Width:  |  Height:  |  Size: 714 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,7 @@
(function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:"fast",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId="#"+this.id;if(param.defaultContent==''){param.defaultContent=1;}
if(typeof param.defaultContent=="number")
{var defaultTab=$(thisId+" .tabs li:eq("+(param.defaultContent-1)+") a").attr('href').substr(1);}else{var defaultTab=param.defaultContent;}
$(thisId+" .tabs li a").each(function(){var tabToHide=$(this).attr('href').substr(1);$("#"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+" .easytabs-tab-content").hide();}
function changeContent(tabId){hideAll();$(thisId+" .tabs li").removeClass(param.activeClass);$(thisId+" .tabs li a[href=#"+tabId+"]").closest('li').addClass(param.activeClass);if(param.fadeSpeed!="none")
{$(thisId+" #"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+" #"+tabId).show();}}
$(thisId+" .tabs li").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery);
@@ -0,0 +1,129 @@
/*Notes about grid:
Columns: 12
Grid Width: 825px
Column Width: 55px
Gutter Width: 15px
-------------------------------*/
.section {margin-bottom: 18px;
}
.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}
.section {*zoom: 1;}
.section .firstcolumn,
.section .firstcol {margin-left: 0;}
/* Border on left hand side of a column. */
.border {
padding-left: 7px;
margin-left: 7px;
border-left: 1px solid #eee;
}
/* Border with more whitespace, spans one column. */
.colborder {
padding-left: 42px;
margin-left: 42px;
border-left: 1px solid #eee;
}
/* The Grid Classes */
.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12
{margin-left: 15px;float: left;display: inline; overflow: hidden;}
.width1, .grid1, .span-1 {width: 55px;}
.width1_2cols,.grid1_2cols {width: 20px;}
.width1_3cols,.grid1_3cols {width: 8px;}
.width1_4cols,.grid1_4cols {width: 2px;}
.input_width1 {width: 49px;}
.width2, .grid2, .span-2 {width: 125px;}
.width2_3cols,.grid2_3cols {width: 31px;}
.width2_4cols,.grid2_4cols {width: 20px;}
.input_width2 {width: 119px;}
.width3, .grid3, .span-3 {width: 195px;}
.width3_2cols,.grid3_2cols {width: 90px;}
.width3_4cols,.grid3_4cols {width: 37px;}
.input_width3 {width: 189px;}
.width4, .grid4, .span-4 {width: 265px;}
.width4_3cols,.grid4_3cols {width: 78px;}
.input_width4 {width: 259px;}
.width5, .grid5, .span-5 {width: 335px;}
.width5_2cols,.grid5_2cols {width: 160px;}
.width5_3cols,.grid5_3cols {width: 101px;}
.width5_4cols,.grid5_4cols {width: 72px;}
.input_width5 {width: 329px;}
.width6, .grid6, .span-6 {width: 405px;}
.width6_4cols,.grid6_4cols {width: 90px;}
.input_width6 {width: 399px;}
.width7, .grid7, .span-7 {width: 475px;}
.width7_2cols,.grid7_2cols {width: 230px;}
.width7_3cols,.grid7_3cols {width: 148px;}
.width7_4cols,.grid7_4cols {width: 107px;}
.input_width7 {width: 469px;}
.width8, .grid8, .span-8 {width: 545px;}
.width8_3cols,.grid8_3cols {width: 171px;}
.input_width8 {width: 539px;}
.width9, .grid9, .span-9 {width: 615px;}
.width9_2cols,.grid9_2cols {width: 300px;}
.width9_4cols,.grid9_4cols {width: 142px;}
.input_width9 {width: 609px;}
.width10, .grid10, .span-10 {width: 685px;}
.width10_3cols,.grid10_3cols {width: 218px;}
.width10_4cols,.grid10_4cols {width: 160px;}
.input_width10 {width: 679px;}
.width11, .grid11, .span-11 {width: 755px;}
.width11_2cols,.grid11_2cols {width: 370px;}
.width11_3cols,.grid11_3cols {width: 241px;}
.width11_4cols,.grid11_4cols {width: 177px;}
.input_width11 {width: 749px;}
.width12, .grid12, .span-12 {width: 825px;}
.input_width12 {width: 819px;}
/* Subdivided grid spaces */
.emptycols_left1, .prepend-1 {padding-left: 70px;}
.emptycols_right1, .append-1 {padding-right: 70px;}
.emptycols_left2, .prepend-2 {padding-left: 140px;}
.emptycols_right2, .append-2 {padding-right: 140px;}
.emptycols_left3, .prepend-3 {padding-left: 210px;}
.emptycols_right3, .append-3 {padding-right: 210px;}
.emptycols_left4, .prepend-4 {padding-left: 280px;}
.emptycols_right4, .append-4 {padding-right: 280px;}
.emptycols_left5, .prepend-5 {padding-left: 350px;}
.emptycols_right5, .append-5 {padding-right: 350px;}
.emptycols_left6, .prepend-6 {padding-left: 420px;}
.emptycols_right6, .append-6 {padding-right: 420px;}
.emptycols_left7, .prepend-7 {padding-left: 490px;}
.emptycols_right7, .append-7 {padding-right: 490px;}
.emptycols_left8, .prepend-8 {padding-left: 560px;}
.emptycols_right8, .append-8 {padding-right: 560px;}
.emptycols_left9, .prepend-9 {padding-left: 630px;}
.emptycols_right9, .append-9 {padding-right: 630px;}
.emptycols_left10, .prepend-10 {padding-left: 700px;}
.emptycols_right10, .append-10 {padding-right: 700px;}
.emptycols_left11, .prepend-11 {padding-left: 770px;}
.emptycols_right11, .append-11 {padding-right: 770px;}
.pull-1 {margin-left: -70px;}
.push-1 {margin-right: -70px;margin-left: 18px;float: right;}
.pull-2 {margin-left: -140px;}
.push-2 {margin-right: -140px;margin-left: 18px;float: right;}
.pull-3 {margin-left: -210px;}
.push-3 {margin-right: -210px;margin-left: 18px;float: right;}
.pull-4 {margin-left: -280px;}
.push-4 {margin-right: -280px;margin-left: 18px;float: right;}
@@ -0,0 +1,396 @@
@import url('grid_12-825-55-15.css');
/*
CSS Reset by Eric Meyer - Released under Public Domain
http://meyerweb.com/eric/tools/css/reset/
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center, dl, dt, dd, ol, ul, li,
fieldset, form, label, legend, table,
caption, tbody, tfoot, thead, tr, th, td
{margin: 0;padding: 0;border: 0;outline: 0;
font-size: 100%;vertical-align: baseline;
background: transparent;}
body {line-height: 1;}
ol, ul {list-style: none;}
blockquote, q {quotes: none;}
blockquote:before, blockquote:after,
q:before, q:after {content: ''; content: none;}
:focus {outline: 0;}
ins {text-decoration: none;}
del {text-decoration: line-through;}
table {border-collapse: collapse;border-spacing: 0;}
body {
color: #000;
background-color: #dcdcdc;
}
a {
text-decoration: none;
color: #1883ba;
}
h1{
font-size: 32px;
font-weight: normal;
font-style: normal;
margin-bottom: 18px;
}
h2{
font-size: 18px;
}
#container {
width: 865px;
margin: 0px auto;
}
#header {
padding: 20px;
font-size: 36px;
background-color: #000;
color: #fff;
}
#header span {
color: #666;
}
#main_content {
background-color: #fff;
padding: 60px 20px 20px;
}
#footer p {
margin: 0;
padding-top: 10px;
padding-bottom: 50px;
color: #333;
font: 10px Arial, sans-serif;
}
.tabs {
width: 100%;
height: 31px;
background-color: #444;
}
.tabs li {
float: left;
margin: 0;
overflow: hidden;
background-color: #444;
}
.tabs li a {
display: block;
color: #fff;
text-decoration: none;
font: bold 11px/11px 'Arial';
text-transform: uppercase;
padding: 10px 15px;
border-right: 1px solid #fff;
}
.tabs li a:hover {
background-color: #00b3ff;
}
.tabs li.active a {
color: #000;
background-color: #fff;
}
div.huge {
font-size: 120px;
line-height: 1em;
padding: 0;
letter-spacing: -.02em;
overflow: hidden;
}
div.glyph_range {
font-size: 72px;
line-height: 1.1em;
}
.size10{ font-size: 10px; }
.size11{ font-size: 11px; }
.size12{ font-size: 12px; }
.size13{ font-size: 13px; }
.size14{ font-size: 14px; }
.size16{ font-size: 16px; }
.size18{ font-size: 18px; }
.size20{ font-size: 20px; }
.size24{ font-size: 24px; }
.size30{ font-size: 30px; }
.size36{ font-size: 36px; }
.size48{ font-size: 48px; }
.size60{ font-size: 60px; }
.size72{ font-size: 72px; }
.size90{ font-size: 90px; }
.psample_row1 { height: 120px;}
.psample_row1 { height: 120px;}
.psample_row2 { height: 160px;}
.psample_row3 { height: 160px;}
.psample_row4 { height: 160px;}
.psample {
overflow: hidden;
position: relative;
}
.psample p {
line-height: 1.3em;
display: block;
overflow: hidden;
margin: 0;
}
.psample span {
margin-right: .5em;
}
.white_blend {
width: 100%;
height: 61px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);
position: absolute;
bottom: 0;
}
.black_blend {
width: 100%;
height: 61px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);
position: absolute;
bottom: 0;
}
.fullreverse {
background: #000 !important;
color: #fff !important;
margin-left: -20px;
padding-left: 20px;
margin-right: -20px;
padding-right: 20px;
padding: 20px;
margin-bottom:0;
}
.sample_table td {
padding-top: 3px;
padding-bottom:5px;
padding-left: 5px;
vertical-align: middle;
line-height: 1.2em;
}
.sample_table td:first-child {
background-color: #eee;
text-align: right;
padding-right: 5px;
padding-left: 0;
padding: 5px;
font: 11px/12px "Courier New", Courier, mono;
}
code {
white-space: pre;
background-color: #eee;
display: block;
padding: 10px;
margin-bottom: 18px;
overflow: auto;
}
.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;}
.box {
padding: 18px;
margin-bottom: 18px;
background: #eee;
}
.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;}
#bodycomparison {
position: relative;
overflow: hidden;
font-size: 72px;
height: 90px;
white-space: nowrap;
}
#bodycomparison div{
font-size: 72px;
line-height: 90px;
display: inline;
margin: 0 15px 0 0;
padding: 0;
}
#bodycomparison div span{
font: 10px Arial;
position: absolute;
left: 0;
}
#xheight {
float: none;
position: absolute;
color: #d9f3ff;
font-size: 72px;
line-height: 90px;
}
.fontbody {
position: relative;
}
.arialbody{
font-family: Arial;
position: relative;
}
.verdanabody{
font-family: Verdana;
position: relative;
}
.georgiabody{
font-family: Georgia;
position: relative;
}
/* @group Layout page
*/
#layout h1 {
font-size: 36px;
line-height: 42px;
font-weight: normal;
font-style: normal;
}
#layout h2 {
font-size: 24px;
line-height: 23px;
font-weight: normal;
font-style: normal;
}
#layout h3 {
font-size: 22px;
line-height: 1.4em;
margin-top: 1em;
font-weight: normal;
font-style: normal;
}
#layout p.byline {
font-size: 12px;
margin-top: 18px;
line-height: 12px;
margin-bottom: 0;
}
#layout p {
font-size: 14px;
line-height: 21px;
margin-bottom: .5em;
}
#layout p.large{
font-size: 18px;
line-height: 26px;
}
#layout .sidebar p{
font-size: 12px;
line-height: 1.4em;
}
#layout p.caption {
font-size: 10px;
margin-top: -16px;
margin-bottom: 18px;
}
/* @end */
/* @group Glyphs */
#glyph_chart div{
background-color: #d9f3ff;
color: black;
float: left;
font-size: 36px;
height: 1.2em;
line-height: 1.2em;
margin-bottom: 1px;
margin-right: 1px;
text-align: center;
width: 1.2em;
position: relative;
padding: .6em .2em .2em;
}
#glyph_chart div p {
position: absolute;
left: 0;
top: 0;
display: block;
text-align: center;
font: bold 9px Arial, sans-serif;
background-color: #3a768f;
width: 100%;
color: #fff;
padding: 2px 0;
}
#glyphs h1 {
font-family: Arial, sans-serif;
}
/* @end */
/* @group Installing */
#installing {
font: 13px Arial, sans-serif;
}
#installing p,
#glyphs p{
line-height: 1.2em;
margin-bottom: 18px;
font: 13px Arial, sans-serif;
}
#installing h3{
font-size: 15px;
margin-top: 18px;
}
/* @end */
#rendering h1 {
font-family: Arial, sans-serif;
}
.render_table td {
font: 11px "Courier New", Courier, mono;
vertical-align: middle;
}
@@ -0,0 +1,16 @@
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on April 28, 2015 */
@font-face {
font-family: 'notokr-demilight';
src: url('notokr-demilight.eot');
src: url('notokr-demilight.eot?#iefix') format('embedded-opentype'),
url('notokr-demilight.woff2') format('woff2'),
url('notokr-demilight.woff') format('woff'),
url('notokr-demilight.ttf') format('truetype'),
url('notokr-demilight.svg#notokr-demilight') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -0,0 +1,5 @@
# Font Squirrel Font-face Generator Configuration File
# Upload this file to the generator to recreate the settings
# you used to create these fonts.
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
File diff suppressed because it is too large. Load diff
Binary file not shown.
File diff suppressed because it is too large. Load diff

After

Width:  |  Height:  |  Size: 728 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,7 @@
(function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:"fast",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId="#"+this.id;if(param.defaultContent==''){param.defaultContent=1;}
if(typeof param.defaultContent=="number")
{var defaultTab=$(thisId+" .tabs li:eq("+(param.defaultContent-1)+") a").attr('href').substr(1);}else{var defaultTab=param.defaultContent;}
$(thisId+" .tabs li a").each(function(){var tabToHide=$(this).attr('href').substr(1);$("#"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+" .easytabs-tab-content").hide();}
function changeContent(tabId){hideAll();$(thisId+" .tabs li").removeClass(param.activeClass);$(thisId+" .tabs li a[href=#"+tabId+"]").closest('li').addClass(param.activeClass);if(param.fadeSpeed!="none")
{$(thisId+" #"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+" #"+tabId).show();}}
$(thisId+" .tabs li").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery);
@@ -0,0 +1,129 @@
/*Notes about grid:
Columns: 12
Grid Width: 825px
Column Width: 55px
Gutter Width: 15px
-------------------------------*/
.section {margin-bottom: 18px;
}
.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}
.section {*zoom: 1;}
.section .firstcolumn,
.section .firstcol {margin-left: 0;}
/* Border on left hand side of a column. */
.border {
padding-left: 7px;
margin-left: 7px;
border-left: 1px solid #eee;
}
/* Border with more whitespace, spans one column. */
.colborder {
padding-left: 42px;
margin-left: 42px;
border-left: 1px solid #eee;
}
/* The Grid Classes */
.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12
{margin-left: 15px;float: left;display: inline; overflow: hidden;}
.width1, .grid1, .span-1 {width: 55px;}
.width1_2cols,.grid1_2cols {width: 20px;}
.width1_3cols,.grid1_3cols {width: 8px;}
.width1_4cols,.grid1_4cols {width: 2px;}
.input_width1 {width: 49px;}
.width2, .grid2, .span-2 {width: 125px;}
.width2_3cols,.grid2_3cols {width: 31px;}
.width2_4cols,.grid2_4cols {width: 20px;}
.input_width2 {width: 119px;}
.width3, .grid3, .span-3 {width: 195px;}
.width3_2cols,.grid3_2cols {width: 90px;}
.width3_4cols,.grid3_4cols {width: 37px;}
.input_width3 {width: 189px;}
.width4, .grid4, .span-4 {width: 265px;}
.width4_3cols,.grid4_3cols {width: 78px;}
.input_width4 {width: 259px;}
.width5, .grid5, .span-5 {width: 335px;}
.width5_2cols,.grid5_2cols {width: 160px;}
.width5_3cols,.grid5_3cols {width: 101px;}
.width5_4cols,.grid5_4cols {width: 72px;}
.input_width5 {width: 329px;}
.width6, .grid6, .span-6 {width: 405px;}
.width6_4cols,.grid6_4cols {width: 90px;}
.input_width6 {width: 399px;}
.width7, .grid7, .span-7 {width: 475px;}
.width7_2cols,.grid7_2cols {width: 230px;}
.width7_3cols,.grid7_3cols {width: 148px;}
.width7_4cols,.grid7_4cols {width: 107px;}
.input_width7 {width: 469px;}
.width8, .grid8, .span-8 {width: 545px;}
.width8_3cols,.grid8_3cols {width: 171px;}
.input_width8 {width: 539px;}
.width9, .grid9, .span-9 {width: 615px;}
.width9_2cols,.grid9_2cols {width: 300px;}
.width9_4cols,.grid9_4cols {width: 142px;}
.input_width9 {width: 609px;}
.width10, .grid10, .span-10 {width: 685px;}
.width10_3cols,.grid10_3cols {width: 218px;}
.width10_4cols,.grid10_4cols {width: 160px;}
.input_width10 {width: 679px;}
.width11, .grid11, .span-11 {width: 755px;}
.width11_2cols,.grid11_2cols {width: 370px;}
.width11_3cols,.grid11_3cols {width: 241px;}
.width11_4cols,.grid11_4cols {width: 177px;}
.input_width11 {width: 749px;}
.width12, .grid12, .span-12 {width: 825px;}
.input_width12 {width: 819px;}
/* Subdivided grid spaces */
.emptycols_left1, .prepend-1 {padding-left: 70px;}
.emptycols_right1, .append-1 {padding-right: 70px;}
.emptycols_left2, .prepend-2 {padding-left: 140px;}
.emptycols_right2, .append-2 {padding-right: 140px;}
.emptycols_left3, .prepend-3 {padding-left: 210px;}
.emptycols_right3, .append-3 {padding-right: 210px;}
.emptycols_left4, .prepend-4 {padding-left: 280px;}
.emptycols_right4, .append-4 {padding-right: 280px;}
.emptycols_left5, .prepend-5 {padding-left: 350px;}
.emptycols_right5, .append-5 {padding-right: 350px;}
.emptycols_left6, .prepend-6 {padding-left: 420px;}
.emptycols_right6, .append-6 {padding-right: 420px;}
.emptycols_left7, .prepend-7 {padding-left: 490px;}
.emptycols_right7, .append-7 {padding-right: 490px;}
.emptycols_left8, .prepend-8 {padding-left: 560px;}
.emptycols_right8, .append-8 {padding-right: 560px;}
.emptycols_left9, .prepend-9 {padding-left: 630px;}
.emptycols_right9, .append-9 {padding-right: 630px;}
.emptycols_left10, .prepend-10 {padding-left: 700px;}
.emptycols_right10, .append-10 {padding-right: 700px;}
.emptycols_left11, .prepend-11 {padding-left: 770px;}
.emptycols_right11, .append-11 {padding-right: 770px;}
.pull-1 {margin-left: -70px;}
.push-1 {margin-right: -70px;margin-left: 18px;float: right;}
.pull-2 {margin-left: -140px;}
.push-2 {margin-right: -140px;margin-left: 18px;float: right;}
.pull-3 {margin-left: -210px;}
.push-3 {margin-right: -210px;margin-left: 18px;float: right;}
.pull-4 {margin-left: -280px;}
.push-4 {margin-right: -280px;margin-left: 18px;float: right;}
@@ -0,0 +1,396 @@
@import url('grid_12-825-55-15.css');
/*
CSS Reset by Eric Meyer - Released under Public Domain
http://meyerweb.com/eric/tools/css/reset/
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center, dl, dt, dd, ol, ul, li,
fieldset, form, label, legend, table,
caption, tbody, tfoot, thead, tr, th, td
{margin: 0;padding: 0;border: 0;outline: 0;
font-size: 100%;vertical-align: baseline;
background: transparent;}
body {line-height: 1;}
ol, ul {list-style: none;}
blockquote, q {quotes: none;}
blockquote:before, blockquote:after,
q:before, q:after {content: ''; content: none;}
:focus {outline: 0;}
ins {text-decoration: none;}
del {text-decoration: line-through;}
table {border-collapse: collapse;border-spacing: 0;}
body {
color: #000;
background-color: #dcdcdc;
}
a {
text-decoration: none;
color: #1883ba;
}
h1{
font-size: 32px;
font-weight: normal;
font-style: normal;
margin-bottom: 18px;
}
h2{
font-size: 18px;
}
#container {
width: 865px;
margin: 0px auto;
}
#header {
padding: 20px;
font-size: 36px;
background-color: #000;
color: #fff;
}
#header span {
color: #666;
}
#main_content {
background-color: #fff;
padding: 60px 20px 20px;
}
#footer p {
margin: 0;
padding-top: 10px;
padding-bottom: 50px;
color: #333;
font: 10px Arial, sans-serif;
}
.tabs {
width: 100%;
height: 31px;
background-color: #444;
}
.tabs li {
float: left;
margin: 0;
overflow: hidden;
background-color: #444;
}
.tabs li a {
display: block;
color: #fff;
text-decoration: none;
font: bold 11px/11px 'Arial';
text-transform: uppercase;
padding: 10px 15px;
border-right: 1px solid #fff;
}
.tabs li a:hover {
background-color: #00b3ff;
}
.tabs li.active a {
color: #000;
background-color: #fff;
}
div.huge {
font-size: 120px;
line-height: 1em;
padding: 0;
letter-spacing: -.02em;
overflow: hidden;
}
div.glyph_range {
font-size: 72px;
line-height: 1.1em;
}
.size10{ font-size: 10px; }
.size11{ font-size: 11px; }
.size12{ font-size: 12px; }
.size13{ font-size: 13px; }
.size14{ font-size: 14px; }
.size16{ font-size: 16px; }
.size18{ font-size: 18px; }
.size20{ font-size: 20px; }
.size24{ font-size: 24px; }
.size30{ font-size: 30px; }
.size36{ font-size: 36px; }
.size48{ font-size: 48px; }
.size60{ font-size: 60px; }
.size72{ font-size: 72px; }
.size90{ font-size: 90px; }
.psample_row1 { height: 120px;}
.psample_row1 { height: 120px;}
.psample_row2 { height: 160px;}
.psample_row3 { height: 160px;}
.psample_row4 { height: 160px;}
.psample {
overflow: hidden;
position: relative;
}
.psample p {
line-height: 1.3em;
display: block;
overflow: hidden;
margin: 0;
}
.psample span {
margin-right: .5em;
}
.white_blend {
width: 100%;
height: 61px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);
position: absolute;
bottom: 0;
}
.black_blend {
width: 100%;
height: 61px;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);
position: absolute;
bottom: 0;
}
.fullreverse {
background: #000 !important;
color: #fff !important;
margin-left: -20px;
padding-left: 20px;
margin-right: -20px;
padding-right: 20px;
padding: 20px;
margin-bottom:0;
}
.sample_table td {
padding-top: 3px;
padding-bottom:5px;
padding-left: 5px;
vertical-align: middle;
line-height: 1.2em;
}
.sample_table td:first-child {
background-color: #eee;
text-align: right;
padding-right: 5px;
padding-left: 0;
padding: 5px;
font: 11px/12px "Courier New", Courier, mono;
}
code {
white-space: pre;
background-color: #eee;
display: block;
padding: 10px;
margin-bottom: 18px;
overflow: auto;
}
.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;}
.box {
padding: 18px;
margin-bottom: 18px;
background: #eee;
}
.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;}
#bodycomparison {
position: relative;
overflow: hidden;
font-size: 72px;
height: 90px;
white-space: nowrap;
}
#bodycomparison div{
font-size: 72px;
line-height: 90px;
display: inline;
margin: 0 15px 0 0;
padding: 0;
}
#bodycomparison div span{
font: 10px Arial;
position: absolute;
left: 0;
}
#xheight {
float: none;
position: absolute;
color: #d9f3ff;
font-size: 72px;
line-height: 90px;
}
.fontbody {
position: relative;
}
.arialbody{
font-family: Arial;
position: relative;
}
.verdanabody{
font-family: Verdana;
position: relative;
}
.georgiabody{
font-family: Georgia;
position: relative;
}
/* @group Layout page
*/
#layout h1 {
font-size: 36px;
line-height: 42px;
font-weight: normal;
font-style: normal;
}
#layout h2 {
font-size: 24px;
line-height: 23px;
font-weight: normal;
font-style: normal;
}
#layout h3 {
font-size: 22px;
line-height: 1.4em;
margin-top: 1em;
font-weight: normal;
font-style: normal;
}
#layout p.byline {
font-size: 12px;
margin-top: 18px;
line-height: 12px;
margin-bottom: 0;
}
#layout p {
font-size: 14px;
line-height: 21px;
margin-bottom: .5em;
}
#layout p.large{
font-size: 18px;
line-height: 26px;
}
#layout .sidebar p{
font-size: 12px;
line-height: 1.4em;
}
#layout p.caption {
font-size: 10px;
margin-top: -16px;
margin-bottom: 18px;
}
/* @end */
/* @group Glyphs */
#glyph_chart div{
background-color: #d9f3ff;
color: black;
float: left;
font-size: 36px;
height: 1.2em;
line-height: 1.2em;
margin-bottom: 1px;
margin-right: 1px;
text-align: center;
width: 1.2em;
position: relative;
padding: .6em .2em .2em;
}
#glyph_chart div p {
position: absolute;
left: 0;
top: 0;
display: block;
text-align: center;
font: bold 9px Arial, sans-serif;
background-color: #3a768f;
width: 100%;
color: #fff;
padding: 2px 0;
}
#glyphs h1 {
font-family: Arial, sans-serif;
}
/* @end */
/* @group Installing */
#installing {
font: 13px Arial, sans-serif;
}
#installing p,
#glyphs p{
line-height: 1.2em;
margin-bottom: 18px;
font: 13px Arial, sans-serif;
}
#installing h3{
font-size: 15px;
margin-top: 18px;
}
/* @end */
#rendering h1 {
font-family: Arial, sans-serif;
}
.render_table td {
font: 11px "Courier New", Courier, mono;
vertical-align: middle;
}
+16
View File
@@ -0,0 +1,16 @@
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on April 28, 2015 */
@font-face {
font-family: 'notokr-light';
src: url('notokr-light.eot');
src: url('notokr-light.eot?#iefix') format('embedded-opentype'),
url('notokr-light.woff2') format('woff2'),
url('notokr-light.woff') format('woff'),
url('notokr-light.ttf') format('truetype'),
url('notokr-light.svg#notokr-light') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -0,0 +1,5 @@
# Font Squirrel Font-face Generator Configuration File
# Upload this file to the generator to recreate the settings
# you used to create these fonts.
{"mode":"basic","formats":["ttf","woff","woff2","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"}
File diff suppressed because it is too large. Load diff
Loaded 100 of 459 files, more files were not shown because too many files have changed in this diff. Show more