This commit is contained in:
2026-01-30 17:20:52 +09:00
commit 21b6332c9c
459 changed files with 190743 additions and 0 deletions

36
index.php Normal file
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
kngil/.htaccess Normal file
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

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
kngil/bbs/.htaccess Normal file
View File

@@ -0,0 +1 @@
Options -Indexes

165
kngil/bbs/adm.php Normal file
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
kngil/bbs/adm_comp copy.php Normal file
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
kngil/bbs/adm_comp.php Normal file
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()
]);
}

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()]);
}
?>

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()]);
}
?>

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
kngil/bbs/adm_guard.php Normal file
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));

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()]);
}
?>

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()]);
}
?>

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()
]);
}

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
kngil/bbs/adm_service.php Normal file
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()
]);
}

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
kngil/bbs/db_conn.php Normal file
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
kngil/bbs/get_base_cd.php Normal file
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
kngil/bbs/join copy.php Normal file
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
kngil/bbs/join.php Normal file
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
kngil/bbs/login.php Normal file
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']);

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
kngil/bbs/login_sms.php Normal file
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
kngil/bbs/logout.php Normal file
View File

@@ -0,0 +1,6 @@
<?php
session_start();
session_destroy();
header('Location: /kngil/skin/index.php');
exit;

40
kngil/bbs/mypage01.php Normal file
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
kngil/bbs/mypage02.php Normal file
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
kngil/bbs/mypage03.php Normal file
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
kngil/bbs/qa_comment.php Normal file
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()
]);
}

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']);

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
kngil/bbs/qa_detail.php Normal file
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
kngil/bbs/qa_list.php Normal file
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
kngil/bbs/qa_status.php Normal file
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
kngil/bbs/qa_write.php Normal file
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
kngil/bbs/sales_results.php Normal file
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;
?>

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
kngil/css/adm_style.css Normal file
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
kngil/css/common.css Normal file

File diff suppressed because it is too large Load Diff

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}

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');
}

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;
}

10333
kngil/css/faq/faq_style.css Normal file

File diff suppressed because it is too large Load Diff

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
kngil/css/lib/aos.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
kngil/css/lib/lenis.min.css vendored Normal file
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
kngil/css/lib/swiper11.min.css vendored Normal file

File diff suppressed because one or more lines are too long

4
kngil/css/qa/font-awesome.min.css vendored Normal file

File diff suppressed because one or more lines are too long

49
kngil/css/qa/qa_font.css Normal file
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
kngil/css/qa/qa_reset.css Normal file
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;
}

10333
kngil/css/qa/qa_style.css Normal file

File diff suppressed because it is too large Load Diff

7249
kngil/css/style.css Normal file

File diff suppressed because it is too large Load Diff

BIN
kngil/fonts/FontAwesome.otf Normal file

Binary file not shown.

View File

@@ -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.

View File

@@ -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);

View File

@@ -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;}

View File

@@ -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;
}

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;
}

View File

@@ -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.

View File

@@ -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);

View File

@@ -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;}

View File

@@ -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;
}

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;
}

View File

@@ -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.

View File

@@ -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);

View File

@@ -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;}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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.

View File

@@ -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);

View File

@@ -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;}

View File

@@ -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;
}

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;
}

View File

@@ -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

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