+
+
diff --git a/AvocadoAmber/adm/admin.tail.php b/AvocadoAmber/adm/admin.tail.php
index b39a053..b5d291b 100644
--- a/AvocadoAmber/adm/admin.tail.php
+++ b/AvocadoAmber/adm/admin.tail.php
@@ -2,6 +2,7 @@
if (!defined('_GNUBOARD_'))
exit;
?>
+
@@ -11,6 +12,17 @@ if (!defined('_GNUBOARD_'))
diff --git a/AvocadoAmber/adm/board_list_update.php b/AvocadoAmber/adm/board_list_update.php
index 7567322..6bc71a8 100644
--- a/AvocadoAmber/adm/board_list_update.php
+++ b/AvocadoAmber/adm/board_list_update.php
@@ -1,13 +1,63 @@
false, 'message' => '게시판 테이블명이 없습니다.']);
+ exit;
+ }
+
+ $result = migrate_board_table($bo_table);
+ echo json_encode($result);
+ exit;
+}
+
+// 선택 마이그레이션 처리
+
if (!count($_POST['chk'])) {
alert($_POST['act_button'] . " 하실 항목을 하나 이상 체크하세요.");
}
-if ($_POST['act_button'] == "선택수정") {
+if ($_POST['act_button'] == "선택마이그레이션") {
+ auth_check($auth[$sub_menu], 'w');
+
+ if (!count($_POST['chk'])) {
+ alert("마이그레이션 하실 항목을 하나 이상 체크하세요.");
+ }
+
+ $success_count = 0;
+ $fail_count = 0;
+ $messages = [];
+
+ for ($i = 0; $i < count($_POST['chk']); $i++) {
+ $k = $_POST['chk'][$i];
+ $bo_table = sql_real_escape_string(strip_tags($_POST['board_table'][$k]));
+
+ if (empty($bo_table)) {
+ continue;
+ }
+
+ $result = migrate_board_table($bo_table);
+
+ if ($result['success']) {
+ $success_count++;
+ $messages[] = "{$bo_table}: 성공 (컬럼 {$result['updated']}개 추가)";
+ } else {
+ $fail_count++;
+ $messages[] = "{$bo_table}: 실패 - {$result['message']}";
+ }
+ }
+} else if ($_POST['act_button'] == "선택수정") {
auth_check($auth[$sub_menu], 'w');
@@ -28,7 +78,7 @@ if ($_POST['act_button'] == "선택수정") {
$purify_keys = ["gr_id", "bo_subject", "bo_skin", "bo_list_level", "bo_read_level", "bo_write_level", "bo_comment_level", "bo_reply_level", "board_table"];
- foreach($_POST as $key => $value) {
+ foreach ($_POST as $key => $value) {
if (in_array($key, $purify_keys)) {
if (is_array($_POST[$key])) {
$_POST[$key][$k] = sql_real_escape_string(strip_tags($_POST[$key][$k]));
diff --git a/AvocadoAmber/adm/board_migration.inc.php b/AvocadoAmber/adm/board_migration.inc.php
new file mode 100644
index 0000000..3ae43db
--- /dev/null
+++ b/AvocadoAmber/adm/board_migration.inc.php
@@ -0,0 +1,319 @@
+ 'int(11) NOT NULL AUTO_INCREMENT',
+ 'wr_num' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_reply' => 'varchar(10) NOT NULL',
+ 'wr_parent' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_is_comment' => 'tinyint(4) NOT NULL DEFAULT 0',
+ 'wr_comment' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_comment_reply' => 'varchar(5) NOT NULL',
+ 'ca_name' => 'varchar(255) NOT NULL',
+ 'wr_option' => "set('html1','html2','secret','mail') NOT NULL",
+ 'wr_subject' => 'varchar(255) NOT NULL',
+ 'wr_content' => 'mediumtext NOT NULL',
+ 'wr_extra_vars' => 'text NOT NULL',
+ 'wr_link1' => 'text NOT NULL',
+ 'wr_link2' => 'text NOT NULL',
+ 'wr_link1_hit' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_link2_hit' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_hit' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_good' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_nogood' => 'int(11) NOT NULL DEFAULT 0',
+ 'mb_id' => 'varchar(20) NOT NULL',
+ 'wr_password' => 'varchar(255) NOT NULL',
+ 'wr_extrapassword' => 'varchar(255) NOT NULL',
+ 'wr_name' => 'varchar(255) NOT NULL',
+ 'wr_email' => 'varchar(255) NOT NULL',
+ 'wr_homepage' => 'varchar(255) NOT NULL',
+ 'wr_datetime' => "datetime NOT NULL DEFAULT '1970-01-01 00:00:00'",
+ 'wr_file' => 'tinyint(4) NOT NULL DEFAULT 0',
+ 'wr_last' => 'varchar(19) NOT NULL',
+ 'wr_ip' => 'varchar(255) NOT NULL',
+ 'wr_facebook_user' => 'varchar(255) NOT NULL',
+ 'wr_twitter_user' => 'varchar(255) NOT NULL',
+ 'wr_dice1' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_dice2' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_log' => 'text NOT NULL',
+ 'wr_item' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_item_log' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_action' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_secret' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_adult' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_wide' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_plip' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_noname' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_ing' => 'int(11) NOT NULL DEFAULT 0',
+ 'ch_id' => 'int(11) NOT NULL DEFAULT 0',
+ 'ch_side' => 'int(11) NOT NULL DEFAULT 0',
+ 'ch_class' => 'int(11) NOT NULL DEFAULT 0',
+ 'ti_id' => 'int(11) NOT NULL DEFAULT 0',
+ 'ma_id' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_width' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_height' => 'int(11) NOT NULL DEFAULT 0',
+ 'wr_url' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_type' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_1' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_2' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_3' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_4' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_5' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_6' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_7' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_8' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_9' => "varchar(255) NOT NULL DEFAULT ''",
+ 'wr_10' => "varchar(255) NOT NULL DEFAULT ''"
+ ];
+}
+
+// bo_version 컬럼 체크 및 추가
+function check_and_add_bo_version()
+{
+ global $g5;
+
+ $sql = "SHOW COLUMNS FROM {$g5['board_table']} LIKE 'bo_version'";
+ $result = sql_query($sql);
+
+ if (sql_num_rows($result) == 0) {
+ $sql = "ALTER TABLE {$g5['board_table']} ADD `bo_version` varchar(255) NOT NULL DEFAULT '0'";
+ sql_query($sql);
+ return true;
+ }
+
+ return false;
+}
+
+// 컬럼 정의 정규화 (비교를 위해)
+function normalize_column_definition($definition)
+{
+ // 소문자로 변환
+ $def = strtolower($definition);
+
+ // 공백 정규화
+ $def = preg_replace('/\s+/', ' ', $def);
+ $def = trim($def);
+
+ // AUTO_INCREMENT 제거 (비교 시 제외)
+ $def = str_replace('auto_increment', '', $def);
+
+ // int(11) -> int 형식 통일
+ $def = preg_replace('/int\(\d+\)/', 'int', $def);
+ $def = preg_replace('/tinyint\(\d+\)/', 'tinyint', $def);
+
+ // varchar/char 길이는 유지
+
+ // 따옴표 통일 (single quote)
+ $def = str_replace('"', "'", $def);
+
+ return trim($def);
+}
+
+// 현재 테이블 구조 가져오기 (원본 정의 포함)
+function get_current_table_structure($table_name)
+{
+ $sql = "SHOW COLUMNS FROM `{$table_name}`";
+ $result = sql_query($sql);
+
+ $structure = [];
+ while ($row = sql_fetch_array($result)) {
+ $type = $row['Type'];
+ $null = $row['Null'] == 'NO' ? 'NOT NULL' : '';
+ $default = '';
+
+ if ($row['Default'] !== null) {
+ if (in_array(strtolower($row['Default']), ['current_timestamp'])) {
+ $default = "DEFAULT {$row['Default']}";
+ } else {
+ $default = "DEFAULT '{$row['Default']}'";
+ }
+ } else if ($row['Null'] == 'NO' && $row['Default'] === null && $row['Extra'] != 'auto_increment') {
+ // NOT NULL이고 DEFAULT가 없는 경우 처리
+ if (strpos($type, 'int') !== false) {
+ $default = 'DEFAULT 0';
+ } else if (strpos($type, 'text') !== false) {
+ // text 타입은 default를 설정할 수 없음
+ $default = '';
+ } else {
+ $default = "DEFAULT ''";
+ }
+ }
+
+ $extra = $row['Extra'];
+ if ($extra == 'auto_increment') {
+ $extra = 'AUTO_INCREMENT';
+ }
+
+ $definition = trim("{$type} {$null} {$default} {$extra}");
+ $structure[$row['Field']] = $definition;
+ }
+
+ return $structure;
+}
+
+// 테이블 구조 비교 (누락 및 변경된 컬럼 모두 감지)
+function compare_table_structure($table_name)
+{
+ $standard = get_standard_board_structure();
+ $current = get_current_table_structure($table_name);
+
+ $missing_columns = []; // 누락된 컬럼
+ $modified_columns = []; // 속성이 다른 컬럼
+
+ foreach ($standard as $column => $definition) {
+ if (!isset($current[$column])) {
+ // 컬럼이 존재하지 않음
+ $missing_columns[$column] = $definition;
+ } else {
+ // 컬럼은 존재하지만 속성 비교
+ $standard_normalized = normalize_column_definition($definition);
+ $current_normalized = normalize_column_definition($current[$column]);
+
+ if ($standard_normalized !== $current_normalized) {
+ // 속성이 다름
+ $modified_columns[$column] = [
+ 'current' => $current[$column],
+ 'standard' => $definition
+ ];
+ }
+ }
+ }
+
+ return [
+ 'missing' => $missing_columns,
+ 'modified' => $modified_columns
+ ];
+}
+
+// 게시판 테이블 마이그레이션 실행
+function migrate_board_table($bo_table)
+{
+ global $g5;
+
+ $write_table = $g5['write_prefix'] . $bo_table;
+
+ // 테이블 존재 확인
+ $sql = "SHOW TABLES LIKE '{$write_table}'";
+ $result = sql_query($sql);
+ if (sql_num_rows($result) == 0) {
+ return ['success' => false, 'message' => '테이블이 존재하지 않습니다.'];
+ }
+
+ // 누락 및 변경된 컬럼 확인
+ $comparison = compare_table_structure($write_table);
+ $missing_columns = $comparison['missing'];
+ $modified_columns = $comparison['modified'];
+
+ if (empty($missing_columns) && empty($modified_columns)) {
+ // 버전 업데이트만 수행
+ $sql = "UPDATE {$g5['board_table']} SET bo_version = '" . BOARD_MIGRATION_VERSION . "' WHERE bo_table = '{$bo_table}'";
+ sql_query($sql);
+ return [
+ 'success' => true,
+ 'message' => '이미 최신 버전입니다.',
+ 'added' => 0,
+ 'modified' => 0
+ ];
+ }
+
+ $added_count = 0;
+ $modified_count = 0;
+ $errors = [];
+
+ // 누락된 컬럼 추가
+ foreach ($missing_columns as $column => $definition) {
+ $sql = "ALTER TABLE `{$write_table}` ADD `{$column}` {$definition}";
+ if (sql_query($sql)) {
+ $added_count++;
+ } else {
+ $errors[] = "컬럼 추가 실패: {$column}";
+ }
+ }
+
+ // 변경된 컬럼 수정
+ foreach ($modified_columns as $column => $info) {
+ $sql = "ALTER TABLE `{$write_table}` MODIFY `{$column}` {$info['standard']}";
+ if (sql_query($sql)) {
+ $modified_count++;
+ } else {
+ $errors[] = "컬럼 수정 실패: {$column}";
+ }
+ }
+
+ // 버전 업데이트
+ $sql = "UPDATE {$g5['board_table']} SET bo_version = '" . BOARD_MIGRATION_VERSION . "' WHERE bo_table = '{$bo_table}'";
+ sql_query($sql);
+
+ $message = '마이그레이션이 완료되었습니다.';
+ if (!empty($errors)) {
+ $message .= ' (일부 오류: ' . implode(', ', $errors) . ')';
+ }
+
+ return [
+ 'success' => true,
+ 'message' => $message,
+ 'added' => $added_count,
+ 'modified' => $modified_count,
+ 'errors' => $errors
+ ];
+}
+
+// 모든 게시판 체크
+function check_all_boards_migration()
+{
+ global $g5;
+
+ check_and_add_bo_version();
+
+ $sql = "SELECT bo_table, bo_version FROM {$g5['board_table']}";
+ $result = sql_query($sql);
+
+ $boards_need_update = [];
+
+ while ($row = sql_fetch_array($result)) {
+ if ($row['bo_version'] != BOARD_MIGRATION_VERSION) {
+ $write_table = $g5['write_prefix'] . $row['bo_table'];
+ $comparison = compare_table_structure($write_table);
+
+ $boards_need_update[] = [
+ 'bo_table' => $row['bo_table'],
+ 'current_version' => $row['bo_version'],
+ 'missing_columns' => count($comparison['missing']),
+ 'modified_columns' => count($comparison['modified'])
+ ];
+ }
+ }
+
+ return $boards_need_update;
+}
+
+// 특정 게시판의 상세 차이점 확인
+function get_board_migration_details($bo_table)
+{
+ global $g5;
+
+ $write_table = $g5['write_prefix'] . $bo_table;
+
+ // 테이블 존재 확인
+ $sql = "SHOW TABLES LIKE '{$write_table}'";
+ $result = sql_query($sql);
+ if (sql_num_rows($result) == 0) {
+ return ['success' => false, 'message' => '테이블이 존재하지 않습니다.'];
+ }
+
+ $comparison = compare_table_structure($write_table);
+
+ return [
+ 'success' => true,
+ 'bo_table' => $bo_table,
+ 'missing_columns' => $comparison['missing'],
+ 'modified_columns' => $comparison['modified']
+ ];
+}
diff --git a/AvocadoAmber/adm/board_move_check.php b/AvocadoAmber/adm/board_move_check.php
new file mode 100644
index 0000000..9c31aa0
--- /dev/null
+++ b/AvocadoAmber/adm/board_move_check.php
@@ -0,0 +1,48 @@
+ false, 'message' => '']);
+ exit;
+}
+
+$source_table = $g5['write_prefix'] . $source_board;
+$target_table = $g5['write_prefix'] . $target_board;
+
+$source_exists = sql_query("SHOW TABLES LIKE '{$source_table}'", false);
+$target_exists = sql_query("SHOW TABLES LIKE '{$target_table}'", false);
+
+if (!sql_num_rows($source_exists) || !sql_num_rows($target_exists)) {
+ echo json_encode(['warning' => true, 'message' => '게시판 테이블이 존재하지 않습니다.']);
+ exit;
+}
+
+$source_columns = [];
+$result = sql_query("SHOW COLUMNS FROM {$source_table}");
+while ($row = sql_fetch_array($result)) {
+ $source_columns[] = $row['Field'];
+}
+
+$target_columns = [];
+$result = sql_query("SHOW COLUMNS FROM {$target_table}");
+while ($row = sql_fetch_array($result)) {
+ $target_columns[] = $row['Field'];
+}
+
+$missing_columns = array_diff($source_columns, $target_columns);
+
+$exclude_columns = ['wr_id', 'wr_num', 'wr_reply', 'wr_parent'];
+$missing_columns = array_diff($missing_columns, $exclude_columns);
+
+if (count($missing_columns) > 0) {
+ $message = '대상 게시판에 존재하지 않는 필드가 있어 해당 데이터는 복사되지 않습니다: ' . implode(', ', $missing_columns);
+ echo json_encode(['warning' => true, 'message' => $message]);
+} else {
+ echo json_encode(['warning' => false, 'message' => '']);
+}
+?>
diff --git a/AvocadoAmber/adm/board_move_list.php b/AvocadoAmber/adm/board_move_list.php
new file mode 100644
index 0000000..6cb1f20
--- /dev/null
+++ b/AvocadoAmber/adm/board_move_list.php
@@ -0,0 +1,295 @@
+처음';
+
+$g5['title'] = '게시물 이동/복사';
+include_once "./admin.head.php";
+
+$colspan = 8;
+?>
+
+
+
+ ()
+ 전체게시물 개
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 이동: 선택한 게시물을 대상 게시판으로 이동합니다. 원본 게시물은 삭제됩니다.
+ 복사: 선택한 게시물을 대상 게시판에 복사합니다. 원본 게시물은 유지됩니다.
+ 게시판 테이블 구조가 다른 경우, 존재하는 필드만 복사되며 경고 메시지가 표시됩니다.
+
+
+
+
+
+
diff --git a/AvocadoAmber/adm/board_move_update.php b/AvocadoAmber/adm/board_move_update.php
new file mode 100644
index 0000000..b456191
--- /dev/null
+++ b/AvocadoAmber/adm/board_move_update.php
@@ -0,0 +1,286 @@
+ $col_info) {
+ if (isset($target_columns[$col_name]) && !in_array($col_name, $exclude_fields)) {
+ $common_columns[] = $col_name;
+ }
+}
+
+if (empty($common_columns)) {
+ alert('복사할 수 있는 공통 컬럼이 없습니다.');
+}
+
+$success_count = 0;
+$fail_count = 0;
+$error_messages = [];
+
+foreach ($chk as $wr_id) {
+ $wr_id = (int) $wr_id;
+
+ $write = sql_fetch("SELECT * FROM {$source_table} WHERE wr_id = '{$wr_id}'");
+
+ if (!$write) {
+ $fail_count++;
+ $error_messages[] = "게시물 ID {$wr_id}를 찾을 수 없습니다.";
+ continue;
+ }
+
+ $is_reply = $write['wr_reply'] ? true : false;
+
+ if ($is_reply && $act_button === 'move') {
+ $parent_id = $write['wr_parent'];
+ $parent_check = sql_fetch("SELECT wr_id FROM {$source_table} WHERE wr_id = '{$parent_id}'");
+ if (!$parent_check) {
+ $write['wr_reply'] = '';
+ $write['wr_parent'] = 0;
+ }
+ }
+
+ try {
+ $insert_values = [];
+ $insert_fields = [];
+
+ foreach ($common_columns as $col) {
+ if ($col === 'wr_num')
+ continue;
+
+ if ($col === 'wr_reply' || $col === 'wr_parent') {
+ if ($col === 'wr_reply') {
+ $insert_fields[] = $col;
+ $insert_values[] = "''";
+ } else if ($col === 'wr_parent') {
+ $insert_fields[] = $col;
+ $insert_values[] = "0";
+ }
+ continue;
+ }
+
+ $insert_fields[] = $col;
+ $value = $write[$col];
+
+ if ($col === 'bo_table') {
+ $insert_values[] = "'{$target_board}'";
+ } else {
+ $insert_values[] = "'" . sql_real_escape_string($value) . "'";
+ }
+ }
+
+ $row = sql_fetch("SELECT MIN(wr_num) AS min_wr_num FROM {$target_table}");
+ $wr_num = $row['min_wr_num'] - 1;
+
+ $insert_fields[] = 'wr_num';
+ $insert_values[] = "'{$wr_num}'";
+
+ $sql = "INSERT INTO {$target_table} (" . implode(', ', $insert_fields) . ")
+ VALUES (" . implode(', ', $insert_values) . ")";
+
+ sql_query($sql);
+ $new_wr_id = sql_insert_id();
+
+ if (isset($write['wr_is_comment']) && $write['wr_is_comment'] == 0) {
+ sql_query("UPDATE {$target_table} SET wr_parent = '{$new_wr_id}' WHERE wr_id = '{$new_wr_id}'");
+ }
+
+ if ($write['wr_file']) {
+ copy_board_files($bo_table, $wr_id, $target_board, $new_wr_id, $write);
+ }
+
+ if ($act_button === 'move') {
+ sql_query("DELETE FROM {$g5['board_new_table']} WHERE bo_table = '{$bo_table}' AND wr_id = '{$wr_id}'");
+ sql_query("DELETE FROM {$g5['board_good_table']} WHERE bo_table = '{$bo_table}' AND wr_id = '{$wr_id}'");
+
+ sql_query("DELETE FROM {$source_table} WHERE wr_id = '{$wr_id}'");
+
+ move_board_files($bo_table, $wr_id, $target_board, $new_wr_id);
+ }
+
+ sql_query("UPDATE {$g5['board_table']} SET bo_count_write = bo_count_write + 1 WHERE bo_table = '{$target_board}'");
+
+ if ($act_button === 'move') {
+ sql_query("UPDATE {$g5['board_table']} SET bo_count_write = bo_count_write - 1 WHERE bo_table = '{$bo_table}'");
+ }
+
+ $success_count++;
+
+ } catch (Exception $e) {
+ $fail_count++;
+ $error_messages[] = "게시물 ID {$wr_id} 처리 중 오류: " . $e->getMessage();
+ }
+}
+
+$action_text = ($act_button === 'move') ? '이동' : '복사';
+$message = "{$success_count}개의 게시물이 {$action_text}되었습니다.";
+
+if ($fail_count > 0) {
+ $message .= "\\n{$fail_count}개의 게시물 처리 중 오류가 발생했습니다.";
+ if (!empty($error_messages)) {
+ $message .= "\\n\\n상세 오류:\\n" . implode("\\n", array_slice($error_messages, 0, 5));
+ if (count($error_messages) > 5) {
+ $message .= "\\n... 외 " . (count($error_messages) - 5) . "건";
+ }
+ }
+}
+
+$qstr = 'bo_table=' . $bo_table;
+if (isset($_POST['sod']))
+ $qstr .= '&sod=' . $_POST['sod'];
+if (isset($_POST['sfl']))
+ $qstr .= '&sfl=' . $_POST['sfl'];
+if (isset($_POST['stx']))
+ $qstr .= '&stx=' . urlencode($_POST['stx']);
+if (isset($_POST['page']))
+ $qstr .= '&page=' . $_POST['page'];
+
+goto_url('./board_move_list.php?' . $qstr, false, $message);
+
+function copy_board_files($source_bo_table, $source_wr_id, $target_bo_table, $target_wr_id, $write_data)
+{
+ global $g5;
+
+ $source_dir = G5_DATA_PATH . '/file/' . $source_bo_table;
+ $target_dir = G5_DATA_PATH . '/file/' . $target_bo_table;
+
+ if (!is_dir($target_dir)) {
+ @mkdir($target_dir, G5_DIR_PERMISSION);
+ @chmod($target_dir, G5_DIR_PERMISSION);
+ }
+
+ for ($i = 0; $i < 10; $i++) {
+ $file_field = 'wr_file' . $i;
+ $source_field = 'bf_source' . $i;
+
+ if (isset($write_data[$file_field]) && $write_data[$file_field]) {
+ $source_file = $source_dir . '/' . $write_data[$file_field];
+
+ if (file_exists($source_file)) {
+ $new_filename = $target_wr_id . '_' . $i . '_' . time() . substr($write_data[$file_field], strrpos($write_data[$file_field], '.'));
+ $target_file = $target_dir . '/' . $new_filename;
+
+ if (@copy($source_file, $target_file)) {
+ @chmod($target_file, G5_FILE_PERMISSION);
+
+ $bf_source = isset($write_data[$source_field]) ? $write_data[$source_field] : basename($write_data[$file_field]);
+ $bf_filesize = filesize($target_file);
+ $bf_width = 0;
+ $bf_height = 0;
+ $bf_type = 0;
+
+ if (preg_match("/\.(gif|jpg|jpeg|png)$/i", $new_filename)) {
+ $size = @getimagesize($target_file);
+ if ($size) {
+ $bf_width = $size[0];
+ $bf_height = $size[1];
+ $bf_type = $size[2];
+ }
+ }
+
+ $sql = " INSERT INTO {$g5['board_file_table']}
+ SET bo_table = '{$target_bo_table}',
+ wr_id = '{$target_wr_id}',
+ bf_no = '{$i}',
+ bf_source = '" . sql_real_escape_string($bf_source) . "',
+ bf_file = '{$new_filename}',
+ bf_download = 0,
+ bf_content = '',
+ bf_filesize = '{$bf_filesize}',
+ bf_width = '{$bf_width}',
+ bf_height = '{$bf_height}',
+ bf_type = '{$bf_type}',
+ bf_datetime = '" . G5_TIME_YMDHIS . "' ";
+ sql_query($sql);
+ }
+ }
+ }
+ }
+}
+
+function move_board_files($source_bo_table, $source_wr_id, $target_bo_table, $target_wr_id)
+{
+ global $g5;
+
+ $sql = "SELECT * FROM {$g5['board_file_table']}
+ WHERE bo_table = '{$source_bo_table}' AND wr_id = '{$source_wr_id}'
+ ORDER BY bf_no";
+ $result = sql_query($sql);
+
+ $source_dir = G5_DATA_PATH . '/file/' . $source_bo_table;
+ $target_dir = G5_DATA_PATH . '/file/' . $target_bo_table;
+
+ if (!is_dir($target_dir)) {
+ @mkdir($target_dir, G5_DIR_PERMISSION);
+ @chmod($target_dir, G5_DIR_PERMISSION);
+ }
+
+ while ($row = sql_fetch_array($result)) {
+ $source_file = $source_dir . '/' . $row['bf_file'];
+
+ if (file_exists($source_file)) {
+ $new_filename = $target_wr_id . '_' . $row['bf_no'] . '_' . time() . substr($row['bf_file'], strrpos($row['bf_file'], '.'));
+ $target_file = $target_dir . '/' . $new_filename;
+
+ if (@rename($source_file, $target_file)) {
+ $sql = " INSERT INTO {$g5['board_file_table']}
+ SET bo_table = '{$target_bo_table}',
+ wr_id = '{$target_wr_id}',
+ bf_no = '{$row['bf_no']}',
+ bf_source = '" . sql_real_escape_string($row['bf_source']) . "',
+ bf_file = '{$new_filename}',
+ bf_download = '{$row['bf_download']}',
+ bf_content = '" . sql_real_escape_string($row['bf_content']) . "',
+ bf_filesize = '{$row['bf_filesize']}',
+ bf_width = '{$row['bf_width']}',
+ bf_height = '{$row['bf_height']}',
+ bf_type = '{$row['bf_type']}',
+ bf_datetime = '{$row['bf_datetime']}' ";
+ sql_query($sql);
+ }
+ }
+ }
+
+ sql_query("DELETE FROM {$g5['board_file_table']} WHERE bo_table = '{$source_bo_table}' AND wr_id = '{$source_wr_id}'");
+}
+?>
diff --git a/AvocadoAmber/adm/community_form_update.php b/AvocadoAmber/adm/community_form_update.php
index de85568..67941e1 100644
--- a/AvocadoAmber/adm/community_form_update.php
+++ b/AvocadoAmber/adm/community_form_update.php
@@ -33,4 +33,4 @@ EventHandler::triggerEvent("amber.admin.community_form_update");
sql_query($sql);
-goto_url('./community_form.php');
+goto_url(G5_ADMIN_URL . '/community_form.php');
diff --git a/AvocadoAmber/adm/css/addon_config.css b/AvocadoAmber/adm/css/addon_config.css
index b38abf6..907bfe3 100644
--- a/AvocadoAmber/adm/css/addon_config.css
+++ b/AvocadoAmber/adm/css/addon_config.css
@@ -3,7 +3,7 @@ th a {
display: inline-block;
vertical-align: middle;
padding: 3px 10px;
- background: var(--theme-color-a);
+ background: var(--theme-sub-500);
color: #fff;
margin: 5px 0 0;
}
@@ -12,33 +12,30 @@ th a+a {
margin-top: 3px;
}
-#wrap {
+html>body #container {
+ padding: 0;
+}
+
+.addon_conf_form {
height: 100%;
}
-#container {
- padding: 0 !important;
- min-height: 100%;
-}
-
-#wrapper {
- height: 100%;
- box-sizing: border-box;
-}
-
-#container section.addon_config {
+#container .addon_config {
display: flex;
- height: 100%;
- padding: 8px;
+ height: auto;
gap: 8px;
+ box-sizing: border-box;
+ margin-bottom: 0;
+ padding: 0;
+ width: calc(100% - 8px);
+ height: 100%
}
.addon_config>nav {
min-width: 200px;
display: flex;
flex-direction: column;
- border: 1px solid var(--theme-color-d);
- border-radius: 4px;
+ background: var(--theme-gray-800);
overflow:hidden;
}
@@ -48,12 +45,13 @@ th a+a {
}
.addon_config>nav>a.selected {
- background: var(--theme-color-a);
+ background: var(--theme-sub-300);
+ color: var(--black);
font-weight: bold;
}
.addon_config>nav>span {
- background: var(--theme-color-d);
+ background: var(--theme-gray-500);
color: #FFF;
line-height: 48px;
font-size: 14px;
@@ -71,10 +69,6 @@ td a {
color: var(--theme-color-d);
}
-.footer-copyright {
- padding: 20px !important;
-}
-
span.empty {
display: flex;
flex-direction: column;
diff --git a/AvocadoAmber/adm/css/default.css b/AvocadoAmber/adm/css/default.css
new file mode 100644
index 0000000..67fb6cf
--- /dev/null
+++ b/AvocadoAmber/adm/css/default.css
@@ -0,0 +1,1950 @@
+@charset "utf-8";
+@import url(./jquery.minicolors.css);
+@import url('https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css');
+@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap');
+
+@font-face {
+ font-family: 'icon';
+ src: url("../../css/fonts/bootstrap-icons.woff2") format("woff2"),
+ url("../../css/fonts/bootstrap-icons.woff") format("woff");
+ font-weight: normal;
+ font-style: normal;
+}
+
+:root {
+ --black: #000;
+ --white: #FFF;
+
+ --theme-50: #fff3e0;
+ --theme-100: #ffe1b3;
+ --theme-200: #ffce81;
+ --theme-300: #ffb94e;
+ --theme-400: #ffa927;
+ --theme-500: #ff9b02;
+ --theme-600: #fc8f01;
+ --theme-700: #f67f00;
+ --theme-800: #f06f00;
+ --theme-900: #e75400;
+
+ --theme-sub-50: #e6f2ff;
+ --theme-sub-100: #c4ddff;
+ --theme-sub-200: #a1c9ff;
+ --theme-sub-300: #81b3ff;
+ --theme-sub-400: #6fa3fe;
+ --theme-sub-500: #6893fa;
+ --theme-sub-600: #6484ea;
+ --theme-sub-700: #5e71d6;
+ --theme-sub-800: #5960c2;
+ --theme-sub-900: #5040a0;
+
+ --theme-gray-50: #fff9ef;
+ --theme-gray-100: #d0d3d8;
+ --theme-gray-200: #b0b6bf;
+ --theme-gray-300: #919aa7;
+ --theme-gray-400: #7a8494;
+ --theme-gray-500: #637083;
+ --theme-gray-600: #566272;
+ --theme-gray-700: #464f5c;
+ --theme-gray-800: #363d47;
+ --theme-gray-900: #242930;
+
+ --theme-color-0: #FFF8F0;
+ --theme-color-a: #edd0b6;
+ --theme-color-b: #e3bb82;
+ --theme-color-c: #c7996b;
+ --theme-color-d: hsl(30, 72%, 55%);
+ --theme-color-d-gnb: hsla(30, 72%, 55%, .2);
+ --theme-color-e: hsl(45, 100%, 50%);
+ --theme-color-sub: #4a797b;
+ --theme-color-sub-b: #A8DADC;
+
+ --bg-color: #181926;
+ --text-color: #CAD3F5;
+ --border-color: #6E738D;
+ --button-bg-hover-color: #CAD3F5;
+ --button-text-color: #000;
+ --header-bg-color: #24273A;
+
+ --accent-color: var(--theme-color-e);
+ --button-bg-color: var(--theme-color-e);
+}
+
+html,
+body {
+ padding: 0;
+ margin: 0;
+ font-family: 'Noto Sans KR', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
+ vertical-align: text-bottom;
+ line-height: 1;
+ font-weight: 500;
+ font-size: 12px;
+}
+
+body.popup-body {
+ background: var(--theme-gray-100);
+ min-width: 0px;
+}
+
+html,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+form,
+fieldset,
+img {
+ margin: 0;
+ padding: 0;
+ border: 0
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section {
+ display: block
+}
+
+header ul,
+nav ul,
+aside ul,
+footer ul {
+ margin: 0;
+ padding: 0;
+ list-style: none
+}
+
+label,
+input,
+button,
+select,
+img {
+ vertical-align: middle
+}
+
+input {
+ margin: 0;
+ padding: 0;
+ border-radius: 0;
+}
+
+input[type=text],
+input[type=password],
+input[type=submit],
+input[type=image] {
+ appearance: none;
+ -webkit-appearance: none;
+}
+
+button {
+ border-radius: 0;
+ appearance: none;
+ -webkit-appearance: none;
+ cursor: pointer
+}
+
+p {
+ margin: 0;
+ padding: 0;
+ word-break: break-all
+}
+
+hr {
+ display: none
+}
+
+pre {
+ overflow-x: scroll;
+}
+
+caption {
+ display: none;
+}
+
+.cke_sc,
+.sound_only {
+ display: none;
+}
+
+input[type="file"] {
+ font-size: 12px;
+ border: 1px solid #dde3e0;
+ height: 28px;
+}
+
+input[type="number"],
+input[type="text"],
+input[type="password"],
+select,
+textarea {
+ border: 1px solid #dde3e0;
+ box-sizing: border-box;
+ font-family: 'Dotum';
+ font-size: 12px;
+}
+
+input[type="number"],
+input[type="text"],
+input[type="password"] {
+ padding: 0 8px;
+}
+
+input[type="number"],
+input[type="text"],
+input[type="password"],
+select {
+ height: 28px;
+ padding-left: 8px;
+}
+
+textarea {
+ width: 100%;
+ height: 150px;
+}
+
+input[type="number"] {
+ text-align: center;
+ padding: 0;
+}
+
+label {
+ cursor: pointer;
+}
+
+label+input {
+ margin-left: 10px;
+}
+
+input[type=checkbox] {
+ margin-left: 0;
+}
+
+td img,
+.prev_thumb {
+ max-width: 100% !important;
+ max-height: 300px;
+}
+
+.txt-center {
+ text-align: center !important;
+}
+
+.txt-left {
+ text-align: left !important;
+}
+
+.txt-right {
+ text-align: right !important;
+}
+
+.frm_info {
+ display: block;
+ margin-bottom: 5px;
+ font-size: 11px;
+ font-family: 'Dotum';
+ color: var(--theme-color-d);
+}
+
+.single-info .frm_info {
+ margin-bottom: 0;
+}
+
+.full {
+ width: 100% !important;
+}
+
+.empty_table {
+ line-height: 200px;
+}
+
+#container {
+ font-family: 'Noto Sans KR', sans-serif;
+}
+
+#container section {
+ position: relative;
+ padding-bottom: 50px;
+}
+
+#container h2 {
+ font-size: 18px;
+ font-weight: 300;
+ margin-bottom: 10px;
+ line-height: 30px;
+ display: flex;
+ gap: 8px;
+}
+
+#container h2:before {
+ content: "\F3E5";
+ font-family: 'icon';
+ padding-right: 5px;
+ font-size: 20px;
+ height: 20px;
+ width: 20px;
+ color: #4b4b47;
+}
+
+#container h3 {
+ font-size: 15px;
+ font-weight: 300;
+ margin-bottom: 10px;
+ line-height: 30px;
+}
+
+.local_ov {
+ border-bottom: 1px solid #efeff1;
+ margin-bottom: 10px;
+ padding-bottom: 10px;
+ font-size: 13px;
+ font-weight: 300;
+}
+
+.ov_listall {
+ display: block;
+ position: relative;
+ float: left;
+ padding: 0 10px 0 0;
+ margin-right: 10px;
+ text-decoration: none;
+ color: var(--theme-color-c);
+}
+
+.ov_listall:before {
+ content: "";
+ display: block;
+ position: absolute;
+ right: 0;
+ top: 3px;
+ bottom: 3px;
+ width: 1px;
+ background: #e1e1e1;
+}
+
+.local_desc {
+ background: var(--theme-color-0);
+ padding: 5px 10px;
+ border: 1px solid var(--theme-color-a);
+ color: #5b5b5a;
+ margin-bottom: 10px;
+ line-height: 1.8em;
+}
+
+.local_desc .point {
+ color: var(--theme-color-c);
+}
+
+.local_desc.pos-top {
+ margin-top: 10px;
+ margin-bottom: 0;
+}
+
+.pg_wrap {
+ display: block;
+ position: relative;
+ text-align: center;
+ padding: 30px 0 30px 0;
+}
+
+.pg_wrap span {
+ display: inline-block;
+ position: relative;
+ text-align: center;
+ vertical-align: middle;
+ margin: 0 10px;
+}
+
+.pg_wrap strong,
+.pg_wrap a {
+ display: inline-block;
+ padding: 0 10px;
+ min-width: 10px;
+ height: 30px;
+ line-height: 30px;
+ text-align: center;
+ background: #fafafa;
+ text-decoration: none;
+ vertical-align: middle;
+ border-radius: 9em;
+}
+
+.pg_wrap strong {
+ background: var(--theme-color-c);
+ color: #fff;
+ border-color: var(--theme-color-c);
+}
+
+.pg_wrap .pg_control {
+ width: 30px;
+ padding: 0;
+ box-sizing: border-box;
+ border: none;
+}
+
+.pg_wrap .pg_control * {
+ line-height: 30px;
+}
+
+.btn_list01 {
+ position: relative;
+ padding: 20px 0;
+}
+
+.local_desc.pos-top+.btn_list01 {
+ padding-top: 10px;
+}
+
+.btn_list01 * {
+ padding: 10px 15px;
+ vertical-align: middle;
+}
+
+.btn_list03 {
+ position: absolute;
+ top: 5px;
+ right: 0;
+}
+
+.btn_list03 * {
+ padding: 5px 10px;
+}
+
+.btn_add01 * {
+ padding: 10px 15px;
+ vertical-align: middle;
+}
+
+.btn_list a,
+.btn_list button,
+.btn_list input {
+ display: inline-block;
+ background: var(--theme-color-c);
+ color: #fff;
+ font-weight: 400;
+ text-decoration: none;
+ border: none;
+ line-height: 1.0em;
+ cursor: pointer;
+}
+
+.btn_add {
+ float: right;
+ clear: both;
+ margin-bottom: 10px;
+}
+
+.btn_add a,
+.btn_add button,
+.btn_add input {
+ display: inline-block;
+ background: var(--theme-color-c);
+ color: #fff;
+ font-size: 13px;
+ font-weight: 400;
+ text-decoration: none;
+ border: none;
+ line-height: 1.0em;
+ cursor: pointer;
+}
+
+.btn_frmline {
+ display: inline-block;
+ background: var(--theme-color-c);
+ color: #fff;
+ font-weight: 400;
+ padding: 0 15px;
+ text-decoration: none;
+ border: none;
+ line-height: 28px;
+ cursor: pointer;
+ vertical-align: middle;
+}
+
+.btn_del_menu {
+ display: inline-block;
+ color: var(--theme-color-c);
+ font-size: 13px;
+ font-weight: 400;
+ border: none;
+ line-height: 1.0em;
+ background: transparent;
+ cursor: pointer;
+}
+
+.sv {
+ display: none !important;
+}
+
+.color-preview {
+ display: inline-block;
+ width: 25px;
+ height: 25px;
+ border: 1px solid #cacaca;
+ vertical-align: middle;
+}
+
+.admin-icon-box {
+ display: inline-block;
+ min-width: 25px;
+ height: 25px;
+ border: 1px solid #cacaca;
+ vertical-align: middle;
+}
+
+table {
+ border-spacing: 0px;
+}
+
+.tbl_wrap table {
+ width: 100%;
+ border-collapse: collapse;
+ table-layout: fixed;
+}
+
+.tbl_head01 thead th {
+ background: #f9f9f9;
+ font-weight: 300;
+ padding: 8px 10px;
+ border: 1px solid #efeff1;
+ font-size: 13px;
+ color: #5b5b5a;
+}
+
+.tbl_head01 .bo-right {
+ border-right-width: 1px !important;
+}
+
+.tbl_head01 .bo-left {
+ border-left-width: 1px !important;
+}
+
+.tbl_head01 .bo-top {
+ border-top-width: 1px !important;
+}
+
+.tbl_head01 .bo-no-right {
+ border-right-width: 0px !important;
+}
+
+.tbl_head01 .bo-no-left {
+ border-left-width: 0px !important;
+}
+
+.tbl_head01 .bo-no-top {
+ border-top-width: 0px !important;
+}
+
+.tbl_head01 .bo-no-bottom {
+ border-bottom-width: 0px !important;
+}
+
+.tbl_head01 tbody td {
+ text-align: center;
+ padding: 7px 10px;
+ color: #5b5b5a;
+ border: 1px solid #efeff1;
+ border-top-width: 0;
+ border-left-width: 0;
+ height: 30px;
+}
+
+.tbl_head01 tbody td:first-child {
+ border-left-width: 1px;
+}
+
+.tbl_head01 tbody td a {
+ color: var(--theme-color-d);
+}
+
+.tbl_head01 tfoot th,
+.tbl_head01 tfoot td {
+ background: #f9f9f9;
+ font-weight: 300;
+ padding: 8px 10px;
+ border: 1px solid #efeff1;
+ border-top-width: 0;
+ border-left-width: 0;
+ font-size: 13px;
+ color: #5b5b5a;
+}
+
+.tbl_head01 tfoot td:first-child,
+.tbl_head01 tfoot th:first-child {
+ border-left-width: 1px;
+}
+
+.tbl_frm01 table {
+ border-top: 1px solid #efeff5;
+}
+
+.tbl_frm01 tbody th,
+.tbl_frm01 tbody td {
+ color: #5b5b5a;
+ font-weight: 400;
+ padding: 10px;
+ border: 0px solid #efeff5;
+ border-bottom-width: 1px;
+}
+
+.tbl_frm01 tbody th {
+ background: #f9f9f9;
+ border-right-width: 1px;
+}
+
+.tbl_frm01 tbody th.bo-right,
+.tbl_frm01 tbody td.bo-right {
+ border-right-width: 1px;
+}
+
+.tbl_frm01 tbody th.bo-left,
+.tbl_frm01 tbody td.bo-left {
+ border-left-width: 1px;
+}
+
+.tbl_frm01 tbody th.bo-top,
+.tbl_frm01 tbody td.bo-top {
+ border-top-width: 1px;
+}
+
+.tbl_frm01 tbody th+td.bo-left {
+ border-left-width: 0px !important;
+}
+
+table .side-image {
+ max-width: 100%;
+}
+
+.index-gnb {
+ display: block;
+ font-size: 13px;
+}
+
+.index-gnb>ul>li {
+ display: table;
+ width: 100%;
+ table-layout: fixed;
+ overflow: hidden;
+ border-bottom: 1px solid rgba(255, 255, 255, .2);
+}
+
+.index-gnb>ul>li>* {
+ display: table-cell;
+}
+
+.index-gnb>ul>li>a {
+ width: 130px;
+ text-align: center;
+ vertical-align: middle;
+ font-size: 14px;
+}
+
+.index-gnb>ul>li>ul {
+ display: block;
+ padding: 10px;
+}
+
+.index-gnb>ul>li>ul>li {
+ display: inline-block;
+ min-width: 130px;
+ vertical-align: middle;
+ padding: 5px 0;
+}
+
+.prev_thumb {
+ max-width: 100px;
+ max-height: 50px;
+}
+
+.banner-thumb {
+ max-width: 200px;
+ max-height: 100px;
+}
+
+.character-thumb {
+ max-width: 200px;
+ max-height: 500px;
+}
+
+
+.ajax-list-box {
+ height: 70px;
+ overflow-y: auto;
+ border: 1px solid #eaeaea;
+ margin-top: 10px;
+ padding: 5px;
+}
+
+.ajax-list-box ul,
+.ajax-list-box li {
+ display: block;
+ margin: 0;
+ padding: 0;
+ position: relative;
+}
+
+.ajax-list-box li {
+ margin-bottom: 5px;
+}
+
+.ajax-list-box li a {
+ display: block;
+ position: relative;
+ padding: 10px;
+ border-radius: 3px;
+ color: #2a2d2a;
+ background: #fafafa;
+ text-decoration: none;
+ font-size: 12px;
+}
+
+.ajax-list-box li a p.point {
+ color: var(--theme-color-c);
+}
+
+.ajax-list-box li a:hover {
+ color: #fff;
+ background: #3a3a3a;
+}
+
+.ajax-list-box li a .ui-thumb {
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ width: 30px;
+ line-height: 30px;
+ overflow: hidden;
+ text-align: center;
+}
+
+.ajax-list-box li a .ui-thumb img {
+ max-width: 100%;
+}
+
+.ajax-list-box li a .ui-info {
+ margin-left: 40px;
+}
+
+.ajax-list-box .no-data {
+ line-height: 50px;
+ text-align: center;
+ margin-top: 10px;
+}
+
+.visit_bar {
+ position: relative
+}
+
+.visit_bar span {
+ position: absolute;
+ top: -8px;
+ left: 0;
+ height: 15px;
+ background: var(--theme-color-c)
+}
+
+/*테마*/
+.theme_p {
+ margin: 0 0 10px
+}
+
+#theme_list {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ width: 1000px;
+ position: relative
+}
+
+#theme_list:after {
+ display: block;
+ visibility: hidden;
+ clear: both;
+ content: ""
+}
+
+#theme_list li {
+ margin: 10px 10px 10px 0;
+ float: left
+}
+
+#theme_list li:after {
+ display: block;
+ visibility: hidden;
+ clear: both;
+ content: ""
+}
+
+#theme_list li .tmli_if {
+ border: 1px solid var(--theme-color-a);
+ width: 300px;
+ box-sizing: border-box;
+ min-height: 240px;
+ display: flex;
+ flex-direction: column;
+}
+
+#theme_list li .tmli_if::before {
+ content: "";
+ height: 220px;
+ background-image: var(--bg);
+ background-size: cover;
+ background-position: center;
+}
+
+#theme_list li .tmli_if>img {
+ width: 300px;
+ height: 225px;
+}
+
+#theme_list li .tmli_if:hover>img {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+ filter: alpha(opacity=50);
+ -moz-opacity: 0.5;
+ -khtml-opacity: 0.5;
+ opacity: 0.5;
+}
+
+#theme_list li .tmli_tit {
+ position: relative;
+ border-top: 1px solid var(--theme-color-a);
+ background: var(--theme-color-0);
+}
+
+#theme_list li .tmli_tit p {
+ height: 40px;
+ line-height: 40px;
+ padding: 0 10px 0;
+ font-weight: bold;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+}
+
+#theme_list li .tmli_tit button.tmli_dt {
+ position: absolute;
+ top: 8px;
+ right: 10px;
+ padding: 5px;
+ background: #111;
+ color: #fff;
+ display: none;
+ border: none
+}
+
+#theme_list li .tmli_if:hover button.tmli_dt {
+ display: block
+}
+
+#theme_list li .theme_sl {
+ float: left;
+ border: none;
+ margin-top: 5px;
+ padding: 0 5px;
+ height: 26px;
+ background: #999;
+ color: #fff
+}
+
+#theme_list li .theme_sl:hover {
+ background: var(--theme-color-d);
+}
+
+#theme_list li .theme_deactive {
+ margin-left: 4px
+}
+
+#theme_list li .theme_sl_use {
+ background: var(--theme-color-d);
+ line-height: 26px
+}
+
+#theme_list li .theme_pr {
+ float: right;
+ margin-top: 5px;
+ padding: 0 5px;
+ height: 26px;
+ line-height: 24px;
+ border: 1px solid #ccc;
+ background: #fafafa;
+}
+
+#theme_list li .theme_preview {
+ float: right;
+ margin-top: 5px;
+ padding: 0 5px;
+ height: 26px;
+ border: 1px solid #ccc;
+ background: #fafafa;
+}
+
+#theme_detail {
+ position: fixed;
+ top: 50%;
+ height: 540px;
+ width: 900px;
+ margin-top: -271px;
+ background: #fff;
+ background: #f3f3f3;
+ border: 1px solid #000;
+ -webkit-box-shadow: 1px 2px 5px rgba(150, 150, 150, 100.5);
+ -moz-box-shadow: 1px 2px 5px rgba(150, 150, 150, 0.5);
+ box-shadow: 1px 2px 5px rgba(150, 150, 150, 0.5);
+ z-index: 1000
+}
+
+#theme_detail:after {
+ display: block;
+ visibility: hidden;
+ clear: both;
+ content: ""
+}
+
+#theme_detail h2 {
+ font-size: 1.25em;
+ background: #fff;
+ padding: 0 15px;
+ line-height: 40px;
+ border-bottom: 1px solid #d8d8d8;
+ margin: 0
+}
+
+.theme_dt_img {
+ float: left;
+ padding: 20px
+}
+
+.theme_dt_img img {
+ border: 1px solid #aaa;
+ max-width: 600px;
+}
+
+.theme_dt_if {
+ float: left;
+ width: 235px;
+ padding: 20px 0
+}
+
+.theme_dt_if table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 15px 0 0;
+ font-size: 0.92em
+}
+
+.theme_dt_if table th {
+ padding: 5px;
+ background: #fff;
+ border-bottom: 1px solid #f3f3f3;
+ vertical-align: top;
+ color: #3f51b5
+}
+
+.theme_dt_if table td {
+ padding: 5px;
+ background: #fff;
+ border-bottom: 1px solid #f3f3f3;
+ line-height: 1.56em
+}
+
+.theme_dt_if table td a {
+ text-decoration: underline
+}
+
+.theme_dt_if p {
+ line-height: 1.5em
+}
+
+.if_p_bg {
+ display: inline-block;
+ width: 20px;
+ height: 1px;
+ background: #000;
+ margin: 30px 0 10px
+}
+
+#theme_detail .theme_dt_btn {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ background: #fff;
+}
+
+#theme_detail .theme_dt_btn .close_btn {
+ border: 0;
+ border-left: 1px solid #d8d8d8;
+ background: url('../img/close.png') 50% 50% no-repeat;
+ width: 40px;
+ height: 40px;
+ overflow: hidden;
+ text-indent: -99999px
+}
+
+#theme_detail .theme_dt_btn .close_btn:hover {
+ background-color: #eceffc
+}
+
+#theme_detail .theme_dt_btn .btn_03 {
+ line-height: 28px;
+ display: inline-block;
+ vertical-align: top;
+ margin-top: 6px;
+ padding: 0 6px;
+ border-radius: 5px
+}
+
+#theme_detail h2:before {
+ content: "\F45D";
+ font-size: 16px;
+}
+
+.footer-copyright {
+ font-size: 14px;
+ color: #A0A0A0;
+ text-align: center;
+}
+
+.footer-copyright a {
+ color: #A0A0A0;
+}
+
+table span.dbchk {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+table i.dbchk.bi {
+ font-size: 16px;
+}
+
+table i.dbchk.bi.bi-x-circle {
+ color: #800000;
+}
+
+.grid_1 {
+ width: 50px
+}
+
+.grid_2 {
+ width: 100px
+}
+
+.grid_3 {
+ width: 150px
+}
+
+.grid_4 {
+ width: 200px
+}
+
+.grid_5 {
+ width: 250px
+}
+
+.grid_6 {
+ width: 300px
+}
+
+.grid_7 {
+ width: 350px
+}
+
+.grid_8 {
+ width: 400px
+}
+
+.grid_9 {
+ width: 450px
+}
+
+.grid_10 {
+ width: 500px
+}
+
+.grid_11 {
+ width: 550px
+}
+
+.grid_12 {
+ width: 600px
+}
+
+.grid_13 {
+ width: 650px
+}
+
+.grid_14 {
+ width: 700px
+}
+
+.grid_15 {
+ width: 750px
+}
+
+.grid_16 {
+ width: 800px
+}
+
+.grid_17 {
+ width: 850px
+}
+
+.grid_18 {
+ width: 900px
+}
+
+
+th a {
+ display: inline-block;
+ vertical-align: middle;
+ padding: 3px 10px;
+ font-weight: 500;
+ color: #fff;
+ margin: 5px 0 0;
+}
+
+th a+a {
+ margin-top: 3px;
+}
+
+td a {
+ color: var(--theme-color-d);
+}
+
+span.empty {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ min-height: 200px;
+ justify-content: center;
+ align-items: center;
+ color: #A0A0A0;
+ border: 1px solid #F0F0F0;
+}
+
+/* amber.lib */
+
+.adm-form {
+ padding: 16px;
+ border-bottom: 1px solid var(--theme-color-e, #efeff5);
+}
+
+.adm-form input,
+.adm-form textarea,
+.adm-form select {
+ outline-color: var(--theme-color-e);
+}
+
+.adm-form:hover {
+ background: var(--theme-color-0);
+}
+
+.adm-form:last-child {
+ margin-bottom: 8px;
+}
+
+.adm-form-postfix {
+ min-width: 40px;
+ text-align: center;
+}
+
+.adm-form-colflex {
+ display: flex;
+ gap: 8px;
+}
+
+.adm-form-rowflex {
+ display: flex;
+ gap: 8px;
+ flex-direction: column;
+ justify-content: center;
+}
+
+.adm-form-colflex .adm-form-flex-full {
+ flex-grow: 1;
+}
+
+.adm-form-name {
+ font-size: 16px;
+ font-weight: bold;
+}
+
+.adm-form-desc {
+ margin: 8px 0 0 0;
+ font-size: 14px;
+}
+
+.adm-form-check {
+ position: relative;
+ width: 48px;
+ height: 24px;
+ margin: 4px 0;
+}
+
+.adm-form-check input[type=checkbox] {
+ width: 48px;
+ height: 24px;
+ position: relative;
+ cursor: pointer;
+ opacity: 0;
+}
+
+.adm-form-check input[type=checkbox]+.adm-form-checkbox-cover {
+ pointer-events: none;
+ box-shadow: inset 0 0 3px #0004;
+ background: #DDD;
+ width: 48px;
+ height: 24px;
+ border-radius: 24px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ display: flex;
+ justify-content: center;
+ transition: .25s;
+}
+
+.adm-form-check input[type=checkbox]+.adm-form-checkbox-cover::before {
+ content: "";
+ height: 18px;
+ width: 18px;
+ border-radius: 50%;
+ background: #FFF;
+ box-shadow: 0 0 3px #0004;
+ transform: translateX(-12px) translateY(3px);
+ box-sizing: border-box;
+ transition: .25s;
+}
+
+.adm-form-check input[type=checkbox]:checked+.adm-form-checkbox-cover {
+ background: var(--theme-color-e, #06C);
+}
+
+.adm-form-check input[type=checkbox]:checked+.adm-form-checkbox-cover::before {
+ transform: translateX(12px) translateY(3px);
+}
+
+.adm-form-select {
+ padding: 4px;
+}
+
+.adm-form-select select {
+ width: 100%;
+ box-sizing: border-box;
+ cursor: pointer;
+ border: 1px solid var(--theme-color-e, #efeff5);
+ border-radius: 4px;
+ padding: 8px;
+ height: auto
+}
+
+.adm-form-text {
+ padding: 4px;
+}
+
+.adm-form-text input[type=text] {
+ border: 1px solid var(--theme-color-e, #efeff5);
+ padding: 8px;
+ border-radius: 4px;
+ height: auto;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+.adm-form-file {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.adm-form-file>div {
+ display: flex;
+ gap: 8px;
+ align-items: center;
+}
+
+.adm-form-file div>span {
+ display: inline-block;
+ min-width: 80px;
+ font-size: 14px;
+}
+
+.adm-form-file div>input {
+ flex-grow: 1;
+ box-sizing: border-box;
+ border: 1px solid var(--theme-color-e, #efeff5);
+ padding: 8px;
+ border-radius: 4px;
+ height: auto;
+}
+
+.adm-form-file div>input[type=file] {
+ cursor: pointer;
+}
+
+.adm-form-listedit {
+ width: 100%;
+}
+
+.adm-form-listedit .adm-listedit-controls {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.adm-listedit-items {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ margin-bottom: 8px;
+ overflow-y: auto;
+ max-height: 360px;
+ box-sizing: border-box;
+ border: 1px solid var(--theme-color-e, #efeff5);
+ border-radius: 4px;
+ padding: 8px;
+}
+
+.adm-listedit-item {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.adm-form-listedit input[type=text] {
+ flex-grow: 1;
+ padding: 8px;
+ flex-grow: 1;
+ box-sizing: border-box;
+ border: 1px solid var(--theme-color-e, #efeff5);
+ border-radius: 4px;
+}
+
+.adm-listedit-remove,
+.adm-listedit-add {
+ min-width: 100px;
+ align-self: stretch;
+ border: 1px solid #ddd;
+ background: #f8f8f8;
+ cursor: pointer;
+ border-radius: 4px;
+ font-size: 14px;
+ white-space: nowrap;
+}
+
+.adm-listedit-remove:hover,
+.adm-listedit-add:hover {
+ background: #e8e8e8;
+}
+
+.adm-listedit-remove {
+ background: var(--theme-color-sub-b, #ff6b6b);
+ color: #000;
+ border-color: var(--theme-color-sub, #ff5252);
+}
+
+.adm-listedit-remove:hover {
+ color: #FFF;
+ background: var(--theme-color-sub, #ff6b6b);
+}
+
+.adm-listedit-add {
+ background: var(--theme-color-e, #4CAF50);
+ color: #000;
+ border-color: var(--theme-color-d, #45a049);
+}
+
+.adm-listedit-add:hover {
+ color: #FFF;
+ background: var(--theme-color-d, #45a049);
+}
+
+.adm-listedit-controls {
+ text-align: left;
+}
+
+.adm-form-number {
+ padding: 4px;
+ display: flex;
+ align-items: center;
+ gap: 8px
+}
+
+.adm-form-number input[type=number] {
+ border: 1px solid var(--theme-color-e, #efeff5);
+ padding: 8px;
+ border-radius: 4px;
+ height: auto;
+ width: 80px;
+ min-width: 60px;
+ box-sizing: border-box;
+}
+
+#page_top a {
+ display: block;
+ position: relative;
+ width: 70px;
+ height: 70px;
+ float: right;
+ border-left: 1px solid #4d515c;
+ overflow: hidden;
+ color: #c3c8cc;
+ text-indent: -999px;
+}
+
+#page_top a:before {
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ font-family: 'icon';
+ line-height: 70px;
+ font-size: 25px;
+ text-align: center;
+ text-indent: 0;
+}
+
+.list_confirm {
+ display: flex;
+ justify-content: end;
+ padding: 16px;
+ gap: 8px;
+}
+
+.list_confirm>* {
+ background: var(--theme-color-c);
+ color: #FFF;
+ cursor: pointer;
+ min-width: 64px;
+ text-align: center;
+ display: block;
+ line-height: 1em;
+ padding: 8px 16px;
+ box-sizing: border-box;
+ border: 0;
+}
+
+#gnb {
+ margin-left: 8px;
+ display: block;
+ position: relative;
+ font-family: 'Noto Sans KR', sans-serif;
+}
+
+#gnb .gnb_1dli {
+ position: relative;
+ overflow: hidden;
+}
+
+#gnb .gnb_1dli>a {
+ padding: 8px;
+ line-height: 16px;
+}
+
+#gnb .gnb_1dli>ul {
+ padding: 0;
+ margin: 0 0 0 8px;
+}
+
+#gnb .gnb_1dli.on>a {
+ color: var(--theme-200);
+}
+
+#gnb .gnb_1dli.on>ul {
+ position: relative;
+ overflow: hidden;
+ border-radius: 4px;
+}
+
+#gnb .gnb_1dli.on>ul::before {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ opacity: .25;
+ background: var(--theme-sub-900);
+ display: block;
+}
+
+#gnb>ul>li>a {
+ display: block;
+ padding: 8px 16px;
+ color: var(--theme-gray-200);
+ font-size: 15px;
+ text-decoration: none;
+}
+
+#gnb .gnb_2dli {
+ position: relative;
+}
+
+#gnb .gnb_2dli>a {
+ display: block;
+ padding: 8px 12px;
+ color: #acaeb2;
+ font-size: 13px;
+}
+
+#gnb .gnb_2dli>a:before {
+ font-family: 'icon';
+ padding-right: 7px;
+}
+
+#gnb .gnb_2dli.check {
+ background: var(--theme-color-d-gnb);
+ border-left: 4px solid var(--theme-color-e);
+ font-weight: bold;
+}
+
+#gnb .gnb_2dli.check>a {
+ color: #FFF;
+}
+
+#gnb .gnb_2dli.check>a:before {
+ color: var(--theme-color-d);
+ font-weight: normal;
+}
+
+#gnb .gnb_2dli>a:hover {
+ color: #fff;
+ background: var(--theme-sub-700);
+ text-decoration: none;
+}
+
+#gnb .gnb_2dli>a:hover:before {
+ color: var(--theme-sub-100);
+}
+
+#gnb .gnb_2dli.on>a:hover {
+ background: var(--theme-700);
+}
+
+#gnb .gnb_2dli.on>a:hover:before {
+ color: var(--theme-100);
+}
+
+#gnb .gnb_2dul {
+ display: none;
+}
+
+#gnb .gnb_2dli>a {
+ display: flex;
+ align-items: center;
+}
+
+#gnb .gnb_2dli.check>a:after {
+ content: "";
+ display: block;
+ position: absolute;
+}
+
+#gnb .gnb_2dli>a:before {
+ content: "\F3E3";
+ font-size: 16px !important;
+ width: 16px;
+ height: 16px;
+}
+
+#gnb .gnb_2dli>a:before {
+ content: var(--icon, "\F3E3");
+}
+
+#fsearch input {
+ margin: 0;
+}
+
+form .btn_submit {
+ border: none;
+ background: var(--theme-color-c);
+ color: #fff;
+ font-size: 13px;
+ width: 50px;
+ height: 28px;
+ cursor: pointer;
+ line-height: 1.0em;
+}
+
+.new_win {
+ padding: 20px;
+}
+
+.new_win_desc {
+ padding: 10px;
+ margin: 20px 0;
+ background: var(--theme-gray-500);
+ color: #fff;
+}
+
+.win-guide {
+ display: block;
+ position: relative;
+ padding: 10px;
+ border: 1px solid #efeff5;
+ background: #f9f9f9;
+}
+
+.win-guide em {
+ color: var(--theme-color-c);
+ font-weight: 800;
+ font-style: normal;
+ padding: 0 10px;
+}
+
+.btn_win02 {
+ padding: 20px;
+ text-align: center;
+}
+
+.btn_win02>* {
+ display: inline-block;
+ background: var(--theme-color-c);
+ color: #fff;
+ font-size: 13px;
+ height: 30px;
+ padding: 0 20px;
+ font-weight: 400;
+ text-decoration: none;
+ border: none;
+ line-height: 1.0em;
+ cursor: pointer;
+}
+
+.add_select {
+ display: inline-block;
+ background: #b0c4de;
+ color: #fff;
+ font-size: 13px;
+ height: 30px;
+ padding: 0 20px;
+ font-weight: 400;
+ text-decoration: none;
+ border: none;
+ line-height: 1.0em;
+ cursor: pointer;
+}
+
+.full_input {
+ width: 100% !important;
+}
+
+.menu_list[data-name="구분선"] td {
+ background: #efeff1;
+}
+
+.menu_list[data-name="구분선"] .td_category~td:not(.order) input,
+.menu_list[data-name="구분선"] .td_category~td:not(.order) select {
+ display: none;
+}
+
+/* 2.4.0 */
+
+body a {
+ text-decoration: none;
+ color: var(--theme-sub-500);
+}
+
+body a:hover {
+ text-decoration: underline;
+ color: var(--theme-sub-300);
+}
+
+html {
+ width: 100vw;
+ height: 100vh;
+ overflow: hidden;
+}
+
+body {
+ position: relative;
+ height: 100vh;
+ overflow: auto;
+}
+
+body #header {
+ position: fixed;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: 240px;
+}
+
+body #header nav>ul {
+ padding: unset;
+}
+
+body #header ul {
+ list-style: none;
+ padding: 0 0 0 16px;
+}
+
+body #wrapper {
+ display: block;
+ position: relative;
+ margin: 0 0 0 248px;
+ height: calc(100vh - 16px);
+ width: calc(100% - 256px);
+ overflow: hidden;
+ border-radius: 4px;
+ box-sizing: border-box;
+}
+
+body #wrapper .admin-content {
+ height: 100%;
+ width: 100%;
+ position: relative;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+}
+
+body #wrapper .admin-content #page_top {
+ position: sticky;
+ top: 0;
+ margin: 0;
+ background: var(--theme-gray-800);
+ color: var(--theme-sub-50);
+}
+
+body #wrapper .admin-content #page_top h2 {
+ display: flex;
+ align-items: center;
+ height: 64px;
+ margin: 0;
+ padding: 0;
+ font-weight: normal;
+ font-size: 20px;
+ line-height: 32px;
+ padding-left: 32px;
+}
+
+body #wrapper .admin-content .footer-copyright {
+ position: sticky;
+ bottom: 0;
+ padding: 8px 16px;
+ background: var(--theme-gray-800);
+ text-align: center;
+}
+
+body #container {
+ overflow: auto;
+ height: 100%;
+ flex-grow: 1;
+ padding: 20px;
+ box-sizing: border-box;
+ background: var(--white);
+}
+
+.anchor {
+ display: flex;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ border-bottom: 1px solid var(--theme-300);
+ margin-bottom: 10px;
+}
+
+.anchor li a {
+ display: block;
+ padding: 8px 12px;
+ color: var(--theme-gray-700);
+ border-top: 1px solid transparent;
+}
+
+.anchor li a.active {
+ border: 1px solid var(--theme-300);
+ border-radius: 4px 4px 0 0;
+ border-bottom: 1px solid var(--white);
+ margin-bottom: -1px;
+ color: var(--black);
+}
+
+.anchor li a:hover {
+ text-decoration: none;
+}
+
+.btn_confirm button {
+ background: transparent;
+}
+
+#admin_prof {
+ height: 80px;
+}
+
+#admin_prof h1 {
+ display: flex;
+ height: 70px;
+ justify-content: center;
+ align-items: center;
+}
+
+#header p {
+ display: flex;
+ justify-content: space-between;
+ padding: 8px;
+ background: var(--theme-gray-600);
+ border-radius: 4px;
+ margin-left: 8px;
+}
+
+#header p a {
+ color: #FFF;
+}
+
+.admin_theme {
+ font-size: 18px;
+ padding-left: 24px;
+ display: block;
+ position: relative;
+}
+
+.admin_theme::before {
+ font-family: 'icon';
+ content: "\F4B0";
+ position: absolute;
+ left: 0;
+ right: 0;
+}
+
+.btn_confirm {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 9999;
+ padding: 0;
+}
+
+.btn_confirm>* {
+ display: block;
+ position: relative;
+ height: 64px;
+ width: 64px;
+ float: left;
+ border: none;
+ color: #fff;
+ cursor: pointer;
+}
+
+.btn_confirm .btn {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border: 2px solid transparent;
+ box-sizing: border-box;
+ transition: .25s;
+}
+
+.btn_confirm .btn>span {
+ position: relative;
+ text-align: center;
+ z-index: 0;
+}
+
+.btn_confirm .btn>input[type=submit],
+.btn_confirm .btn>.btn_submit {
+ position: absolute;
+ display: block;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+ z-index: 1;
+ cursor: pointer;
+}
+
+.manage_buttons {
+ display: flex;
+ gap: 8px;
+ justify-content: space-between;
+}
+
+.btn_confirm .btn,
+.btn_confirm a,
+.btn_confirm button {
+ background: var(--theme-gray-600);
+ margin-left: 1px;
+}
+
+.btn_confirm .btn>span,
+.btn_confirm a>*,
+.btn_confirm button>* {
+ pointer-events: none;
+}
+
+.btn_confirm .btn>input[type=submit],
+.btn_confirm a,
+.btn_confirm button {
+ box-sizing: border-box;
+ border: 2px solid transparent;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 0;
+ transition: .25s;
+}
+
+.btn_confirm a:hover,
+.btn_confirm button:hover,
+.btn_confirm .btn:hover {
+ text-decoration: none;
+ color: var(--white);
+ background-color: var(--theme-sub-700);
+}
+
+#wrap {
+ display: block;
+ position: relative;
+ margin: 0;
+ padding: 8px 0;
+ box-sizing: border-box;
+ background: var(--theme-gray-900);
+ height: 100%;
+}
+
+/* ex css */
+
+.setter {
+ display: block;
+}
+
+.setter>div.css-setting-multi {
+ display: flex;
+ gap: 8px;
+ border: 1px solid #F4F4F2;
+ align-items: center;
+ padding: 4px 8px;
+ justify-content: end;
+}
+
+.setter>div.css-setting-multi input {
+ display: inline-block;
+ flex: 1;
+ max-width: 80px; /* firefox fix */
+ width: auto;
+}
+
+.setter>div.css-setting-multi>.css-left-desc {
+ display: block;
+ text-align: center;
+ min-width: 24px;
+}
+
+.setter>div.css-setting-multi>.css-setting-radius {
+ min-width: 24px;
+ width: 24px;
+ height: 16px;
+ background: #866;
+ box-sizing: border-box;
+}
diff --git a/AvocadoAmber/adm/design_form_css.php b/AvocadoAmber/adm/design_form_css.php
index 83f1824..d53dba1 100644
--- a/AvocadoAmber/adm/design_form_css.php
+++ b/AvocadoAmber/adm/design_form_css.php
@@ -15,6 +15,44 @@ $tab_width = 1024;
$is_item_area = false;
$is_comment_area = false;
+if (!function_exists('hex2rgba')) {
+ function hex2rgba($color, $opacity = false)
+ {
+ $default = 'rgb(0,0,0)';
+ if (empty($color))
+ return $default;
+ if ($color[0] == '#') {
+ $color = substr($color, 1);
+ }
+ if (strlen($color) == 6) {
+ $hex = [$color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5]];
+ } elseif (strlen($color) == 3) {
+ $hex = [$color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2]];
+ } else {
+ return $default;
+ }
+
+ $rgb = array_map('hexdec', $hex);
+
+ if ($opacity) {
+ $opacity = (100 - $opacity) / 100;
+ if (abs($opacity) > 1)
+ $opacity = 1.0;
+ $output = 'rgba(' . implode(",", $rgb) . ',' . $opacity . ')';
+ } else {
+ $output = 'rgb(' . implode(",", $rgb) . ')';
+ }
+ return $output;
+ }
+}
+
+function print_css($key, $index, $css_value) {
+ global $css;
+
+ if (array_key_exists($key, $css) && array_key_exists($index, $css[$key])) {
+ echo $css_value;
+ }
+}
?>
@charset "utf-8";
@@ -49,30 +87,24 @@ $middle_content_width = $content_width + 40;
기본 폰트 설정
***************************************************************/
-* {}
+* {}
body {
}
.txt-default {
}
a, .txt-point, .sch_word {
}
-.txt-menu-font {}
+.txt-menu-font {}
/**************************************************************
@@ -81,25 +113,17 @@ if ($css['color_point'][0])
.enterWrapper {
}
.enterWrapper .guide {
}
@@ -107,16 +131,11 @@ if ($css['intro'][5])
.admin-preview-box,
html.single:before {
}
}
@@ -124,16 +143,11 @@ if ($css['background'][5])
.admin-preview-box,
html.single:before {
}
}
@@ -143,20 +157,16 @@ if ($css['m_background'][5])
***************************************************************/
/* 관리자 미리보기 스타일 정의 */
-.admin-preview-box .gnbWrap { }
+.admin-preview-box .gnbWrap { }
.admin-preview-box .gnbWrap .tooltips {
-}
+}
#topCont a .icons,
.icons-link-box .icons,
.admin-preview-box .gnbWrap .icons {
}
#topCont a .icons:before,
@@ -174,43 +184,29 @@ switch ($css['menu_icon'][13]) {
echo "";
break;
}
-if ($css['menu_icon'][0])
- echo "background-color:" . hex2rgba($css['menu_icon'][0], $css['menu_icon'][1]) . "; ";
-if ($css['menu_icon'][2])
- echo "background:linear-gradient(0deg, " . hex2rgba($css['menu_icon'][2], $css['menu_icon'][3]) . " 0%, " . hex2rgba($css['menu_icon'][4], $css['menu_icon'][5]) . " 100%); ";
-if ($css['menu_icon'][6])
- echo "border-color:" . hex2rgba($css['menu_icon'][6], $css['menu_icon'][7]) . "; ";
-if ($css['menu_icon'][8])
- echo "border-style:{$css['menu_icon'][8]}; ";
-if ($css['menu_icon'][9])
- echo "border-width:{$css['menu_icon'][9]}px; ";
+print_css('menu_icon', 0, "background-color:" . hex2rgba($css['menu_icon'][0], $css['menu_icon'][1]) . "; ");
+print_css('menu_icon', 2, "background:linear-gradient(0deg, " . hex2rgba($css['menu_icon'][2], $css['menu_icon'][3]) . " 0%, " . hex2rgba($css['menu_icon'][4], $css['menu_icon'][5]) . " 100%); ");
+print_css('menu_icon', 6, "border-color:" . hex2rgba($css['menu_icon'][6], $css['menu_icon'][7]) . "; ");
+print_css('menu_icon', 8, "border-style:{$css['menu_icon'][8]}; ");
+print_css('menu_icon', 9, "border-width:{$css['menu_icon'][9]}px; ");
?>}
.admin-preview-box .gnbWrap .tooltips {
}
/* 사용자단 스타일 정의 */
#header .gnbWrap,
-#mo_header .gnbWrap { }
+#mo_header .gnbWrap { }
#header .gnbWrap .tooltips,
#mo_header .gnbWrap .tooltips {
-}
+}
@media all and (min-width: = ($tab_width + 1) ?>px) {
#header {
@@ -318,8 +314,7 @@ switch ($css['use_header'][0]) {
#header .gnbWrap .icons {
}
@@ -336,57 +331,40 @@ switch ($css['menu_icon'][13]) {
echo "";
break;
}
-if ($css['menu_icon'][0])
- echo "background-color:" . hex2rgba($css['menu_icon'][0], $css['menu_icon'][1]) . "; ";
-if ($css['menu_icon'][2])
- echo "background:linear-gradient(0deg, " . hex2rgba($css['menu_icon'][2], $css['menu_icon'][3]) . " 0%, " . hex2rgba($css['menu_icon'][4], $css['menu_icon'][5]) . " 100%); ";
-if ($css['menu_icon'][6])
- echo "border-color:" . hex2rgba($css['menu_icon'][6], $css['menu_icon'][7]) . "; ";
-if ($css['menu_icon'][8])
- echo "border-style:{$css['menu_icon'][8]}; ";
-if ($css['menu_icon'][9])
- echo "border-width:{$css['menu_icon'][9]}px; ";
+print_css('menu_icon', 0, "background-color:" . hex2rgba($css['menu_icon'][0], $css['menu_icon'][1]) . "; ");
+print_css('menu_icon', 2, "background:linear-gradient(0deg, " . hex2rgba($css['menu_icon'][2], $css['menu_icon'][3]) . " 0%, " . hex2rgba($css['menu_icon'][4], $css['menu_icon'][5]) . " 100%); ");
+print_css('menu_icon', 6, "border-color:" . hex2rgba($css['menu_icon'][6], $css['menu_icon'][7]) . "; ");
+print_css('menu_icon', 8, "border-style:{$css['menu_icon'][8]}; ");
+print_css('menu_icon', 9, "border-width:{$css['menu_icon'][9]}px; ");
?>}
#header .gnbWrap .tooltips {
}
}
@media all and (max-width: = $tab_width ?>px) {
#mo_header {
}
#mo_header .gnbWrap a {
}
#mo_header .gnbWrap li.line {
}
body.open-gnb .control-mobile-menu {
}
}
@@ -398,52 +376,38 @@ if ($css['menu_tooltip'][2])
*::-webkit-scrollbar {
}
*::-webkit-scrollbar-track {
}
*::-webkit-scrollbar-thumb {
}
* {
-}
+}
::selection {
}
::-moz-selection {
}
::-webkit-selection {
}
@@ -453,117 +417,79 @@ if ($css['color_bak'][0])
.ui-btn {
}
.ui-btn:hover {
}
.ui-btn.point {
}
.ui-btn.point:hover {
}
.ui-btn.etc {
}
.ui-btn.etc:hover {
}
a.ui-btn {
}
.ui-btn.small {
}
a.ui-btn.small {
}
.ui-btn.big {
}
a.ui-btn.big {
}
@@ -571,11 +497,9 @@ if ($css['input_bak'][2])
검색박스 영역
***************************************************************/
-#bo_sch { }
+#bo_sch { }
#bo_sch button {
-}
+}
/**************************************************************
@@ -586,30 +510,21 @@ if ($css['input_bak'][2])
#bo_w,
#bo_v {
}
#bo_v .board-title,
@@ -617,35 +532,28 @@ if ($css['board_table'][12])
#bo_v #bo_vc,
#bo_v #bo_v_bot {
}
#bo_v .board-title,
#bo_v .board-info {
}
#bo_v #bo_vc,
#bo_v #bo_v_bot {
}
#bo_v .board-title > * {
}
#bo_v #bo_vc .is-reply {
}
@@ -656,28 +564,23 @@ if ($css['form_body'][4])
.pg_wrap {
}
.pg_wrap .pg_page {
}
.pg_wrap .pg_page:hover {
}
.pg_wrap .pg_control {
}
.pg_wrap .pg_current {
}
@@ -687,8 +590,7 @@ if ($css['color_point'][0])
hr.line {
}
@@ -703,8 +605,7 @@ input[type="number"],
input[type="password"],
select {
}
.form-input,
@@ -716,28 +617,19 @@ textarea,
select {
}
*::placeholder {
-}
+}
/**************************************************************
@@ -746,58 +638,40 @@ if ($css['input_bak'][11])
.theme-box {
}
.board-notice-box {
}
@@ -809,75 +683,55 @@ for ($i = 0; $i < count($css['board_notice']['border']); $i++) {
.theme-list thead th {
}
.theme-list tbody th,
.theme-list tbody td {
}
.theme-form tbody th {
}
.theme-form tbody td {
}
@@ -891,33 +745,23 @@ for ($i = 0; $i < count($css['form_body']['border']); $i++) {
#load_log_board {
}
#log_list {
}
@@ -926,40 +770,29 @@ for ($i = 0; $i < count($css['mmb_list']['border']); $i++) {
}
#log_list .item .item-inner .ui-pic {
}
@@ -968,42 +801,31 @@ for ($i = 0; $i < count($css['mmb_log']['border']); $i++) {
}
#log_list .item .item-inner .ui-comment {
}
#log_list .item .item-inner .co-header p.owner,
#log_list .item .item-inner .co-header p.owner a {
}
#log_list .item .item-inner .co-footer .date {
}
#log_list .item .item-inner .co-content .other-site-link {
}
#log_list .item .item-inner .co-content .link_hash_tag {
}
#log_list .item .item-inner .co-content .log_link_tag {
}
diff --git a/AvocadoAmber/adm/items/config/addon_config.php b/AvocadoAmber/adm/items/config/addon_config.php
index cace59e..fb5a5c4 100644
--- a/AvocadoAmber/adm/items/config/addon_config.php
+++ b/AvocadoAmber/adm/items/config/addon_config.php
@@ -19,89 +19,89 @@ include_once G5_ADMIN_PATH . '/admin.head.php';
add_stylesheet(get_embed_file("css", G5_PATH . "/adm/css/addon_config.css"), 1);
?>
-