@charset "utf-8";
/* ----------------------------------------------------------------------------------------------
 *                 ORANGE-PMI PLATFORM  Version 2.0.0 - Last modified 2026-09-22
 *           Modular Web Architecture · Powered by Orangecommunication · www.oranc.net
 * ----------------------------------------------------------------------------------------------
 * 폼 공용 컴포넌트 — 입력칸 · 선택 · 체크 · 필수표시 · 도움말.
 *
 * form.css (public_html/<site>/asset/css) — 이 사이트의 base.php 가 `site::css/form.css` 로 건다.
 *   앞에 `variables.css` 가 먼저 와야 한다 — 색·치수는 거기 토큰을 읽는다.
 *   **이 사이트 소유**다 — 같은 파일이 사이트마다 한 벌씩 있다 (2026-09-21 사용자 결정:
 *   업그레이드가 덮어쓰는 `asset/core/` 에 두지 않는다). 모양을 바꿀 때는 이 파일을 직접 고친다.
 *   ⚠ **다른 사이트에도 같은 파일이 있다 — 한쪽만 고치면 갈라진다.** 공통 규칙을 손볼 때는
 *     `public_html/<site>/asset/css/` 아래 같은 이름을 **전부** 본다. 2026-09-21 이전에 이 복제로
 *     main 이 gwizard 의 수정을 3일간 못 받은 적이 있다. → global-template "공통 UI class"
 *
 *   ── 담는 것 / 담지 않는 것 ──────────────────────────────────────────────────
 *     담는다   c-input · c-select · c-textarea · c-check · c-req · c-help · c-notice
 *     ✗ 버튼   c-btn 은 ui.css — 폼 밖(목록 · 표 안)에서도 쓰므로 폼에 매이지 않는다
 *     ✗ 배치   버튼줄 l-actions · 검색줄 l-search 는 layout.css
 *     ✗ 표     라벨 칸이 딸린 입력형 표는 table.css (c-table)
 *
 *   ★ 이름을 `c-form__input` 으로 짓지 않는다 — Input·Select 는 폼 **밖에서도** 쓰므로 폼의
 *     내부 요소가 아니다(지침 4장). 독립 컴포넌트로 둔다.
 *
 *   ※ 값의 출처는 gwizard 의 레거시 관리자 CSS 다 — 새로 그린 디자인이 아니다.
 *     [구 .input_form · .textarea_form · 전역 select · .ghelp · .inlineblock]
 * ---------------------------------------------------------------------------------------------- */


/*  입력 컨트롤  ==================================================================================
    ★ 높이는 `--control-height` 하나다 — **한 줄에 나란히 서는 넷**(입력칸·select·버튼·정렬 화살표)이
      같은 토큰을 읽는다. 그래서 목록 한 줄에 [이름칸][체크][∧][∨][+][M][C] 가 섞여 서도 위아래가
      맞는다(사용자 지적 2026-09-18). 화살표 규칙은 사이트 CSS 에 있지만 값은 같은 토큰이다 —
      2026-09-19 에 셋만 줄이고 화살표를 빠뜨린 사고가 그래서 이제 일어나지 않는다.
      → variables.css "치수" 절
    ★ 줄 높이는 `calc(--control-height - 2px)` — 위아래 테두리 1px 씩을 뺀 값이다. **높이에서 따라
      나오는 수**라 숫자로 적지 않는다(적어 두면 높이를 고칠 때 같이 고쳐야 하고, 그게 위 사고의 꼴이다).
    ★ input 은 line-height 만으로는 높이가 브라우저마다 갈리므로(폰트 크기에 따라 content 가 더
      커진다) height 를 **명시**한다 — box-sizing:border-box 라 테두리가 이 안에 든다.
    ★ **목록 행 안에서는 `--control-height-sm`** 이다 — 행이 좁아서다. 그 네 줄은 table.css 에
      모여 있다(여기 말고 거기서 고칠 것).
    ★ 안쪽 좌우 여백은 `--control-pad-x` 다 — **셋이 같은 값을 읽는다**(입력칸·select·textarea).
      관리자는 좁고(5px) 사용자쪽은 넓다(10px) — 사이트가 바꾸는 축이라 토큰이다.
      textarea 는 위아래도 같은 값을 쓴다(레거시가 그랬다 — 한 값으로 사방을 준다).  */
.c-input					{vertical-align:middle; height:var(--control-height); border:1px solid var(--border-color); padding:0 var(--control-pad-x); letter-spacing:0; line-height:calc(var(--control-height) - 2px); margin:1px 0; border-radius:var(--radius-input);}
.c-textarea					{width:100%; min-height:50px; background:#fff; padding:var(--control-pad-x); border:1px solid var(--border-color); overflow-x:hidden; overflow-y:auto; resize:none; border-radius:var(--radius-input);}
/*  ★ select 는 height 를 **명시**한다 — min-height 만으로는 안 줄어든다. 브라우저가 폰트·패딩으로
      정한 제 높이가 그보다 크면 그대로여서, 목록 행에서 이것만 크게 남아 튀었다(2026-09-19).
      input 과 같은 이유로 값도 같은 토큰을 읽는다(위 ★ 의 "넷").  */
.c-select					{vertical-align:middle; min-width:80px; height:var(--control-height); line-height:calc(var(--control-height) - 2px); background:#fff; border:1px solid var(--border-color-select); padding:0 var(--control-pad-x); border-radius:var(--radius-input);}
.c-input:focus,
.c-textarea:focus,
.c-select:focus				{border-color:var(--border-color-focus);}

/*  기본값에서 벗어난 입력 — 라인(테두리)과 글자색으로 표시한다. 목록에서 대부분의 행이 기본값이라,
    눈에 걸리는 칸이 곧 "따로 걸어 둔 설정" 이다. 무엇이 기본값인지는 화면(컨트롤러)이 판정한다.
    ★ **상태(`is-`)라서** 컴포넌트가 아니다 — 같은 입력칸이 조건에 따라 띠는 모습이다(지침 2장).
    ★ `.c-select`·`.c-input` **뒤**에 와야 border-color 를 덮는다 — 명시도가 같아 순서가 우선순위다.
      그래서 유틸이 아니라 이 파일 이 자리에 둔다(utilities.css 는 더 뒤라 순서는 되지만, 상태는
      컴포넌트의 사정이므로 컴포넌트 옆에 있는 편이 읽힌다).  */
.is-changed					{border-color:var(--color-changed); color:var(--color-changed-ink); font-weight:600;}
.c-input::placeholder		{color:var(--color-placeholder);}

/*  날짜·시간 입력 — 브라우저가 제 껍데기(테두리·배경)를 따로 그려서 옆의 text 입력과 **선 색이 달라 보였다**
    (사용자 지적 2026-09-23). 껍데기를 벗겨 위 `.c-input` 의 테두리 하나만 남긴다.
    ★ 달력 아이콘은 별도 가상요소라 그대로 남는다.  */
.c-input[type="date"],
.c-input[type="datetime-local"],
.c-input[type="time"],
.c-input[type="month"]		{-webkit-appearance:none; appearance:none; background:#fff;}
/*  잠긴 필드(disabled)는 브라우저 기본 그대로 둔다 — 지금 관리자 화면이 그렇다.
    설정 화면의 🔒 항목이 여기 해당한다. 회색 배경 같은 표시가 필요하면 그때 여기 한 줄을 더한다.  */

/*  체크박스·라디오와 그 글자를 한 덩어리로  [구 .inlineblock]
    라디오도 이 class 를 쓴다 — 모양이 같아 `c-radio` 를 따로 두지 않는다(필요해지면 그때 나눈다).
    ★ 항목 사이 간격도 여기서 준다 — 안 주면 한 줄에 여럿일 때 따닥따닥 붙어 어디까지가 한 항목인지
      안 읽힌다(사용자 지적 2026-09-18). 마지막 것의 오른쪽 여백은 지워 칸이 헐거워지지 않게 한다.
      글자와 네모 사이(input 오른쪽)도 같이 벌린다 — 브라우저 기본은 거의 붙어 있다.
      ※ 화면(HTML)에 margin 을 인라인으로 적지 않는다. 간격도 모양이라 사이트가 정한다.  */
.c-check					{display:inline-block; margin-right:18px;}
.c-check:last-child			{margin-right:0;}
.c-check > input			{margin-right:5px; accent-color:var(--color-primary);}   /* 체크·라디오를 사이트 강조색으로 (2026-09-23) */

/*  분절 선택(라디오 묶음) — 서로 배타인 선택지 **두셋**을 한 덩어리 버튼처럼 붙여 놓는다.
    게시판 권한의 '전체 / 로그인회원 / 관리자' 가 첫 자리다 (admin/bbs.form.php).
    ★ 라디오를 감싸는 <label> 이라 `c-check` 와 **역할이 같다** — 글자를 눌러도 켜진다.
      다만 `c-check` 는 줄에 흩어 놓는 항목의 간격(margin-right)을 갖는 반면 이쪽은 **붙여** 놓으므로
      같은 class 를 쓰지 못한다. 선택지가 흩어져도 되는 자리는 그대로 `c-check` 다.
    ★ 고른 것을 **바탕까지** 칠하는 것은 `:has()` 다 — 못 읽는 브라우저에서는 글자색·굵기만 바뀌어
      선택은 여전히 읽힌다(그래서 둘을 같이 둔다).
    ★ 높이는 입력칸과 같은 토큰 — 한 줄에 select·버튼과 나란히 서도 위아래가 맞는다.  */
.c-seg						{display:inline-flex; align-items:center; border:1px solid var(--border-color); border-radius:var(--radius-md); overflow:hidden; background:#fff; vertical-align:middle;}
.c-seg__item				{display:inline-flex; align-items:center; height:calc(var(--control-height) - 2px); padding:0 11px; margin:0; line-height:1; white-space:nowrap; cursor:pointer; border-right:1px solid var(--border-color);}
.c-seg__item:last-child		{border-right:0;}
.c-seg__item > input		{margin:0 5px 0 0;}
.c-seg__item > input:checked + span	{color:var(--color-primary-ink); font-weight:600;}
.c-seg__item:has(> input:checked)	{background:var(--bg-seg-on);}

/*  도움말 고리 — 머리줄처럼 자리가 좁은 곳에서 설명을 `title` 로 접어 둔다.
    긴 규칙은 여전히 `c-notice` 가 편다 — 이쪽은 **그 자리에서 짧게** 되짚는 용도다.  */
.c-hint						{display:inline-flex; align-items:center; justify-content:center; width:16px; height:16px; margin-left:5px; border-radius:50%; background:rgba(255,255,255,.28); font-size:11px; font-weight:400; line-height:1; cursor:help; vertical-align:middle;}

/*  필수 표시 — **기호까지 CSS 가 낸다.** 화면은 빈 <span class="c-req"></span> 만 두므로
    사이트마다 기호·색을 여기 한 곳에서 바꾼다(HTML 을 건드리지 않는다).
    별표를 쓰는 이유 — 필수 입력의 관례라 설명 없이 읽히고, 획이 단순해 작은 크기에서도 안 뭉갠다
    (옛 ※ 는 획이 많아 본문 크기에서 잘 안 보였다).  */
.c-req::before				{content:'*'; color:var(--color-danger); font-weight:700; font-size:1.3em; line-height:1; vertical-align:middle;}

/*  도움말·안내문 — 입력칸 **아래**(div)와 **옆**(span) 두 가지로 쓴다  [구 .ghelp]
    옆에 쓰면 그 줄의 높이를 늘리지 않는다 — 폭이 정해진 입력(날짜·일시·색)의 설명이 그 자리다.  */
.c-help						{color:var(--color-help); font-size:var(--font-size-xs);}   /* 2026-09-23 0.9 → 0.825. 줄간격은 전역(단위 없는 수)이 제 글자 크기로 세 준다 */
span.c-help					{margin-left:10px; vertical-align:middle;}   /* 입력 옆에 설 때 — 그 줄의 높이를 안 늘린다 */

/*  안내 박스 — 여러 줄짜리 설명을 흐름에서 떼어 감싼다. 입력칸 아래 한 줄짜리 .c-help 와 달리
    "이 섹션이 지금 왜 이런 상태인가"를 말하는 자리라, 글자색만으로는 본문에 묻힌다.
    .c-help 와 **같이** 쓴다 — 글자색·크기는 그대로 두고 상자만 더한다.  */
.c-notice					{border:1px solid var(--color-notice-border); border-left:4px solid var(--color-notice); background:var(--color-notice-bg); border-radius:4px; padding:12px 16px; margin:0 0 15px 0;}


/*  첨부칸 — 즉시 업로드 (upload_input($opt['progress'] = 1 | 2))  =====================================
    레거시 basic_multi 의 모양을 그대로 옮긴 것이다(사용자 지시 2026-09-22 "우선은 모양도 그대로").
    그래서 class 이름이 이 파일의 c-*·u-* 규칙과 다르다 — 레거시 마크업과 1:1로 맞춰 둔 자리라서다.
    값만 이 사이트 토큰으로 갈아끼웠다(레거시 --white1·--border-color1·--transition1 → 아래 토큰).
    움직이는 쪽은 app/guava/asset/js/upload.js, 그리는 쪽은 upload_input().
    ⚠ 레거시가 쓰던 Font Awesome 이 이 플랫폼에 없어(layouts/base.php 주석) 아이콘은 글자(＋·×)로 뒀다.  */

/*  한 자리 (progress 1) — [미리보기][첨부][삭제] 가 한 줄  */
.file_box						{position:relative; display:inline-block; vertical-align:middle;}
.file_box .up_file_progress		{display:none;}
.file_box .file_preview			{float:left; width:130px; height:40px; border-radius:var(--radius-input); overflow:hidden;
								 background:var(--bg-label); display:flex; justify-content:center; align-items:center;}
.file_box .file_preview img		{width:auto; height:100%;}
.file_box .file_preview span	{font-size:0.85em; color:var(--color-mute); padding:0 8px; overflow:hidden; white-space:nowrap;}
.file_box .file_btn				{float:left; width:80px; height:40px; line-height:40px; border-radius:var(--radius-input);
								 background:var(--color-dark); color:#fff; font-weight:500; text-align:center;
								 margin-left:10px; cursor:pointer;}
.file_box .file_btn:hover		{background:var(--color-black);}
.file_box .file_btn--del		{background:var(--color-mute);}
.file_box .file_btn--del:hover	{background:var(--color-danger);}
/*  진행률 — 미리보기 자리 위에 덮어 차오른다  */
.file_box .file_progress		{position:absolute; top:0; left:0; width:0; height:40px; border-radius:var(--radius-input);
								 background:var(--color-primary); opacity:0; transition:width 0.2s ease;}
.file_box .file_progress.is-on	{opacity:0.85;}

/*  여러 개 (progress 2) — 올린 것이 한 줄씩 쌓이고 맨 아래 [＋ 파일 등록]  */
.file_multi .file_items			{margin:0 0 8px 0;}
.up_file_progress2				{display:none;}
.uploaded_file_item				{position:relative; display:flex; align-items:center; justify-content:space-between;
								 font-size:0.9em; line-height:1.2em; padding:12px; margin-bottom:8px;
								 border:1px solid var(--border-color); border-radius:var(--radius-input); background:#fff;
								 overflow:hidden;}
.uploaded_file_item:hover		{border-color:var(--color-dark);}
.uploaded_file_item.uploading	{border-color:var(--color-primary); background:var(--bg-label);}
.uploaded_file_item.completed	{border-color:var(--color-primary);}
.uploaded_file_item.failed		{border-color:var(--color-danger); background:var(--color-danger-ink);}
.uploaded_file_item .file_info	{flex:1; margin-right:30px; min-width:0;}
.uploaded_file_item .file_name	{font-weight:500;}
.uploaded_file_item .file_size	{color:var(--color-mute); font-size:0.85em;}

.upload_progress_container		{position:absolute; bottom:0; left:0; right:0; height:4px; background:var(--border-color);}
.upload_progress_bar			{height:100%; width:0; background:var(--color-primary); transition:width 0.2s ease;}
.upload_percentage				{position:absolute; top:50%; right:40px; transform:translateY(-50%);
								 font-size:0.9em; font-weight:600; color:var(--color-primary);}

.remove_up_file_btns			{position:absolute; right:10px; width:22px; height:22px; flex-shrink:0;
								 display:flex; align-items:center; justify-content:center;
								 border:0; border-radius:50%; background:var(--color-mute); color:#fff;
								 font-weight:bold; line-height:1; cursor:pointer;}
.remove_up_file_btns:hover		{background:var(--color-danger);}
.uploaded_file_btns				{display:inline-block; padding:12px 13px; font-size:0.9em; line-height:1.3em;
								 border-radius:var(--radius-sm); background:var(--color-dark); color:#fff;
								 font-weight:500; text-align:center; cursor:pointer;}
.uploaded_file_btns:hover		{background:var(--color-black);}

/*  올리는 중이거나 아직 올린 것이 없을 때 감추는 것 — 자리는 남겨 두지 않는다  */
.is-hidden						{display:none !important;}

/*  색 고르개 — 견본 + 값 칸이 **한 덩이**로 보이고, 견본을 누르면 팔레트가 그 아래 뜬다 (core/js/colorpicker.js).
    레거시 `data-colorpicker` 의 모양을 옮긴 것이다. 값 칸이 곧 저장값이라 손으로 적어도 된다.  */
.c-colorpick				{position:relative; display:inline-flex; align-items:center; gap:6px; flex:0 0 auto; vertical-align:middle;
							 height:var(--control-height); padding:0 8px 0 4px; margin:1px 0;
							 border:1px solid var(--border-color); border-radius:var(--radius-input); background:#fff;}
.c-colorpick__swatch		{width:calc(var(--control-height) - 14px); height:calc(var(--control-height) - 14px); padding:0;
							 border:0; border-radius:3px; background:var(--bg-label); cursor:pointer;}   /* 고른 색은 JS 가 인라인으로 칠한다. 안 골랐으면 이 옅은 바탕이 보인다(누를 자리) */
/*  값 칸 — 감싸는 상자 **안**이라 자기 테두리·배경을 갖지 않는다. 포커스·자동완성일 때 브라우저가 그리는 것까지
    같이 눌러 둔다(그 상태에서만 안쪽에 네모가 비쳤다 — 사용자 지적 2026-09-23). 명시도를 한 단계 올려 전역 input 규칙을 이긴다.  */
.c-colorpick .c-colorpick__text,
.c-colorpick .c-colorpick__text:focus,
.c-colorpick .c-colorpick__text:focus-visible	{width:88px; height:calc(var(--control-height) - 4px); font-size:0.95em;
							 border:0; outline:0; padding:0; background:transparent; box-shadow:none;}
.c-colorpick .c-colorpick__text:-webkit-autofill	{box-shadow:0 0 0 100px #fff inset;}   /* 자동완성 노란 바탕 덮기 */

/*  팔레트 — 견본 바로 아래. 위에 뜨는 것이 없도록 z-index 는 모달(100000)보다 낮게 둔다.  */
.c-colorpick__pop			{position:absolute; top:calc(100% + 4px); left:0; z-index:900; width:max-content; padding:12px;
							 background:#fff; border:1px solid var(--border-color); border-radius:var(--radius-md); box-shadow:0 4px 16px rgba(0,0,0,.15);}
.c-colorpick__label			{margin:0 0 6px; color:var(--color-mute); font-size:0.85em;}
.c-colorpick__grid			{display:grid; grid-template-columns:repeat(10, 22px); gap:3px; margin-bottom:10px;}
.c-colorpick__cell			{width:22px; height:22px; padding:0; border:1px solid rgba(0,0,0,.12); border-radius:2px; cursor:pointer;}
.c-colorpick__cell:hover	{outline:2px solid var(--color-primary); outline-offset:1px;}
.c-colorpick__foot			{display:flex; align-items:center; gap:6px; padding-top:4px; border-top:1px solid var(--border-color);}
.c-colorpick__foot .c-btn	{margin:0; flex:1 1 auto;}
.c-colorpick__more			{position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;}   /* [다른 색…] 이 click() 으로만 연다 */

/*  토글 스위치 — 켜고 끄는 **한 가지**를 묻는 자리(공지·게시·비공개). 체크박스의 다른 모양일 뿐이라 name·value 는 그대로다.
    체크박스가 여럿 나열되는 자리(분류 고르기 등)는 그냥 `c-check` 를 쓴다 — 스위치는 "켜짐/꺼짐" 하나에만.  */
.c-switch					{display:inline-flex; align-items:center; gap:10px; cursor:pointer; vertical-align:middle;}   /* 옆에 선 도움말·입력과 세로 기준을 맞춘다 */
.c-switch > input			{appearance:none; -webkit-appearance:none; position:relative; flex:0 0 auto; width:44px; height:24px; margin:0;
							 border:0; border-radius:12px; background:var(--bg-switch); cursor:pointer; transition:background .15s;}
.c-switch > input::after	{position:absolute; top:2px; left:2px; content:''; width:20px; height:20px; border-radius:50%;
							 background:#fff; box-shadow:0 1px 3px rgba(0,0,0,.25); transition:left .15s;}
.c-switch > input:checked	{background:var(--color-primary);}
.c-switch > input:checked::after	{left:22px;}
.c-switch > input:focus-visible	{outline:2px solid var(--color-primary); outline-offset:2px;}
