<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>산업안전보건법 &#8211; 산업안전지원센터 주식회사</title>
	<atom:link href="https://safetysupport.co.kr/tag/%ec%82%b0%ec%97%85%ec%95%88%ec%a0%84%eb%b3%b4%ea%b1%b4%eb%b2%95/feed/" rel="self" type="application/rss+xml" />
	<link>https://safetysupport.co.kr</link>
	<description>안전관리위탁부터 위험성평가, 중대재해예방까지 — 사업장 맞춤 안전보건 컨설팅</description>
	<lastBuildDate>Wed, 27 May 2026 12:26:39 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://safetysupport.co.kr/wp-content/uploads/2026/03/cropped-파비콘1-32x32.png</url>
	<title>산업안전보건법 &#8211; 산업안전지원센터 주식회사</title>
	<link>https://safetysupport.co.kr</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>안전보건교육 강사 자격</title>
		<link>https://safetysupport.co.kr/safety-education-instructor-qualification/</link>
		
		<dc:creator><![CDATA[mangjil]]></dc:creator>
		<pubDate>Wed, 27 May 2026 12:08:16 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[강사기준]]></category>
		<category><![CDATA[강사자격]]></category>
		<category><![CDATA[관리감독자]]></category>
		<category><![CDATA[별표1]]></category>
		<category><![CDATA[보건관리자]]></category>
		<category><![CDATA[산업안전보건법]]></category>
		<category><![CDATA[산업안전지도사]]></category>
		<category><![CDATA[시행규칙 제26조]]></category>
		<category><![CDATA[안전관리자]]></category>
		<category><![CDATA[안전보건관리책임자]]></category>
		<category><![CDATA[안전보건교육]]></category>
		<category><![CDATA[자체교육]]></category>
		<guid isPermaLink="false">https://safetysupport.co.kr/?p=4079</guid>

					<description><![CDATA[광고 ● 안전보건 통합조회 안전보건교육강사,법령이 정하는 자격 기준 사업주가 근로자 정기교육·관리감독자 교육 등을 자체적으로 실시할 때, 강사 자격이 인정되는 사람을 한눈에 확인하세요. 법령 근거에 따라 두 갈래로 정리했습니다. 산업안전보건법 시행규칙 제26조 제3항 안전보건교육규정 [별표 1] 근로자등 안전보건교육 강사기준 자체교육 강사 자격이란? 「산업안전보건법」 제29조에 따른 근로자 안전보건교육을 사업장이 외부 위탁 없이 자체적으로 실시할 경우, 교육을 진행할 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="4079" class="elementor elementor-4079" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-be21a5d e-flex e-con-boxed e-con e-parent" data-id="be21a5d" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-c280015 elementor-widget elementor-widget-html" data-id="c280015" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<style>
.smart-top-banner{
  max-width:1060px;
  margin:24px auto 16px;
  padding:0;
  font-family:'NanumSquareNeo','Noto Sans KR',sans-serif;
}
.smart-top-banner__label{
  display:flex;
  align-items:center;
  gap:6px;
  margin-bottom:6px;
  padding:0 4px;
  font-size:10px;
  font-weight:700;
  letter-spacing:0.06em;
  color:#9ca3af;
  text-transform:uppercase;
}
.smart-top-banner__label::before{
  content:'AD';
  display:inline-block;
  padding:1px 5px;
  border-radius:3px;
  background:#0D4444;
  color:#fff;
  font-size:9px;
  letter-spacing:0.06em;
  font-weight:800;
}
.smart-top-banner__inner{
  width:100%;
  min-height:90px;        /* CLS 방지 */
  background:#fafbfc;
  border-radius:8px;
  overflow:hidden;
  display:flex;
  align-items:center;
  justify-content:center;
}
.smart-top-banner__inner ins.adsbygoogle{
  display:block;
  width:100%;
  height:90px;            /* 슬림 리더보드 높이 */
}
/* 모바일: 광고가 너무 작게 안 잡히도록 약간 키움 */
@media (max-width:768px){
  .smart-top-banner{
    margin:16px auto 12px;
    padding:0 16px;
  }
  .smart-top-banner__inner,
  .smart-top-banner__inner ins.adsbygoogle{
    height:100px;
  }
}
@media (max-width:480px){
  .smart-top-banner__inner,
  .smart-top-banner__inner ins.adsbygoogle{
    height:50px;          /* 320×50 모바일 배너 */
    min-height:50px;
  }
  .smart-top-banner__inner{ min-height:50px; }
}
</style>

<div class="smart-top-banner" aria-label="광고 영역">
  <div class="smart-top-banner__label">
    <span>광고</span>
  </div>
  <div class="smart-top-banner__inner">
    <ins class="adsbygoogle"
         style="display:block; width:100%; height:90px;"
         data-ad-client="ca-pub-3106752057307696"
         data-ad-slot="2206462755"
         data-ad-format="horizontal"
         data-full-width-responsive="false"></ins>
    <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
  </div>
</div>
				</div>
				<div class="elementor-element elementor-element-d27767e elementor-widget elementor-widget-html" data-id="d27767e" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/moonspam/NanumSquareNeo@latest/NanumSquareNeo.css">

<style>
#iq-edu{
  --ink:#0D3321;
  --ink-2:#15512f;
  --gold:#C9A961;
  --gold-dk:#B8923C;
  --paper:#f7faf8;
  --line:#dfe8e2;
  --soft:#5b6b62;
  --r-base:#1a6bbf;
  --r-base-bg:#eef5fc;
  --r-std:#0D3321;
  --r-std-bg:#eef5ef;
  --radius:16px;
  --shadow:0 10px 30px -12px rgba(13,51,33,.18);
  --font:'NanumSquareNeo','Noto Sans KR',sans-serif;
  font-family:var(--font);
  color:var(--ink);
  -webkit-font-smoothing:antialiased;
  max-width:1160px;
  margin:0 auto;
  padding:0 16px 60px;
  line-height:1.7;
}
#iq-edu *{box-sizing:border-box}

/* ===== 히어로 ===== */
#iq-edu .iq-hero{
  position:relative;overflow:hidden;border-radius:24px;
  background:radial-gradient(120% 140% at 12% 0%, #15512f 0%, #0D3321 55%, #082015 100%);
  color:#fff;padding:54px 44px 48px;margin:24px 0 28px;box-shadow:var(--shadow);
}
#iq-edu .iq-hero::before{
  content:"";position:absolute;inset:0;
  background-image:repeating-linear-gradient(135deg,rgba(255,255,255,.035) 0 2px,transparent 2px 22px);
  pointer-events:none;
}
#iq-edu .iq-hero svg.iq-deco{
  position:absolute;right:-40px;top:-30px;width:360px;height:360px;
  opacity:.16;pointer-events:none;
}
#iq-edu .iq-eyebrow{
  display:inline-flex;align-items:center;gap:8px;
  font-size:.82rem;letter-spacing:.16em;font-weight:700;color:var(--gold);
  border:1px solid rgba(201,169,97,.45);padding:7px 15px;border-radius:999px;
  margin-bottom:18px;background:rgba(201,169,97,.08);
}
#iq-edu .iq-hero h1{
  font-size:clamp(1.7rem,3.4vw,2.55rem);font-weight:900;line-height:1.28;
  margin:0 0 14px;letter-spacing:-.02em;position:relative;z-index:1;
}
#iq-edu .iq-hero h1 b{color:var(--gold)}
#iq-edu .iq-hero p{
  font-size:1.02rem;color:#dce9e1;max-width:660px;margin:0;font-weight:400;
  position:relative;z-index:1;
}
#iq-edu .iq-hero .iq-law{
  margin-top:22px;display:flex;flex-wrap:wrap;gap:8px;position:relative;z-index:1;
}
#iq-edu .iq-hero .iq-law span{
  font-size:.8rem;background:rgba(255,255,255,.1);
  border:1px solid rgba(255,255,255,.18);
  padding:6px 13px;border-radius:8px;color:#eaf3ee;font-weight:600;
}

/* ===== 안내 ===== */
#iq-edu .iq-intro{
  background:#fff;border:1px solid var(--line);border-radius:var(--radius);
  padding:24px 26px;margin-bottom:24px;box-shadow:0 4px 14px -10px rgba(13,51,33,.2);
  position:relative;
}
#iq-edu .iq-intro::before{
  content:"";position:absolute;left:0;top:18px;bottom:18px;width:4px;
  background:linear-gradient(var(--gold),var(--gold-dk));border-radius:4px;
}
#iq-edu .iq-intro h2{font-size:1.12rem;font-weight:800;margin:0 0 8px;padding-left:14px;}
#iq-edu .iq-intro p{font-size:.95rem;color:var(--soft);margin:0;padding-left:14px}
#iq-edu .iq-intro p b{color:var(--ink)}

/* ===== 검색/필터 바 ===== */
#iq-edu .iq-toolbar{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-bottom:22px;}
#iq-edu .iq-search{flex:1 1 280px;position:relative;}
#iq-edu .iq-search input{
  width:100%;font-family:var(--font);font-size:.95rem;
  padding:13px 16px 13px 44px;border:1.5px solid var(--line);
  border-radius:12px;outline:none;background:#fff;color:var(--ink);
  transition:border-color .2s, box-shadow .2s;
}
#iq-edu .iq-search input:focus{
  border-color:var(--gold);box-shadow:0 0 0 3px rgba(201,169,97,.16);
}
#iq-edu .iq-search svg{
  position:absolute;left:15px;top:50%;transform:translateY(-50%);
  width:18px;height:18px;color:var(--soft);
}
#iq-edu .iq-tabs{display:flex;gap:8px;flex-wrap:wrap}
#iq-edu .iq-tab{
  font-family:var(--font);font-weight:700;font-size:.88rem;cursor:pointer;
  padding:12px 18px;border-radius:12px;border:1.5px solid var(--line);
  background:#fff;color:var(--soft);transition:all .18s;white-space:nowrap;
}
#iq-edu .iq-tab:hover{border-color:var(--ink);color:var(--ink)}
#iq-edu .iq-tab.on{
  background:var(--ink);border-color:var(--ink);color:#fff;
  box-shadow:0 6px 16px -8px rgba(13,51,33,.5);
}

/* ===== 섹션 헤더 ===== */
#iq-edu .iq-sec{margin-bottom:34px}
#iq-edu .iq-sec-head{
  display:flex;align-items:flex-start;gap:14px;margin-bottom:18px;
  padding-bottom:14px;border-bottom:2px solid var(--line);
}
#iq-edu .iq-sec-num{
  flex:none;width:46px;height:46px;border-radius:12px;
  display:grid;place-items:center;font-weight:900;font-size:1.1rem;color:#fff;
}
#iq-edu .iq-sec[data-group="base"] .iq-sec-num{background:linear-gradient(135deg,#2c84e0,#1a6bbf)}
#iq-edu .iq-sec[data-group="std"]  .iq-sec-num{background:linear-gradient(135deg,#15512f,#0D3321)}
#iq-edu .iq-sec-tt{flex:1}
#iq-edu .iq-sec-tt h2{font-size:1.22rem;font-weight:900;margin:0 0 4px;letter-spacing:-.01em}
#iq-edu .iq-sec-tt .iq-cite{font-size:.82rem;color:var(--soft);font-weight:600;}
#iq-edu .iq-sec-tt .iq-cite a{color:var(--r-base);text-decoration:none;border-bottom:1px dotted}
#iq-edu .iq-sec[data-group="std"] .iq-sec-tt .iq-cite a{color:var(--ink-2)}

/* ===== 공통 리스트형 (① ② 섹션 모두 사용) ===== */

/* ===== 공통 리스트형 (① ② 섹션 공용) ===== */
#iq-edu .iq-list{
  display:flex;flex-direction:column;gap:0;
  border:1px solid var(--line);border-radius:var(--radius);
  overflow:hidden;background:#fff;
  box-shadow:0 3px 10px -7px rgba(13,51,33,.2);
}
#iq-edu .iq-list-row{
  display:grid;
  grid-template-columns:90px 1fr;
  border-bottom:1px solid var(--line);
  transition:background-color .18s;
  position:relative;
}
#iq-edu .iq-list-row:last-child{border-bottom:none;}

/* ① base 섹션 호버: 파란빛 */
#iq-edu .iq-sec[data-group="base"] .iq-list-row:hover{background-color:#f4f9fe;}
/* ② std 섹션 호버: 크림빛 */
#iq-edu .iq-sec[data-group="std"]  .iq-list-row:hover{background-color:#fdf9f2;}

#iq-edu .iq-list-no{
  display:flex;align-items:flex-start;justify-content:center;
  padding:20px 16px;
  border-right:1px solid var(--line);
  flex-shrink:0;
}
/* ① base 섹션 번호 배경: 파란 계열 */
#iq-edu .iq-sec[data-group="base"] .iq-list-no{background:var(--r-base-bg);}
/* ② std 섹션 번호 배경: 그린 계열 */
#iq-edu .iq-sec[data-group="std"]  .iq-list-no{background:var(--r-std-bg);}

#iq-edu .iq-list-no span{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:52px;height:28px;padding:0 8px;border-radius:7px;
  font-weight:900;font-size:.82rem;
  background:#fff;color:var(--ink);
  border:1px solid var(--line);
  white-space:nowrap;
}
#iq-edu .iq-list-body{
  padding:18px 22px;
  display:flex;flex-direction:column;gap:4px;
}
#iq-edu .iq-list-body h3{
  font-size:1.0rem;font-weight:800;margin:0 0 4px;color:var(--ink);line-height:1.4;
}
#iq-edu .iq-list-body p{
  font-size:.9rem;color:var(--soft);margin:0;line-height:1.65;
}
#iq-edu .iq-list-body .iq-sub2{
  margin-top:8px;padding-top:8px;border-top:1px dashed var(--line);
  display:flex;flex-direction:column;gap:5px;
}
#iq-edu .iq-list-body .iq-sub2 .iq-item2{
  display:grid;grid-template-columns:auto 1fr;gap:6px;
  font-size:.85rem;color:var(--ink-2);font-weight:600;align-items:baseline;
}
#iq-edu .iq-list-body .iq-sub2 .iq-item2 span.k2{
  color:var(--gold-dk);font-weight:900;white-space:nowrap;
}
#iq-edu .iq-list-body .iq-tag2{
  margin-top:8px;display:inline-flex;align-items:center;gap:5px;
  font-size:.75rem;font-weight:700;padding:4px 10px;border-radius:999px;
  background:var(--paper);color:var(--soft);border:1px solid var(--line);width:fit-content;
}
/* 링크 스타일 */
#iq-edu .iq-link{
  display:inline-flex;align-items:center;gap:4px;
  font-size:.8rem;font-weight:700;color:var(--r-base);
  text-decoration:none;border-bottom:1px dotted var(--r-base);
  transition:color .15s;margin-top:2px;
}
#iq-edu .iq-link:hover{color:var(--ink)}

/* ===== 강조 노트 ===== */
#iq-edu .iq-note{
  background:linear-gradient(180deg,#fbfdfb,#f4f8f5);
  border:1px solid var(--line);border-left:4px solid var(--gold);
  border-radius:12px;padding:18px 22px;margin-top:8px;font-size:.9rem;color:var(--ink-2);
}
#iq-edu .iq-note b{color:var(--ink)}

/* ===== 결과 없음 ===== */
#iq-edu .iq-empty{
  display:none;text-align:center;padding:50px 20px;color:var(--soft);
  border:1.5px dashed var(--line);border-radius:var(--radius);background:#fff;
}
#iq-edu .iq-empty.show{display:block}

/* ===== 푸터 ===== */
#iq-edu .iq-foot{
  margin-top:34px;padding:20px 24px;border-radius:14px;
  background:var(--ink);color:#cfe0d6;font-size:.84rem;line-height:1.7;
}
#iq-edu .iq-foot b{color:var(--gold)}
#iq-edu .iq-foot .iq-foot-tt{font-weight:800;color:#fff;font-size:.95rem;margin-bottom:6px;display:block;}

/* 숨김 처리 */
#iq-edu .iq-list-row.hide{display:none}
#iq-edu .iq-sec.hide{display:none}

@media(max-width:600px){
  #iq-edu .iq-hero{padding:38px 24px 34px}
  #iq-edu .iq-grid{grid-template-columns:1fr}
  #iq-edu .iq-list-row{grid-template-columns:72px 1fr}
  #iq-edu .iq-list-no{padding:16px 10px}
  #iq-edu .iq-list-no span{min-width:44px;font-size:.76rem}
}
</style>

<div id="iq-edu">

  <!-- ===== 히어로 ===== -->
  <div class="iq-hero">
    <svg class="iq-deco" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
      <circle cx="100" cy="100" r="78" stroke="#C9A961" stroke-width="2"/>
      <circle cx="100" cy="100" r="58" stroke="#fff" stroke-width="1.2"/>
      <path d="M100 42 L100 158 M42 100 L158 100" stroke="#C9A961" stroke-width="1.2"/>
      <rect x="74" y="74" width="52" height="52" rx="8" stroke="#fff" stroke-width="2" transform="rotate(45 100 100)"/>
      <path d="M88 100 l9 9 l16 -18" stroke="#C9A961" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
    </svg>
    <span class="iq-eyebrow">● 안전보건 통합조회</span>
    <h1>안전보건교육강사,<br><b>법령이 정하는 자격 기준</b></h1>
    <p>사업주가 근로자 정기교육·관리감독자 교육 등을 자체적으로 실시할 때, 강사 자격이 인정되는 사람을 한눈에 확인하세요. 법령 근거에 따라 두 갈래로 정리했습니다.</p>
    <div class="iq-law">
      <span>산업안전보건법 시행규칙 제26조 제3항</span>
      <span>안전보건교육규정 [별표 1] 근로자등 안전보건교육 강사기준</span>
    </div>
  </div>

  <!-- ===== 안내 ===== -->
  <div class="iq-intro">
    <h2>자체교육 강사 자격이란?</h2>
    <p><b>「산업안전보건법」 제29조</b>에 따른 근로자 안전보건교육을 사업장이 외부 위탁 없이 <b>자체적으로 실시</b>할 경우, 교육을 진행할 수 있는 사람의 자격 요건입니다. 아래 ① 시행규칙 제26조 제3항의 기본 자격과, ② 그 중 제4호('학식·경험이 있는 사람')의 세부 기준인 [별표 1]을 함께 확인하시기 바랍니다.</p>
  </div>

  <!-- ===== 검색/필터 ===== -->
  <div class="iq-toolbar">
    <div class="iq-search">
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="m21 21-4.3-4.3"/></svg>
      <input id="iqSearch" type="text" placeholder="자격·직무·면허로 검색 (예: 노무사, 안전관리자, 소방, 3년)">
    </div>
    <div class="iq-tabs">
      <button class="iq-tab on" data-tab="all">전체</button>
      <button class="iq-tab" data-tab="base">시행규칙 제26조③</button>
      <button class="iq-tab" data-tab="std">별표 1 강사기준</button>
    </div>
  </div>

  <!-- ===== ① 섹션: 시행규칙 제26조 제3항 (카드 그리드) ===== -->
  <section class="iq-sec" data-group="base">
    <div class="iq-sec-head">
      <div class="iq-sec-num">①</div>
      <div class="iq-sec-tt">
        <h2>자체교육 강사가 될 수 있는 사람</h2>
        <div class="iq-cite">산업안전보건법 시행규칙 제26조 제3항 ·
          <a href="https://www.law.go.kr/법령/산업안전보건법시행규칙/(20260101,00443,20250530)/제26조" target="_blank" rel="noopener">법령 원문 보기 ↗</a>
        </div>
      </div>
    </div>

    <div class="iq-list">

      <div class="iq-list-row" data-keys="안전보건관리책임자 책임자 선임 사업장 관리감독자 안전관리자 보건관리자 담당자 산업보건의 위탁 전문기관">
        <div class="iq-list-no"><span>제1호</span></div>
        <div class="iq-list-body">
          <h3>사업장 내 안전보건 선임자</h3>
          <p>법령에 따라 사업장에 선임·지정된 안전보건 관리 주체는 모두 자체교육 강사가 될 수 있습니다.</p>
          <div class="iq-sub2">
            <div class="iq-item2"><span class="k2">가.</span><span>안전보건관리책임자 <span style="color:var(--soft);font-weight:400">(법 제15조①)</span></span></div>
            <div class="iq-item2"><span class="k2">나.</span><span>관리감독자 <span style="color:var(--soft);font-weight:400">(법 제16조①)</span></span></div>
            <div class="iq-item2"><span class="k2">다.</span><span>안전관리자 <span style="color:var(--soft);font-weight:400">(법 제17조① · 위탁수행자 포함)</span></span></div>
            <div class="iq-item2"><span class="k2">라.</span><span>보건관리자 <span style="color:var(--soft);font-weight:400">(법 제18조① · 위탁수행자 포함)</span></span></div>
            <div class="iq-item2"><span class="k2">마.</span><span>안전보건관리담당자 <span style="color:var(--soft);font-weight:400">(법 제19조① · 위탁수행자 포함)</span></span></div>
            <div class="iq-item2"><span class="k2">바.</span><span>산업보건의 <span style="color:var(--soft);font-weight:400">(법 제22조①)</span></span></div>
          </div>
          <span class="iq-tag2">▸ 가장 일반적인 사내 강사 자격</span>
        </div>
      </div>

      <div class="iq-list-row" data-keys="공단 안전보건공단 강사요원 교육과정 이수 KOSHA 양성">
        <div class="iq-list-no"><span>제2호</span></div>
        <div class="iq-list-body">
          <h3>공단 강사요원 과정 이수자</h3>
          <p>한국산업안전보건공단(KOSHA)에서 실시하는 <b>해당 분야의 강사요원 교육과정</b>을 이수한 사람입니다.</p>
          <span class="iq-tag2">▸ 교육받은 '해당 분야'에 한정</span>
        </div>
      </div>

      <div class="iq-list-row" data-keys="지도사 산업안전지도사 산업보건지도사 142조 국가전문자격">
        <div class="iq-list-no"><span>제3호</span></div>
        <div class="iq-list-body">
          <h3>산업안전·보건지도사</h3>
          <p>「산업안전보건법」 제142조에 따른 <b>산업안전지도사</b> 또는 <b>산업보건지도사</b>(이하 "지도사")입니다.</p>
          <span class="iq-tag2">▸ 국가전문자격 보유자</span>
        </div>
      </div>

      <div class="iq-list-row" data-keys="학식 경험 고용노동부장관 기준 별표1 별표 강사기준 세부">
        <div class="iq-list-no"><span>제4호</span></div>
        <div class="iq-list-body">
          <h3>학식·경험이 있는 사람</h3>
          <p>산업안전보건에 관하여 학식과 경험이 있는 사람으로서 <b>고용노동부장관이 정하는 기준</b>(아래 ② [별표 1])에 해당하는 사람입니다.</p>
          <span class="iq-tag2" style="background:var(--r-base-bg);color:var(--r-base);border-color:#bcd9f2">▸ 세부 기준은 아래 [별표 1] 참고 ↓</span>
        </div>
      </div>

    </div>
  </section>

  <!-- ===== ② 섹션: 별표 1 강사기준 (리스트형) ===== -->
  <section class="iq-sec" data-group="std">
    <div class="iq-sec-head">
      <div class="iq-sec-num">②</div>
      <div class="iq-sec-tt">
        <h2>'학식·경험이 있는 사람'의 세부 기준</h2>
        <div class="iq-cite">근로자등 안전보건교육 강사기준 [별표 1] (제3조의2·제10조·제15조 관련) · 개정 2025.11.27.</div>
      </div>
    </div>

    <div class="iq-note" style="margin-bottom:18px">
      위 <b>제4호</b>의 '고용노동부장관이 정하는 기준'에 해당하는 구체적 자격입니다. 아래 중 어느 하나에 해당하면 자체교육 강사로 인정됩니다.
    </div>

    <div class="iq-list">

      <!-- 제1호 -->
      <div class="iq-list-row" data-keys="안전보건교육기관 직무교육기관 강사 등급 자격 동급 별표10 별표12">
        <div class="iq-list-no"><span>제1호</span></div>
        <div class="iq-list-body">
          <h3>교육기관 강사 동급 이상 자격자</h3>
          <p>안전보건교육기관 및 직무교육기관의 강사와 <b>같은 등급 이상의 자격</b>을 가진 사람.</p>
          <div style="display:flex;flex-wrap:wrap;gap:8px;margin-top:6px;">
            <a class="iq-link" href="https://www.law.go.kr/법령별표서식/(산업안전보건법 시행령,20260324,별표10)" target="_blank" rel="noopener">시행령 별표10 (안전보건교육기관 강사 기준) ↗</a>
            <a class="iq-link" href="https://www.law.go.kr/법령별표서식/(산업안전보건법 시행령,20260324,별표12)" target="_blank" rel="noopener">시행령 별표12 (직무교육기관 강사 기준) ↗</a>
          </div>
          <span class="iq-tag2">▸ 강사 등급 기준 충족</span>
        </div>
      </div>

      <!-- 제2호 -->
      <div class="iq-list-row" data-keys="사업주 대표자 대표이사 안전보건 이사 임원 경영진">
        <div class="iq-list-no"><span>제2호</span></div>
        <div class="iq-list-body">
          <h3>사업주·대표자·안전보건 이사</h3>
          <p>사업주, 법인의 대표자, 대표이사 및 <b>안전보건 관련 이사</b>.</p>
          <span class="iq-tag2">▸ 경영 책임 라인</span>
        </div>
      </div>

      <!-- 제3호 -->
      <div class="iq-list-row" data-keys="중대재해처벌법 중처법 전담조직 총괄 관리 업무경력 시행령 4조 2호">
        <div class="iq-list-no"><span>제3호</span></div>
        <div class="iq-list-body">
          <h3>중처법상 안전·보건 전담조직 소속자</h3>
          <p>「중대재해처벌법 시행령」 제4조제2호에 따른 안전·보건 업무 총괄·관리 <b>전담조직 소속</b>으로서 업무 경력이 있는 사람.</p>
          <div class="iq-sub2">
            <div class="iq-item2"><span class="k2">※</span><span>전담조직이 관리하는 <b>모든 사업장</b>을 대상으로 교육 가능</span></div>
          </div>
          <span class="iq-tag2">▸ 전사(全社) 교육 권한</span>
        </div>
      </div>

      <!-- 제4호 -->
      <div class="iq-list-row" data-keys="작업 3년 근무 경력 사업주 인정 적정 현장">
        <div class="iq-list-no"><span>제4호</span></div>
        <div class="iq-list-body">
          <h3>현장 작업 3년 이상 경력자</h3>
          <p>사업장 내 작업에 <b>3년 이상 근무</b>한 경력이 있는 사람으로서, <b>사업주가 강사로 적정하다고 인정</b>하는 사람.</p>
          <span class="iq-tag2">▸ 사업주 인정 필요</span>
        </div>
      </div>

      <!-- 제5호 가 -->
      <div class="iq-list-row" data-keys="안전관리전문기관 보건관리전문기관 건설재해예방전문지도기관 석면조사기관 종사자 실무경력 3년">
        <div class="iq-list-no"><span>제5호 가</span></div>
        <div class="iq-list-body">
          <h3>전문기관 종사자 (실무경력 3년 이상)</h3>
          <p>안전·보건관리전문기관, 건설재해예방전문지도기관, 석면조사기관의 종사자로서 <b>실무경력 3년 이상</b>인 사람.</p>
          <span class="iq-tag2">▸ 실무경험 보유자</span>
        </div>
      </div>

      <!-- 제5호 나 -->
      <div class="iq-list-row" data-keys="소방공무원 응급구조사 국가자격 실무경력 3년 구급">
        <div class="iq-list-no"><span>제5호 나</span></div>
        <div class="iq-list-body">
          <h3>소방공무원·응급구조사 (실무경력 3년 이상)</h3>
          <p>소방공무원 및 응급구조사 국가자격 취득자로서 <b>실무경력 3년 이상</b>인 사람.</p>
          <span class="iq-tag2">▸ 실무경험 보유자</span>
        </div>
      </div>

      <!-- 제5호 다 -->
      <div class="iq-list-row" data-keys="근골격계 물리치료사 작업치료사 생활스포츠지도사 직무스트레스 임상심리사 정신보건 전문가 면허 학위">
        <div class="iq-list-no"><span>제5호 다</span></div>
        <div class="iq-list-body">
          <h3>근골격계·직무스트레스 예방 전문가</h3>
          <p>해당 분야 국가면허·자격·학위 취득자로서 실무경험을 보유한 사람.</p>
          <div class="iq-sub2">
            <div class="iq-item2"><span class="k2">근골격계</span><span>물리치료사·작업치료사, 1급 생활스포츠지도사</span></div>
            <div class="iq-item2"><span class="k2">직무스트레스</span><span>임상심리사, 정신보건임상심리사 등 정신보건 관련 국가면허·자격·학위 취득자</span></div>
          </div>
          <span class="iq-tag2">▸ 보건 전문 분야</span>
        </div>
      </div>

      <!-- 제5호 라 -->
      <div class="iq-list-row" data-keys="의사 의료법 5조 간호사 간호법 4조 자격">
        <div class="iq-list-no"><span>제5호 라</span></div>
        <div class="iq-list-body">
          <h3>의사·간호사</h3>
          <p>「의료법」 제5조에 따른 <b>의사</b> 또는 「간호법」 제4조에 따른 <b>간호사</b> 자격을 가진 사람.</p>
          <span class="iq-tag2">▸ 의료 국가면허</span>
        </div>
      </div>

      <!-- 제5호 마 -->
      <div class="iq-list-row" data-keys="공인노무사 노무사 노무사법 3조 자격">
        <div class="iq-list-no"><span>제5호 마</span></div>
        <div class="iq-list-body">
          <h3>공인노무사</h3>
          <p>「공인노무사법」 제3조에 따라 <b>공인노무사</b> 자격을 가진 사람.</p>
          <span class="iq-tag2">▸ 국가전문자격</span>
        </div>
      </div>

      <!-- 제5호 바 -->
      <div class="iq-list-row" data-keys="변호사 변호사법 4조 자격 법률">
        <div class="iq-list-no"><span>제5호 바</span></div>
        <div class="iq-list-body">
          <h3>변호사</h3>
          <p>「변호사법」 제4조에 따라 <b>변호사</b> 자격이 있는 사람.</p>
          <span class="iq-tag2">▸ 국가전문자격</span>
        </div>
      </div>

      <!-- 제5호 사 -->
      <div class="iq-list-row" data-keys="한국교통안전공단 교통안전관리 실무경력 3년 TS">
        <div class="iq-list-no"><span>제5호 사</span></div>
        <div class="iq-list-body">
          <h3>교통안전관리 실무경력자 (3년 이상)</h3>
          <p>한국교통안전공단에서 <b>교통안전관리 실무경력 3년 이상</b>인 사람.</p>
          <span class="iq-tag2">▸ 실무경험 보유자</span>
        </div>
      </div>

      <!-- 제5호 아 -->
      <div class="iq-list-row" data-keys="보건복지부 자살예방교육 전문강사 양성과정 이수 정신건강">
        <div class="iq-list-no"><span>제5호 아</span></div>
        <div class="iq-list-body">
          <h3>자살예방교육 전문강사 양성과정 이수자</h3>
          <p>보건복지부에서 실시하는 <b>자살예방교육 전문강사 양성과정</b> 이수자.</p>
          <span class="iq-tag2">▸ 보건복지부 과정</span>
        </div>
      </div>

    </div><!-- /iq-list -->
  </section>

  <!-- 검색 결과 없음 -->
  <div class="iq-empty" id="iqEmpty">
    🔍 검색 결과가 없습니다. 다른 키워드(예: <b>노무사·소방·안전관리자·3년</b>)로 검색해 보세요.
  </div>

  <!-- ===== 실무 안내 ===== -->
  <div class="iq-note">
    <b>실무 Tip.</b> 자체교육을 실시한 경우에도 <b>교육일지·교육일시·교육내용·참석자 명단·강사 자격 확인 자료</b>를 갖추어 보관해야 합니다. 강사가 위 자격 중 어디에 해당하는지 근거(자격증 사본, 경력증명, 선임서 등)를 함께 기록해 두면 점검·감독 시 입증이 용이합니다.
  </div>

  <!-- ===== 출처 ===== -->
  <div class="iq-foot">
    <span class="iq-foot-tt">법령 근거 및 유의사항</span>
    · 「산업안전보건법 시행규칙」 <b>제26조 제3항</b> (사업주의 자체 안전보건교육 강사 요건)<br>
    · 「근로자등 안전보건교육 강사기준」 <b>[별표 1]</b> (제3조의2·제10조·제15조 관련, 개정 2025.11.27.)<br>
    · 본 자료는 이해를 돕기 위한 정리본입니다. 실제 적용 시 최신 법령 원문 및 고용노동부 고시를 반드시 확인하시기 바랍니다. <b>ⓒ 산업안전지원센터</b>
  </div>

</div>

<script>
(function(){
  var root   = document.getElementById('iq-edu');
  var input  = root.querySelector('#iqSearch');
  var tabs   = root.querySelectorAll('.iq-tab');
  var secs   = root.querySelectorAll('.iq-sec');
  var empty  = root.querySelector('#iqEmpty');
  var curTab = 'all';

  function norm(s){return (s||'').toLowerCase().replace(/\s+/g,'');}

  function apply(){
    var q = norm(input.value);
    var anyVisible = false;

    secs.forEach(function(sec){
      var group = sec.getAttribute('data-group');
      var tabOK = (curTab==='all' || curTab===group);
      var secHasItem = false;

      /* ① ② 섹션 공통: .iq-list-row */
      sec.querySelectorAll('.iq-list-row').forEach(function(row){
        var hay = norm(row.getAttribute('data-keys') + ' ' + row.textContent);
        var match = (q==='' || hay.indexOf(q)>-1);
        var show = tabOK && match;
        row.classList.toggle('hide', !show);
        if(show){secHasItem = true; anyVisible = true;}
      });

      sec.classList.toggle('hide', !tabOK || !secHasItem);
    });

    empty.classList.toggle('show', !anyVisible);
  }

  tabs.forEach(function(t){
    t.addEventListener('click', function(){
      tabs.forEach(function(x){x.classList.remove('on')});
      t.classList.add('on');
      curTab = t.getAttribute('data-tab');
      apply();
    });
  });

  input.addEventListener('input', apply);
})();
</script>				</div>
				<div class="elementor-element elementor-element-ad22e29 elementor-widget elementor-widget-html" data-id="ad22e29" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<style>
.smart-float-ad {
  position: fixed;
  right: 50%;
  margin-right: 630px;          /* ★ 수정: 1140/2 + 60 = 630px */
  top: 50%;
  transform: translateY(-50%);
  z-index: 9998;
  width: 180px;
  padding: 10px 10px 8px;
  border-radius: 18px;
  background: rgba(255,255,255,0.88);
  border: 1px solid rgba(13,68,68,0.12);
  box-shadow: 0 12px 32px rgba(13,68,68,0.14);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  font-family: 'NanumSquareNeo', 'Noto Sans KR', sans-serif;
  transition: opacity 0.4s ease, transform 0.4s ease;
  opacity: 1;
}
.smart-float-ad.is-hidden {
  opacity: 0;
  pointer-events: none;
  transform: translateY(-50%) translateX(-20px);
}
.smart-float-ad__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 6px;
  padding: 0 2px;
}
.smart-float-ad__label {
  display: flex;
  align-items: center;
  gap: 5px;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: #0D4444;
  opacity: .65;
}
.smart-float-ad__label::before {
  content: 'AD';
  display: inline-block;
  padding: 2px 6px;
  border-radius: 4px;
  background: #0D4444;
  color: #fff;
  font-size: 9.5px;
  letter-spacing: 0.06em;
}
.smart-float-ad__close {
  width: 22px;
  height: 22px;
  border: 1.5px solid rgba(13,68,68,0.25);
  background: rgba(13,68,68,0.06);
  color: #0D4444;
  font-size: 13px;
  line-height: 1;
  border-radius: 50%;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  transition: background 0.15s ease, border-color 0.15s ease;
  flex-shrink: 0;
}
.smart-float-ad__close:hover {
  background: rgba(13,68,68,0.15);
  border-color: rgba(13,68,68,0.5);
}
.smart-float-ad__inner {
  min-height: 600px;
  width: 160px;
  margin: 0 auto;
  background: #fff;
  border-radius: 10px;
  overflow: hidden;
}
.smart-float-ad__inner ins.adsbygoogle {
  display: block;
  width: 160px;
  height: 600px;
}
/* ★ 수정: 1140(콘텐츠) + 360(광고2개) + 60(여백) = 1560px */
@media (max-width: 1560px) {
  .smart-float-ad { display: none !important; }
}
</style>

<div class="smart-float-ad" id="smart-float-ad-left" aria-label="광고 영역">
  <div class="smart-float-ad__header">
    <div class="smart-float-ad__label">광고</div>
    <button class="smart-float-ad__close"
            aria-label="광고 닫기"
            onclick="smartLeftAdClose()">×</button>
  </div>
  <div class="smart-float-ad__inner">
    <ins class="adsbygoogle"
         style="display:block;"
         data-ad-client="ca-pub-3106752057307696"
         data-ad-slot="9893381088"
         data-ad-format="auto"
         data-full-width-responsive="false"></ins>
    <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
  </div>
</div>

<script>
(function(){
  var el = document.getElementById('smart-float-ad-left');
  if(!el) return;
  function checkScroll(){
    var scrolled = window.scrollY + window.innerHeight;
    var total    = document.documentElement.scrollHeight;
    if((scrolled / total) > 0.82){
      el.classList.add('is-hidden');
    } else {
      el.classList.remove('is-hidden');
    }
  }
  window.addEventListener('scroll', checkScroll, { passive: true });
  checkScroll();
  function smartLeftAdClose(){
    el.style.opacity = '0';
    el.style.pointerEvents = 'none';
    el.style.transform = 'translateY(-50%) translateX(-20px)';
    try { sessionStorage.setItem('smart_left_ad_closed','1'); } catch(e){}
  }
  window.smartLeftAdClose = smartLeftAdClose;
  try {
    if(sessionStorage.getItem('smart_left_ad_closed') === '1'){
      el.style.display = 'none';
    }
  } catch(e){}
})();
</script>
				</div>
				<div class="elementor-element elementor-element-a2c6bb4 elementor-widget elementor-widget-html" data-id="a2c6bb4" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<style>
.smart-static-ad-right {
  position: fixed;
  left: 50%;
  margin-left: 660px;           /* ★ 수정: 1140/2 + 60 = 630px */
  top: 50%;
  transform: translateY(-50%);
  z-index: 9997;
  width: 180px;
  padding: 10px 10px 8px;
  border-radius: 18px;
  background: rgba(255,255,255,0.88);
  border: 1px solid rgba(13,68,68,0.12);
  box-shadow: 0 12px 32px rgba(13,68,68,0.14);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  font-family: 'NanumSquareNeo', 'Noto Sans KR', sans-serif;
  transition: opacity 0.4s ease, transform 0.4s ease;
  opacity: 1;
}
.smart-static-ad-right.is-hidden {
  opacity: 0;
  pointer-events: none;
  transform: translateY(-50%) translateX(20px);
}
.smart-static-ad-right__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 6px;
  padding: 0 2px;
}
.smart-static-ad-right__label {
  display: flex;
  align-items: center;
  gap: 5px;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: #0D4444;
  opacity: .65;
}
.smart-static-ad-right__label::before {
  content: 'AD';
  display: inline-block;
  padding: 2px 6px;
  border-radius: 4px;
  background: #0D4444;
  color: #fff;
  font-size: 9.5px;
  letter-spacing: 0.06em;
}
.smart-static-ad-right__close {
  width: 22px;
  height: 22px;
  border: 1.5px solid rgba(13,68,68,0.25);
  background: rgba(13,68,68,0.06);
  color: #0D4444;
  font-size: 13px;
  line-height: 1;
  border-radius: 50%;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  transition: background 0.15s ease, border-color 0.15s ease;
  flex-shrink: 0;
}
.smart-static-ad-right__close:hover {
  background: rgba(13,68,68,0.15);
  border-color: rgba(13,68,68,0.5);
}
.smart-static-ad-right__inner {
  min-height: 600px;
  width: 160px;
  margin: 0 auto;
  background: #fff;
  border-radius: 10px;
  overflow: hidden;
}
.smart-static-ad-right__inner ins.adsbygoogle {
  display: block;
  width: 160px;
  height: 600px;
}
/* ★ 수정: 1140(콘텐츠) + 360(광고2개) + 60(여백) = 1560px */
@media (max-width: 1560px) {
  .smart-static-ad-right { display: none !important; }
}
</style>

<div class="smart-static-ad-right" id="smart-static-ad-right" aria-label="광고 영역">
  <div class="smart-static-ad-right__header">
    <div class="smart-static-ad-right__label">광고</div>
    <button class="smart-static-ad-right__close"
            aria-label="광고 닫기"
            onclick="smartRightAdClose()">×</button>
  </div>
  <div class="smart-static-ad-right__inner">
    <ins class="adsbygoogle"
         style="display:block;"
         data-ad-client="ca-pub-3106752057307696"
         data-ad-slot="9072313499"
         data-ad-format="auto"
         data-full-width-responsive="false"></ins>
    <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
  </div>
</div>

<script>
(function(){
  var el = document.getElementById('smart-static-ad-right');
  if(!el) return;
  function checkScroll(){
    var scrolled = window.scrollY + window.innerHeight;
    var total    = document.documentElement.scrollHeight;
    if((scrolled / total) > 0.82){
      el.classList.add('is-hidden');
    } else {
      el.classList.remove('is-hidden');
    }
  }
  window.addEventListener('scroll', checkScroll, { passive: true });
  checkScroll();
  function smartRightAdClose(){
    el.style.opacity = '0';
    el.style.pointerEvents = 'none';
    el.style.transform = 'translateY(-50%) translateX(20px)';
    try { sessionStorage.setItem('smart_right_ad_closed','1'); } catch(e){}
  }
  window.smartRightAdClose = smartRightAdClose;
  try {
    if(sessionStorage.getItem('smart_right_ad_closed') === '1'){
      el.style.display = 'none';
    }
  } catch(e){}
})();
</script>
				</div>
				<div class="elementor-element elementor-element-768d4d4 elementor-widget elementor-widget-html" data-id="768d4d4" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<!-- safetysupport_콘텐츠하단_멀티플렉스 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="autorelaxed"
     data-ad-client="ca-pub-3106752057307696"
     data-ad-slot="7825472551"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>				</div>
				<div class="elementor-element elementor-element-485fe1a elementor-widget elementor-widget-html" data-id="485fe1a" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<style>
.smart-float-nav{
  position:fixed;
  left:50%;
  margin-left:580px;            /* 콘텐츠(1140px) 절반(570) + 여백(10) */
  top:50%;
  transform:translateY(-50%);
  z-index:9999;
  display:flex;
  flex-direction:column;
  gap:10px;
  padding:10px 8px;
  border-radius:24px;
  background:rgba(255,255,255,0.88);
  border:1px solid rgba(13,68,68,0.12);
  box-shadow:0 12px 32px rgba(13,68,68,0.14);
  backdrop-filter:blur(10px);
  -webkit-backdrop-filter:blur(10px);
  /* ★ 스크롤 숨김 트랜지션 */
  transition:opacity 0.4s ease, transform 0.4s ease;
  opacity:1;
}

/* ★ 스크롤 하단 숨김 상태 */
.smart-float-nav.is-hidden{
  opacity:0;
  pointer-events:none;
  transform:translateY(-50%) translateX(20px);
}

.smart-float-btn{
  position:relative;
  display:flex;
  align-items:center;
  justify-content:center;
  width:52px;
  height:52px;
  border:none;
  border-radius:18px;
  background:transparent;
  color:#0D4444;
  text-decoration:none;
  cursor:pointer;
  transition:all .22s ease;
  overflow:visible;
}

.smart-float-btn:hover{
  background:#0D4444;
  color:#fff;
  transform:translateX(-2px);
  box-shadow:0 8px 18px rgba(13,68,68,.22);
}

.smart-float-btn svg{
  width:22px;
  height:22px;
  stroke:currentColor;
  flex-shrink:0;
  transition:transform .22s ease;
}

.smart-float-btn:hover svg{
  transform:scale(1.05);
}

.smart-float-label{
  position:absolute;
  right:62px;
  top:50%;
  transform:translateY(-50%) translateX(6px);
  opacity:0;
  pointer-events:none;
  white-space:nowrap;
  padding:9px 12px;
  border-radius:12px;
  background:#0D4444;
  color:#fff;
  font-size:12.5px;
  font-weight:700;
  letter-spacing:-0.01em;
  box-shadow:0 8px 20px rgba(13,68,68,.22);
  transition:all .18s ease;
  font-family:'NanumSquareNeo','Noto Sans KR',sans-serif;
}

.smart-float-label::after{
  content:'';
  position:absolute;
  left:100%;
  top:50%;
  transform:translateY(-50%);
  border-left:6px solid #0D4444;
  border-top:5px solid transparent;
  border-bottom:5px solid transparent;
}

.smart-float-btn:hover .smart-float-label{
  opacity:1;
  transform:translateY(-50%) translateX(0);
}

.smart-float-divider{
  width:28px;
  height:1px;
  margin:1px auto;
  background:linear-gradient(to right, rgba(13,68,68,0), rgba(13,68,68,.18), rgba(13,68,68,0));
}

/* ★ 좁은 화면: left/margin-left 리셋 후 right 기준으로 폴백 */
@media (max-width:1400px){
  .smart-float-nav{
    left:auto;
    margin-left:0;
    right:22px;
  }
}

@media (max-width:768px){
  .smart-float-nav{
    left:auto;
    margin-left:0;
    right:12px;
    gap:8px;
    padding:8px 6px;
    border-radius:20px;
  }
  .smart-float-btn{
    width:42px;
    height:42px;
    border-radius:14px;
  }
  .smart-float-btn svg{
    width:18px;
    height:18px;
  }
  .smart-float-label{
    display:none;
  }
}
</style>

<div class="smart-float-nav" id="smart-float-nav">

  <a class="smart-float-btn" href="https://safetysupport.co.kr/">
    <span class="smart-float-label">홈으로</span>
    <svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
      <path d="M3 11.5L12 4l9 7.5"/>
      <path d="M5.5 10.5V20h13v-9.5"/>
      <path d="M9.5 20v-6h5v6"/>
    </svg>
  </a>

  <div class="smart-float-divider"></div>

  <a class="smart-float-btn" href="https://safetysupport.co.kr/osh-integrated-lookup/">
    <span class="smart-float-label">목록으로</span>
    <svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
      <line x1="8" y1="6" x2="21" y2="6"/>
      <line x1="8" y1="12" x2="21" y2="12"/>
      <line x1="8" y1="18" x2="21" y2="18"/>
      <line x1="3" y1="6" x2="3.01" y2="6"/>
      <line x1="3" y1="12" x2="3.01" y2="12"/>
      <line x1="3" y1="18" x2="3.01" y2="18"/>
    </svg>
  </a>

  <div class="smart-float-divider"></div>

  <button class="smart-float-btn" onclick="window.scrollTo({top:0,behavior:'smooth'})">
    <span class="smart-float-label">맨 위로</span>
    <svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
      <polyline points="18 15 12 9 6 15"/>
    </svg>
  </button>

  <button class="smart-float-btn" onclick="window.scrollTo({top:document.body.scrollHeight,behavior:'smooth'})">
    <span class="smart-float-label">맨 아래로</span>
    <svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
      <polyline points="6 9 12 15 18 9"/>
    </svg>
  </button>
</div>

<script>
(function(){
  var nav = document.getElementById('smart-float-nav');
  if(!nav) return;

  function checkScroll(){
    var scrolled = window.scrollY + window.innerHeight;
    var total    = document.documentElement.scrollHeight;
    if((scrolled / total) > 0.82){
      nav.classList.add('is-hidden');
    } else {
      nav.classList.remove('is-hidden');
    }
  }
  window.addEventListener('scroll', checkScroll, { passive: true });
  checkScroll();
})();
</script>				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>안전보건관리체제 통합조회</title>
		<link>https://safetysupport.co.kr/safety-health-management-system-lookup/</link>
		
		<dc:creator><![CDATA[mangjil]]></dc:creator>
		<pubDate>Fri, 08 May 2026 15:50:54 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[보건관리자]]></category>
		<category><![CDATA[산업안전보건법]]></category>
		<category><![CDATA[산업안전보건위원회]]></category>
		<category><![CDATA[선임 대상]]></category>
		<category><![CDATA[안전관리자]]></category>
		<category><![CDATA[안전보건관리규정]]></category>
		<category><![CDATA[안전보건관리책임자]]></category>
		<category><![CDATA[안전보건관리체제]]></category>
		<category><![CDATA[적용 제외]]></category>
		<guid isPermaLink="false">https://safetysupport.co.kr/?p=3743</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3743" class="elementor elementor-3743" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-55c3075 e-flex e-con-boxed e-con e-parent" data-id="55c3075" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-7e56ff9 elementor-widget elementor-widget-html" data-id="7e56ff9" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<div id="osh-integrated-lookup-root"></div>
<link rel="stylesheet" href="https://safetysupport.co.kr/wp-content/uploads/safety-lookup/osh-integrated-lookup.css">
<script>
  window.OSH_LOOKUP_CONFIG = {
    appointmentUrl: "https://safetysupport.co.kr/appointment-form-index/",
    ksicUrl: "https://safetysupport.co.kr/ksic-lookup/",
    safetyHealthSystemUrl: "https://safetysupport.co.kr/safety-and-health-management-eligibility/",
    safetyOfficerUrl: "https://safetysupport.co.kr/safetyofficer-eligibility/",
    healthOfficerUrl: "https://safetysupport.co.kr/healthofficer-eligibility/",
    committeeUrl: "https://safetysupport.co.kr/industrial-safety-health-committee-requirements/",
    regulationUrl: "https://safetysupport.co.kr/safety-and-health-management-regulations-target/",
    homeUrl: "https://safetysupport.co.kr/"
  };
</script>
<script src="https://safetysupport.co.kr/wp-content/uploads/safety-lookup/osh-integrated-data.js"></script>
<script src="https://safetysupport.co.kr/wp-content/uploads/safety-lookup/osh-integrated-lookup.js"></script>				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>근골격계질환 예방·관리 교육</title>
		<link>https://safetysupport.co.kr/musculoskeletal-disorder-management/</link>
		
		<dc:creator><![CDATA[mangjil]]></dc:creator>
		<pubDate>Fri, 08 May 2026 04:14:55 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[근골격계 유해요인 조사]]></category>
		<category><![CDATA[근골격계부담작업]]></category>
		<category><![CDATA[근골격계질환]]></category>
		<category><![CDATA[근골격계질환 관리]]></category>
		<category><![CDATA[근골격계질환 교육자료]]></category>
		<category><![CDATA[근골격계질환 예방]]></category>
		<category><![CDATA[근골격계질환 예방관리 프로그램]]></category>
		<category><![CDATA[반복작업]]></category>
		<category><![CDATA[부적절한 작업자세]]></category>
		<category><![CDATA[사업주 보건조치]]></category>
		<category><![CDATA[산업안전보건교육]]></category>
		<category><![CDATA[산업안전보건법]]></category>
		<category><![CDATA[산업안전보건법 제39조]]></category>
		<category><![CDATA[안전보건교육]]></category>
		<category><![CDATA[안전보건규칙 제657조]]></category>
		<category><![CDATA[유해요인 조사]]></category>
		<category><![CDATA[인간공학]]></category>
		<category><![CDATA[인간공학적 개선]]></category>
		<category><![CDATA[작업환경 개선]]></category>
		<category><![CDATA[중량물 취급]]></category>
		<guid isPermaLink="false">https://safetysupport.co.kr/?p=3690</guid>

					<description><![CDATA[EDUCATION MATERIAL 교육 자료 EDU 본 교육자료를 활용하여 관련 교육을 실시하시기 바랍니다. EDUCATION LOG 교육일지 작성 LOG 교육 실시 후 아래 양식에 교육일지를 작성하여 보관하시기 바랍니다. 안전보건교육일지 📋 안전보건교육일지 🔒 워터마크 ON 📥 PDF 저장 🔐 워터마크 해제 워터마크를 끄려면 관리자 비밀번호를입력하세요. 취소 확인 산업안전지원센터㈜ 산업안전지원센터㈜safetysupport.co.kr 안전보건교육일지 산업안전보건법에 따른 안전보건교육 실시 확인 문서 담 당 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3690" class="elementor elementor-3690" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-9265e42 e-flex e-con-boxed e-con e-parent" data-id="9265e42" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-1ce3d98 elementor-widget elementor-widget-html" data-id="1ce3d98" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<!-- =====================================================
  섹션 구분자 - 교육 자료 (EDUCATION MATERIAL)
  용도: WordPress Elementor HTML 위젯
  위치: 이북/자료 콘텐츠 상단
  컬러: 딥그린 (#0D3321) 계열
====================================================== -->

<div id="education-material" style="
  border-radius: 12px;
  overflow: hidden;
  font-family: 'Pretendard', 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
  margin: 8px 0 20px;
">

  <!-- 상단 배너 -->
  <div style="
    background: linear-gradient(100deg, #0D3321 0%, #1a5c35 60%, #226b3f 100%);
    padding: 16px 28px;
    display: flex;
    align-items: center;
    gap: 18px;
  ">
    <!-- 아이콘 원형 -->
    <div style="
      width: 42px; height: 42px;
      background: rgba(255,255,255,0.12);
      border: 1px solid rgba(255,255,255,0.18);
      border-radius: 50%;
      display: flex; align-items: center; justify-content: center;
      flex-shrink: 0;
    ">
      <svg viewBox="0 0 24 24" style="width:19px;height:19px;fill:#a8debb;">
        <path d="M12 3L1 9l11 6 9-4.91V17h2V9M5 13.18v4L12 21l7-3.82v-4L12 17l-7-3.82z"/>
      </svg>
    </div>

    <!-- 텍스트 -->
    <div style="display:flex; flex-direction:column; gap:3px;">
      <span style="
        font-size: 10px; font-weight: 600; letter-spacing: 0.16em;
        color: #7dc49b; text-transform: uppercase;
      ">EDUCATION MATERIAL</span>
      <span style="
        font-size: 17px; font-weight: 700; color: #e8f5ed; letter-spacing: -0.01em;
      ">교육 자료</span>
    </div>

    <!-- 우측 태그 -->
    <div style="
      margin-left: auto;
      background: rgba(255,255,255,0.1);
      border: 0.5px solid rgba(255,255,255,0.22);
      color: #c5e8d0;
      font-size: 10px; font-weight: 600; letter-spacing: 0.12em;
      text-transform: uppercase;
      padding: 5px 14px;
      border-radius: 20px;
      flex-shrink: 0;
      white-space: nowrap;
    ">EDU</div>
  </div>

  <!-- 하단 서브텍스트 -->
  <div style="
    background: #f0f8f3;
    border: 0.5px solid #b8d9c4;
    border-top: none;
    border-radius: 0 0 12px 12px;
    padding: 9px 28px;
    display: flex;
    align-items: center;
    gap: 8px;
  ">
    <div style="
      width: 5px; height: 5px;
      border-radius: 50%;
      background: #3a7a50;
      flex-shrink: 0;
    "></div>
    <span style="
      font-size: 12px; color: #2d6043; font-weight: 500; letter-spacing: 0.01em;
    ">본 교육자료를 활용하여 관련 교육을 실시하시기 바랍니다.</span>
  </div>

</div>				</div>
				<div class="elementor-element elementor-element-fe8cc3f elementor-widget elementor-widget-shortcode" data-id="fe8cc3f" data-element_type="widget" data-e-type="widget" data-widget_type="shortcode.default">
							<div class="elementor-shortcode"><div class="_df_book df-lite" id="df_3688"  _slug="3688" data-title="" wpoptions="true" thumbtype="" ></div><script class="df-shortcode-script" nowprocket type="application/javascript">window.option_df_3688 = {"outline":[],"autoEnableOutline":"false","autoEnableThumbnail":"false","overwritePDFOutline":"false","enableDownload":"false","direction":"1","pageSize":"1","pageMode":"1","singlePageMode":"0","source":"https:\/\/safetysupport.co.kr\/wp-content\/uploads\/2026\/05\/GEN-OHH-003_Musculoskeletal%20Disorder%20Management.pdf","wpOptions":"true"}; if(window.DFLIP && window.DFLIP.parseBooks){window.DFLIP.parseBooks();}</script></div>
						</div>
				<div class="elementor-element elementor-element-b6f904c elementor-widget elementor-widget-html" data-id="b6f904c" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<!-- =====================================================
  섹션 구분자 - 교육일지 작성
  용도: WordPress Elementor HTML 위젯
  위치: 교육일지 콘텐츠 상단
  컬러: 딥그린 (#0D3321) 계열
====================================================== -->

<div id="education-log" style="
  border-radius: 12px;
  overflow: hidden;
  font-family: 'Pretendard', 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
  margin: 8px 0 20px;
  scroll-margin-top: 90px;
">

  <!-- 상단 배너 -->
  <div style="
    background: linear-gradient(100deg, #0D3321 0%, #1a5c35 60%, #226b3f 100%);
    padding: 16px 28px;
    display: flex;
    align-items: center;
    gap: 18px;
  ">
    <!-- 아이콘 원형 -->
    <div style="
      width: 42px; height: 42px;
      background: rgba(255,255,255,0.12);
      border: 1px solid rgba(255,255,255,0.18);
      border-radius: 50%;
      display: flex; align-items: center; justify-content: center;
      flex-shrink: 0;
    ">
      <svg viewBox="0 0 24 24" style="width:19px;height:19px;fill:#a8debb;">
        <path d="M6 2h9l5 5v15a2 2 0 01-2 2H6a2 2 0 01-2-2V4a2 2 0 012-2zm0 2v16h12V8h-4V4H6zm2 8h8v1.5H8V12zm0 3h8v1.5H8V15zm0-6h4v1.5H8V9z"/>
      </svg>
    </div>

    <!-- 텍스트 -->
    <div style="display:flex; flex-direction:column; gap:3px;">
      <span style="
        font-size: 10px; font-weight: 600; letter-spacing: 0.16em;
        color: #7dc49b; text-transform: uppercase;
      ">EDUCATION LOG</span>
      <span style="
        font-size: 17px; font-weight: 700; color: #e8f5ed; letter-spacing: -0.01em;
      ">교육일지 작성</span>
    </div>

    <!-- 우측 태그 -->
    <div style="
      margin-left: auto;
      background: rgba(255,255,255,0.1);
      border: 0.5px solid rgba(255,255,255,0.22);
      color: #c5e8d0;
      font-size: 10px; font-weight: 600; letter-spacing: 0.12em;
      text-transform: uppercase;
      padding: 5px 14px;
      border-radius: 20px;
      flex-shrink: 0;
      white-space: nowrap;
    ">LOG</div>
  </div>

  <!-- 하단 서브텍스트 -->
  <div style="
    background: #f0f8f3;
    border: 0.5px solid #b8d9c4;
    border-top: none;
    border-radius: 0 0 12px 12px;
    padding: 9px 28px;
    display: flex;
    align-items: center;
    gap: 8px;
  ">
    <div style="
      width: 5px; height: 5px;
      border-radius: 50%;
      background: #3a7a50;
      flex-shrink: 0;
    "></div>
    <span style="
      font-size: 12px; color: #2d6043; font-weight: 500; letter-spacing: 0.01em;
    ">교육 실시 후 아래 양식에 교육일지를 작성하여 보관하시기 바랍니다.</span>
  </div>

</div>				</div>
				<div class="elementor-element elementor-element-3187e0f elementor-widget elementor-widget-html" data-id="3187e0f" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>안전보건교육일지</title>
<style>
  @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap');

  :root {
    /* ════ 페이지 여백 ════ */
    --gap-page-top:            60px;
    --gap-page-side:           60px;
    --gap-page-bottom:         28px;
    --gap-page2-top:           60px;

    /* ════ 헤더 ════ */
    --gap-after-header:        5px;
    --approval-sign-height:    50px;   /* 

    /* ════ 작성일자행 ════ */
    --gap-after-writerow:      15px;

    /* ════ 섹션 간격 ════ */
    --gap-after-edutype:       20px;
    --gap-after-educount:      20px;
    --gap-after-educontent:    20px;
    --gap-after-loc:           20px;
    --gap-after-special:       10px;
    --gap-before-mini-roster:  12px;

    /* ════ 셀 높이/패딩 ════ */
    --main-cell-pad-v:         5px;
    --main-cell-pad-h:         8px;
    --educount-row-height:     26px;
    --educontent-min-height:   80px;
    --special-min-height:      60px;
    --loc-cell-pad-v:          7px;
    --mini-row-height:         25px;

    /* ════ 2페이지 ════ */
    --roster-row-height:       25px;

    /* ════ 워터마크 ════ */
    --watermark-opacity:       0.06;

    /* ════ 색상 ════ */
    --deep-green:  #0D3321;
    --light-green: #e8f5ed;
    --lighter-green: #f4faf6;
    --accent:      #3db86b;
    --border:      #888;
    --border-light:#ccc;
    --text:        #1a1a1a;
    --text-muted:  #555;

    /* ════ 테두리 두께(나중에 여기만 수정하면 됨) ════ */
    --main-border-width:       1px;
    --inner-table-border:      1px;
    --roster-divider-width:    1.5px;
  }

  * {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
  }

  body {
    font-family: 'Noto Sans KR', sans-serif;
    background: #f0f0f0;
    color: var(--text);
    font-size: 12px;
    line-height: 1.5;
  }

  #control-panel {
    background: var(--deep-green);
    
    color: #fff;
    padding: 10px 20px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
    position: sticky;
    top: 0;
    z-index: 100;
    box-shadow: 0 2px 8px rgba(0,0,0,0.3);
  }

  #control-panel h1 {
    
    font-size: 14px;
    font-weight: 700;
    white-space: nowrap;
  }

  .btn-pdf {
    background: var(--accent);
    color: #fff;
    border: none;
    padding: 8px 20px;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 700;
    cursor: pointer;
    white-space: nowrap;
    font-family: inherit;
  }

  .btn-pdf:hover {
    background: #2da05a;
  }

  .btn-pdf:disabled {
    opacity: 0.6;
    cursor: not-allowed;
  }

  .btn-wm {
        background: rgba(255,255,255,0.15);
    color: #fff;
    border: 1px solid rgba(255,255,255,0.35);
    padding: 7px 14px;
    border-radius: 6px;
    font-size: 12px;
    font-weight: 500;
    cursor: pointer;
    white-space: nowrap;
    font-family: inherit;
  }

  .btn-wm:hover {
    background: rgba(255,255,255,0.25);
  }

  #pw-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.55);
    z-index: 999;
    align-items: center;
    justify-content: center;
  }

  #pw-overlay.show {
    display: flex;
  }

  #pw-box {
    background: #fff;
    border-radius: 10px;
    padding: 28px 32px;
    width: 300px;
    box-shadow: 0 8px 32px rgba(0,0,0,0.25);
    text-align: center;
  }

  #pw-box h2 {
    font-size: 14px;
    font-weight: 700;
    color: var(--deep-green);
    margin-bottom: 6px;
  }

  #pw-box p {
    font-size: 11px;
    color: var(--text-muted);
    margin-bottom: 16px;
  }

  #pw-input {
    
    width: 100%;
    border: 1.5px solid var(--border);
    border-radius: 6px;
    padding: 8px 12px;
    font-size: 14px;
    text-align: center;
    letter-spacing: 4px;
    font-family: inherit;
    outline: none;
    margin-bottom: 6px;
  }

  #pw-input:focus {
    border-color: var(--accent);
  }

  #pw-input.error {
    border-color: #e24b4a;
    animation: shake 0.3s;
  }

  #pw-error {
    font-size: 11px;
    color: #e24b4a;
    height: 16px;
    margin-bottom: 12px;
  }

  #pw-box .pw-btns {
    display: flex;
    gap: 8px;
  }

  #pw-box .pw-btns button {
    flex: 1;
    padding: 8px;
    border-radius: 6px;
    font-size: 12px;
    font-weight: 700;
    cursor: pointer;
    font-family: inherit;
    border: none;
  }

  .pw-confirm {
    background: var(--deep-green);
    color: #fff;
  }

  .pw-cancel {
      
    background: #f0f0f0;
    color: var(--text);
  }

  @keyframes shake {
    0%,100% { transform: translateX(0); }
    25% { transform: translateX(-6px); }
    75% { transform: translateX(6px); }
  }

  #pages-wrap {
      
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 24px;
    gap: 20px;
  }

  .a4-page {
    background: #fff;
    width: 794px;
    min-height: 1123px;
    padding: var(--gap-page-top) var(--gap-page-side) var(--gap-page-bottom);
    box-shadow: 0 2px 12px rgba(0,0,0,0.18);
    position: relative;
  }

  #page2 {
    padding-top: var(--gap-page2-top);
  }

  .watermark {
    display: none;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%) rotate(-35deg);
    font-size: 68px;
    font-weight: 700;
    color: #000;
    opacity: var(--watermark-opacity);
    white-space: nowrap;
    pointer-events: none;
    user-select: none;
    z-index: 10;
    letter-spacing: 2px;
  }

  .page-num {
    position: absolute;
    bottom: 14px;
    right: var(--gap-page-side);
    font-size: 10px;
    color: #bbb;
  }

  .doc-header {
    display: flex;
    align-items: stretch;
    border-bottom: 2.5px solid var(--deep-green);
    margin-bottom: var(--gap-after-header);
    padding-bottom: 10px;
    gap: 12px;
  }

  .doc-logo-area {
    display: flex;
    align-items: center;
    min-width: 150px;
    flex-shrink: 0;
  }

  .doc-logo-text {
    font-size: 11px;
    font-weight: 700;
    color: var(--deep-green);
    line-height: 1.5;
  }

  .doc-title-area {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
  }

  .doc-title-area .doc-title {
    font-size: 25px;
    font-weight: 700;
    color: var(--deep-green);
    letter-spacing: 1px;
  }

  .doc-title-area .doc-sub {
    font-size: 11px;
    color: var(--text-muted);
    margin-top: 3px;
  }

  .doc-approval {
    display: flex;
    align-items: stretch;
    flex-shrink: 0;
    border: var(--main-border-width) solid var(--border);
    border-radius: 3px;
    overflow: hidden;
  }

  .doc-approval .ap-cells {
  display: flex;
  align-items: stretch;
}

  .doc-approval .ap-cell {
    width: 70px;
    text-align: center;
    border-left: var(--main-border-width) solid var(--border);
    display: flex;
    flex-direction: column;
  }

  .doc-approval .ap-cell:first-child {
    border-left: none;
  }

  .doc-approval .ap-cell .ap-role {
  font-size: 10px;
  font-weight: 700;
  padding: 3px 4px;
  border-bottom: var(--main-border-width) solid var(--border);
  background: var(--deep-green);
  color: #fff;
  text-align: center;
  word-break: keep-all;
  line-height: 1.4;
  flex: 1;
}

  .doc-approval .ap-cell .ap-role[contenteditable]:focus {
    outline: 1px solid rgba(255,255,255,0.6);
    background: #1a5c35;
  }

  .doc-approval .ap-cell .ap-sign {
  flex: 1;
  min-height: var(--approval-sign-height);
  display: flex;
  align-items: flex-end;
  justify-content: center;
  font-size: 8px;
  color: #ccc;
  padding-bottom: 3px;
}

  .write-row {
    display: flex;
    gap: 32px;
    font-size: 11px;
    color: var(--text-muted);
    padding: 5px 4px;
    border-bottom: var(--main-border-width) solid var(--border-light);
    margin-bottom: var(--gap-after-writerow);
  }

  .write-row span {
    display: flex;
    align-items: center;
    gap: 6px;
  }

  .write-row .write-val {
    border-bottom: var(--main-border-width) solid var(--border-light);
    min-width: 90px;
    outline: none;
    display: inline-block;
    color: var(--text);
    background: transparent;
  }

  .write-row .write-val:focus {
      
    background: #fffde7;
  }

  .main-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 12px;
    background: #fff;
    
  }

  .main-table th,
  .main-table td {
    border: var(--main-border-width) solid var(--border);
    vertical-align: middle;
    padding: var(--main-cell-pad-v) var(--main-cell-pad-h);
    background: #fff;
  }

  .main-table .section-row td {
    background: var(--deep-green) !important;
    color: #fff;
    font-weight: 700;
    font-size: 12px;
    padding: 5px 10px;
    letter-spacing: 0.3px;
    border-color: var(--Deep-green);
    
  }

  .main-table .section-row td::before {
    content: '';
    display: inline-block;
    width: 3px;
    height: 11px;
    background: var(--accent);
    border-radius: 2px;
    margin-right: 7px;
    vertical-align: middle;
  }

  .main-table .row-th {
  background: var(--light-green) !important;
  color: var(--deep-green);
  font-weight: 700;
  text-align: center;
  white-space: nowrap;
  width: 52px;
  line-height: 1.4;
  font-size: 11px;
}

  .section-label {
    background: var(--light-green) !important;
  }

  .main-table td[contenteditable],
  .main-table th[contenteditable] {
    background: #fff !important;
  }

  .main-table td[contenteditable]:focus,
  .main-table th[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 2px solid var(--accent);
    outline-offset: -2px;
  }

  .edu-type-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 7px 2px;
    font-size: 11px;
    background: #fff;
    
  }

  .edu-type-grid label {
    display: flex;
    align-items: center;
    gap: 4px;
    cursor: pointer;
    background: #fff;
  }

  .edu-type-grid input[type="checkbox"] {
    accent-color: var(--deep-green);
    width: 12px;
    height: 12px;
    flex-shrink: 0;
  }

  .educount-row > td,
  .loc-row > td {
    vertical-align: top !important;
    padding: 0 !important;
    line-height: 0;
    font-size: 0;
    background: #fff !important;
    
  }

  .educount-row > th.row-th,
  .loc-row > th.row-th {
    vertical-align: middle !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    
  }

  .inw-table {
    width: 100%;
    border-collapse: collapse;
    border-spacing: 0;
    table-layout: fixed;
    font-size: 11px;
    margin: 0;
    background: #fff;
    
  }

  .inw-table th,
.inw-table td {
  border: var(--inner-table-border) solid var(--border);
  text-align: center;
  padding: 3px 4px;
  height: var(--educount-row-height);
  background: transparent;
  vertical-align: middle;
}

  .inw-table th {
    color: var(--deep-green);
    font-weight: 700;
  }

  .inw-head {
  background: var(--lighter-green) !important;
}

  .inw-table td.row-label {
    background: #fff !important;
    font-weight: 700;
    text-align: left;
    padding-left: 18px;
    color: var(--deep-green);
    
  }

  .inw-label {
  background: var(--lighter-green) !important;
}

  .inw-table td[contenteditable] {
    background: #fff !important;
  }

  .inw-table td[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
    
  }

  .inw-table .miss-reason {
    text-align: left;
    padding: 3px 6px;
    background: #fff !important;
  }

  .loc-table {
    width: 100%;
    border-collapse: collapse;
    border-spacing: 0;
    table-layout: fixed;
    font-size: 11px;
    margin: 0;
    background: #fff;
  }

  .loc-table th,
.loc-table td {
  border: var(--inner-table-border) solid var(--border);
  padding: var(--loc-cell-pad-v) 8px;
  background: transparent;
  vertical-align: middle;
}

  .loc-table th {
    color: var(--deep-green);
    font-weight: 700;
    text-align: center;
    white-space: nowrap;
    width: 14%;
  }

  .loc-label {
  background: var(--lighter-green) !important;
}

  .loc-table td[contenteditable] {
    background: #fff !important;
    
  }

  .loc-table td[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
  }

  .mini-roster-wrap {
    margin-top: var(--gap-before-mini-roster);
  }

  .mini-roster-title {
    text-align: center;
    font-size: 12px;
    font-weight: 700;
    padding: 5px 10px;
    letter-spacing: 2px;
    background: var(--deep-green);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 7px;
  }

  .mini-roster-title::before {
    content: '';
    display: inline-block;
    width: 3px;
    height: 11px;
    background: var(--accent);
    border-radius: 2px;
  }

  .mini-roster-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 11px;
    table-layout: fixed;
  }

  .mini-roster-table th {
    background: var(--light-green);
    color: var(--deep-green);
    font-weight: 700;
    text-align: center;
    border: var(--main-border-width) solid var(--border);
    padding: 4px 3px;
  }

  .mini-roster-table td {
    border: var(--main-border-width) solid var(--border);
    padding: 2px 3px;
    text-align: center;
    height: var(--mini-row-height);
    vertical-align: middle;
    background: #fff;
  }

  .mini-roster-table td[contenteditable]:focus {
    background: #fffde7;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
  }

  .mini-roster-table .seq-cell {
    background: var(--light-green) !important;
    color: var(--deep-green);
    font-weight: 700;
    width: 22px;
  }

  .mini-roster-table .col-divider {
    border-right: var(--roster-divider-width) solid var(--deep-green) !important;
  }

  .page2-header {
    display: flex;
    align-items: stretch;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 12px;
    padding-bottom: 8px;
    border-bottom: 2.5px solid var(--deep-green);
  }

  .logo-text {
    font-size: 11px;
    font-weight: 700;
    color: var(--deep-green);
    line-height: 1.4;
  }

  .roster-meta {
    display: flex;
    gap: 24px;
    font-size: 11px;
    font-weight: 700;
    color: var(--text-muted);
    justify-content: center;
    margin: 12px 0 14px;
  }

  .roster-meta strong {
    font-weight: 400;
    border-bottom: var(--main-border-width) solid var(--border-light);
    min-width: 90px;
    display: inline-block;
    outline: none;
  }

  .roster-meta strong:focus {
    background: #fffde7;
  }

  .roster-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 11px;
    table-layout: fixed;
  }

  .roster-table thead th {
    background: var(--deep-green);
    color: #fff;
    font-weight: 700;
    padding: 5px 3px;
    border: var(--main-border-width) solid var(--border);
    text-align: center;
  }

  .roster-table tbody td {
    border: var(--main-border-width) solid var(--border);
    padding: 2px 3px;
    text-align: center;
    height: var(--roster-row-height);
    vertical-align: middle;
    background: #fff !important;
  }

  .roster-table tbody td[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
  }

  .roster-table .col-divider {
    border-right: var(--roster-divider-width) solid var(--deep-green) !important;
  }

  .legal-footer {
    margin-top: 14px;
    padding-top: 7px;
    border-top: var(--main-border-width) solid var(--border-light);
    font-size: 10px;
    color: var(--text-muted);
    line-height: 1.6;
  }

  @media print {
    body {
      background: #fff;
    }
    #control-panel {
      display: none;
    }
    #pw-overlay {
      display: none !important;
    }
    #pages-wrap {
      padding: 0;
      gap: 0;
    }
    .a4-page {
      box-shadow: none;
      margin: 0;
      page-break-after: always;
    }
  }
</style>
</head>
<body>

<div id="control-panel">
  <h1>📋 안전보건교육일지</h1>
  <div style="display:flex; gap:8px; align-items:center;">
    <button class="btn-wm" id="btn-wm" onclick="toggleWatermarkUI()">🔒 워터마크 ON</button>
    <button class="btn-pdf" onclick="generatePDF()">📥 PDF 저장</button>
  </div>
</div>

<div id="pw-overlay">
  <div id="pw-box">
    <h2>🔐 워터마크 해제</h2>
    <p>워터마크를 끄려면 관리자 비밀번호를<br>입력하세요.</p>
    <input type="password" id="pw-input" placeholder="비밀번호" maxlength="20"
      onkeydown="if(event.key==='Enter') confirmPW()">
    <div id="pw-error"></div>
    <div class="pw-btns">
      <button class="pw-cancel" onclick="closePW()">취소</button>
      <button class="pw-confirm" onclick="confirmPW()">확인</button>
    </div>
  </div>
</div>

<div id="pages-wrap">

<div class="a4-page" id="page1">
<div class="watermark" id="wm-page1">산업안전지원센터㈜</div>

  <div class="doc-header">
    <div class="doc-logo-area">
      <div class="doc-logo-text">산업안전지원센터㈜<br><span style="font-weight:400; font-size:10px; color:#4a7a5a;">safetysupport.co.kr</span></div>
    </div>
    <div class="doc-title-area">
      <div class="doc-title">안전보건교육일지</div>
      <div class="doc-sub">산업안전보건법에 따른 안전보건교육 실시 확인 문서</div>
    </div>
    <div class="doc-approval">
      <div class="ap-cells">
        <div class="ap-cell">
          <div class="ap-role">담 당</div>
          <div class="ap-sign">서명</div>
        </div>
        <div class="ap-cell">
          <div class="ap-role" contenteditable="true" style="outline:none;" id="ap-role2">팀 장</div>
          <div class="ap-sign">서명</div>
        </div>
        <div class="ap-cell">
          <div class="ap-role" contenteditable="true" style="outline:none;" id="ap-role3">대 표</div>
          <div class="ap-sign">서명</div>
        </div>
      </div>
    </div>
  </div>

  <div class="write-row">
    <span>작성일자 : <span class="write-val" contenteditable="true" id="f-write-date"></span></span>
    <span>작성자 : <span class="write-val" contenteditable="true" id="f-writer" style="min-width:60px;"></span></span>
  </div>

  <table class="main-table">

    <tr class="section-row"><td colspan="4">교육 구분</td></tr>
    <tr>
      <th class="row-th section-label">교육<br>구분</th>
      <td colspan="3" style="padding:8px 12px; background:#fff;">
        <div class="edu-type-grid">
          <label><input type="checkbox" name="edutype" value="정기교육"> 정기교육</label>
          <label><input type="checkbox" name="edutype" value="채용시교육"> 채용 시 교육</label>
          <label><input type="checkbox" name="edutype" value="작업내용변경"> 작업내용 변경시의 교육</label>
          <label><input type="checkbox" name="edutype" value="특별교육"> 특별교육</label>
          <label><input type="checkbox" name="edutype" value="물질안전"> 물질안전보건자료 교육</label>
          <div style="display:flex; align-items:center; gap:4px; font-size:11px; background:#fff;">
            <input type="checkbox" name="edutype" value="기타" id="cb-etc">
            <label for="cb-etc">기 타 (</label><span id="etc-input" contenteditable="true"
              style="min-width:30px; display:inline-block; outline:none; border-bottom:1px solid #ccc; background:#fff;"></span><span>) 교육</span>
          </div>
        </div>
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-edutype); border:none; background:#fff;"></td></tr>

    <tr class="section-row"><td colspan="4">교육 인원</td></tr>
    <tr class="educount-row">
      <th class="row-th section-label">교육<br>인원</th>
      <td colspan="3" style="padding:0; line-height:0; font-size:0; vertical-align:top; background:#fff;">
        <table class="inw-table">
          <thead>
            <tr>
              <th class="inw-head" style="width:22%;">구분</th>
              <th class="inw-head" style="width:10%;">계</th>
              <th class="inw-head" style="width:10%;">남</th>
              <th class="inw-head" style="width:10%;">여</th>
              <th class="inw-head">교육미실시 사유</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td class="row-label inw-label">교육 대상자 수</td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td class="miss-reason" contenteditable="true" rowspan="3"></td>
            </tr>
            <tr>
              <td class="row-label inw-label">참석 인원</td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
            </tr>
            <tr>
              <td class="row-label inw-label">교육미실시자수</td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
            </tr>
          </tbody>
        </table>
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-educount); border:none; background:#fff;"></td></tr>

    <tr class="section-row"><td colspan="4">교육 내용</td></tr>
    <tr>
      <th class="row-th section-label">교육<br>내용</th>
      <td colspan="3" contenteditable="true" id="f-content"
    style="height:var(--educontent-min-height); vertical-align:top; padding:8px 10px; line-height:1.8; background:#fff;">
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-educontent); border:none; background:#fff;"></td></tr>

    <tr class="section-row"><td colspan="4">교육실시자 및 장소</td></tr>
    <tr class="loc-row">
      <th class="row-th section-label" style="white-space:nowrap; font-size:10px; line-height:1.5;">교육실시자<br>및 장소</th>
      <td colspan="3" style="padding:0; line-height:0; font-size:0; vertical-align:top; background:#fff;">
        <table class="loc-table">
          <tr>
            <th class="loc-label">교육실시자</th>
            <td contenteditable="true" id="f-instructor"></td>
            <th class="loc-label">교육일시</th>
            <td contenteditable="true" id="f-date"></td>
          </tr>
          <tr>
            <th class="loc-label">교육시간</th>
            <td contenteditable="true" id="f-hours"></td>
            <th class="loc-label">교육장소</th>
            <td contenteditable="true" id="f-place"></td>
          </tr>
        </table>
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-loc); border:none; background:#fff;"></td></tr>

    <tr class="section-row"><td colspan="4">특기사항</td></tr>
    <tr>
      <th class="row-th section-label">특기<br>사항</th>
      <td colspan="3" contenteditable="true" id="f-remark"
    style="height:var(--special-min-height); vertical-align:top; padding:7px 10px; background:#fff;">
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-special); border:none; background:#fff;"></td></tr>

  </table>

  <div class="mini-roster-wrap">
    <div class="mini-roster-title">참석자 명단</div>
    <table class="mini-roster-table">
      <thead>
        <tr>
          <th style="width:22px;">No</th>
          <th>직 책</th>
          <th>성 명</th>
          <th class="col-divider">서 명</th>
          <th style="width:22px;">No</th>
          <th>직 책</th>
          <th>성 명</th>
          <th>서 명</th>
        </tr>
      </thead>
      <tbody id="mini-roster-body"></tbody>
    </table>
  </div>

  <div class="page-num">1 / 2</div>
</div>

<div class="a4-page" id="page2">
<div class="watermark" id="wm-page2">산업안전지원센터㈜</div>

  <div class="page2-header">
    <div style="display:flex; align-items:center; gap:8px; min-width:140px;">
      <div class="logo-text">산업안전지원센터㈜<br><span style="font-weight:400; font-size:10px;">safetysupport.co.kr</span></div>
    </div>
    <div style="flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center;">
      <div style="font-size:17px; font-weight:600; color:var(--deep-green);">교육 참석자 명단</div>
      <div style="font-size:12px; color:var(--text-muted); margin-top:2px;">안전보건교육 수강 확인 서명부</div>
    </div>
    <div style="min-width:140px;"></div>
  </div>

  <div class="roster-meta">
    <span>교육일시:&nbsp;<strong contenteditable="true" id="r-date"></strong></span>
    <span>교육장소:&nbsp;<strong contenteditable="true" id="r-place"></strong></span>
    <span>참석인원:&nbsp;<strong contenteditable="true" id="r-count"></strong></span>
  </div>

  <table class="roster-table">
    <thead>
      <tr>
        <th style="width:14%;">소속/부서</th>
        <th style="width:10%;">직위</th>
        <th style="width:11%;">성명</th>
        <th class="col-divider" style="width:15%;">서명</th>
        <th style="width:14%;">소속/부서</th>
        <th style="width:10%;">직위</th>
        <th style="width:11%;">성명</th>
        <th style="width:15%;">서명</th>
      </tr>
    </thead>
    <tbody id="roster-body"></tbody>
  </table>

  <div class="legal-footer">
    본 교육일지는 「산업안전보건법」 제29조(근로자에 대한 안전보건교육) 및 동법 시행규칙 제26조에 따른 안전보건교육 실시 확인 목적으로 작성되었으며, 3년간 보존하여야 합니다.
  </div>

  <div class="page-num">2 / 2</div>
</div>

</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script>
(function buildMiniRoster() {
  const tbody = document.getElementById('mini-roster-body');
  for (let i = 0; i < 5; i++) {
  const n1 = i + 1, n2 = i + 6;
    const tr = document.createElement('tr');
    tr.innerHTML =
      `<td class="seq-cell">${n1}</td>` +
      `<td contenteditable="true"></td>` +
      `<td contenteditable="true"></td>` +
      `<td class="col-divider"></td>` +
      `<td class="seq-cell">${n2}</td>` +
      `<td contenteditable="true"></td>` +
      `<td contenteditable="true"></td>` +
      `<td></td>`;
    tbody.appendChild(tr);
  }
})();

(function buildRoster() {
  const tbody = document.getElementById('roster-body');
  for (let i = 0; i < 30; i++) {
    const tr = document.createElement('tr');
    tr.innerHTML =
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td class="col-divider"></td>` +
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td></td>`;
    tbody.appendChild(tr);
  }
})();

(function setToday() {
  const d = new Date();
  const str = d.getFullYear() + '년 ' + (d.getMonth()+1) + '월 ' + d.getDate() + '일';
  ['f-date','f-write-date','r-date'].forEach(function(id) {
    var el = document.getElementById(id);
    if (el && !el.textContent.trim()) el.textContent = str;
  });
})();

document.getElementById('f-date').addEventListener('input', function() {
  document.getElementById('r-date').textContent = this.textContent.trim();
});
document.getElementById('f-place').addEventListener('input', function() {
  document.getElementById('r-place').textContent = this.textContent.trim();
});

const WM_PASSWORD = 'ossc01432';
let wmOn = true;

function toggleWatermark(show) {
  document.querySelectorAll('.watermark').forEach(function(el) {
    el.style.display = show ? 'block' : 'none';
  });
}
toggleWatermark(true);

function toggleWatermarkUI() {
  if (wmOn) {
    openPW();
  } else {
    wmOn = true;
    toggleWatermark(true);
    document.getElementById('btn-wm').textContent = '🔒 워터마크 ON';
  }
}

function openPW() {
  document.getElementById('pw-input').value = '';
  document.getElementById('pw-error').textContent = '';
  document.getElementById('pw-input').classList.remove('error');
  document.getElementById('pw-overlay').classList.add('show');
  setTimeout(function() {
    document.getElementById('pw-input').focus();
  }, 50);
}

function closePW() {
  document.getElementById('pw-overlay').classList.remove('show');
}

function confirmPW() {
  var val = document.getElementById('pw-input').value;
  if (val === WM_PASSWORD) {
    closePW();
    wmOn = false;
    toggleWatermark(false);
    document.getElementById('btn-wm').textContent = '🔓 워터마크 OFF';
  } else {
    var inp = document.getElementById('pw-input');
    inp.classList.remove('error');
    void inp.offsetWidth;
    inp.classList.add('error');
    document.getElementById('pw-error').textContent = '비밀번호가 올바르지 않습니다.';
    inp.value = '';
    inp.focus();
  }
}

function buildEduTypeText() {
  const checked = document.querySelectorAll('input[name="edutype"]:checked');
  return Array.from(checked).map(function(c) {
    if (c.value === '기타') {
      const etc = document.getElementById('etc-input').textContent;
      return '■ 기타(' + (etc || '') + ')교육';
    }
    return '■ ' + c.value;
  }).join('  ') || '(선택 없음)';
}

async function generatePDF() {
  const btn = document.querySelector('.btn-pdf');
  btn.disabled = true;
  btn.textContent = '생성 중…';

  const gridEl = document.querySelector('.edu-type-grid');
  const txtEl = document.createElement('span');
  txtEl.style.fontSize = '11px';
  txtEl.textContent = buildEduTypeText();
  gridEl.parentNode.insertBefore(txtEl, gridEl);
  gridEl.style.display = 'none';

  try {
    const { jsPDF } = window.jspdf;
    const pdf = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });
    const pages = ['page1', 'page2'];

    for (let i = 0; i < pages.length; i++) {
      const cvs = await html2canvas(document.getElementById(pages[i]), {
        scale: 2,
        useCORS: true,
        backgroundColor: '#ffffff',
        logging: false
      });
      if (i > 0) pdf.addPage();
      pdf.addImage(cvs.toDataURL('image/jpeg', 0.95), 'JPEG', 0, 0, 210, 297);
    }

    const today = new Date();
    const ds = today.getFullYear() +
      String(today.getMonth()+1).padStart(2,'0') +
      String(today.getDate()).padStart(2,'0');

    pdf.save('안전보건교육일지_' + ds + '.pdf');
  } catch(e) {
    alert('PDF 생성 오류: ' + e.message);
  } finally {
    gridEl.style.display = '';
    txtEl.remove();
    btn.disabled = false;
    btn.textContent = '📥 PDF 저장';
  }
}
</script>
<!-- =====================================================
  교육페이지 전용 스마트 네비게이션
  위치: 교육일지 HTML 코드의 </body> 바로 위
====================================================== -->

<style>
.smart-edu-float-nav{
  position:fixed;
  right:22px;
  top:50%;
  transform:translateY(-50%);
  z-index:9999;
  display:flex;
  flex-direction:column;
  gap:10px;
  padding:10px 8px;
  border-radius:24px;
  background:rgba(255,255,255,0.88);
  border:1px solid rgba(13,68,68,0.12);
  box-shadow:0 12px 32px rgba(13,68,68,0.14);
  backdrop-filter:blur(10px);
  -webkit-backdrop-filter:blur(10px);
}

.smart-edu-float-btn{
  position:relative;
  display:flex;
  align-items:center;
  justify-content:center;
  width:52px;
  height:52px;
  border:none;
  border-radius:18px;
  background:transparent;
  color:#0D4444;
  text-decoration:none;
  cursor:pointer;
  transition:all .22s ease;
  overflow:visible;
}

.smart-edu-float-btn:hover{
  background:#0D4444;
  color:#fff;
  transform:translateX(-2px);
  box-shadow:0 8px 18px rgba(13,68,68,.22);
}

.smart-edu-float-btn svg{
  width:22px;
  height:22px;
  stroke:currentColor;
  flex-shrink:0;
  transition:transform .22s ease;
}

.smart-edu-float-btn:hover svg{
  transform:scale(1.05);
}

.smart-edu-float-label{
  position:absolute;
  right:62px;
  top:50%;
  transform:translateY(-50%) translateX(6px);
  opacity:0;
  pointer-events:none;
  white-space:nowrap;
  padding:9px 12px;
  border-radius:12px;
  background:#0D4444;
  color:#fff;
  font-size:12.5px;
  font-weight:700;
  letter-spacing:-0.01em;
  box-shadow:0 8px 20px rgba(13,68,68,.22);
  transition:all .18s ease;
  font-family:'NanumSquareNeo','Noto Sans KR',sans-serif;
}

.smart-edu-float-label::after{
  content:'';
  position:absolute;
  left:100%;
  top:50%;
  transform:translateY(-50%);
  border-left:6px solid #0D4444;
  border-top:5px solid transparent;
  border-bottom:5px solid transparent;
}

.smart-edu-float-btn:hover .smart-edu-float-label{
  opacity:1;
  transform:translateY(-50%) translateX(0);
}

.smart-edu-float-divider{
  width:28px;
  height:1px;
  margin:1px auto;
  background:linear-gradient(to right, rgba(13,68,68,0), rgba(13,68,68,.18), rgba(13,68,68,0));
}

html{
  scroll-behavior:smooth;
}

#education-material,
#education-log{
  scroll-margin-top:90px;
}

@media (max-width:768px){
  .smart-edu-float-nav{
    right:12px;
    gap:8px;
    padding:8px 6px;
    border-radius:20px;
  }

  .smart-edu-float-btn{
    width:42px;
    height:42px;
    border-radius:14px;
  }

  .smart-edu-float-btn svg{
    width:18px;
    height:18px;
  }

  .smart-edu-float-label{
    display:none;
  }
}

@media print{
  .smart-edu-float-nav{
    display:none !important;
  }
}
</style>

<div class="smart-edu-float-nav">

  <!-- 교육목록으로 -->
  <a class="smart-edu-float-btn" href="https://safetysupport.co.kr/safety-education/" aria-label="교육목록으로 이동">
    <span class="smart-edu-float-label">교육목록으로</span>
    <svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
      <line x1="8" y1="6" x2="21" y2="6"/>
      <line x1="8" y1="12" x2="21" y2="12"/>
      <line x1="8" y1="18" x2="21" y2="18"/>
      <line x1="3" y1="6" x2="3.01" y2="6"/>
      <line x1="3" y1="12" x2="3.01" y2="12"/>
      <line x1="3" y1="18" x2="3.01" y2="18"/>
    </svg>
  </a>

  <div class="smart-edu-float-divider"></div>

  <!-- 교육자료로 이동 -->
  <a class="smart-edu-float-btn" href="#education-material" aria-label="교육자료로 이동">
    <span class="smart-edu-float-label">교육자료로 이동</span>
    <svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
      <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/>
      <polyline points="14 2 14 8 20 8"/>
      <line x1="8" y1="13" x2="16" y2="13"/>
      <line x1="8" y1="17" x2="16" y2="17"/>
      <line x1="8" y1="9" x2="10" y2="9"/>
    </svg>
  </a>

  <!-- 교육일지로 이동 -->
  <a class="smart-edu-float-btn" href="#education-log" aria-label="교육일지로 이동">
    <span class="smart-edu-float-label">교육일지로 이동</span>
    <svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
      <rect x="3" y="4" width="18" height="18" rx="2" ry="2"/>
      <line x1="16" y1="2" x2="16" y2="6"/>
      <line x1="8" y1="2" x2="8" y2="6"/>
      <line x1="3" y1="10" x2="21" y2="10"/>
      <line x1="8" y1="15" x2="16" y2="15"/>
      <line x1="8" y1="18" x2="13" y2="18"/>
    </svg>
  </a>

  <div class="smart-edu-float-divider"></div>

  <!-- 제일 상단으로 -->
  <button class="smart-edu-float-btn" type="button" onclick="window.scrollTo({top:0,behavior:'smooth'})" aria-label="제일 상단으로 이동">
    <span class="smart-edu-float-label"> 상단으로</span>
    <svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
      <polyline points="18 15 12 9 6 15"/>
    </svg>
  </button>

  <!-- 제일 하단으로 -->
  <button class="smart-edu-float-btn" type="button" onclick="window.scrollTo({top:document.documentElement.scrollHeight,behavior:'smooth'})" aria-label="제일 하단으로 이동">
    <span class="smart-edu-float-label"> 하단으로</span>
    <svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
      <polyline points="6 9 12 15 18 9"/>
    </svg>
  </button>

</div>
</body>
</html>				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>직무스트레스 건강장해 예방</title>
		<link>https://safetysupport.co.kr/job-stress-health-disorder-prevention/</link>
		
		<dc:creator><![CDATA[mangjil]]></dc:creator>
		<pubDate>Fri, 08 May 2026 02:02:04 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KOSHA GUIDE]]></category>
		<category><![CDATA[KOSS]]></category>
		<category><![CDATA[감정노동]]></category>
		<category><![CDATA[건강장해 예방]]></category>
		<category><![CDATA[고객응대근로자]]></category>
		<category><![CDATA[근로자 건강관리]]></category>
		<category><![CDATA[근로자 정신건강]]></category>
		<category><![CDATA[사업주 의무]]></category>
		<category><![CDATA[산업안전보건교육]]></category>
		<category><![CDATA[산업안전보건법]]></category>
		<category><![CDATA[안전보건교육]]></category>
		<category><![CDATA[조직문화 개선]]></category>
		<category><![CDATA[직무스트레스]]></category>
		<category><![CDATA[직무스트레스 건강장해]]></category>
		<category><![CDATA[직무스트레스 관리]]></category>
		<category><![CDATA[직무스트레스 교육자료]]></category>
		<category><![CDATA[직무스트레스 예방]]></category>
		<category><![CDATA[직무스트레스 평가]]></category>
		<category><![CDATA[직장 내 스트레스]]></category>
		<guid isPermaLink="false">https://safetysupport.co.kr/?p=3663</guid>

					<description><![CDATA[EDUCATION MATERIAL 교육 자료 EDU 본 교육자료를 활용하여 관련 교육을 실시하시기 바랍니다. EDUCATION LOG 교육일지 작성 LOG 교육 실시 후 아래 양식에 교육일지를 작성하여 보관하시기 바랍니다. 안전보건교육일지 📋 안전보건교육일지 🔒 워터마크 ON 📥 PDF 저장 🔐 워터마크 해제 워터마크를 끄려면 관리자 비밀번호를입력하세요. 취소 확인 산업안전지원센터㈜ 산업안전지원센터㈜safetysupport.co.kr 안전보건교육일지 산업안전보건법에 따른 안전보건교육 실시 확인 문서 담 당 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3663" class="elementor elementor-3663" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-f35bdfc e-con-full e-flex e-con e-parent" data-id="f35bdfc" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-51efa7c elementor-widget elementor-widget-html" data-id="51efa7c" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<div style="
  border-radius: 12px;
  overflow: hidden;
  font-family: 'Pretendard', 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
  margin: 8px 0 20px;
">

  <!-- 상단 배너 -->
  <div style="
    background: linear-gradient(100deg, #0D3321 0%, #1a5c35 60%, #226b3f 100%);
    padding: 16px 28px;
    display: flex;
    align-items: center;
    gap: 18px;
  ">
    <!-- 아이콘 원형 -->
    <div style="
      width: 42px; height: 42px;
      background: rgba(255,255,255,0.12);
      border: 1px solid rgba(255,255,255,0.18);
      border-radius: 50%;
      display: flex; align-items: center; justify-content: center;
      flex-shrink: 0;
    ">
      <svg viewBox="0 0 24 24" style="width:19px;height:19px;fill:#a8debb;">
        <path d="M12 3L1 9l11 6 9-4.91V17h2V9M5 13.18v4L12 21l7-3.82v-4L12 17l-7-3.82z"/>
      </svg>
    </div>

    <!-- 텍스트 -->
    <div style="display:flex; flex-direction:column; gap:3px;">
      <span style="
        font-size: 10px; font-weight: 600; letter-spacing: 0.16em;
        color: #7dc49b; text-transform: uppercase;
      ">EDUCATION MATERIAL</span>
      <span style="
        font-size: 17px; font-weight: 700; color: #e8f5ed; letter-spacing: -0.01em;
      ">교육 자료</span>
    </div>

    <!-- 우측 태그 -->
    <div style="
      margin-left: auto;
      background: rgba(255,255,255,0.1);
      border: 0.5px solid rgba(255,255,255,0.22);
      color: #c5e8d0;
      font-size: 10px; font-weight: 600; letter-spacing: 0.12em;
      text-transform: uppercase;
      padding: 5px 14px;
      border-radius: 20px;
      flex-shrink: 0;
      white-space: nowrap;
    ">EDU</div>
  </div>

  <!-- 하단 서브텍스트 -->
  <div style="
    background: #f0f8f3;
    border: 0.5px solid #b8d9c4;
    border-top: none;
    border-radius: 0 0 12px 12px;
    padding: 9px 28px;
    display: flex;
    align-items: center;
    gap: 8px;
  ">
    <div style="
      width: 5px; height: 5px;
      border-radius: 50%;
      background: #3a7a50;
      flex-shrink: 0;
    "></div>
    <span style="
      font-size: 12px; color: #2d6043; font-weight: 500; letter-spacing: 0.01em;
    ">본 교육자료를 활용하여 관련 교육을 실시하시기 바랍니다.</span>
  </div>

</div>				</div>
				<div class="elementor-element elementor-element-caa4336 elementor-widget elementor-widget-shortcode" data-id="caa4336" data-element_type="widget" data-e-type="widget" data-widget_type="shortcode.default">
							<div class="elementor-shortcode"><div class="_df_book df-lite" id="df_3661"  _slug="%ec%a7%81%eb%ac%b4%ec%8a%a4%ed%8a%b8%eb%a0%88%ec%8a%a4-%ea%b1%b4%ea%b0%95%ec%9e%a5%ed%95%b4-%ec%98%88%eb%b0%a9" data-title="%ec%a7%81%eb%ac%b4%ec%8a%a4%ed%8a%b8%eb%a0%88%ec%8a%a4-%ea%b1%b4%ea%b0%95%ec%9e%a5%ed%95%b4-%ec%98%88%eb%b0%a9" wpoptions="true" thumbtype="" ></div><script class="df-shortcode-script" nowprocket type="application/javascript">window.option_df_3661 = {"outline":[],"autoEnableOutline":"false","autoEnableThumbnail":"false","overwritePDFOutline":"false","enableDownload":"false","direction":"1","pageSize":"1","pageMode":"1","singlePageMode":"0","source":"https:\/\/safetysupport.co.kr\/wp-content\/uploads\/2026\/05\/GEN-OHH-002_Occupational%20Stress%20%26%20Health%20Disorder%20Prevention.pdf","wpOptions":"true"}; if(window.DFLIP && window.DFLIP.parseBooks){window.DFLIP.parseBooks();}</script></div>
						</div>
				<div class="elementor-element elementor-element-3d310e6 elementor-widget elementor-widget-html" data-id="3d310e6" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<div style="
  border-radius: 12px;
  overflow: hidden;
  font-family: 'Pretendard', 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
  margin: 8px 0 20px;
">

  <!-- 상단 배너 -->
  <div style="
    background: linear-gradient(100deg, #0D3321 0%, #1a5c35 60%, #226b3f 100%);
    padding: 16px 28px;
    display: flex;
    align-items: center;
    gap: 18px;
  ">
    <!-- 아이콘 원형 -->
    <div style="
      width: 42px; height: 42px;
      background: rgba(255,255,255,0.12);
      border: 1px solid rgba(255,255,255,0.18);
      border-radius: 50%;
      display: flex; align-items: center; justify-content: center;
      flex-shrink: 0;
    ">
      <svg viewBox="0 0 24 24" style="width:19px;height:19px;fill:#a8debb;">
        <path d="M6 2h9l5 5v15a2 2 0 01-2 2H6a2 2 0 01-2-2V4a2 2 0 012-2zm0 2v16h12V8h-4V4H6zm2 8h8v1.5H8V12zm0 3h8v1.5H8V15zm0-6h4v1.5H8V9z"/>
      </svg>
    </div>

    <!-- 텍스트 -->
    <div style="display:flex; flex-direction:column; gap:3px;">
      <span style="
        font-size: 10px; font-weight: 600; letter-spacing: 0.16em;
        color: #7dc49b; text-transform: uppercase;
      ">EDUCATION LOG</span>
      <span style="
        font-size: 17px; font-weight: 700; color: #e8f5ed; letter-spacing: -0.01em;
      ">교육일지 작성</span>
    </div>

    <!-- 우측 태그 -->
    <div style="
      margin-left: auto;
      background: rgba(255,255,255,0.1);
      border: 0.5px solid rgba(255,255,255,0.22);
      color: #c5e8d0;
      font-size: 10px; font-weight: 600; letter-spacing: 0.12em;
      text-transform: uppercase;
      padding: 5px 14px;
      border-radius: 20px;
      flex-shrink: 0;
      white-space: nowrap;
    ">LOG</div>
  </div>

  <!-- 하단 서브텍스트 -->
  <div style="
    background: #f0f8f3;
    border: 0.5px solid #b8d9c4;
    border-top: none;
    border-radius: 0 0 12px 12px;
    padding: 9px 28px;
    display: flex;
    align-items: center;
    gap: 8px;
  ">
    <div style="
      width: 5px; height: 5px;
      border-radius: 50%;
      background: #3a7a50;
      flex-shrink: 0;
    "></div>
    <span style="
      font-size: 12px; color: #2d6043; font-weight: 500; letter-spacing: 0.01em;
    ">교육 실시 후 아래 양식에 교육일지를 작성하여 보관하시기 바랍니다.</span>
  </div>

</div>


				</div>
				<div class="elementor-element elementor-element-3932805 elementor-widget elementor-widget-html" data-id="3932805" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>안전보건교육일지</title>
<style>
  @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap');

  :root {
    /* ════ 페이지 여백 ════ */
    --gap-page-top:            60px;
    --gap-page-side:           60px;
    --gap-page-bottom:         28px;
    --gap-page2-top:           60px;

    /* ════ 헤더 ════ */
    --gap-after-header:        5px;
    --approval-sign-height:    50px;   /* 

    /* ════ 작성일자행 ════ */
    --gap-after-writerow:      15px;

    /* ════ 섹션 간격 ════ */
    --gap-after-edutype:       20px;
    --gap-after-educount:      20px;
    --gap-after-educontent:    20px;
    --gap-after-loc:           20px;
    --gap-after-special:       10px;
    --gap-before-mini-roster:  12px;

    /* ════ 셀 높이/패딩 ════ */
    --main-cell-pad-v:         5px;
    --main-cell-pad-h:         8px;
    --educount-row-height:     26px;
    --educontent-min-height:   80px;
    --special-min-height:      60px;
    --loc-cell-pad-v:          7px;
    --mini-row-height:         25px;

    /* ════ 2페이지 ════ */
    --roster-row-height:       25px;

    /* ════ 워터마크 ════ */
    --watermark-opacity:       0.06;

    /* ════ 색상 ════ */
    --deep-green:  #0D3321;
    --light-green: #e8f5ed;
    --lighter-green: #f4faf6;
    --accent:      #3db86b;
    --border:      #888;
    --border-light:#ccc;
    --text:        #1a1a1a;
    --text-muted:  #555;

    /* ════ 테두리 두께(나중에 여기만 수정하면 됨) ════ */
    --main-border-width:       1px;
    --inner-table-border:      1px;
    --roster-divider-width:    1.5px;
  }

  * {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
  }

  body {
    font-family: 'Noto Sans KR', sans-serif;
    background: #f0f0f0;
    color: var(--text);
    font-size: 12px;
    line-height: 1.5;
  }

  #control-panel {
    background: var(--deep-green);
    
    color: #fff;
    padding: 10px 20px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
    position: sticky;
    top: 0;
    z-index: 100;
    box-shadow: 0 2px 8px rgba(0,0,0,0.3);
  }

  #control-panel h1 {
    
    font-size: 14px;
    font-weight: 700;
    white-space: nowrap;
  }

  .btn-pdf {
    background: var(--accent);
    color: #fff;
    border: none;
    padding: 8px 20px;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 700;
    cursor: pointer;
    white-space: nowrap;
    font-family: inherit;
  }

  .btn-pdf:hover {
    background: #2da05a;
  }

  .btn-pdf:disabled {
    opacity: 0.6;
    cursor: not-allowed;
  }

  .btn-wm {
        background: rgba(255,255,255,0.15);
    color: #fff;
    border: 1px solid rgba(255,255,255,0.35);
    padding: 7px 14px;
    border-radius: 6px;
    font-size: 12px;
    font-weight: 500;
    cursor: pointer;
    white-space: nowrap;
    font-family: inherit;
  }

  .btn-wm:hover {
    background: rgba(255,255,255,0.25);
  }

  #pw-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.55);
    z-index: 999;
    align-items: center;
    justify-content: center;
  }

  #pw-overlay.show {
    display: flex;
  }

  #pw-box {
    background: #fff;
    border-radius: 10px;
    padding: 28px 32px;
    width: 300px;
    box-shadow: 0 8px 32px rgba(0,0,0,0.25);
    text-align: center;
  }

  #pw-box h2 {
    font-size: 14px;
    font-weight: 700;
    color: var(--deep-green);
    margin-bottom: 6px;
  }

  #pw-box p {
    font-size: 11px;
    color: var(--text-muted);
    margin-bottom: 16px;
  }

  #pw-input {
    
    width: 100%;
    border: 1.5px solid var(--border);
    border-radius: 6px;
    padding: 8px 12px;
    font-size: 14px;
    text-align: center;
    letter-spacing: 4px;
    font-family: inherit;
    outline: none;
    margin-bottom: 6px;
  }

  #pw-input:focus {
    border-color: var(--accent);
  }

  #pw-input.error {
    border-color: #e24b4a;
    animation: shake 0.3s;
  }

  #pw-error {
    font-size: 11px;
    color: #e24b4a;
    height: 16px;
    margin-bottom: 12px;
  }

  #pw-box .pw-btns {
    display: flex;
    gap: 8px;
  }

  #pw-box .pw-btns button {
    flex: 1;
    padding: 8px;
    border-radius: 6px;
    font-size: 12px;
    font-weight: 700;
    cursor: pointer;
    font-family: inherit;
    border: none;
  }

  .pw-confirm {
    background: var(--deep-green);
    color: #fff;
  }

  .pw-cancel {
      
    background: #f0f0f0;
    color: var(--text);
  }

  @keyframes shake {
    0%,100% { transform: translateX(0); }
    25% { transform: translateX(-6px); }
    75% { transform: translateX(6px); }
  }

  #pages-wrap {
      
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 24px;
    gap: 20px;
  }

  .a4-page {
    background: #fff;
    width: 794px;
    min-height: 1123px;
    padding: var(--gap-page-top) var(--gap-page-side) var(--gap-page-bottom);
    box-shadow: 0 2px 12px rgba(0,0,0,0.18);
    position: relative;
  }

  #page2 {
    padding-top: var(--gap-page2-top);
  }

  .watermark {
    display: none;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%) rotate(-35deg);
    font-size: 68px;
    font-weight: 700;
    color: #000;
    opacity: var(--watermark-opacity);
    white-space: nowrap;
    pointer-events: none;
    user-select: none;
    z-index: 10;
    letter-spacing: 2px;
  }

  .page-num {
    position: absolute;
    bottom: 14px;
    right: var(--gap-page-side);
    font-size: 10px;
    color: #bbb;
  }

  .doc-header {
    display: flex;
    align-items: stretch;
    border-bottom: 2.5px solid var(--deep-green);
    margin-bottom: var(--gap-after-header);
    padding-bottom: 10px;
    gap: 12px;
  }

  .doc-logo-area {
    display: flex;
    align-items: center;
    min-width: 150px;
    flex-shrink: 0;
  }

  .doc-logo-text {
    font-size: 11px;
    font-weight: 700;
    color: var(--deep-green);
    line-height: 1.5;
  }

  .doc-title-area {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
  }

  .doc-title-area .doc-title {
    font-size: 25px;
    font-weight: 700;
    color: var(--deep-green);
    letter-spacing: 1px;
  }

  .doc-title-area .doc-sub {
    font-size: 11px;
    color: var(--text-muted);
    margin-top: 3px;
  }

  .doc-approval {
    display: flex;
    align-items: stretch;
    flex-shrink: 0;
    border: var(--main-border-width) solid var(--border);
    border-radius: 3px;
    overflow: hidden;
  }

  .doc-approval .ap-cells {
  display: flex;
  align-items: stretch;
}

  .doc-approval .ap-cell {
    width: 70px;
    text-align: center;
    border-left: var(--main-border-width) solid var(--border);
    display: flex;
    flex-direction: column;
  }

  .doc-approval .ap-cell:first-child {
    border-left: none;
  }

  .doc-approval .ap-cell .ap-role {
  font-size: 10px;
  font-weight: 700;
  padding: 3px 4px;
  border-bottom: var(--main-border-width) solid var(--border);
  background: var(--deep-green);
  color: #fff;
  text-align: center;
  word-break: keep-all;
  line-height: 1.4;
  flex: 1;
}

  .doc-approval .ap-cell .ap-role[contenteditable]:focus {
    outline: 1px solid rgba(255,255,255,0.6);
    background: #1a5c35;
  }

  .doc-approval .ap-cell .ap-sign {
  flex: 1;
  min-height: var(--approval-sign-height);
  display: flex;
  align-items: flex-end;
  justify-content: center;
  font-size: 8px;
  color: #ccc;
  padding-bottom: 3px;
}

  .write-row {
    display: flex;
    gap: 32px;
    font-size: 11px;
    color: var(--text-muted);
    padding: 5px 4px;
    border-bottom: var(--main-border-width) solid var(--border-light);
    margin-bottom: var(--gap-after-writerow);
  }

  .write-row span {
    display: flex;
    align-items: center;
    gap: 6px;
  }

  .write-row .write-val {
    border-bottom: var(--main-border-width) solid var(--border-light);
    min-width: 90px;
    outline: none;
    display: inline-block;
    color: var(--text);
    background: transparent;
  }

  .write-row .write-val:focus {
      
    background: #fffde7;
  }

  .main-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 12px;
    background: #fff;
    
  }

  .main-table th,
  .main-table td {
    border: var(--main-border-width) solid var(--border);
    vertical-align: middle;
    padding: var(--main-cell-pad-v) var(--main-cell-pad-h);
    background: #fff;
  }

  .main-table .section-row td {
    background: var(--deep-green) !important;
    color: #fff;
    font-weight: 700;
    font-size: 12px;
    padding: 5px 10px;
    letter-spacing: 0.3px;
    border-color: var(--Deep-green);
    
  }

  .main-table .section-row td::before {
    content: '';
    display: inline-block;
    width: 3px;
    height: 11px;
    background: var(--accent);
    border-radius: 2px;
    margin-right: 7px;
    vertical-align: middle;
  }

  .main-table .row-th {
  background: var(--light-green) !important;
  color: var(--deep-green);
  font-weight: 700;
  text-align: center;
  white-space: nowrap;
  width: 52px;
  line-height: 1.4;
  font-size: 11px;
}

  .section-label {
    background: var(--light-green) !important;
  }

  .main-table td[contenteditable],
  .main-table th[contenteditable] {
    background: #fff !important;
  }

  .main-table td[contenteditable]:focus,
  .main-table th[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 2px solid var(--accent);
    outline-offset: -2px;
  }

  .edu-type-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 7px 2px;
    font-size: 11px;
    background: #fff;
    
  }

  .edu-type-grid label {
    display: flex;
    align-items: center;
    gap: 4px;
    cursor: pointer;
    background: #fff;
  }

  .edu-type-grid input[type="checkbox"] {
    accent-color: var(--deep-green);
    width: 12px;
    height: 12px;
    flex-shrink: 0;
  }

  .educount-row > td,
  .loc-row > td {
    vertical-align: top !important;
    padding: 0 !important;
    line-height: 0;
    font-size: 0;
    background: #fff !important;
    
  }

  .educount-row > th.row-th,
  .loc-row > th.row-th {
    vertical-align: middle !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    
  }

  .inw-table {
    width: 100%;
    border-collapse: collapse;
    border-spacing: 0;
    table-layout: fixed;
    font-size: 11px;
    margin: 0;
    background: #fff;
    
  }

  .inw-table th,
.inw-table td {
  border: var(--inner-table-border) solid var(--border);
  text-align: center;
  padding: 3px 4px;
  height: var(--educount-row-height);
  background: transparent;
  vertical-align: middle;
}

  .inw-table th {
    color: var(--deep-green);
    font-weight: 700;
  }

  .inw-head {
  background: var(--lighter-green) !important;
}

  .inw-table td.row-label {
    background: #fff !important;
    font-weight: 700;
    text-align: left;
    padding-left: 18px;
    color: var(--deep-green);
    
  }

  .inw-label {
  background: var(--lighter-green) !important;
}

  .inw-table td[contenteditable] {
    background: #fff !important;
  }

  .inw-table td[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
    
  }

  .inw-table .miss-reason {
    text-align: left;
    padding: 3px 6px;
    background: #fff !important;
  }

  .loc-table {
    width: 100%;
    border-collapse: collapse;
    border-spacing: 0;
    table-layout: fixed;
    font-size: 11px;
    margin: 0;
    background: #fff;
  }

  .loc-table th,
.loc-table td {
  border: var(--inner-table-border) solid var(--border);
  padding: var(--loc-cell-pad-v) 8px;
  background: transparent;
  vertical-align: middle;
}

  .loc-table th {
    color: var(--deep-green);
    font-weight: 700;
    text-align: center;
    white-space: nowrap;
    width: 14%;
  }

  .loc-label {
  background: var(--lighter-green) !important;
}

  .loc-table td[contenteditable] {
    background: #fff !important;
    
  }

  .loc-table td[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
  }

  .mini-roster-wrap {
    margin-top: var(--gap-before-mini-roster);
  }

  .mini-roster-title {
    text-align: center;
    font-size: 12px;
    font-weight: 700;
    padding: 5px 10px;
    letter-spacing: 2px;
    background: var(--deep-green);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 7px;
  }

  .mini-roster-title::before {
    content: '';
    display: inline-block;
    width: 3px;
    height: 11px;
    background: var(--accent);
    border-radius: 2px;
  }

  .mini-roster-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 11px;
    table-layout: fixed;
  }

  .mini-roster-table th {
    background: var(--light-green);
    color: var(--deep-green);
    font-weight: 700;
    text-align: center;
    border: var(--main-border-width) solid var(--border);
    padding: 4px 3px;
  }

  .mini-roster-table td {
    border: var(--main-border-width) solid var(--border);
    padding: 2px 3px;
    text-align: center;
    height: var(--mini-row-height);
    vertical-align: middle;
    background: #fff;
  }

  .mini-roster-table td[contenteditable]:focus {
    background: #fffde7;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
  }

  .mini-roster-table .seq-cell {
    background: var(--light-green) !important;
    color: var(--deep-green);
    font-weight: 700;
    width: 22px;
  }

  .mini-roster-table .col-divider {
    border-right: var(--roster-divider-width) solid var(--deep-green) !important;
  }

  .page2-header {
    display: flex;
    align-items: stretch;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 12px;
    padding-bottom: 8px;
    border-bottom: 2.5px solid var(--deep-green);
  }

  .logo-text {
    font-size: 11px;
    font-weight: 700;
    color: var(--deep-green);
    line-height: 1.4;
  }

  .roster-meta {
    display: flex;
    gap: 24px;
    font-size: 11px;
    font-weight: 700;
    color: var(--text-muted);
    justify-content: center;
    margin: 12px 0 14px;
  }

  .roster-meta strong {
    font-weight: 400;
    border-bottom: var(--main-border-width) solid var(--border-light);
    min-width: 90px;
    display: inline-block;
    outline: none;
  }

  .roster-meta strong:focus {
    background: #fffde7;
  }

  .roster-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 11px;
    table-layout: fixed;
  }

  .roster-table thead th {
    background: var(--deep-green);
    color: #fff;
    font-weight: 700;
    padding: 5px 3px;
    border: var(--main-border-width) solid var(--border);
    text-align: center;
  }

  .roster-table tbody td {
    border: var(--main-border-width) solid var(--border);
    padding: 2px 3px;
    text-align: center;
    height: var(--roster-row-height);
    vertical-align: middle;
    background: #fff !important;
  }

  .roster-table tbody td[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
  }

  .roster-table .col-divider {
    border-right: var(--roster-divider-width) solid var(--deep-green) !important;
  }

  .legal-footer {
    margin-top: 14px;
    padding-top: 7px;
    border-top: var(--main-border-width) solid var(--border-light);
    font-size: 10px;
    color: var(--text-muted);
    line-height: 1.6;
  }

  @media print {
    body {
      background: #fff;
    }
    #control-panel {
      display: none;
    }
    #pw-overlay {
      display: none !important;
    }
    #pages-wrap {
      padding: 0;
      gap: 0;
    }
    .a4-page {
      box-shadow: none;
      margin: 0;
      page-break-after: always;
    }
  }
</style>
</head>
<body>

<div id="control-panel">
  <h1>📋 안전보건교육일지</h1>
  <div style="display:flex; gap:8px; align-items:center;">
    <button class="btn-wm" id="btn-wm" onclick="toggleWatermarkUI()">🔒 워터마크 ON</button>
    <button class="btn-pdf" onclick="generatePDF()">📥 PDF 저장</button>
  </div>
</div>

<div id="pw-overlay">
  <div id="pw-box">
    <h2>🔐 워터마크 해제</h2>
    <p>워터마크를 끄려면 관리자 비밀번호를<br>입력하세요.</p>
    <input type="password" id="pw-input" placeholder="비밀번호" maxlength="20"
      onkeydown="if(event.key==='Enter') confirmPW()">
    <div id="pw-error"></div>
    <div class="pw-btns">
      <button class="pw-cancel" onclick="closePW()">취소</button>
      <button class="pw-confirm" onclick="confirmPW()">확인</button>
    </div>
  </div>
</div>

<div id="pages-wrap">

<div class="a4-page" id="page1">
<div class="watermark" id="wm-page1">산업안전지원센터㈜</div>

  <div class="doc-header">
    <div class="doc-logo-area">
      <div class="doc-logo-text">산업안전지원센터㈜<br><span style="font-weight:400; font-size:10px; color:#4a7a5a;">safetysupport.co.kr</span></div>
    </div>
    <div class="doc-title-area">
      <div class="doc-title">안전보건교육일지</div>
      <div class="doc-sub">산업안전보건법에 따른 안전보건교육 실시 확인 문서</div>
    </div>
    <div class="doc-approval">
      <div class="ap-cells">
        <div class="ap-cell">
          <div class="ap-role">담 당</div>
          <div class="ap-sign">서명</div>
        </div>
        <div class="ap-cell">
          <div class="ap-role" contenteditable="true" style="outline:none;" id="ap-role2">팀 장</div>
          <div class="ap-sign">서명</div>
        </div>
        <div class="ap-cell">
          <div class="ap-role" contenteditable="true" style="outline:none;" id="ap-role3">대 표</div>
          <div class="ap-sign">서명</div>
        </div>
      </div>
    </div>
  </div>

  <div class="write-row">
    <span>작성일자 : <span class="write-val" contenteditable="true" id="f-write-date"></span></span>
    <span>작성자 : <span class="write-val" contenteditable="true" id="f-writer" style="min-width:60px;"></span></span>
  </div>

  <table class="main-table">

    <tr class="section-row"><td colspan="4">교육 구분</td></tr>
    <tr>
      <th class="row-th section-label">교육<br>구분</th>
      <td colspan="3" style="padding:8px 12px; background:#fff;">
        <div class="edu-type-grid">
          <label><input type="checkbox" name="edutype" value="정기교육"> 정기교육</label>
          <label><input type="checkbox" name="edutype" value="채용시교육"> 채용 시 교육</label>
          <label><input type="checkbox" name="edutype" value="작업내용변경"> 작업내용 변경시의 교육</label>
          <label><input type="checkbox" name="edutype" value="특별교육"> 특별교육</label>
          <label><input type="checkbox" name="edutype" value="물질안전"> 물질안전보건자료 교육</label>
          <div style="display:flex; align-items:center; gap:4px; font-size:11px; background:#fff;">
            <input type="checkbox" name="edutype" value="기타" id="cb-etc">
            <label for="cb-etc">기 타 (</label><span id="etc-input" contenteditable="true"
              style="min-width:30px; display:inline-block; outline:none; border-bottom:1px solid #ccc; background:#fff;"></span><span>) 교육</span>
          </div>
        </div>
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-edutype); border:none; background:#fff;"></td></tr>

    <tr class="section-row"><td colspan="4">교육 인원</td></tr>
    <tr class="educount-row">
      <th class="row-th section-label">교육<br>인원</th>
      <td colspan="3" style="padding:0; line-height:0; font-size:0; vertical-align:top; background:#fff;">
        <table class="inw-table">
          <thead>
            <tr>
              <th class="inw-head" style="width:22%;">구분</th>
              <th class="inw-head" style="width:10%;">계</th>
              <th class="inw-head" style="width:10%;">남</th>
              <th class="inw-head" style="width:10%;">여</th>
              <th class="inw-head">교육미실시 사유</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td class="row-label inw-label">교육 대상자 수</td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td class="miss-reason" contenteditable="true" rowspan="3"></td>
            </tr>
            <tr>
              <td class="row-label inw-label">참석 인원</td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
            </tr>
            <tr>
              <td class="row-label inw-label">교육미실시자수</td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
            </tr>
          </tbody>
        </table>
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-educount); border:none; background:#fff;"></td></tr>

    <tr class="section-row"><td colspan="4">교육 내용</td></tr>
    <tr>
      <th class="row-th section-label">교육<br>내용</th>
      <td colspan="3" contenteditable="true" id="f-content"
    style="height:var(--educontent-min-height); vertical-align:top; padding:8px 10px; line-height:1.8; background:#fff;">
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-educontent); border:none; background:#fff;"></td></tr>

    <tr class="section-row"><td colspan="4">교육실시자 및 장소</td></tr>
    <tr class="loc-row">
      <th class="row-th section-label" style="white-space:nowrap; font-size:10px; line-height:1.5;">교육실시자<br>및 장소</th>
      <td colspan="3" style="padding:0; line-height:0; font-size:0; vertical-align:top; background:#fff;">
        <table class="loc-table">
          <tr>
            <th class="loc-label">교육실시자</th>
            <td contenteditable="true" id="f-instructor"></td>
            <th class="loc-label">교육일시</th>
            <td contenteditable="true" id="f-date"></td>
          </tr>
          <tr>
            <th class="loc-label">교육시간</th>
            <td contenteditable="true" id="f-hours"></td>
            <th class="loc-label">교육장소</th>
            <td contenteditable="true" id="f-place"></td>
          </tr>
        </table>
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-loc); border:none; background:#fff;"></td></tr>

    <tr class="section-row"><td colspan="4">특기사항</td></tr>
    <tr>
      <th class="row-th section-label">특기<br>사항</th>
      <td colspan="3" contenteditable="true" id="f-remark"
    style="height:var(--special-min-height); vertical-align:top; padding:7px 10px; background:#fff;">
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-special); border:none; background:#fff;"></td></tr>

  </table>

  <div class="mini-roster-wrap">
    <div class="mini-roster-title">참석자 명단</div>
    <table class="mini-roster-table">
      <thead>
        <tr>
          <th style="width:22px;">No</th>
          <th>직 책</th>
          <th>성 명</th>
          <th class="col-divider">서 명</th>
          <th style="width:22px;">No</th>
          <th>직 책</th>
          <th>성 명</th>
          <th>서 명</th>
        </tr>
      </thead>
      <tbody id="mini-roster-body"></tbody>
    </table>
  </div>

  <div class="page-num">1 / 2</div>
</div>

<div class="a4-page" id="page2">
<div class="watermark" id="wm-page2">산업안전지원센터㈜</div>

  <div class="page2-header">
    <div style="display:flex; align-items:center; gap:8px; min-width:140px;">
      <div class="logo-text">산업안전지원센터㈜<br><span style="font-weight:400; font-size:10px;">safetysupport.co.kr</span></div>
    </div>
    <div style="flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center;">
      <div style="font-size:16px; font-weight:700; color:var(--deep-green);">교육 참석자 명단</div>
      <div style="font-size:11px; color:var(--text-muted); margin-top:2px;">안전보건교육 수강 확인 서명부</div>
    </div>
    <div style="min-width:140px;"></div>
  </div>

  <div class="roster-meta">
    <span>교육일시:&nbsp;<strong contenteditable="true" id="r-date"></strong></span>
    <span>교육장소:&nbsp;<strong contenteditable="true" id="r-place"></strong></span>
    <span>참석인원:&nbsp;<strong contenteditable="true" id="r-count"></strong></span>
  </div>

  <table class="roster-table">
    <thead>
      <tr>
        <th style="width:14%;">소속/부서</th>
        <th style="width:10%;">직위</th>
        <th style="width:11%;">성명</th>
        <th class="col-divider" style="width:15%;">서명</th>
        <th style="width:14%;">소속/부서</th>
        <th style="width:10%;">직위</th>
        <th style="width:11%;">성명</th>
        <th style="width:15%;">서명</th>
      </tr>
    </thead>
    <tbody id="roster-body"></tbody>
  </table>

  <div class="legal-footer">
    본 교육일지는 「산업안전보건법」 제29조(근로자에 대한 안전보건교육) 및 동법 시행규칙 제26조에 따른 안전보건교육 실시 확인 목적으로 작성되었으며, 3년간 보존하여야 합니다.
  </div>

  <div class="page-num">2 / 2</div>
</div>

</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script>
(function buildMiniRoster() {
  const tbody = document.getElementById('mini-roster-body');
  for (let i = 0; i < 5; i++) {
  const n1 = i + 1, n2 = i + 6;
    const tr = document.createElement('tr');
    tr.innerHTML =
      `<td class="seq-cell">${n1}</td>` +
      `<td contenteditable="true"></td>` +
      `<td contenteditable="true"></td>` +
      `<td class="col-divider"></td>` +
      `<td class="seq-cell">${n2}</td>` +
      `<td contenteditable="true"></td>` +
      `<td contenteditable="true"></td>` +
      `<td></td>`;
    tbody.appendChild(tr);
  }
})();

(function buildRoster() {
  const tbody = document.getElementById('roster-body');
  for (let i = 0; i < 30; i++) {
    const tr = document.createElement('tr');
    tr.innerHTML =
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td class="col-divider"></td>` +
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td contenteditable="true" style="font-size:11px;"></td>` +
      `<td></td>`;
    tbody.appendChild(tr);
  }
})();

(function setToday() {
  const d = new Date();
  const str = d.getFullYear() + '년 ' + (d.getMonth()+1) + '월 ' + d.getDate() + '일';
  ['f-date','f-write-date','r-date'].forEach(function(id) {
    var el = document.getElementById(id);
    if (el && !el.textContent.trim()) el.textContent = str;
  });
})();

document.getElementById('f-date').addEventListener('input', function() {
  document.getElementById('r-date').textContent = this.textContent.trim();
});
document.getElementById('f-place').addEventListener('input', function() {
  document.getElementById('r-place').textContent = this.textContent.trim();
});

const WM_PASSWORD = 'ossc01432';
let wmOn = true;

function toggleWatermark(show) {
  document.querySelectorAll('.watermark').forEach(function(el) {
    el.style.display = show ? 'block' : 'none';
  });
}
toggleWatermark(true);

function toggleWatermarkUI() {
  if (wmOn) {
    openPW();
  } else {
    wmOn = true;
    toggleWatermark(true);
    document.getElementById('btn-wm').textContent = '🔒 워터마크 ON';
  }
}

function openPW() {
  document.getElementById('pw-input').value = '';
  document.getElementById('pw-error').textContent = '';
  document.getElementById('pw-input').classList.remove('error');
  document.getElementById('pw-overlay').classList.add('show');
  setTimeout(function() {
    document.getElementById('pw-input').focus();
  }, 50);
}

function closePW() {
  document.getElementById('pw-overlay').classList.remove('show');
}

function confirmPW() {
  var val = document.getElementById('pw-input').value;
  if (val === WM_PASSWORD) {
    closePW();
    wmOn = false;
    toggleWatermark(false);
    document.getElementById('btn-wm').textContent = '🔓 워터마크 OFF';
  } else {
    var inp = document.getElementById('pw-input');
    inp.classList.remove('error');
    void inp.offsetWidth;
    inp.classList.add('error');
    document.getElementById('pw-error').textContent = '비밀번호가 올바르지 않습니다.';
    inp.value = '';
    inp.focus();
  }
}

function buildEduTypeText() {
  const checked = document.querySelectorAll('input[name="edutype"]:checked');
  return Array.from(checked).map(function(c) {
    if (c.value === '기타') {
      const etc = document.getElementById('etc-input').textContent;
      return '■ 기타(' + (etc || '') + ')교육';
    }
    return '■ ' + c.value;
  }).join('  ') || '(선택 없음)';
}

async function generatePDF() {
  const btn = document.querySelector('.btn-pdf');
  btn.disabled = true;
  btn.textContent = '생성 중…';

  const gridEl = document.querySelector('.edu-type-grid');
  const txtEl = document.createElement('span');
  txtEl.style.fontSize = '11px';
  txtEl.textContent = buildEduTypeText();
  gridEl.parentNode.insertBefore(txtEl, gridEl);
  gridEl.style.display = 'none';

  try {
    const { jsPDF } = window.jspdf;
    const pdf = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });
    const pages = ['page1', 'page2'];

    for (let i = 0; i < pages.length; i++) {
      const cvs = await html2canvas(document.getElementById(pages[i]), {
        scale: 2,
        useCORS: true,
        backgroundColor: '#ffffff',
        logging: false
      });
      if (i > 0) pdf.addPage();
      pdf.addImage(cvs.toDataURL('image/jpeg', 0.95), 'JPEG', 0, 0, 210, 297);
    }

    const today = new Date();
    const ds = today.getFullYear() +
      String(today.getMonth()+1).padStart(2,'0') +
      String(today.getDate()).padStart(2,'0');

    pdf.save('안전보건교육일지_' + ds + '.pdf');
  } catch(e) {
    alert('PDF 생성 오류: ' + e.message);
  } finally {
    gridEl.style.display = '';
    txtEl.remove();
    btn.disabled = false;
    btn.textContent = '📥 PDF 저장';
  }
}
</script>
</body>
</html>				</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>위험을 다루는 순서, 보호구는 마지막 수단이다</title>
		<link>https://safetysupport.co.kr/risk-management-5-principles/</link>
		
		<dc:creator><![CDATA[mangjil]]></dc:creator>
		<pubDate>Thu, 07 May 2026 20:40:02 +0000</pubDate>
				<category><![CDATA[칼럼]]></category>
		<category><![CDATA[PDCA]]></category>
		<category><![CDATA[개인보호구]]></category>
		<category><![CDATA[방호장치]]></category>
		<category><![CDATA[보호구]]></category>
		<category><![CDATA[산업안전]]></category>
		<category><![CDATA[산업안전보건법]]></category>
		<category><![CDATA[안전관리]]></category>
		<category><![CDATA[안전보건관리체계]]></category>
		<category><![CDATA[안전작업절차]]></category>
		<category><![CDATA[위험관리 5원칙]]></category>
		<category><![CDATA[위험성평가]]></category>
		<category><![CDATA[위험성평가 개선대책]]></category>
		<category><![CDATA[위험원 격리]]></category>
		<category><![CDATA[위험원 방호]]></category>
		<category><![CDATA[위험원 제거]]></category>
		<category><![CDATA[자율안전관리]]></category>
		<category><![CDATA[작업안전]]></category>
		<category><![CDATA[중대재해처벌법]]></category>
		<category><![CDATA[휴먼에러]]></category>
		<guid isPermaLink="false">https://safetysupport.co.kr/?p=3649</guid>

					<description><![CDATA[safetysupport insight COLUMN 위험을 다루는 순서,보호구는 마지막 수단이다 보호구를 지급했다고 위험이 사라진 것이 아니다. 위험관리의 5원칙은 제거에서 시작해 행동으로 완성되며, 그 순서가 곧 안전수준의 차이를 만든다. safetysupport insight COLUMN The Order of Risk Control,PPE Is the Last Resort Issuing PPE does not make the hazard disappear. The five principles of risk management begin with elimination [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3649" class="elementor elementor-3649" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-604e863 e-con-full e-flex e-con e-parent" data-id="604e863" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-666a050 elementor-widget elementor-widget-html" data-id="666a050" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<style>
@import url('https://hangeul.pstatic.net/hangeul_static/css/nanum-square-neo.css');
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=Noto+Serif:ital,wght@0,700;1,400&display=swap');
*{box-sizing:border-box;margin:0;padding:0;}
body,div,p,h1,h2,ul,li,blockquote{font-family:'NanumSquareNeo','Noto Sans KR',sans-serif;}
.ss-outer{max-width:860px;margin:0 auto;background:#fff;}
.ss-header{background:linear-gradient(160deg,#0d2a4f 0%,#1a3a6b 100%);padding:32px 36px;border-left:4px solid #C9A961;box-shadow:0 4px 20px rgba(0,0,0,0.18);}
.ss-header-inner{display:flex;justify-content:space-between;align-items:flex-start;}
.ss-header-left{flex:1;}
.ss-toggle{display:flex;align-items:center;background:rgba(255,255,255,0.12);border-radius:50px;padding:2px;flex-shrink:0;margin-left:20px;cursor:pointer;}
.toggle-label{background:transparent!important;background-color:transparent!important;background-image:none!important;border:0!important;outline:0!important;box-shadow:none!important;-webkit-appearance:none;appearance:none;font-family:'Inter',sans-serif;font-size:12px;font-weight:700;padding:6px 16px;cursor:pointer;transition:all .2s;border-radius:50px;line-height:1;}
.toggle-label:hover,.toggle-label:focus,.toggle-label:active,.toggle-label:focus-visible{background:transparent!important;background-color:transparent!important;background-image:none!important;box-shadow:none!important;outline:0!important;border:0!important;transform:none!important;}
.toggle-label.active{background:#fff!important;background-color:#fff!important;color:#1a3a6b!important;}
.toggle-label.inactive{color:rgba(255,255,255,0.65);}
.ss-brand-tag{font-family:'Inter',sans-serif;font-size:10px;color:#C9A961;text-transform:uppercase;letter-spacing:.20em;font-weight:700;display:block;}
.ss-cat-tag{font-family:'Inter',sans-serif;font-size:10px;color:rgba(255,255,255,0.65);text-transform:uppercase;letter-spacing:.16em;font-weight:700;margin-top:8px;display:block;}
h1.ss-title{font-size:30px;font-weight:700;color:#fff;line-height:1.45;margin:18px 0 0;font-family:'NanumSquareNeo','Noto Sans KR',sans-serif;letter-spacing:-0.02em;}
h1.ss-title-en{font-family:'Noto Serif',serif;font-size:30px;font-weight:700;color:#fff;line-height:1.45;margin:18px 0 0;letter-spacing:-0.01em;}
.ss-subtitle{font-size:14.5px;color:rgba(255,255,255,0.82);font-weight:400;margin-top:12px;line-height:1.75;word-break:keep-all;}
.ss-subtitle-en{font-family:"Inter",sans-serif;font-size:14px;color:rgba(255,255,255,0.82);font-weight:400;margin-top:12px;line-height:1.75;}
.ss-title-line{width:48px;height:2px;background:#C9A961;margin:24px 0 0;}
.ss-panel{display:none;}
.ss-panel.active{display:block;}
.ss-body{max-width:780px;margin:0 auto;padding:40px 32px 90px;}
.ss-img{width:100%;max-height:420px;object-fit:cover;border-radius:10px;margin:0 0 32px;display:block;box-shadow:0 4px 20px rgba(0,0,0,0.08);}
p.ss-p{font-size:16.5px;color:#2d2d2d;line-height:2.0;margin:0 0 22px;word-break:keep-all;letter-spacing:-0.01em;}
p.ss-p-en{font-family:'Inter',sans-serif;font-size:16px;color:#2d2d2d;line-height:1.95;margin:0 0 20px;}
h2.ss-h2{font-size:19px;font-weight:700;color:#1a3a6b;border-left:3px solid #1a3a6b;padding-left:14px;margin:0 0 22px;line-height:1.5;letter-spacing:-0.01em;}
blockquote.ss-bq{background:#f4f8fd;border-left:3px solid #4a9ee8;padding:20px 28px;margin:36px 0;font-size:16px;line-height:1.9;color:#1a3a6b;font-weight:600;border-radius:0 6px 6px 0;}
blockquote.ss-bq-en{background:#f4f8fd;border-left:3px solid #4a9ee8;padding:20px 28px;margin:36px 0;font-family:'Inter',sans-serif;font-size:15.5px;line-height:1.9;color:#1a3a6b;font-weight:600;font-style:italic;border-radius:0 6px 6px 0;}
.ss-divider{width:100%;height:1px;background:linear-gradient(to right,#dde8f5 0%,transparent 100%);margin:56px 0 36px;display:block;}
.ss-en-badge{display:inline-flex;align-items:center;gap:8px;background:#1a3a6b;color:#fff;font-family:'Inter',sans-serif;font-size:10px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;padding:5px 14px;border-radius:20px;margin-bottom:20px;}
.ss-en-dot{width:6px;height:6px;border-radius:50%;background:#4a9ee8;display:inline-block;flex-shrink:0;}
.ss-footer{margin-top:70px;border-top:1px solid #dde8f5;padding-top:20px;text-align:center;font-family:'Inter',sans-serif;font-size:12px;color:#bbb;letter-spacing:.06em;}
</style>
<div class="ss-outer">
  <div class="ss-header">
    <div class="ss-header-inner">
      <div id="ss-panel-ko" class="ss-panel active ss-header-left">
        <span class="ss-brand-tag">safetysupport insight</span>
        <span class="ss-cat-tag">COLUMN</span>
        <h1 class="ss-title">위험을 다루는 순서,<br>보호구는 마지막 수단이다</h1>
        <p class="ss-subtitle">보호구를 지급했다고 위험이 사라진 것이 아니다. 위험관리의 5원칙은 제거에서 시작해 행동으로 완성되며, 그 순서가 곧 안전수준의 차이를 만든다.</p>
        <div class="ss-title-line"></div>
      </div>
      <div id="ss-panel-en" class="ss-panel ss-header-left">
        <span class="ss-brand-tag">safetysupport insight</span>
        <span class="ss-cat-tag">COLUMN</span>
        <h1 class="ss-title-en">The Order of Risk Control,<br>PPE Is the Last Resort</h1>
        <p class="ss-subtitle-en">Issuing PPE does not make the hazard disappear. The five principles of risk management begin with elimination and end with behavior — and that order determines the level of safety.</p>
        <div class="ss-title-line"></div>
      </div>
      <div class="ss-toggle" onclick="ssToggle()">
        <button id="ss-lbl-ko" class="toggle-label active">한국어</button>
        <button id="ss-lbl-en" class="toggle-label inactive">English</button>
      </div>
    </div>
  </div>
  <div class="ss-body">
    <img decoding="async" class="ss-img" src="https://safetysupport.co.kr/wp-content/uploads/image/202605/risk-ppe-worker-machine-hazard.png" alt="보호구를 착용했지만 위험한 기계 바로 앞에 서 있는 근로자 — 보호구는 마지막 방어선이다">
    <div id="ss-panel-ko" class="ss-panel active">
      <p class="ss-p">보호구를 착용하면 안전해진다는 생각은 틀리지 않지만, 완전하지도 않다. 보호구는 위험이 신체에 도달하는 순간을 마지막으로 막아주는 수단이지, 위험이 사라졌다는 의미가 아니며, 회전체는 여전히 돌고 있고 유해물질은 여전히 공기 중에 존재하며 중량물은 여전히 무겁다. 보호구를 착용한 상태에서도 끼임사고는 발생하고, 호흡보호구를 쓴 상태에서도 유해가스 중독은 일어난다. 위험이 그 자리에 있는 한, 보호구는 마지막 방어선일 뿐 근원적인 해결책이 아니다.</p>
      <p class="ss-p">위험관리의 5가지 원칙과 10가지 방법은 이 한계를 넘어서기 위한 체계적 판단의 틀이다. 위험원을 제거하거나 대체하고, 불가능하다면 격리하며, 그래도 위험이 남는다면 방호장치로 접촉을 차단하고, 작업자에게 적절한 도구와 보호구를 제공하며, 마지막으로 안전한 위치와 행동기준으로 남아 있는 위험에 대응하는 흐름이다. 이 순서는 안전대책의 강도와 신뢰성을 기준으로 배열되어 있으며, 위쪽 원칙일수록 사람의 판단이나 의지에 덜 의존하고 더 구조적으로 위험을 통제한다.</p>
    </div>
    <div id="ss-panel-en" class="ss-panel">
      <span class="ss-en-badge"><span class="ss-en-dot"></span>English Version</span>
      <p class="ss-p-en">The belief that wearing PPE makes a workplace safe is not wrong — but it is incomplete. PPE is the final barrier between a hazard and the human body, not evidence that the hazard has been removed. The rotating shaft is still turning. The toxic substance is still in the air. The heavy load is still heavy. Crush injuries happen to workers wearing gloves; gas poisoning happens to workers wearing respirators. As long as the hazard remains, PPE is the last line of defense — not a fundamental solution.</p>
      <p class="ss-p-en">The five principles and ten methods of risk management provide a systematic framework for moving beyond this limitation. The sequence runs from eliminating or substituting the hazard, to isolating it, to installing physical safeguards, to reinforcing the worker with appropriate tools and equipment, and finally to managing residual risk through safe positioning and behavioral standards. This order is arranged by the strength and reliability of each control measure — the higher the principle, the less it depends on individual judgment or willpower, and the more structurally it controls the hazard.</p>
    </div>
    <span class="ss-divider"></span>
    <img decoding="async" class="ss-img" src="https://safetysupport.co.kr/wp-content/uploads/image/202605/risk-isolation-safety-fence-factory.png" alt="산업시설 안전펜스 너머로 기계설비가 작동 중인 장면 — 위험과 사람 사이의 구조적 분리">
    <div id="ss-panel-ko" class="ss-panel active">
      <h2 class="ss-h2">위험원 제거 — 가장 강력하지만 가장 어려운 수단</h2>
      <p class="ss-p">위험관리의 첫 번째 원칙은 위험원 자체를 없애는 것으로, 유해성이 높은 화학물질을 무해한 물질로 대체하거나, 끼임 위험이 큰 수작업 공정을 없애거나, 중량물을 사람이 직접 취급하지 않아도 되도록 공정 자체를 바꾸는 방식이 여기에 해당하며, 이 원칙이 실현되면 나머지 원칙들을 적용할 필요 자체가 줄어든다는 점에서 가장 근원적인 통제수단으로 평가된다. 위험이 사라진 작업장에서는 방호장치가 제대로 닫혀 있었는지, 보호구를 착용했는지, 작업자가 충분히 주의했는지를 따질 이유가 없다.</p>
      <p class="ss-p">그러나 위험원 제거는 가장 이상적인 동시에 가장 현실적 제약이 많은 수단이기도 하다. 현존 기술로 위험한 공정 자체를 없애기 어렵거나, 대체물질이 존재하지 않거나, 설비 변경에 수반되는 비용이 사업장의 규모를 감안할 때 사실상 불가능에 가까운 경우가 많으며, 생산공정의 특성상 해당 공정을 유지하지 않으면 제품의 품질이나 생산효율을 확보할 수 없는 경우도 적지 않다. 따라서 위험원 제거는 위험성평가에서 개선대책을 검토할 때 언제나 가장 먼저 가능성을 따져야 하지만, 그 적용이 어렵다는 이유만으로 이후 단계로 곧바로 넘어가는 것을 당연시해서도 안 된다.</p>
      <h2 class="ss-h2">위험원 격리 — 위험과 사람 사이에 구조적 거리를 만드는 일</h2>
      <p class="ss-p">위험원을 완전히 제거할 수 없다면 다음 단계는 위험이 작업자에게 도달하는 경로를 끊는 것으로, 위험원 격리는 위험 자체는 현장에 남아 있지만 그 위험이 작업자와 직접 접촉하지 않도록 공간적·기능적 거리를 확보하는 방식이며, 울 또는 칸막이 설치와 자동화 및 원격조작이 대표적인 방법이다. 로봇 작업구역에 안전펜스를 설치하거나, 고온·고압 설비를 별도 구획 안에 배치하거나, 조작실에서 설비를 원격으로 운전하도록 전환하는 방식이 이에 해당한다.</p>
      <p class="ss-p">자동화와 원격조작은 격리의 가장 적극적인 형태로, 사람이 설비 가까이 접근해 손을 넣고 얼굴을 기울여야 했던 작업을 기계나 장비가 대신 수행하게 함으로써 위험과 사람의 접점 자체를 구조적으로 줄이는 방식이며, 고온, 회전체, 유해가스, 밀폐공간, 고소작업처럼 접근 자체가 위험한 환경에서는 자동화와 원격조작이 편의 수단이 아니라 핵심적인 안전관리 수단이 된다. 격리의 본질은 작업자가 위험을 인지하고 피하는 것이 아니라, 통상적인 작업 과정에서 위험구역으로 들어갈 필요가 없도록 작업동선과 설비 배치, 유지보수 방식을 구조적으로 설계하는 데 있다.</p>
      <blockquote class="ss-bq">격리는 위험을 없애지 못하지만, 위험이 사람에게 닿는 경로를 끊어낸다. 그리고 그 경로를 끊는 것은 울타리를 세우는 행위가 아니라, 작업 전체를 다시 설계하는 일이다.</blockquote>
    </div>
    <div id="ss-panel-en" class="ss-panel">
      <h2 class="ss-h2">Elimination — The Most Powerful, Most Difficult Control</h2>
      <p class="ss-p-en">The first principle of risk management is removing the hazard itself — substituting a toxic chemical with a harmless alternative, eliminating a process with entrapment risks, or redesigning workflows so workers no longer need to manually handle heavy loads. When this principle is successfully applied, the need to apply every subsequent principle diminishes accordingly. In a workplace where the hazard no longer exists, there is no need to ask whether the guard was closed, whether PPE was worn, or whether the worker was sufficiently attentive.</p>
      <p class="ss-p-en">Yet elimination is simultaneously the most ideal and the most constrained of all control measures. Existing technology may make it impossible to remove certain processes entirely; no viable substitutes may exist; the cost of equipment modification may be prohibitive given the scale of the organization; or the nature of the production process may make it impossible to maintain quality or efficiency without preserving the current method. Elimination must always be the first possibility examined when developing risk control measures — but the difficulty of applying it should never be treated as automatic justification for skipping directly to a lower-order control.</p>
      <h2 class="ss-h2">Isolation — Creating Structural Distance Between Hazard and Person</h2>
      <p class="ss-p-en">When complete elimination is not feasible, the next step is severing the path by which the hazard reaches the worker. Isolation keeps the hazard present in the workplace while establishing physical and functional distance — through safety fencing, enclosures, automation, or remote operation — so that workers do not need to enter the danger zone during normal work. Installing safety fences around robotic work cells, enclosing high-temperature or high-pressure equipment in dedicated compartments, and converting operations to remote control from a separate control room are all representative applications.</p>
      <p class="ss-p-en">Automation and remote operation represent the most proactive form of isolation: replacing tasks that once required workers to reach into machinery, lean over equipment, or bring their faces close to hazardous areas with mechanical or remote alternatives, structurally reducing the points of contact between hazard and person. In environments where approach itself is dangerous — high heat, rotating machinery, toxic gases, confined spaces, work at height — automation and remote operation are not conveniences but core safety controls. The essence of isolation lies not in telling workers to recognize and avoid danger, but in designing work routes, equipment layout, and maintenance procedures so that entering the hazard zone is simply unnecessary.</p>
      <blockquote class="ss-bq-en">Isolation does not eliminate the hazard — but it severs the path by which the hazard reaches a person. And severing that path is not a matter of putting up a fence. It is a matter of redesigning the entire work process.</blockquote>
    </div>
    <span class="ss-divider"></span>
    <img decoding="async" class="ss-img" src="https://safetysupport.co.kr/wp-content/uploads/image/202605/risk-reinforcement-tool-handling-worker.png" alt="전용 장비를 사용해 위험 부품을 다루는 근로자 — 몸과 위험 사이에 도구가 있다">
    <div id="ss-panel-ko" class="ss-panel active">
      <h2 class="ss-h2">위험원 방호 — 사람의 실수를 전제한 물리적 안전망</h2>
      <p class="ss-p">위험원 방호는 격리와 유사하지만, 작업자가 위험부위에 인접하여 작업해야 하는 상황을 전제로 한다는 점에서 다르다. 회전체의 축, 벨트, 체인, 프레스 금형, 절단날, 고온 배관, 분진 발생부 등에 덮개나 방호커버를 설치하고, 문이 열리면 설비가 정지되는 인터록이나 손이 위험영역에 들어가면 작동을 멈추는 광전자식 방호장치, 접근을 감지하는 센서류를 설치하는 방식이 이에 해당하며, 격리가 위험구역 전체와 사람을 분리하는 개념이라면 방호는 특정 위험부위와 신체의 접촉 자체를 물리적으로 차단하는 장치적 개념에 가깝다.</p>
      <p class="ss-p">방호의 가장 중요한 특성은 작업자의 의지와 주의력에 의존하지 않는다는 점으로, 사람은 피로하거나 익숙해지면 위험을 과소평가하고 작업속도에 쫓기면 불안전한 자세를 선택하며 반복작업에서는 순간적인 부주의가 발생하기 마련인데, 방호장치는 이러한 휴먼에러가 발생하더라도 신체가 위험부위에 도달하지 못하도록 구조적으로 막아준다. 다만 방호장치는 설치 자체보다 유지와 사용성이 더 중요하며, 작업에 방해된다는 이유로 덮개를 열어둔 채 운전하거나 센서를 임의로 무력화한다면 방호의 기능은 사라지므로, 현장에서 실제로 사용 가능한 구조로 설계되고 지속적으로 관리되어야 한다.</p>
      <blockquote class="ss-bq">방호장치는 위험을 숨기는 장치가 아니라, 사람이 실수해도 사고로 이어지지 않도록 만드는 물리적 안전망이다.</blockquote>
      <h2 class="ss-h2">사람 측면의 보강 — 남은 위험을 안전하게 다루는 조건</h2>
      <p class="ss-p">위험원을 제거하거나 격리하고 방호장치를 설치하더라도 모든 위험을 완전히 통제할 수는 없으며, 이때 필요한 것이 사람 측면의 보강이다. 손으로 직접 취급하던 중량물을 리프트나 호이스트로 옮기도록 하거나, 설비 내부를 확인하기 위해 얼굴을 가까이 들이밀던 작업에 내시경카메라를 도입하거나, 고온부를 직접 만질 가능성이 있는 작업에 단열장갑을 지급하고 분진이나 유해가스 노출 작업에 적정한 호흡보호구를 제공하는 방식이 이에 해당하며, 적절한 공구와 보조장비는 불안정한 자세와 과도한 힘, 반복적인 신체 부담을 줄여주고 작업자가 위험한 위치에 몸을 넣지 않고도 작업을 수행할 수 있게 한다.</p>
      <p class="ss-p">이 단계에서 반드시 기억해야 할 점은 보호구가 최우선 대책이 아니라는 사실로, 보호구는 작업자에게 마지막으로 제공되는 개인적 방어수단이며 위험원이 제거되거나 격리되지 않은 상태에서 보호구만으로 위험을 관리하려 하면 관리 수준이 낮아질 수 있다. 따라서 사람 측면의 보강은 보호구 지급과 장비 제공을 넘어, 작업자가 위험을 직접 감당하지 않고도 작업을 완수할 수 있는 조건을 만드는 관리수단으로 이해되어야 한다.</p>
      <blockquote class="ss-bq">사람 측면의 보강은 위험을 개인에게 맡기는 것이 아니라, 사람이 위험을 직접 감당하지 않도록 작업조건을 보완하는 과정이다.</blockquote>
    </div>
    <div id="ss-panel-en" class="ss-panel">
      <h2 class="ss-h2">Safeguarding — A Physical Safety Net That Assumes Human Error</h2>
      <p class="ss-p-en">Safeguarding resembles isolation but differs in a critical respect: it presupposes that workers must operate in proximity to hazardous parts. Installing protective covers or guards over rotating shafts, belts, chains, press dies, cutting blades, high-temperature piping, and dust-generating components; fitting interlocks that stop equipment when a door is opened; installing photoelectric safety devices that halt operation when a hand enters the danger zone; deploying sensors that detect approach — these are all representative safeguarding measures. Where isolation separates the worker from the entire hazard zone, safeguarding physically blocks contact between specific hazardous parts and the human body.</p>
      <p class="ss-p-en">The defining characteristic of safeguarding is that it does not depend on worker willpower or attention. People grow fatigued, become desensitized to familiar hazards, cut corners under time pressure, and experience momentary lapses during repetitive tasks — safeguards are designed to prevent these entirely human failures from allowing the body to reach the hazardous point, or to ensure that a dangerous condition triggers an immediate stop. That said, the maintenance and usability of safeguards matter more than their installation alone; a guard left open because it interferes with work, or a sensor deliberately bypassed, renders the safeguard completely ineffective. Safeguards must be designed for practical use and actively maintained throughout the life of the equipment.</p>
      <blockquote class="ss-bq-en">A safeguard is not a device that conceals danger. It is a physical safety net that ensures a human error does not become an industrial accident.</blockquote>
      <h2 class="ss-h2">Human-Side Reinforcement — Creating the Conditions to Handle Residual Risk Safely</h2>
      <p class="ss-p-en">Even after elimination, isolation, and safeguarding have been applied, not every hazard can be fully controlled — and this is where human-side reinforcement becomes necessary. Replacing manual handling of heavy loads with lifts, hoists, or carts; introducing endoscope cameras where workers previously had to bring their faces close to internal equipment to inspect it; providing insulated gloves for work involving contact with hot surfaces; supplying appropriate respiratory protection for tasks with dust or toxic gas exposure — all of these reduce unstable postures, excessive force, and repetitive physical strain, allowing workers to complete tasks without placing their bodies in hazardous positions.</p>
      <p class="ss-p-en">The essential point at this stage is that PPE is not a primary control measure. It is the last personal defense available to the worker — and relying on PPE alone, without first eliminating or isolating the hazard, results in a fundamentally inadequate safety management approach. Human-side reinforcement must be understood not as delegating risk to the individual, but as systematically improving the working conditions so that workers are not required to absorb danger with their own bodies.</p>
      <blockquote class="ss-bq-en">Human-side reinforcement is not about assigning risk to the individual. It is about improving working conditions so that people are not required to personally absorb the danger that remains.</blockquote>
    </div>
    <span class="ss-divider"></span>
    <img decoding="async" class="ss-img" src="https://safetysupport.co.kr/wp-content/uploads/image/202605/risk-tbm-safety-briefing-workers.png" alt="작업 전 TBM을 진행 중인 근로자들 — 안전행동의 기준을 공유하는 마지막 관리수단">
    <div id="ss-panel-ko" class="ss-panel active">
      <h2 class="ss-h2">사람 측면의 대응과 위험관리의 완성</h2>
      <p class="ss-p">위험관리의 마지막 원칙은 남아 있는 위험을 작업자가 올바르게 인지하고 일정한 기준에 따라 행동하도록 만드는 것으로, 지게차 작업구역에서 보행자의 위치를 정하거나, 크레인 인양작업 중 신호수의 위치와 대피공간을 확보하거나, 설비 정비 시 전원 차단과 잠금표지를 확인한 뒤 작업을 시작하도록 하는 절차가 이에 해당한다. 작업 전 TBM을 통해 당일 작업의 위험요인과 통제방법을 공유하고, 비정상작업이나 돌발작업이 발생했을 때 즉시 작업을 멈추고 재평가하도록 하는 기준도 여기에 포함된다.</p>
      <p class="ss-p">휴먼에러는 개인의 부주의만으로 설명되지 않으며, 불명확한 작업지시, 복잡한 절차, 촉박한 시간, 혼재된 동선, 반복되는 예외작업은 모두 실수를 유도하는 조건이 되므로, 이 단계의 목표는 "조심하라"는 말이 아니라 실수가 발생하기 어려운 작업환경과 행동기준을 설계하는 것이다. 위험관리의 5원칙은 각각 독립된 기법이 아니라 하나의 순서로 이해해야 하며, 제거는 관리의 필요 자체를 줄이는 대책이고, 격리와 방호는 위험이 사람에게 전달되는 경로를 구조적으로 차단하는 대책이며, 보강과 대응은 남아 있는 위험을 안전하게 다루기 위한 대책으로, 이 순서를 역행하여 곧바로 교육 실시나 보호구 착용으로 마무리하는 것은 더 근원적인 단계의 가능성을 검토하지 않은 채 위험을 사람에게 떠넘기는 결과로 이어질 수 있다.</p>
      <blockquote class="ss-bq">안전행동은 개인의 의지만으로 유지되지 않는다. 현장이 같은 기준으로 움직일 때 비로소 안전은 문화가 된다.</blockquote>
      <h2 class="ss-h2">위험관리의 순서가 안전수준을 결정한다</h2>
      <p class="ss-p">안전한 작업장은 위험한 설비를 그대로 두고, 위험한 동선을 그대로 두며, 불안정한 자세를 그대로 둔 채 작업자에게 조심을 요구하는 방식으로 만들어지지 않는다. 위험을 사람에게 가까이 두지 않도록 설계하고, 불가피하게 남은 위험은 방호와 절차, 장비와 행동기준으로 촘촘히 통제하는 다층적 방어 체계가 작동할 때, 비로소 사업장은 자율적 안전관리체계에서 지향하는 근원적 안전에 한 걸음 더 가까워진다. 위험관리는 제거에서 시작해 행동으로 완성되며, 그 사이에는 격리, 방호, 보강이라는 여러 겹의 안전장치가 반드시 놓여야 한다.</p>
      <blockquote class="ss-bq">안전한 작업장은 위험을 잘 피하는 사람에게 의존하지 않는다. 위험이 사람에게 닿기 어려운 구조를 먼저 만들고, 남은 위험은 여러 겹의 통제수단으로 감싸는 것이다.</blockquote>
      <div class="ss-footer">산업안전지원센터㈜ · Occupational Safety Support Center</div>
    </div>
    <div id="ss-panel-en" class="ss-panel">
      <h2 class="ss-h2">Behavioral Response — The Final Principle and the Completion of Risk Management</h2>
      <p class="ss-p-en">The final principle of risk management involves ensuring that workers correctly recognize residual hazards and act in accordance with established standards. Designating where pedestrians must stand in forklift operating zones, securing the position of signal operators and evacuation spaces during crane lifts, confirming power isolation and lockout tags before beginning equipment maintenance — these are all representative applications. Pre-work TBM sessions that share the day's hazards and control measures, and standards requiring workers to immediately stop and reassess when non-routine or unexpected tasks arise, also fall within this principle.</p>
      <p class="ss-p-en">Human error cannot be attributed solely to individual carelessness. Unclear work instructions, overly complex procedures, time pressure, congested work routes, and repeatedly occurring exceptional tasks are all conditions that make mistakes more likely — and the goal at this stage is not to tell workers to "be careful," but to design work environments and behavioral standards in which errors are harder to make. The five principles of risk management must be understood as a single ordered sequence, not as independent techniques: elimination reduces the need for control itself; isolation and safeguarding structurally sever the path by which hazard reaches people; reinforcement and behavioral response manage what remains. Bypassing this sequence to conclude with "safety training" or "wear your PPE" — without first examining the possibility of higher-order controls — effectively transfers the burden of danger onto the individual worker.</p>
      <blockquote class="ss-bq-en">Safe behavior cannot be sustained by individual willpower alone. Safety becomes a culture only when an entire workplace operates according to the same standards.</blockquote>
      <h2 class="ss-h2">The Order of Risk Management Determines the Level of Safety</h2>
      <p class="ss-p-en">A safe workplace is not built by leaving hazardous equipment in place, leaving dangerous traffic routes unchanged, leaving unstable postures uncorrected, and asking workers to be more careful. It is built through a layered defense system in which hazards are kept away from people by design, and whatever risk inevitably remains is tightly controlled through safeguards, procedures, equipment, and behavioral standards. When this multi-layer system operates as intended, the workplace moves meaningfully closer to the intrinsic safety that autonomous safety management frameworks are designed to achieve. Risk management begins with elimination and ends with behavior — and between those two points, the layers of isolation, safeguarding, and reinforcement must be firmly in place.</p>
      <blockquote class="ss-bq-en">A safe workplace does not rely on workers who are skilled at avoiding danger. It is built by first creating a structure in which danger is difficult to reach — and wrapping whatever remains in multiple layers of control.</blockquote>
      <div class="ss-footer">Occupational Safety Support Center · safetysupport.co.kr</div>
    </div>
  </div>
</div>
<script>
var ssIsKo = true;
function ssToggle(){
  ssIsKo = !ssIsKo;
  var lblKo = document.getElementById("ss-lbl-ko");
  var lblEn = document.getElementById("ss-lbl-en");
  var panels = document.querySelectorAll(".ss-panel");
  var pKo = [], pEn = [];
  panels.forEach(function(p){
    if(p.id === "ss-panel-ko") pKo.push(p);
    if(p.id === "ss-panel-en") pEn.push(p);
  });
  if(ssIsKo){
    lblKo.className = "toggle-label active";
    lblEn.className = "toggle-label inactive";
    pKo.forEach(function(p){ p.classList.add("active"); });
    pEn.forEach(function(p){ p.classList.remove("active"); });
  } else {
    lblKo.className = "toggle-label inactive";
    lblEn.className = "toggle-label active";
    pKo.forEach(function(p){ p.classList.remove("active"); });
    pEn.forEach(function(p){ p.classList.add("active"); });
  }
}
</script>				</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>산업안전보건위원회 회의록 작성툴</title>
		<link>https://safetysupport.co.kr/occupational-safety-health-committee-minutes-tool/</link>
		
		<dc:creator><![CDATA[mangjil]]></dc:creator>
		<pubDate>Sat, 02 May 2026 11:24:30 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[근로자 참여]]></category>
		<category><![CDATA[사업장 안전관리]]></category>
		<category><![CDATA[산업안전보건법]]></category>
		<category><![CDATA[산업안전보건위원회]]></category>
		<category><![CDATA[산업안전보건위원회 회의록]]></category>
		<category><![CDATA[안전보건 회의록]]></category>
		<category><![CDATA[안전보건관리체계]]></category>
		<category><![CDATA[안전보건위원회]]></category>
		<category><![CDATA[회의록 작성툴]]></category>
		<guid isPermaLink="false">https://safetysupport.co.kr/?p=3423</guid>

					<description><![CDATA[산업안전보건위원회 필수 심의·의결사항 사업장의 산업재해 예방계획의 수립에 관한 사항 안전보건관리규정의 작성 및 변경에 관한 사항 안전보건교육에 관한 사항 작업환경측정 등 작업환경의 점검 및 개선에 관한 사항 근로자의 건강진단 등 건강관리에 관한 사항 산업재해 중 중대재해에 관한 사항에 대한 원인 조사 및 재발 방지대책 수립에 관한 사항 산업재해에 관한 통계의 기록 및 유지에 관한 사항 유해하거나 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3423" class="elementor elementor-3423" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-a859de0 e-con-full e-flex e-con e-parent" data-id="a859de0" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-203fcd2 elementor-widget elementor-widget-html" data-id="203fcd2" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/moonspam/NanumSquareNeo@latest/NanumSquareNeo.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>

<style>
:root{
  --navy:#12355b;--blue:#1f6fb2;--line:#d8e4ef;--ink:#1f2a37;--muted:#6b7280;--accent:#2aa876;--red:#b42318;--shadow:0 10px 28px rgba(20,52,92,.10);
}
*{box-sizing:border-box}
.committee-tool{max-width:1440px;margin:0 auto;padding:24px 18px 70px;font-family:'NanumSquareNeo','Malgun Gothic',sans-serif;color:var(--ink);word-break:keep-all;line-height:1.55}
.committee-tool button,.committee-tool input,.committee-tool textarea,.committee-tool select{font-family:inherit}
.committee-tool button{cursor:pointer}
.ct-header{background:linear-gradient(135deg,#12355b 0%,#1f6fb2 72%,#2aa876 100%);border-radius:18px;color:#fff;padding:28px 30px;box-shadow:var(--shadow);position:relative;overflow:hidden}
.ct-header:after{content:"";position:absolute;right:-80px;top:-80px;width:240px;height:240px;border-radius:50%;background:rgba(255,255,255,.10)}
.ct-eye{font-size:11px;font-weight:900;letter-spacing:.18em;text-transform:uppercase;color:#bfe7ff;margin-bottom:8px}
.ct-header h1{font-size:clamp(25px,3vw,38px);font-weight:900;letter-spacing:-.04em;line-height:1.25;margin:0}
.ct-header p{margin:8px 0 0;font-size:14px;color:rgba(255,255,255,.84);max-width:860px}
.ct-layout{display:grid;grid-template-columns:440px minmax(0,1fr);gap:24px;align-items:start;margin-top:18px}
.ct-form{position:sticky;top:16px;max-height:calc(100vh - 32px);overflow:auto;background:#fff;border:1px solid var(--line);border-radius:16px;padding:22px 20px;box-shadow:var(--shadow)}
.ct-form-title{font-size:18px;font-weight:900;color:var(--navy);display:flex;align-items:center;gap:8px;margin-bottom:18px}
.ct-form-title:before{content:"";width:5px;height:20px;background:linear-gradient(180deg,var(--blue),var(--accent));border-radius:6px}
.ct-sec{font-size:11px;font-weight:900;color:var(--blue);letter-spacing:.12em;text-transform:uppercase;display:flex;align-items:center;gap:8px;margin:20px 0 10px}
.ct-sec:after{content:"";height:1px;background:#e7eef6;flex:1}
.ct-field{margin-bottom:12px}
.ct-label{display:block;font-size:13px;font-weight:900;color:#34495e;margin-bottom:6px}
.ct-input,.ct-select,.ct-textarea{width:100%;border:1.5px solid var(--line);background:#fff;border-radius:10px;outline:0;color:var(--ink);font-size:13px;transition:.16s}
.ct-input,.ct-select{height:42px;padding:0 12px}
.ct-textarea{min-height:88px;padding:10px 12px;resize:vertical;line-height:1.65}
.ct-textarea.ct-etc-input{min-height:64px}
.ct-input:focus,.ct-select:focus,.ct-textarea:focus{border-color:var(--blue);box-shadow:0 0 0 4px rgba(31,111,178,.10)}
.ct-input::placeholder,.ct-textarea::placeholder{color:#aab5c1}
.ct-grid2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.ct-grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px}
.ct-note{font-size:11.5px;color:var(--muted);line-height:1.55;margin:6px 0 8px}
.ct-btn{border:1px solid transparent;border-radius:10px;padding:10px 14px;min-height:40px;font-size:13px;font-weight:900;display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:.15s;background:#fff;color:var(--navy);box-shadow:0 3px 10px rgba(20,52,92,.07)}
.ct-btn:hover{filter:brightness(1.04)}
.ct-btn:active{transform:scale(.98)}
.ct-btn-blue{background:var(--blue);color:#fff;border-color:var(--blue)}
.ct-btn-green{background:var(--accent);color:#fff;border-color:var(--accent)}
.ct-btn-light{background:#fff;color:var(--navy);border-color:var(--line)}
.ct-btn-sm{font-size:12px;min-height:34px;padding:7px 11px;border-radius:8px}
.ct-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:14px}
.ct-actions .ct-btn{width:100%}

.ct-editor-table{width:100%;border-collapse:collapse;margin:6px 0 10px}
.ct-editor-table th{background:#f0f7ff;color:#264866;border:1px solid var(--line);font-size:11.5px;padding:7px;text-align:center}
.ct-editor-table td{border:1px solid #edf2f7;padding:5px;background:#fff;vertical-align:middle}
.ct-editor-table input{width:100%;border:1px solid #dce8f2;border-radius:7px;padding:7px;font-size:11.5px;outline:0}
.ct-x{background:transparent;border:0;color:#b0b8c2;font-weight:900;font-size:14px;padding:2px 5px}
.ct-x:hover{color:var(--red)}

.ct-agenda-tools{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}
.ct-tools{display:flex;align-items:center;gap:6px;position:relative;flex-wrap:wrap;justify-content:flex-end}
.ct-tip{display:none;position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);width:520px;max-width:calc(100vw - 36px);max-height:76vh;overflow:auto;background:#122238;color:#e5f4ff;border:1px solid rgba(255,255,255,.12);border-radius:14px;padding:18px 20px;z-index:99999;box-shadow:0 20px 46px rgba(0,0,0,.34);font-size:12.5px;line-height:1.7}
.ct-tip.open{display:block}
.ct-tip-title{font-size:15px;font-weight:900;color:#91d5ff;margin-bottom:10px;display:block}
.ct-tip ol{padding-left:18px;margin:0}
.ct-tip li{margin:5px 0}
.ct-tip-dim{display:none;position:fixed;inset:0;background:rgba(5,18,32,.28);z-index:99998}
.ct-tip-dim.open{display:block}

.ct-ai{display:none;background:#f7fbff;border:1px solid #cfe3f6;border-left:4px solid var(--blue);border-radius:12px;padding:12px 13px;margin:8px 0 12px;position:relative}
.ct-ai.open{display:block}
.ct-ai.callout{box-shadow:0 0 0 3px rgba(31,111,178,.08),0 12px 26px rgba(31,111,178,.10)}
.ct-ai.callout .ct-generate-wrap{padding:8px;border-radius:14px;background:linear-gradient(135deg,rgba(31,111,178,.12),rgba(42,168,118,.12));border:1px solid rgba(31,111,178,.20)}
.ct-ai-title{font-size:13px;font-weight:900;color:var(--navy);margin-bottom:8px}
.ct-ai-row{display:grid;grid-template-columns:1fr 108px;gap:8px;align-items:stretch}
.ct-status{font-size:13.5px;font-weight:900;color:#667085;margin-top:10px;min-height:22px;text-align:center}
.ct-status.done{font-size:15px;color:#186a3b;background:#effaf3;border:1px solid #bfe7cc;border-radius:10px;padding:10px 12px;line-height:1.55}
.ct-status.warn{font-size:14px;color:#9a5b00;background:#fff8e1;border:1px solid #f1d27a;border-radius:10px;padding:10px 12px}
.ct-generate-btn{background:linear-gradient(135deg,#1f6fb2,#2aa876);color:#fff;border:0;box-shadow:0 8px 18px rgba(31,111,178,.18)}
.ct-generate-btn:hover{filter:brightness(1.08);transform:translateY(-1px)}
.ct-generate-btn.loading{background:linear-gradient(90deg,#12355b,#1f6fb2,#2aa876,#1f6fb2);background-size:260% 100%;animation:ctBtnFlow 1.5s ease-in-out infinite;box-shadow:0 0 0 3px rgba(42,168,118,.14),0 10px 22px rgba(31,111,178,.22)}
@keyframes ctBtnFlow{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}
.ct-apply-row{display:none;margin-top:10px;justify-content:center}
.ct-apply-row.open{display:flex}
.ct-apply-btn{min-width:180px;background:linear-gradient(135deg,#12355b,#1f6fb2);color:#fff;border:0;box-shadow:0 10px 22px rgba(31,111,178,.24);animation:ctApplyPulse 1.7s ease-in-out infinite}
@keyframes ctApplyPulse{0%,100%{transform:translateY(0);box-shadow:0 8px 20px rgba(31,111,178,.20)}50%{transform:translateY(-2px);box-shadow:0 14px 26px rgba(31,111,178,.32)}}

.ct-preview{background:#edf3f8;border:1px solid var(--line);border-radius:16px;padding:14px;overflow:auto;box-shadow:var(--shadow);display:flex;flex-direction:column;align-items:center}
.ct-preview-label{width:100%;font-size:11px;font-weight:900;color:#8a99aa;letter-spacing:.14em;text-transform:uppercase;margin-bottom:10px;display:flex;align-items:center;gap:8px}
.ct-preview-label:after{content:"";height:1px;background:#d8e4ef;flex:1}
.ct-preview-toolbar{width:100%;display:flex;justify-content:flex-end;gap:6px;margin-bottom:10px}
.ct-preview-toolbar .ct-btn{min-height:30px;padding:6px 10px;font-size:12px}
.ct-preview .ct-doc{zoom:var(--ct-preview-zoom,.72);transform:none;margin:0 auto 18px}
.ct-doc{width:794px;min-height:1123px;background:#fff;margin:0 auto 18px;padding:34px 34px 30px;color:#111;box-shadow:0 6px 24px rgba(0,0,0,.08);position:relative;overflow:hidden;font-family:'NanumSquareNeo','Malgun Gothic',sans-serif}
#committeePdfArea .ct-doc{zoom:1!important;transform:none!important;margin:0 auto!important;box-shadow:none}
.ct-doc:before{content:"";position:absolute;left:0;top:0;right:0;height:7px;background:linear-gradient(90deg,var(--navy),var(--blue),var(--accent))}
.ct-doc-head{text-align:center;padding:14px 0 12px;border-bottom:2px solid #111;margin-bottom:12px}
.ct-doc-title{font-size:26px;font-weight:900;letter-spacing:.03em;line-height:1.35}
.ct-doc-sub{font-size:20px;font-weight:800;color:#333;margin-top:10px;min-height:24px}
.ct-table{width:100%;border-collapse:collapse;table-layout:fixed;font-size:13px;border-left:1px solid #111;border-top:1px solid #111}
.ct-table th,.ct-table td{border-right:1px solid #111;border-bottom:1px solid #111;padding:8px 10px;vertical-align:middle;white-space:pre-wrap;word-break:keep-all;background:#fff}
.ct-table th{background:#f7f7f5;font-weight:900;text-align:center}
.ct-side{background:#f7f7f5!important;text-align:center!important;font-weight:900;font-size:15px;line-height:1.45}
.ct-meta th{background:#f7f7f5!important}
.ct-meta td{background:#fff!important;text-align:center}
.ct-sign td{height:40px;background:#fff!important}
.ct-center{text-align:center}
.ct-role{font-size:12.5px;line-height:1.45;word-break:keep-all}
.ct-body{vertical-align:top!important;line-height:1.75;font-size:13px;background:#fff!important}
.ct-agenda-cell{height:210px;background:#fff!important}
.ct-decision-cell{height:235px;background:#fff!important}
.ct-etc-cell{height:95px;background:#fff!important}
.ct-num-list{margin:0;padding:0;list-style:none}
.ct-num-list li{display:grid;grid-template-columns:28px 1fr;column-gap:6px;margin-bottom:10px;line-height:1.75}
.ct-num-list li:last-child{margin-bottom:0}
.ct-num-list .ct-no{text-align:right;font-weight:700}
.ct-num-list .ct-txt{min-width:0}

.ct-wm-layer{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;overflow:hidden;z-index:10;display:flex;align-items:center;justify-content:center}
.ct-wm-text{color:rgba(20,52,92,.06);font-size:110px;font-weight:900;white-space:nowrap;transform:rotate(-35deg);letter-spacing:.12em;user-select:none}
.ct-wm-modal{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:999999;align-items:center;justify-content:center}
.ct-wm-modal.open{display:flex}
.ct-wm-box{background:#fff;border-radius:12px;padding:28px 32px;min-width:360px;box-shadow:0 20px 60px rgba(0,0,0,.25)}
.ct-wm-box h3{font-size:18px;font-weight:900;color:var(--navy);margin:0 0 16px}
.ct-wm-box p{font-size:13px;color:#666;margin:0 0 16px;line-height:1.7}
.ct-wm-row{display:flex;gap:10px}
.ct-wm-row input{flex:1;height:44px;border:1.5px solid var(--line);border-radius:8px;padding:0 12px;font-size:14px}
.ct-wm-msg{font-size:12px;margin-top:8px;height:18px}
#committeePdfArea{position:absolute;left:-99999px;top:0;width:794px;background:#fff}
@media(max-width:1120px){.ct-layout{grid-template-columns:1fr}.ct-form{position:static;max-height:none}.ct-preview .ct-doc{zoom:var(--ct-preview-zoom,.68)}}
@media(max-width:860px){.committee-tool{padding:14px 10px 50px}.ct-preview{padding:14px;overflow:auto;align-items:flex-start}.ct-grid2,.ct-grid3{grid-template-columns:1fr}.ct-ai-row{grid-template-columns:1fr}.ct-preview .ct-doc{zoom:1}}
</style>

<div class="ct-tip-dim" id="ctTipDim" onclick="closeLawTip()"></div>
<div class="ct-tip" id="ctLawTip">
  <span class="ct-tip-title">산업안전보건위원회 필수 심의·의결사항</span>
  <ol>
    <li>사업장의 산업재해 예방계획의 수립에 관한 사항</li>
    <li>안전보건관리규정의 작성 및 변경에 관한 사항</li>
    <li>안전보건교육에 관한 사항</li>
    <li>작업환경측정 등 작업환경의 점검 및 개선에 관한 사항</li>
    <li>근로자의 건강진단 등 건강관리에 관한 사항</li>
    <li>산업재해 중 중대재해에 관한 사항에 대한 원인 조사 및 재발 방지대책 수립에 관한 사항</li>
    <li>산업재해에 관한 통계의 기록 및 유지에 관한 사항</li>
    <li>유해하거나 위험한 기계·기구·설비를 도입한 경우 안전 및 보건 관련 조치에 관한 사항</li>
    <li>그 밖에 해당 사업장 근로자의 안전 및 보건을 유지·증진시키기 위하여 필요한 사항</li>
  </ol>
</div>

<div class="ct-wm-modal" id="ctWmModal">
  <div class="ct-wm-box">
    <h3>워터마크 해제</h3>
    <p>비밀번호를 입력하면 워터마크 없이 PDF를 저장합니다.</p>
    <div class="ct-wm-row">
      <input type="password" id="ctWmPwInput" placeholder="비밀번호 입력" onkeydown="if(event.key==='Enter')ctCheckWmPw()">
      <button class="ct-btn ct-btn-blue" onclick="ctCheckWmPw()">확인</button>
    </div>
    <div class="ct-wm-msg" id="ctWmMsg"></div>
    <div style="margin-top:16px;text-align:right">
      <button class="ct-btn ct-btn-light ct-btn-sm" onclick="ctCloseWmModal()">취소</button>
    </div>
  </div>
</div>

<div class="committee-tool" id="committeeTool">
  <header class="ct-header">
    <div class="ct-eye">Safety Support · Committee Minutes Builder</div>
    <h1>산업안전보건위원회 회의록 작성툴</h1>
    <p>회의 정보, 참석위원, 회의안건 및 의결사항을 입력하면 우측에서 회의록이 실시간으로 완성됩니다.</p>
  </header>

  <main class="ct-layout">
    <aside class="ct-form">
      <div class="ct-form-title">회의록 입력</div>

      <div class="ct-sec">Basic Info</div>
      <div class="ct-grid3">
        <div class="ct-field"><label class="ct-label">연도</label><input class="ct-input" id="year" value="2026"></div>
        <div class="ct-field"><label class="ct-label">분기</label><select class="ct-select" id="quarter"><option>1분기</option><option>2분기</option><option>3분기</option><option>4분기</option></select></div>
        <div class="ct-field"><label class="ct-label">회의구분</label><select class="ct-select" id="meetingType"><option>정기회의</option><option>임시회의</option></select></div>
      </div>

      <div class="ct-field"><label class="ct-label">사업장명</label><input class="ct-input" id="site" placeholder="예: ㈜한국제조 화성공장"></div>

      <div class="ct-grid2">
        <div class="ct-field"><label class="ct-label">회의일시</label><input class="ct-input" id="date" placeholder="예: 2026. 03. 25. 14:00~15:00"></div>
        <div class="ct-field"><label class="ct-label">회의장소</label><input class="ct-input" id="place" placeholder="예: 본관 2층 회의실"></div>
      </div>

      <div class="ct-sec">Committee Members</div>
      <div class="ct-note">성명란에는 직책과 성명을 함께 입력하면 출력 시 식별이 쉽습니다. 예: 안전관리자 / 홍길동</div>

      <table class="ct-editor-table" id="userMembers">
        <thead><tr><th>사용자위원 직책</th><th>성명</th><th style="width:34px"></th></tr></thead>
        <tbody>
          <tr><td><input value="안전보건관리책임자"></td><td><input placeholder="예: 공장장 / 홍길동"></td><td><button class="ct-x" onclick="deleteRow(this)">×</button></td></tr>
          <tr><td><input value="안전관리자"></td><td><input placeholder="예: 안전관리자 / 김안전"></td><td><button class="ct-x" onclick="deleteRow(this)">×</button></td></tr>
          <tr><td><input value="보건관리자"></td><td><input placeholder="예: 보건관리자 / 이보건"></td><td><button class="ct-x" onclick="deleteRow(this)">×</button></td></tr>
        </tbody>
      </table>
      <button class="ct-btn ct-btn-light ct-btn-sm" onclick="addMember('userMembers','사용자위원')">사용자위원 추가</button>

      <table class="ct-editor-table" id="workerMembers" style="margin-top:12px">
        <thead><tr><th>근로자위원 직책</th><th>성명</th><th style="width:34px"></th></tr></thead>
        <tbody>
          <tr><td><input value="근로자대표"></td><td><input placeholder="예: 근로자대표 / 박대표"></td><td><button class="ct-x" onclick="deleteRow(this)">×</button></td></tr>
          <tr><td><input value="근로자위원"></td><td><input placeholder="예: 근로자위원 / 최위원"></td><td><button class="ct-x" onclick="deleteRow(this)">×</button></td></tr>
          <tr><td><input value="근로자위원"></td><td><input placeholder="예: 근로자위원 / 정위원"></td><td><button class="ct-x" onclick="deleteRow(this)">×</button></td></tr>
        </tbody>
      </table>
      <button class="ct-btn ct-btn-light ct-btn-sm" onclick="addMember('workerMembers','근로자위원')">근로자위원 추가</button>

      <div class="ct-sec">Minutes</div>

      <div class="ct-field">
        <div class="ct-agenda-tools">
          <label class="ct-label" style="margin-bottom:0">회의안건</label>
          <div class="ct-tools">
            <button type="button" class="ct-btn ct-btn-light ct-btn-sm" onclick="openLawTip()">필수 심의·의결사항</button>
            <button type="button" class="ct-btn ct-btn-blue ct-btn-sm" onclick="toggleAiBox()">심의안건 참조안 생성</button>
          </div>
        </div>

        <div class="ct-ai callout open" id="aiBox">
          <div class="ct-ai-title">심의안건·의결사항 참조안 생성</div>
          <div class="ct-note">사업장 업종, 주요 이슈, 작업환경, 계절적 위험요인을 입력하면 필수 심의·의결사항 9개 항목을 반영한 참조안을 생성합니다.</div>
          <div class="ct-generate-wrap">
            <div class="ct-ai-row">
              <textarea class="ct-textarea" id="aiKeyword" style="min-height:76px" placeholder="예: 제조업, 지게차 통행로 개선, 위험성평가 후속조치, 근골격계 부담작업, 실외작업·호흡기 질환 예방"></textarea>
              <button type="button" class="ct-btn ct-generate-btn" onclick="generateAgendaByAI()" id="aiBtn">참조안 생성</button>
            </div>
          </div>
          <div class="ct-status" id="aiStatus"></div>
          <div class="ct-apply-row" id="applyRow">
            <button type="button" class="ct-btn ct-apply-btn" onclick="applyAiResult()">결과 반영</button>
          </div>
        </div>

        <textarea class="ct-textarea" id="agenda" placeholder="예: 1. 1분기 산업재해 예방계획 추진실적 및 개선 필요사항 검토&#10;2. 작업환경 점검 결과에 따른 개선조치 계획 심의"></textarea>
      </div>

      <div class="ct-field">
        <label class="ct-label">의결사항</label>
        <textarea class="ct-textarea" id="decision" placeholder="예: 1. 1분기 산업재해 예방계획 중 미완료 개선조치에 대해 담당부서별 조치기한을 정하여 이행하기로 함&#10;2. 작업환경 점검 결과 확인된 환기·조도·소음 관련 개선 필요사항을 다음 분기 내 조치계획에 반영하기로 함"></textarea>
      </div>

      <div class="ct-field">
        <label class="ct-label">기타사항</label>
        <textarea class="ct-textarea ct-etc-input" id="etc" placeholder="예: 차기 회의는 2026년 2분기 중 개최 예정"></textarea>
      </div>

      <div class="ct-sec">Controls</div>
      <div class="ct-actions">
        <button class="ct-btn ct-btn-light" onclick="fillExample()">예시 입력</button>
        <button class="ct-btn ct-btn-light" onclick="resetForm()">초기화</button>
        <button class="ct-btn ct-btn-light" onclick="ctOpenWmModal()">워터마크 해제</button>
        <button class="ct-btn ct-btn-blue" id="pdfBtn" onclick="exportCommitteePDF()">PDF 저장</button>
      </div>
    </aside>

    <section class="ct-preview" id="previewWrap">
      <div class="ct-preview-label">Realtime Preview</div>
      <div class="ct-preview-toolbar">
        <button type="button" class="ct-btn ct-btn-light ct-btn-sm" onclick="previewZoomOut()">축소</button>
        <button type="button" class="ct-btn ct-btn-light ct-btn-sm" onclick="previewZoomFit()">맞춤</button>
        <button type="button" class="ct-btn ct-btn-light ct-btn-sm" onclick="previewZoomIn()">확대</button>
      </div>
      <article class="ct-doc" id="previewDoc"></article>
    </section>
  </main>
</div>

<div id="committeePdfArea"></div>

<script>
const GEMINI_PROXY_URL = '/gemini-proxy.php';
let lastAiAgenda = '';
let lastAiDecision = '';
let ctWmUnlocked = false;
let ctPdfExporting = false;
let ctPreviewZoom = 0.72;
const CT_WM_PASSWORD = 'ossc02854';

function el(id){ return document.getElementById(id); }

function esc(v){
  var d = document.createElement('div');
  d.appendChild(document.createTextNode(String(v || '')));
  return d.innerHTML;
}

function br(v){
  var d = document.createElement('div');
  d.appendChild(document.createTextNode(String(v || '')));
  return d.innerHTML.split('\n').join('<br>');
}

function numberedText(v){
  var text = String(v || '').trim();
  if(!text){ return ''; }
  var rawLines = text.split('\n');
  var lines = [];
  for(var i=0;i<rawLines.length;i++){
    var line = rawLines[i].trim();
    if(line){ lines.push(line); }
  }

  var html = '<ol class="ct-num-list">';
  for(var j=0;j<lines.length;j++){
    var lineText = lines[j];
    var dot = lineText.indexOf('.');
    var n = '';
    var body = lineText;

    if(dot > 0 && dot <= 3){
      var maybeNo = lineText.slice(0,dot);
      if(!isNaN(parseInt(maybeNo,10))){
        n = maybeNo + '.';
        body = lineText.slice(dot+1).trim();
      }
    }

    html += '<li><span class="ct-no">' + esc(n) + '</span><span class="ct-txt">' + esc(body) + '</span></li>';
  }
  html += '</ol>';
  return html;
}

function val(id){ var x = el(id); return x ? x.value.trim() : ''; }

function rows(id){
  return Array.from(el(id).querySelectorAll('tbody tr')).map(function(tr){
    return Array.from(tr.querySelectorAll('input')).map(function(i){ return i.value.trim(); });
  });
}

function addMember(id,label){
  var tr = document.createElement('tr');
  var td1 = document.createElement('td');
  var td2 = document.createElement('td');
  var td3 = document.createElement('td');
  var in1 = document.createElement('input');
  var in2 = document.createElement('input');
  var btn = document.createElement('button');

  in1.value = label;
  in2.placeholder = '예: 직책 / 성명';
  btn.className = 'ct-x';
  btn.textContent = '×';
  btn.onclick = function(){ deleteRow(btn); };

  td1.appendChild(in1);
  td2.appendChild(in2);
  td3.appendChild(btn);
  tr.appendChild(td1);
  tr.appendChild(td2);
  tr.appendChild(td3);
  el(id).querySelector('tbody').appendChild(tr);
  render();
}

function deleteRow(btn){
  var tb = btn.closest('tbody');
  if(tb.children.length <= 1){ return; }
  btn.closest('tr').remove();
  render();
}

function fmtRole(v){
  var s = esc(v);
  if(v === '안전보건관리책임자'){ return '안전보건관리<br>책임자'; }
  return s;
}

function memberRows(){
  var u = rows('userMembers');
  var w = rows('workerMembers');
  var max = Math.max(5, u.length, w.length);
  var html = '';

  for(var i = 0; i < max; i++){
    var ur = u[i] || ['',''];
    var wr = w[i] || ['',''];
    html += '<tr class="ct-sign">' +
      '<td class="ct-center ct-role">' + fmtRole(ur[0]) + '</td>' +
      '<td class="ct-center">' + esc(ur[1]) + '</td>' +
      '<td></td>' +
      '<td class="ct-center ct-role">' + fmtRole(wr[0]) + '</td>' +
      '<td class="ct-center">' + esc(wr[1]) + '</td>' +
      '<td></td>' +
    '</tr>';
  }
  return html;
}

function openLawTip(){
  el('ctTipDim').classList.add('open');
  el('ctLawTip').classList.add('open');
}

function closeLawTip(){
  el('ctTipDim').classList.remove('open');
  el('ctLawTip').classList.remove('open');
}

function ctWmHTML(){
  if(ctWmUnlocked || ctPdfExporting){ return ''; }
  return '<div class="ct-wm-layer"><div class="ct-wm-text">산업안전지원센터</div></div>';
}

function makeDocHTML(){
  var year = val('year') || new Date().getFullYear();
  var quarter = val('quarter') || '1분기';
  var title = esc(year) + '년&nbsp;&nbsp;' + esc(quarter) + '&nbsp;&nbsp;산업안전보건위원회 회의록';

  return ctWmHTML() +
    '<div class="ct-doc-head">' +
      '<div class="ct-doc-title">' + title + '</div>' +
      '<div class="ct-doc-sub">' + esc(val('site')) + '</div>' +
    '</div>' +

    '<table class="ct-table ct-meta">' +
      '<colgroup><col style="width:75px"><col><col style="width:75px"><col><col style="width:75px"><col></colgroup>' +
      '<tr>' +
        '<th>회의<br>일시</th><td>' + esc(val('date')) + '</td>' +
        '<th>회의<br>장소</th><td>' + esc(val('place')) + '</td>' +
        '<th>회의<br>구분</th><td>' + esc(val('meetingType')) + '</td>' +
      '</tr>' +
    '</table>' +

    '<table class="ct-table" style="border-top:0">' +
      '<colgroup><col style="width:75px"><col><col><col><col><col><col></colgroup>' +
      '<tr>' +
        '<td rowspan="7" class="ct-side">참석<br>위원</td>' +
        '<th colspan="3">사용자위원</th>' +
        '<th colspan="3">근로자위원</th>' +
      '</tr>' +
      '<tr><th>직책</th><th>성명</th><th>서명</th><th>직책</th><th>성명</th><th>서명</th></tr>' +
      memberRows() +
      '<tr><td class="ct-side">회의<br>안건</td><td colspan="6" class="ct-body ct-agenda-cell">' + numberedText(val('agenda')) + '</td></tr>' +
      '<tr><td class="ct-side">의결<br>사항</td><td colspan="6" class="ct-body ct-decision-cell">' + numberedText(val('decision')) + '</td></tr>' +
      '<tr><td class="ct-side">기타<br>사항</td><td colspan="6" class="ct-body ct-etc-cell">' + br(val('etc')) + '</td></tr>' +
    '</table>';
}

function render(){
  el('previewDoc').innerHTML = makeDocHTML();
}

function calcFitZoom(){
  var wrap = el('previewWrap');
  if(!wrap){ return 0.72; }
  var available = wrap.clientWidth - 36;
  var docWidth = 794;
  return Math.max(0.42, Math.min(1.15, available / docWidth));
}

function setPreviewZoom(v){
  ctPreviewZoom = Math.max(0.42, Math.min(1.15, v));
  el('previewWrap').style.setProperty('--ct-preview-zoom', ctPreviewZoom);
}

function previewZoomIn(){
  setPreviewZoom(ctPreviewZoom + 0.06);
}

function previewZoomOut(){
  setPreviewZoom(ctPreviewZoom - 0.06);
}

function previewZoomFit(){
  setPreviewZoom(calcFitZoom());
}

function toggleAiBox(){
  el('aiBox').classList.toggle('open');
}

function getMeetingMonth(){
  var d = val('date');
  var parts = d.split('.');
  var m = parseInt(parts[1] || '', 10);
  if(m >= 1 && m <= 12){ return m; }

  var q = val('quarter');
  if(q.indexOf('1') >= 0){ return 3; }
  if(q.indexOf('2') >= 0){ return 6; }
  if(q.indexOf('3') >= 0){ return 9; }
  if(q.indexOf('4') >= 0){ return 12; }
  return new Date().getMonth() + 1;
}

function getSeasonIssue(month){
  if(month >= 3 && month <= 5){ return '봄철 꽃가루·황사·미세먼지로 인한 호흡기 질환 예방, 실외작업 노출 저감, 환기·보호구 관리, 해빙기 시설물 점검'; }
  if(month >= 6 && month <= 8){ return '여름철 폭염·열사병 예방, 온열질환 관리, 장마철 미끄러짐·감전·침수 위험 관리'; }
  if(month >= 9 && month <= 11){ return '가을철 일교차와 야외작업 피로, 낙엽·우천에 따른 미끄러짐, 환절기 호흡기 질환 예방'; }
  return '겨울철 한랭질환 예방, 결빙·미끄러짐 관리, 난방기구 화재위험 및 환기 관리';
}

function splitAiSections(text){
  var clean = String(text || '').split('```').join('').split('**').join('').trim();
  var lines = clean.split('\n');
  var agendaStart = -1;
  var decisionStart = -1;

  for(var i = 0; i < lines.length; i++){
    var t = lines[i].trim().replace(':','').replace('：','');
    if(t === '회의안건' && agendaStart === -1){
      agendaStart = i;
    }else if(t === '의결사항' && agendaStart !== -1 && decisionStart === -1){
      decisionStart = i;
    }
  }

  if(agendaStart >= 0 && decisionStart > agendaStart){
    return {
      agenda: lines.slice(agendaStart + 1, decisionStart).join('\n').trim(),
      decision: lines.slice(decisionStart + 1).join('\n').trim()
    };
  }

  return { agenda: clean, decision: '' };
}

function countNumberedItems(text){
  var lines = String(text || '').split('\n');
  var count = 0;
  for(var i=0;i<lines.length;i++){
    var t = lines[i].trim();
    var dot = t.indexOf('.');
    if(dot > 0 && dot <= 3){
      var n = parseInt(t.slice(0,dot),10);
      if(n >= 1 && n <= 99){ count++; }
    }
  }
  return count;
}

async function callGemini(prompt){
  var res = await fetch(GEMINI_PROXY_URL, {
    method:'POST',
    headers:{'Content-Type':'application/json'},
    body:JSON.stringify({prompt:prompt})
  });

  var data = await res.json();
  if(!res.ok){ throw new Error(data.error || 'AI 요청에 실패했습니다.'); }

  return data.content && data.content[0] && data.content[0].text ? data.content[0].text : (data.text || JSON.stringify(data));
}

async function generateAgendaByAI(){
  var status = el('aiStatus');
  var btn = el('aiBtn');
  var applyRow = el('applyRow');
  var NL = '\n';
  var month = getMeetingMonth();
  var season = getSeasonIssue(month);

  status.className = 'ct-status';
  status.style.color = '#667085';
  status.textContent = '참조안을 생성 중입니다. 잠시만 기다려주세요.';
  applyRow.classList.remove('open');
  btn.disabled = true;
  btn.textContent = '생성 중...';
  btn.classList.add('loading');

  var basePrompt = [
    '너는 산업안전보건위원회 회의록을 작성하는 안전보건 실무 전문가이다.',
    '아래 정보를 바탕으로 회원사가 참고할 수 있는 산업안전보건위원회 회의안건과 의결사항을 작성하라.',
    '',
    '절대 규칙:',
    '1. 첫 줄은 반드시 회의안건으로 시작한다.',
    '2. 중간에 의결사항 제목을 정확히 1회만 쓴다.',
    '3. 회의안건은 반드시 1번부터 9번까지 총 9개 작성한다.',
    '4. 의결사항도 반드시 1번부터 9번까지 총 9개 작성한다.',
    '5. 의결사항 1번은 회의안건 1번에, 의결사항 2번은 회의안건 2번에 대응되도록 작성한다.',
    '6. 절대로 1개, 2개, 3개로 요약하지 않는다.',
    '7. 통합 안건으로 묶지 않는다.',
    '8. 마크다운 기호, 별표, 굵은 글씨, 개최월 제목, 설명문은 쓰지 않는다.',
    '9. 법 조항 번호는 쓰지 않는다.',
    '',
    '출력 형식:',
    '회의안건',
    '1. [산업재해 예방계획] ...',
    '2. [안전보건관리규정] ...',
    '3. [안전보건교육] ...',
    '4. [작업환경 점검·개선] ...',
    '5. [근로자 건강관리] ...',
    '6. [중대재해 원인조사·재발방지] ...',
    '7. [산업재해 통계관리] ...',
    '8. [위험 기계·기구·설비 도입] ...',
    '9. [안전보건 유지·증진] ...',
    '',
    '의결사항',
    '1. ...',
    '2. ...',
    '3. ...',
    '4. ...',
    '5. ...',
    '6. ...',
    '7. ...',
    '8. ...',
    '9. ...',
    '',
    '회의 정보:',
    '사업장명: ' + (val('site') || '미입력'),
    '회의구분: ' + (val('meetingType') || '정기회의'),
    '연도·분기: ' + (val('year') || '미입력') + '년 ' + (val('quarter') || '미입력'),
    '개최월: ' + month + '월',
    '계절 안전보건 이슈: ' + season,
    '사용자 입력: ' + (val('aiKeyword') || '제조업 사업장, 위험성평가 후속조치, 안전보건교육, 작업환경 개선')
  ].join(NL);

  try{
    var text = await callGemini(basePrompt);
    var parsed = splitAiSections(text);

    if(countNumberedItems(parsed.agenda) < 9 || countNumberedItems(parsed.decision) < 9){
      status.className = 'ct-status warn';
      status.textContent = '의결사항 9개 항목을 보완 생성 중입니다.';

      var repairPrompt = [
        '이전 응답이 형식 요건을 충족하지 못했다.',
        '반드시 회의안건 9개와 의결사항 9개를 모두 작성하라.',
        '첫 줄은 회의안건, 중간 제목은 의결사항만 사용하라.',
        '의결사항은 1번부터 9번까지 누락 없이 작성하라.',
        '마크다운, 별표, 설명문은 쓰지 않는다.',
        '',
        '이전 응답:',
        text
      ].join(NL);

      text = await callGemini(repairPrompt);
      parsed = splitAiSections(text);
    }

    lastAiAgenda = parsed.agenda;
    lastAiDecision = parsed.decision;

    status.className = 'ct-status done';
    status.innerHTML = '참조안 생성이 완료되었습니다.<br>아래 결과 반영 버튼을 눌러주세요.';
    applyRow.classList.add('open');
  }catch(err){
    status.className = 'ct-status';
    status.style.color = '#b42318';
    status.textContent = '참조안 생성 실패: ' + err.message;
  }finally{
    btn.disabled = false;
    btn.textContent = '참조안 생성';
    btn.classList.remove('loading');
  }
}

function applyAiResult(){
  if(lastAiAgenda){ el('agenda').value = lastAiAgenda; }
  if(lastAiDecision){ el('decision').value = lastAiDecision; }
  render();
}

function fillExample(){
  el('year').value = '2026';
  el('quarter').value = '1분기';
  el('meetingType').value = '정기회의';
  el('site').value = '㈜한국제조 화성공장';
  el('date').value = '2026. 03. 25. 14:00~15:00';
  el('place').value = '본관 2층 회의실';
  el('agenda').value = '1. 1분기 산업재해 예방계획 추진실적 및 개선 필요사항 검토\n2. 작업환경 점검 결과에 따른 개선조치 계획 심의';
  el('decision').value = '1. 1분기 산업재해 예방계획 중 미완료 개선조치에 대해 담당부서별 조치기한을 정하여 이행하기로 함\n2. 작업환경 점검 결과 확인된 환기·조도·소음 관련 개선 필요사항을 다음 분기 내 조치계획에 반영하기로 함';
  el('etc').value = '차기 회의는 2026년 2분기 중 개최 예정';
  render();
}

function resetForm(){
  document.querySelectorAll('#committeeTool input, #committeeTool textarea').forEach(function(x){
    if(x.id !== 'year'){ x.value = ''; }
  });
  el('year').value = '2026';
  lastAiAgenda = '';
  lastAiDecision = '';
  el('aiStatus').className = 'ct-status';
  el('aiStatus').textContent = '';
  el('applyRow').classList.remove('open');
  render();
}

function ctOpenWmModal(){
  el('ctWmModal').classList.add('open');
  el('ctWmPwInput').value = '';
  el('ctWmMsg').textContent = '';
}

function ctCloseWmModal(){
  el('ctWmModal').classList.remove('open');
}

function ctCheckWmPw(){
  if(el('ctWmPwInput').value === CT_WM_PASSWORD){
    ctWmUnlocked = true;
    el('ctWmMsg').style.color = '#186a3b';
    el('ctWmMsg').textContent = '워터마크가 해제되었습니다.';
    setTimeout(ctCloseWmModal, 700);
    render();
  }else{
    el('ctWmMsg').style.color = '#b42318';
    el('ctWmMsg').textContent = '비밀번호가 올바르지 않습니다.';
    el('ctWmPwInput').value = '';
  }
}

function safeName(s){
  var name = String(s || '산업안전보건위원회_회의록');
  ['\\','/',':','*','?','"','<','>','|'].forEach(function(ch){ name = name.split(ch).join(''); });
  return name.trim() || '산업안전보건위원회_회의록';
}

function findSafeCutY(canvas, startY, idealH){
  var target = Math.min(startY + idealH, canvas.height);
  var search = 90;
  var from = Math.max(startY + Math.round(idealH * 0.65), target - search);
  var to = Math.min(canvas.height - 1, target + search);
  var ctx = canvas.getContext('2d');

  for(let scanY = target; scanY >= from; scanY -= 3){
    var data = ctx.getImageData(0, scanY, canvas.width, 1).data;
    var light = 0;
    var total = 0;
    for(let scanX = 0; scanX < canvas.width; scanX += 8){
      var idx = scanX * 4;
      var r = data[idx], g = data[idx+1], b = data[idx+2];
      if(r > 245 && g > 245 && b > 245){ light++; }
      total++;
    }
    if(light / total > 0.985){ return scanY; }
  }

  for(let scanY2 = target; scanY2 <= to; scanY2 += 3){
    var data2 = ctx.getImageData(0, scanY2, canvas.width, 1).data;
    var light2 = 0;
    var total2 = 0;
    for(let scanX2 = 0; scanX2 < canvas.width; scanX2 += 8){
      var idx2 = scanX2 * 4;
      var r2 = data2[idx2], g2 = data2[idx2+1], b2 = data2[idx2+2];
      if(r2 > 245 && g2 > 245 && b2 > 245){ light2++; }
      total2++;
    }
    if(light2 / total2 > 0.985){ return scanY2; }
  }

  return target;
}

function drawPageWatermark(ctx, w, h){
  if(ctWmUnlocked){ return; }
  ctx.save();
  ctx.translate(w / 2, h / 2);
  ctx.rotate(-35 * Math.PI / 180);
  ctx.globalAlpha = 0.09;
  ctx.fillStyle = '#12355b';
  ctx.font = '900 120px Malgun Gothic, sans-serif';
  ctx.textAlign = 'center';
  ctx.textBaseline = 'middle';
  ctx.fillText('산업안전지원센터', 0, 0);
  ctx.restore();
}

async function exportCommitteePDF(){
  render();

  var btn = el('pdfBtn');
  if(btn){
    btn.textContent = 'PDF 생성 중...';
    btn.style.opacity = '.6';
    btn.style.pointerEvents = 'none';
  }

  var area = el('committeePdfArea');
  ctPdfExporting = true;
  area.innerHTML = '<article class="ct-doc">' + makeDocHTML() + '</article>';
  ctPdfExporting = false;

  var doc = area.querySelector('.ct-doc');
  var pdf = new window.jspdf.jsPDF('p','mm','a4');
  var pW = 210;
  var pH = 297;
  var m = 12;
  var usableW = pW - m * 2;
  var usableH = pH - m * 2;

  var cv = await html2canvas(doc, {
    scale: 2,
    useCORS: true,
    backgroundColor: '#ffffff',
    logging: false,
    scrollX: 0,
    scrollY: 0
  });

  var ppm = cv.width / usableW;
  var pageCanvasH = Math.round(usableH * ppm);
  var y = 0;
  var pageIndex = 0;

  while(y < cv.height){
    var cutY = findSafeCutY(cv, y, pageCanvasH);
    if(cutY <= y + 100 || cutY > cv.height){ cutY = Math.min(y + pageCanvasH, cv.height); }

    var sliceH = cutY - y;
    var sl = document.createElement('canvas');
    sl.width = cv.width;
    sl.height = pageCanvasH;

    var ctx = sl.getContext('2d');
    ctx.fillStyle = '#ffffff';
    ctx.fillRect(0,0,sl.width,sl.height);
    ctx.drawImage(cv,0,y,cv.width,sliceH,0,0,cv.width,sliceH);
    drawPageWatermark(ctx, sl.width, sl.height);

    if(pageIndex > 0){ pdf.addPage(); }
    pdf.addImage(sl.toDataURL('image/jpeg',0.93),'JPEG',m,m,usableW,sl.height / ppm);

    y = cutY;
    pageIndex++;
  }

  pdf.save(safeName((val('site') || '') + '_산업안전보건위원회_회의록') + '.pdf');
  area.innerHTML = '';

  if(btn){
    btn.textContent = 'PDF 저장';
    btn.style.opacity = '';
    btn.style.pointerEvents = '';
  }
}

document.addEventListener('input', function(e){
  if(e.target.closest && e.target.closest('#committeeTool')){ render(); }
});
document.addEventListener('change', function(e){
  if(e.target.closest && e.target.closest('#committeeTool')){ render(); }
});
document.addEventListener('keydown', function(e){
  if(e.key === 'Escape'){ closeLawTip(); }
});

previewZoomFit();
render();

window.addEventListener('resize', function(){
  previewZoomFit();
});
</script>				</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>유해·위험작업 취업제한 자격요건 정리 &#124; 작업별 자격·면허·경험 기준</title>
		<link>https://safetysupport.co.kr/hazardous-work-qualification-requirements/</link>
		
		<dc:creator><![CDATA[mangjil]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 02:35:52 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[건설안전]]></category>
		<category><![CDATA[산업안전보건법]]></category>
		<category><![CDATA[안전관리실무]]></category>
		<category><![CDATA[위험작업관리]]></category>
		<category><![CDATA[유해위험작업]]></category>
		<category><![CDATA[자격면허기준]]></category>
		<category><![CDATA[작업별자격요건]]></category>
		<category><![CDATA[작업자자격기준]]></category>
		<category><![CDATA[취업제한작업]]></category>
		<category><![CDATA[현장안전기준]]></category>
		<guid isPermaLink="false">https://safetysupport.co.kr/?p=3332</guid>

					<description><![CDATA[유해·위험작업 취업제한 자격요건 &#124; 별표 1 정리 RESTRICTED HAZARDOUS WORK LIST 유해·위험작업의 취업 제한에 관한 규칙 [별표 1] 자격·면허·경험 또는 기능이 필요한 작업 한눈에 정리 유해·위험작업별 작업범위와 필요한 자격·면허·기능 또는 경험을 순서대로 확인할 수 있도록 정리했습니다. 작업명, 작업범위, 요구요건을 분리하여 현장에서 필요한 항목을 빠르게 찾을 수 있습니다. APPENDIX INDEX22개 유해·위험작업 6작업군 분류2비고 특례 확인 방법 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3332" class="elementor elementor-3332" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-c635f21 e-flex e-con-boxed e-con e-parent" data-id="c635f21" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-ada2724 elementor-widget elementor-widget-html" data-id="ada2724" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3106752057307696"
     crossorigin="anonymous"></script>
<!-- safetysupport_상단_반응형 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-3106752057307696"
     data-ad-slot="2206462755"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
				</div>
				<div class="elementor-element elementor-element-c8aa2fb elementor-widget elementor-widget-html" data-id="c8aa2fb" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>유해·위험작업 취업제한 자격요건 | 별표 1 정리</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/moonspam/NanumSquareNeo@1.0/nanumsquareneo.css">
<style>
:root{
  --ink:#172033;
  --muted:#697386;
  --paper:#fbfaf6;
  --paper-2:#f3f0e8;
  --navy:#0b1b32;
  --navy-2:#102b4d;
  --teal:#1aa896;
  --lime:#bce784;
  --blue:#3a7bd5;
  --orange:#f39c42;
  --red:#e45d5d;
  --violet:#6d5dfc;
  --line:rgba(23,32,51,.12);
  --shadow:0 24px 70px rgba(11,27,50,.16);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:'NanumSquareNeo',system-ui,-apple-system,sans-serif;background:var(--paper);color:var(--ink);line-height:1.78;font-size:17px}
button,input{font-family:inherit}
a{text-decoration:none;color:inherit}
.restricted-page{overflow:hidden;background:
  radial-gradient(circle at 5% 5%, rgba(188,231,132,.28), transparent 32%),
  radial-gradient(circle at 95% 0%, rgba(26,168,150,.18), transparent 28%),
  linear-gradient(180deg,#fbfaf6 0%,#fff 42%,#f7f8fb 100%)}
.hero{position:relative;max-width:1240px;margin:26px auto 0;padding:0 22px}
.hero-shell{position:relative;min-height:430px;border-radius:42px;background:#09192f;color:#fff;overflow:hidden;box-shadow:0 30px 90px rgba(11,27,50,.28)}
.hero-shell:before{content:'';position:absolute;inset:0;background:
  linear-gradient(115deg,rgba(255,255,255,.10) 0 1px,transparent 1px 100%),
  linear-gradient(25deg,rgba(188,231,132,.15),transparent 36%),
  radial-gradient(circle at 82% 28%,rgba(26,168,150,.55),transparent 34%),
  radial-gradient(circle at 18% 92%,rgba(109,93,252,.42),transparent 38%);background-size:76px 76px,100% 100%,100% 100%,100% 100%;opacity:.9}
.hero-shell:after{content:'資格';position:absolute;right:34px;bottom:-72px;color:rgba(255,255,255,.05);font-size:220px;font-weight:900;letter-spacing:-.14em;line-height:1}
.hero-inner{position:relative;z-index:1;display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:34px;align-items:end;min-height:430px;padding:54px}
.hero-mark{display:inline-flex;align-items:center;gap:10px;width:max-content;padding:8px 14px;border-radius:999px;background:rgba(255,255,255,.09);border:1px solid rgba(255,255,255,.16);font-size:12px;font-weight:900;letter-spacing:.12em;color:#bce784;margin-bottom:22px}
.hero-mark:before{content:'';width:8px;height:8px;border-radius:99px;background:#bce784;box-shadow:0 0 20px rgba(188,231,132,.85)}
.hero-kicker{font-size:14px;font-weight:800;color:rgba(255,255,255,.64);letter-spacing:.02em;margin-bottom:8px}
.hero-title{font-size:54px;line-height:1.05;letter-spacing:-.07em;font-weight:900;word-break:keep-all;max-width:780px}
.hero-title span{display:inline;color:#c8ff93;white-space:nowrap}
.hero-desc{max-width:820px;margin-top:20px;color:rgba(255,255,255,.8);font-size:17px;line-height:1.95;word-break:keep-all}
.hero-stats{align-self:stretch;display:grid;grid-template-rows:1fr auto;gap:14px}
.stat-main{position:relative;border-radius:32px;background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.17);backdrop-filter:blur(14px);padding:28px;overflow:hidden}
.stat-main:before{content:'';position:absolute;right:-60px;top:-60px;width:180px;height:180px;border-radius:50%;background:rgba(188,231,132,.18)}
.stat-main small{display:block;color:rgba(255,255,255,.58);font-size:12px;font-weight:900;letter-spacing:.12em;margin-bottom:18px}
.stat-main strong{display:block;font-size:76px;line-height:.9;font-weight:900;letter-spacing:-.08em;color:#fff}
.stat-main span{display:block;margin-top:12px;color:#c8ff93;font-size:18px;font-weight:900}
.stat-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.stat-mini{border-radius:20px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.13);padding:15px 16px}
.stat-mini b{display:block;font-size:20px;color:#fff;line-height:1.1}.stat-mini em{display:block;margin-top:6px;font-size:11px;font-style:normal;font-weight:900;color:rgba(255,255,255,.58)}
.wrap{max-width:1160px;margin:28px auto 80px;padding:0 24px}
.overview{display:grid;grid-template-columns:1.1fr .9fr;gap:16px;margin-bottom:18px}
.brief,.legend{border:1px solid var(--line);border-radius:28px;background:rgba(255,255,255,.78);box-shadow:0 14px 38px rgba(11,27,50,.08);backdrop-filter:blur(8px);overflow:hidden}
.brief{padding:24px}.brief h2,.legend h2{font-size:18px;font-weight:900;letter-spacing:-.03em;color:#102b4d}.brief p{margin-top:8px;color:#3a4557;word-break:keep-all;font-size:16px}.brief-line{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.pill{display:inline-flex;align-items:center;gap:7px;min-height:34px;padding:0 13px;border-radius:999px;background:#f3f6f4;border:1px solid rgba(23,32,51,.09);font-size:12px;font-weight:900;color:#334155}.pill:before{content:'';width:6px;height:6px;border-radius:99px;background:var(--teal)}
.legend{padding:22px}.legend-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:14px}.legend-chip{min-height:40px;display:flex;align-items:center;gap:8px;border-radius:14px;padding:0 12px;background:#fff;border:1px solid rgba(23,32,51,.09);font-size:12px;font-weight:900;color:#364152}.dot{width:9px;height:9px;border-radius:99px;flex:none}.dot.law{background:var(--blue)}.dot.machine{background:var(--teal)}.dot.fire{background:var(--orange)}.dot.elec{background:var(--violet)}.dot.build{background:var(--red)}.dot.special{background:#2f9e44}
.board{border-radius:34px;background:#fff;border:1px solid rgba(23,32,51,.10);box-shadow:var(--shadow);overflow:hidden}
.board-head{display:grid;grid-template-columns:minmax(0,1fr) 420px;gap:22px;padding:28px;background:linear-gradient(135deg,#ffffff,#eef8f5);border-bottom:1px solid rgba(23,32,51,.10)}
.board-head h2{font-size:24px;font-weight:900;letter-spacing:-.04em;color:#0b1b32}.board-head p{margin-top:4px;color:#687386;font-size:16px}.searchbox{position:relative;display:flex;align-items:center;gap:13px;height:66px;border-radius:22px;border:2px solid rgba(26,168,150,.55);background:#fff;padding:0 20px;box-shadow:0 16px 36px rgba(26,168,150,.18),0 0 0 6px rgba(26,168,150,.06)}.searchbox:before{content:'검색';position:absolute;right:18px;top:-15px;min-height:28px;padding:0 12px;border-radius:999px;background:#0b1b32;color:#c8ff93;font-size:12px;font-weight:900;display:flex;align-items:center;box-shadow:0 8px 18px rgba(11,27,50,.16)}.searchbox svg{width:24px;height:24px;color:#1aa896;flex:none}.searchbox input{border:0;outline:0;background:transparent;width:100%;font-size:17px;font-weight:900;color:var(--ink);padding-right:44px}.searchbox input::placeholder{color:#6f7b8d;font-weight:800}
.category-tabs{display:flex;gap:8px;overflow-x:auto;padding:16px 28px;background:#fbfcfd;border-bottom:1px solid rgba(23,32,51,.08)}
.cat-btn{border:1px solid rgba(23,32,51,.12);background:#fff;white-space:nowrap;border-radius:999px;padding:11px 16px;font-size:14px;font-weight:900;color:#4b5567;cursor:pointer;transition:.2s ease}.cat-btn:hover{transform:translateY(-1px);border-color:#1aa896;color:#0d7468}.cat-btn.active{background:#0b1b32;color:#fff;border-color:#0b1b32;box-shadow:0 10px 22px rgba(11,27,50,.16)}
.list{counter-reset:item;padding:0 28px 26px}.group-title{position:sticky;top:0;z-index:5;margin:26px -28px 14px;padding:12px 28px;background:rgba(255,255,255,.88);backdrop-filter:blur(10px);border-top:1px solid rgba(23,32,51,.08);border-bottom:1px solid rgba(23,32,51,.08);display:flex;align-items:center;gap:10px;color:#0b1b32;font-size:14px;font-weight:900;letter-spacing:-.02em}.group-title:before{content:'';width:9px;height:9px;border-radius:99px;background:var(--teal)}
.work-item{position:relative;display:grid;grid-template-columns:86px minmax(0,1fr);gap:0;border:1px solid rgba(23,32,51,.10);border-radius:22px;background:linear-gradient(90deg,#f9fbfb,#fff);overflow:hidden;margin-bottom:12px;transition:.2s ease}.work-item:hover{transform:translateY(-2px);box-shadow:0 16px 34px rgba(11,27,50,.10);border-color:rgba(26,168,150,.36);background:linear-gradient(90deg,#f4fbf8,#fffdf3)}.work-item:hover .work-body{background:linear-gradient(90deg,rgba(188,231,132,.12),rgba(26,168,150,.06))}.work-item:hover .info{background:#fffef8;border-color:rgba(26,168,150,.24)}
.work-no{position:relative;display:flex;align-items:center;justify-content:center;flex-direction:column;background:#f0f5f3;border-right:1px solid rgba(23,32,51,.08);color:#0b1b32;font-weight:900}.work-no b{font-size:28px;line-height:1;letter-spacing:-.06em}.work-no small{margin-top:6px;font-size:10px;color:#6b7280;font-weight:900;letter-spacing:.08em}.work-body{padding:18px 20px 20px}.work-top{display:flex;align-items:flex-start;justify-content:space-between;gap:14px}.work-title{font-size:20px;line-height:1.55;font-weight:900;letter-spacing:-.03em;color:#152033;word-break:keep-all}.badge{display:inline-flex;align-items:center;white-space:nowrap;min-height:28px;border-radius:999px;padding:0 10px;font-size:11px;font-weight:900;background:#eef7f5;color:#0d7468;border:1px solid rgba(26,168,150,.18)}.work-grid{display:grid;grid-template-columns:.95fr 1.05fr;gap:12px;margin-top:14px}.info{border-radius:16px;background:#fff;border:1px solid rgba(23,32,51,.09);padding:14px 15px}.info h4{font-size:15px;font-weight:900;color:#0b1b32;margin-bottom:9px;display:flex;align-items:center;gap:7px}.info h4:before{content:'';width:4px;height:14px;border-radius:99px;background:#1aa896}.info p,.info li{font-size:16px;color:#3e4a5c;line-height:1.85;word-break:keep-all}.info ul{list-style:none;display:grid;gap:5px}.info li{position:relative;padding-left:13px}.info li:before{content:'-';position:absolute;left:0;color:#1aa896;font-weight:900}.note{margin-top:12px;border-radius:15px;background:#fff8ea;border:1px solid rgba(243,156,66,.26);padding:13px 15px;color:#7c4a0b;font-size:15px;font-weight:800;line-height:1.75;word-break:keep-all}.tip-btn{margin-top:12px;border:0;border-radius:999px;background:#0b1b32;color:#c8ff93;min-height:38px;padding:0 14px;font-size:14px;font-weight:900;cursor:pointer;box-shadow:0 10px 22px rgba(11,27,50,.15)}.tip-btn:hover{filter:brightness(1.08);transform:translateY(-1px)}.law-tip{display:none;margin-top:12px;border-radius:18px;background:#f4fbf8;border:1px solid rgba(26,168,150,.24);padding:15px 16px;color:#223044;line-height:1.85;font-size:15px;word-break:keep-all}.work-item.open-tip .law-tip{display:block}.law-tip strong{display:block;margin-bottom:5px;color:#0d7468;font-size:15px}.law-tip p{margin:0}.law-tip .tip-caution{margin-top:8px;color:#6b7280;font-size:13px;font-weight:800}.law .work-no{background:#eef5ff}.machine .work-no{background:#edf9f6}.fire .work-no{background:#fff4e8}.elec .work-no{background:#f4f1ff}.build .work-no{background:#fff0f0}.special .work-no{background:#eef9ef}.law .info h4:before{background:var(--blue)}.fire .info h4:before{background:var(--orange)}.elec .info h4:before{background:var(--violet)}.build .info h4:before{background:var(--red)}.special .info h4:before{background:#2f9e44}.law .badge{background:#eef5ff;color:#1d5fa8}.fire .badge{background:#fff4e8;color:#a95609}.elec .badge{background:#f4f1ff;color:#5c50d6}.build .badge{background:#fff0f0;color:#bd3434}.special .badge{background:#eef9ef;color:#247c38}
.footnote{margin:8px 28px 28px;border-radius:24px;background:#0b1b32;color:#fff;padding:24px;display:grid;gap:12px}.footnote h3{font-size:17px;font-weight:900;color:#c8ff93}.footnote p{color:rgba(255,255,255,.78);font-size:13.5px;line-height:1.85;word-break:keep-all}.empty{display:none;margin:24px 28px;padding:48px 20px;border-radius:22px;background:#f8fafc;border:1px dashed rgba(23,32,51,.22);text-align:center;color:#697386;font-weight:900}
.float{position:fixed;right:22px;bottom:22px;display:flex;gap:8px;z-index:20}.float button,.float a{width:48px;height:48px;border:0;border-radius:18px;background:#0b1b32;color:#fff;box-shadow:0 12px 30px rgba(11,27,50,.22);display:flex;align-items:center;justify-content:center;cursor:pointer;font-weight:900}.float svg{width:21px;height:21px;stroke:currentColor}
mark{background:#dfffb6;color:#0b1b32;border-radius:4px;padding:0 2px}
@media(max-width:920px){.hero-inner{grid-template-columns:1fr;padding:38px}.hero-title{font-size:44px}.overview{grid-template-columns:1fr}.board-head{grid-template-columns:1fr}.work-grid{grid-template-columns:1fr}.searchbox{height:62px}}
@media(max-width:640px){.hero{padding:0 12px}.hero-shell{border-radius:28px}.hero-inner{padding:30px 22px}.hero-title{font-size:35px}.hero-desc{font-size:14px}.wrap{padding:0 12px}.board{border-radius:26px}.board-head,.category-tabs{padding-left:18px;padding-right:18px}.list{padding:0 18px 18px}.group-title{margin-left:-18px;margin-right:-18px;padding-left:18px}.work-item{grid-template-columns:64px minmax(0,1fr);border-radius:18px}.work-no b{font-size:22px}.work-body{padding:15px}.work-top{flex-direction:column}.footnote{margin-left:18px;margin-right:18px}.float{right:12px;bottom:12px}}
</style>
</head>
<body>
<div class="restricted-page">
  <section class="hero" id="top">
    <div class="hero-shell">
      <div class="hero-inner">
        <div>
          <div class="hero-mark">RESTRICTED HAZARDOUS WORK LIST</div>
          <div class="hero-kicker">유해·위험작업의 취업 제한에 관한 규칙 [별표 1]</div>
          <h1 class="hero-title">자격·면허·경험 또는 기능이 <span>필요한 작업 한눈에 정리</span></h1>
          <p class="hero-desc">유해·위험작업별 작업범위와 필요한 자격·면허·기능 또는 경험을 순서대로 확인할 수 있도록 정리했습니다. 작업명, 작업범위, 요구요건을 분리하여 현장에서 필요한 항목을 빠르게 찾을 수 있습니다.</p>
        </div>
        <aside class="hero-stats">
          <div class="stat-main"><small>APPENDIX INDEX</small><strong>22</strong><span>개 유해·위험작업</span></div>
          <div class="stat-grid"><div class="stat-mini"><b>6</b><em>작업군 분류</em></div><div class="stat-mini"><b>2</b><em>비고 특례</em></div></div>
        </aside>
      </div>
    </div>
  </section>
  <main class="wrap">
    <section class="overview">
      <article class="brief">
        <h2>확인 방법</h2>
        <p>전체 목록은 별표 순서대로 표시됩니다. 특정 작업군을 선택하면 해당 분야의 작업만 모아 볼 수 있으며, 검색창에 작업명이나 자격명을 입력하면 관련 항목을 바로 확인할 수 있습니다.</p>
        <div class="brief-line"><span class="pill">작업명 중심</span><span class="pill">작업범위 분리</span><span class="pill">자격요건 나열</span><span class="pill">비고 별도 정리</span></div>
      </article>
      <article class="legend">
        <h2>작업군 구분</h2>
        <div class="legend-grid"><div class="legend-chip"><span class="dot law"></span>법정자격 연계</div><div class="legend-chip"><span class="dot elec"></span>전기·에너지</div><div class="legend-chip"><span class="dot fire"></span>화기·폭발</div><div class="legend-chip"><span class="dot machine"></span>기계·양중</div><div class="legend-chip"><span class="dot build"></span>건설·구조물</div><div class="legend-chip"><span class="dot special"></span>특수작업</div></div>
      </article>
    </section>
    <section class="board" id="listBoard">
      <div class="board-head"><div><h2>작업별 자격요건 목록</h2><p>전체는 별표 순서대로 표시되며, 작업군 선택 시 해당 분야만 표시됩니다.</p></div><label class="searchbox"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><circle cx="11" cy="11" r="7"></circle><path d="M20 20l-4-4"></path></svg><input id="searchInput" type="text" placeholder="예: 지게차, 크레인, 용접, 비계, 교육"></label></div>
      <div class="category-tabs" id="tabs"><button class="cat-btn active" data-filter="전체">전체</button><button class="cat-btn" data-filter="법정자격 연계">법정자격 연계</button><button class="cat-btn" data-filter="전기·에너지">전기·에너지</button><button class="cat-btn" data-filter="화기·폭발">화기·폭발</button><button class="cat-btn" data-filter="기계·양중">기계·양중</button><button class="cat-btn" data-filter="건설·구조물">건설·구조물</button><button class="cat-btn" data-filter="특수작업">특수작업</button></div>
      <div class="list" id="workList"></div>
      <div class="empty" id="empty">검색 결과가 없습니다. 다른 검색어 또는 작업군을 선택해 주세요.</div>
      <section class="footnote"><h3>비고</h3><p>1. 타워크레인 설치·해체작업 자격을 해당 교육기관 교육 이수 및 수료시험 합격으로 취득한 근로자가 작업 중 안전보건의무를 이행하지 않아 다른 사람에게 손해를 입혀 벌금 이상의 형이 확정된 경우, 교육 144시간을 다시 이수하고 수료시험에 합격하기 전까지 해당 작업에 필요한 자격을 가진 근로자로 보지 않습니다.</p><p>2. 2021년 7월 15일 이전에 도로교통법상 운전면허를 받고 3개월 이상 지게차 작업 경험이 있는 사람이 공단이 정하는 지게차 조종 관련 교육을 이수한 경우에는 지게차 사용 작업 자격이 있는 것으로 봅니다.</p></section>
    </section>
  </main>
  <div class="float"><a href="#listBoard" title="목록"><svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><line x1="7" y1="7" x2="21" y2="7"></line><line x1="7" y1="12" x2="21" y2="12"></line><line x1="7" y1="17" x2="21" y2="17"></line><circle cx="3" cy="7" r="1"></circle><circle cx="3" cy="12" r="1"></circle><circle cx="3" cy="17" r="1"></circle></svg></a><button onclick="window.scrollTo({top:0,behavior:'smooth'})" title="맨 위"><svg viewBox="0 0 24 24" fill="none" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19V5"></path><path d="M5 12l7-7 7 7"></path></svg></button></div>
</div>
<script>
const WORKS = [
{no:'1',cat:'법정자격 연계',cls:'law',title:'고압가스 안전관리법에 따른 압력용기 등을 취급하는 작업',range:'자격 또는 면허를 가진 사람이 취급해야 하는 업무',req:['고압가스 안전관리법에서 규정하는 자격'],tipTitle:'고압가스 안전관리법상 자격 확인 방향',tip:'압력용기·고압가스 설비의 종류와 취급업무에 따라 고압가스 안전관리법령에서 정하는 안전관리자, 검사 관련 자격 또는 해당 업무 수행이 허용된 자격을 확인해야 합니다. 설비 종류와 사업 인허가 형태에 따라 적용 자격이 달라질 수 있으므로 사업장 보유 설비 기준으로 확인하는 것이 적절합니다.'},
{no:'2',cat:'전기·에너지',cls:'elec',title:'전기사업법에 따른 전기설비 등을 취급하는 작업',range:'자격 또는 면허를 가진 사람이 취급해야 하는 업무',req:['전기사업법에서 규정하는 자격'],tipTitle:'전기사업법상 자격 확인 방향',tip:'전기사업용 전기설비를 취급하는 경우에는 전기사업법 및 관련 하위법령에서 정하는 전기설비의 공사·유지·운용 관련 자격 또는 선임 기준을 확인해야 합니다. 일반 사업장 전기설비는 전기안전관리법 적용 여부도 함께 검토하는 것이 안전합니다.'},
{no:'2의2',cat:'전기·에너지',cls:'elec',title:'전기안전관리법에 따른 전기설비 등을 취급하는 작업',range:'자격 또는 면허를 가진 사람이 취급해야 하는 업무',req:['전기안전관리법에서 규정하는 자격'],tipTitle:'전기안전관리법상 자격 확인 방향',tip:'전기설비의 안전관리 업무는 전기안전관리법상 전기안전관리자 선임 대상 여부와 선임 가능한 자격 기준을 함께 확인해야 합니다. 전압, 설비용량, 수전설비 형태에 따라 선임 기준이 달라질 수 있습니다.'},
{no:'3',cat:'전기·에너지',cls:'elec',title:'에너지이용 합리화법에 따른 보일러를 취급하는 작업',range:'자격 또는 면허를 가진 사람이 취급해야 하는 업무',req:['에너지이용 합리화법에서 규정하는 자격'],tipTitle:'에너지이용 합리화법상 자격 확인 방향',tip:'보일러 등 열사용기자재는 검사대상기기 해당 여부와 조종자·관리자 선임 기준을 함께 확인해야 합니다. 보일러 용량, 사용압력, 열사용기자재의 종류에 따라 필요한 자격 또는 교육요건이 달라질 수 있습니다.'},
{no:'4',cat:'기계·양중',cls:'machine',title:'건설기계관리법에 따른 건설기계를 사용하는 작업',range:'면허를 가진 사람이 취급해야 하는 업무',req:['건설기계관리법에서 규정하는 면허'],tipTitle:'건설기계관리법상 면허 확인 방향',tip:'건설기계 사용 작업은 장비 종류별 건설기계조종사면허 해당 여부를 확인해야 합니다. 굴착기, 로더, 지게차, 기중기 등 장비별 면허 구분이 다르므로 실제 투입 장비명을 기준으로 확인하는 것이 적절합니다.'},
{no:'4의2',cat:'기계·양중',cls:'machine',title:'지게차를 사용하는 작업',range:'전동식으로 솔리드타이어를 부착한 지게차 중 도로가 아닌 장소에서만 운행하는 지게차를 취급하는 업무',req:['국가기술자격법에 따른 지게차운전기능사 자격','건설기계관리법 제26조제4항 및 같은 법 시행규칙 제73조제2항제3호에 따른 소형 건설기계 조종 교육과정 이수자'],note:'비고 제2호: 2021년 7월 15일 이전에 도로교통법상 운전면허를 받고 3개월 이상 지게차 작업 경험이 있는 사람이 공단의 지게차 조종 관련 교육을 이수한 경우, 지게차 사용 작업 자격이 있는 것으로 보는 특례 확인 필요'},
{no:'5',cat:'화기·폭발',cls:'fire',title:'터널 내에서의 발파작업',range:'장전·결선·점화 및 불발 장약 처리와 이와 관련된 점검 및 처리업무',req:['총포·도검·화약류 등의 안전관리에 관한 법률에서 규정하는 자격','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','관계 법령에 따라 해당 작업을 할 수 있도록 허용된 사람'],tipTitle:'총포·도검·화약류 등 안전관리 법령상 자격 예시',tip:'화약류를 제조·관리·사용하는 업무는 통상 화약류제조보안책임자, 화약류관리보안책임자 등 화약류 관련 면허·자격 체계와 연결됩니다. 발파작업의 실제 업무범위와 화약류 사용허가 조건에 따라 필요한 자격을 확인해야 합니다.'},
{no:'6',cat:'화기·폭발',cls:'fire',title:'인화성 가스 및 산소를 사용하여 금속을 용접·용단 또는 가열하는 작업',range:'폭발분위기가 조성된 장소에서의 업무 또는 안전보건규칙 별표 1에 따른 위험물질을 취급하는 밀폐된 장소에서의 업무',req:['국가기술자격법에 따른 전기용접기능사, 특수용접기능사 및 가스용접기능사보 이상의 자격. 단, 가스용접에 한정','국가기술자격법에 따른 금속재료산업기사, 표면처리산업기사, 주조산업기사 및 금속제련산업기사 이상의 자격','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자']},
{no:'7',cat:'화기·폭발',cls:'fire',title:'폭발성·발화성 및 인화성 물질의 제조 또는 취급작업',range:'폭발분위기가 조성된 장소에서의 폭발성·발화성·인화성 물질의 취급업무',req:['총포·도검·화약류 등의 안전관리에 관한 법률에서 규정하는 자격','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','관계 법령에 따라 해당 작업을 할 수 있도록 허용된 사람'],tipTitle:'총포·도검·화약류 등 안전관리 법령상 자격 예시',tip:'화약류 또는 폭발성 물질의 제조·취급업무는 화약류제조보안책임자, 화약류관리보안책임자 등 화약류 관련 면허·자격과 연결될 수 있습니다. 취급 물질, 장소, 허가조건에 따라 필요한 자격이 달라질 수 있습니다.'},
{no:'8',cat:'특수작업',cls:'special',title:'방사선 취급작업',range:'원자로 운전업무, 핵연료물질 취급·폐기업무, 방사선 동위원소 취급·폐기업무, 방사선 발생장치 검사·촬영업무',req:['원자력안전법에서 규정하는 면허'],tipTitle:'원자력안전법상 면허 예시',tip:'업무 유형에 따라 원자로조종감독자·원자로조종사, 핵연료물질취급감독자, 방사성동위원소취급자 일반면허·특수면허, 방사선취급감독자면허, 방사선발생장치취급자면허 등 원자력안전법상 면허를 확인해야 합니다.'},
{no:'9',cat:'전기·에너지',cls:'elec',title:'고압선 정전작업 및 활선작업',range:'안전보건규칙 제302조제1항제3호다목에 따른 고압 전로 취급 업무로서 정전작업 및 활선작업',req:['국가기술자격법에 따른 전기기능사, 철도신호기능사 및 전기철도기능사 이상의 자격','초·중등교육법에 따른 고등학교에서 전기에 관한 학과를 졸업한 사람 또는 같은 수준 이상의 학력 소지자','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','관계 법령에 따라 해당 작업을 할 수 있도록 허용된 사람']},
{no:'10',cat:'건설·구조물',cls:'build',title:'철골구조물 및 배관 등을 설치하거나 해체하는 작업',range:'철골구조물 설치·해체작업 및 안전보건규칙 제256조에 따른 위험물질 등이 들어 있는 배관 작업',req:['철골구조물 설치·해체작업: 철골구조물기능사보 이상의 자격 또는 3개월 이상 해당 작업 경험자. 단, 경험자는 높이 66미터 미만 작업에 한정','위험물질 등이 들어 있는 배관: 공업배관기능사보 이상 및 건축배관기능사보 이상의 자격 또는 해당 분야 직업능력개발훈련 이수자']},
{no:'11',cat:'기계·양중',cls:'machine',title:'천장크레인 조종작업',range:'조종석이 설치되어 있는 천장크레인의 조종석 조종작업',req:['국가기술자격법에 따른 천장크레인운전기능사 자격','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','이 규칙에서 정하는 해당 교육기관에서 교육을 이수하고 수료시험에 합격한 사람']},
{no:'12',cat:'기계·양중',cls:'machine',title:'타워크레인 조종작업',range:'조종석이 설치되지 않은 정격하중 5톤 이상의 무인타워크레인을 포함한 타워크레인 조종작업',req:['국가기술자격법에 따른 타워크레인운전기능사 자격']},
{no:'13',cat:'기계·양중',cls:'machine',title:'컨테이너크레인 조종업무',range:'조종석이 설치되어 있는 컨테이너크레인의 조종석 조종작업',req:['국가기술자격법에 따른 컨테이너크레인운전기능사 자격','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','이 규칙에서 정하는 해당 교육기관에서 교육을 이수하고 수료시험에 합격한 사람','관계 법령에 따라 해당 작업을 할 수 있도록 허용된 사람']},
{no:'14',cat:'기계·양중',cls:'machine',title:'승강기 점검 및 보수작업',range:'승강기 점검 및 보수작업',req:['국가기술자격법에 따른 승강기기능사 자격','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','이 규칙에서 정하는 해당 교육기관에서 교육을 이수하고 수료시험에 합격한 사람','관계 법령에 따라 해당 작업을 할 수 있도록 허용된 사람']},
{no:'15',cat:'건설·구조물',cls:'build',title:'흙막이 지보공의 조립 및 해체작업',range:'흙막이 지보공의 조립 및 해체작업',req:['국가기술자격법에 따른 거푸집기능사보 또는 비계기능사보 이상의 자격','3개월 이상 해당 작업 경험자. 단, 깊이 31미터 미만 작업에 한정','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','이 규칙에서 정하는 해당 교육기관에서 교육을 이수한 사람']},
{no:'16',cat:'건설·구조물',cls:'build',title:'거푸집의 조립 및 해체작업',range:'거푸집의 조립 및 해체작업',req:['국가기술자격법에 따른 거푸집기능사보 이상의 자격','3개월 이상 해당 작업 경험자. 단, 층높이가 10미터 미만인 작업에 한정','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','이 규칙에서 정하는 해당 교육기관에서 교육을 이수한 사람']},
{no:'17',cat:'건설·구조물',cls:'build',title:'비계의 조립 및 해체작업',range:'비계의 조립 및 해체작업',req:['국가기술자격법에 따른 비계기능사보 이상의 자격','3개월 이상 해당 작업 경험자. 단, 층높이가 10미터 미만인 작업에 한정','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','이 규칙에서 정하는 해당 교육기관에서 교육을 이수한 사람']},
{no:'18',cat:'특수작업',cls:'special',title:'표면공급식 잠수장비 또는 스쿠버 잠수장비에 의해 수중에서 행하는 작업',range:'표면공급식 잠수장비 또는 스쿠버 잠수장비를 사용하여 수중에서 행하는 작업',req:['국가기술자격법에 따른 잠수기능사보 이상의 자격','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','3개월 이상 해당 작업 경험자','이 규칙에서 정하는 해당 교육기관에서 교육을 이수한 사람']},
{no:'19',cat:'특수작업',cls:'special',title:'롤러기를 사용하여 고무 또는 에보나이트 등 점성물질을 취급하는 작업',range:'롤러기를 사용하여 고무 또는 에보나이트 등 점성물질을 취급하는 작업',req:['3개월 이상 해당 작업 경험자']},
{no:'20',cat:'기계·양중',cls:'machine',title:'양화장치 운전작업',range:'조종석이 설치되어 있는 양화장치 운전작업',req:['국가기술자격법에 따른 양화장치운전기능사보 이상의 자격','국민 평생 직업능력 개발법에 따른 해당 분야 직업능력개발훈련 이수자','이 규칙에서 정하는 해당 교육기관에서 교육을 이수하고 수료시험에 합격한 사람']},
{no:'21',cat:'기계·양중',cls:'machine',title:'타워크레인 설치·해체작업',range:'타워크레인을 높이는 작업을 포함한 타워크레인 설치·해체작업',req:['국가기술자격법에 따른 타워크레인 설치·해체기능사 자격','국가기술자격법에 따른 판금제관기능사 또는 비계기능사 자격. 단, 2025년 12월 31일까지 취득한 자격으로 한정','해당 교육기관에서 교육을 이수하고 수료시험에 합격한 사람으로서 수료시험 합격 후 5년이 경과하지 않은 사람 또는 보수교육 이수 후 5년이 경과하지 않은 사람'],note:'비고 제1호: 타워크레인 설치·해체작업 자격을 교육 이수 및 수료시험 합격으로 취득한 근로자가 작업 중 안전보건의무를 이행하지 않아 다른 사람에게 손해를 입혀 벌금 이상의 형이 확정된 경우, 144시간 교육을 다시 이수하고 수료시험에 합격하기 전까지 해당 작업 자격을 가진 근로자로 보지 않는 제한 사유 확인 필요'},
{no:'22',cat:'기계·양중',cls:'machine',title:'이동식 크레인·고소작업대 조종작업',range:'카고크레인에 한정한 이동식 크레인 및 차량탑재형 고소작업대 조종작업',req:['국가기술자격법에 따른 기중기운전기능사 자격','이 규칙에서 정하는 해당 교육기관에서 교육을 이수하고 수료시험에 합격한 사람']}
];
let current='전체', keyword='';
const order=['법정자격 연계','전기·에너지','화기·폭발','기계·양중','건설·구조물','특수작업'];
function esc(s){return String(s).replace(/[&<>"]/g,m=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'}[m]));}
function hi(s){s=esc(s); const k=keyword.trim(); if(!k) return s; return s.replace(new RegExp(k.replace(/[.*+?^${}()|[\]\\]/g,'\\$&'),'gi'),m=>`<mark>${m}</mark>`)}
function show(){
 const list=WORKS.filter(w=>(current==='전체'||w.cat===current)&&(!keyword||[w.no,w.cat,w.title,w.range,...w.req,w.note||''].join(' ').toLowerCase().includes(keyword.toLowerCase())));
 const box=document.getElementById('workList'), empty=document.getElementById('empty');
 if(!list.length){box.innerHTML=''; empty.style.display='block'; return;} empty.style.display='none';
 let html='';
 const renderItem=w=>`<article class="work-item ${w.cls}"><div class="work-no"><b>${hi(w.no)}</b><small>NO.</small></div><div class="work-body"><div class="work-top"><h3 class="work-title">${hi(w.title)}</h3><span class="badge">${hi(w.cat)}</span></div><div class="work-grid"><div class="info"><h4>작업범위</h4><p>${hi(w.range)}</p></div><div class="info"><h4>자격·면허·기능 또는 경험</h4><ul>${w.req.map(r=>`<li>${hi(r)}</li>`).join('')}</ul>${w.tip?`<button type="button" class="tip-btn" onclick="toggleTip(this)">관련 법령 자격 TIP</button><div class="law-tip"><strong>${hi(w.tipTitle||'관련 법령 자격 안내')}</strong><p>${hi(w.tip)}</p><p class="tip-caution">※ 세부 자격은 설비·장비·작업범위 및 최신 하위법령에 따라 달라질 수 있으므로 실제 적용 시 현행 법령 확인이 필요합니다.</p></div>`:''}</div></div>${w.note?`<div class="note">${hi(w.note)}</div>`:''}</div></article>`;
 if(current==='전체'){
   html=list.map(renderItem).join('');
 }else{
   order.forEach(cat=>{ const items=list.filter(w=>w.cat===cat); if(!items.length) return; html+=`<h3 class="group-title">${cat}</h3>` + items.map(renderItem).join(''); });
 }
 box.innerHTML=html;
}
function toggleTip(btn){btn.closest('.work-item').classList.toggle('open-tip');}
document.getElementById('tabs').addEventListener('click',e=>{const b=e.target.closest('.cat-btn'); if(!b) return; current=b.dataset.filter; document.querySelectorAll('.cat-btn').forEach(x=>x.classList.toggle('active',x===b)); show();});
document.getElementById('searchInput').addEventListener('input',e=>{keyword=e.target.value.trim(); show();});
show();
</script>
</body>
</html>				</div>
				<div class="elementor-element elementor-element-c9279ef elementor-widget elementor-widget-html" data-id="c9279ef" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3106752057307696"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="autorelaxed"
     data-ad-client="ca-pub-3106752057307696"
     data-ad-slot="7825472551"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>지게차 작업계획서 작성</title>
		<link>https://safetysupport.co.kr/forklift-work-plan-tool/</link>
		
		<dc:creator><![CDATA[mangjil]]></dc:creator>
		<pubDate>Tue, 28 Apr 2026 04:15:52 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[산업안전보건법]]></category>
		<category><![CDATA[안전보건규칙]]></category>
		<category><![CDATA[작업계획서 PDF]]></category>
		<category><![CDATA[중량물 운반작업]]></category>
		<category><![CDATA[지게차 관계자교육]]></category>
		<category><![CDATA[지게차 도면작성]]></category>
		<category><![CDATA[지게차 안전대책]]></category>
		<category><![CDATA[지게차 안전작업계획서]]></category>
		<category><![CDATA[지게차 안전점검표]]></category>
		<category><![CDATA[지게차 운반경로]]></category>
		<category><![CDATA[지게차 위험요인]]></category>
		<category><![CDATA[지게차 작업계획서]]></category>
		<category><![CDATA[지게차 작업계획서 작성도구]]></category>
		<category><![CDATA[지게차 작업전점검]]></category>
		<guid isPermaLink="false">https://safetysupport.co.kr/?p=3237</guid>

					<description><![CDATA[지게차 작업계획서 작성도구 &#124; 산업안전지원센터 🔓 워터마크 해제 비밀번호를 입력하면 워터마크 없이 PDF를 저장합니다. 확인 취소 Safety Support · Forklift Work Plan 지게차 작업계획서 작성도구 작업계획서 작성 · 운반경로 도면 편집 · 교육자료 출력 · PDF 저장 🔓 워터마크 해제 PDF 저장 1. 작업개요 2. 중량물 제원 3. 장비 제원 4. 작업장소·운반경로 5. 관계자 교육 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3237" class="elementor elementor-3237" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-bb1f1a0 e-con-full e-flex e-con e-parent" data-id="bb1f1a0" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-1a969be elementor-widget elementor-widget-html" data-id="1a969be" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3106752057307696"
     crossorigin="anonymous"></script>
<!-- safetysupport_상단_반응형 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-3106752057307696"
     data-ad-slot="2206462755"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
				</div>
				<div class="elementor-element elementor-element-33ff180 elementor-widget elementor-widget-html" data-id="33ff180" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>지게차 작업계획서 작성도구 | 산업안전지원센터</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/moonspam/NanumSquareNeo@latest/NanumSquareNeo.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<style>
:root{
  --deep:#0D3321;--mid:#1a5c38;--accent:#2e8b57;
  --pale:#e8f5ee;--soft:#f6faf7;
  --blue:#1565a7;--blue-s:#e8f4fd;
  --gold:#c9a84c;--gold-s:#fdf5e0;
  --ink:#1f2422;--ink2:#344b61;--muted:#737f79;
  --line:#d9e2dc;--line2:#edf2ef;
  --bg:#f0f4f2;--paper:#fff;
  --danger:#c0392b;
  --sh:0 8px 24px rgba(13,51,33,.09);
}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:'NanumSquareNeo','Malgun Gothic',sans-serif;background:var(--bg);color:var(--ink);font-size:14px;line-height:1.65;word-break:keep-all}
input,textarea,select,button{font-family:'NanumSquareNeo','Malgun Gothic',sans-serif}
button{cursor:pointer}

.tool{max-width:1480px;margin:0 auto;padding:22px 18px 70px}

/* 헤더 */
.hd{padding:20px 22px 22px;border-bottom:2px solid var(--deep);background:#fff;border-radius:12px 12px 0 0;box-shadow:0 3px 12px rgba(13,51,33,.06);text-align:center}
.hd-eye{font-size:11px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin-bottom:6px}
.hd-title{font-size:clamp(22px,3vw,33px);font-weight:900;color:var(--deep);letter-spacing:-.04em}
.hd-sub{font-size:12.5px;color:var(--muted);margin-top:4px}

/* 버튼 */
.btn{border:1.5px solid transparent;border-radius:8px;padding:9px 14px;font-size:13px;font-weight:900;display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:39px;transition:.15s}
.btn:hover{filter:brightness(1.07)}
.btn:active{transform:scale(.97)}
.btn-primary{background:var(--deep);color:#fff;border-color:var(--deep)}
.btn-gold{background:var(--gold-s);color:#755300;border-color:var(--gold)}
.btn-light{background:#fff;color:var(--deep);border-color:var(--line)}
.btn-blue{background:var(--blue);color:#fff}
.btn-danger{background:#fff;color:var(--danger);border-color:#efc4bd}
.btn-sm{font-size:11.5px;min-height:32px;padding:6px 10px}
.btn-xs{font-size:11px;min-height:26px;padding:4px 8px;border-radius:6px}
.top-acts{display:flex;justify-content:flex-end;gap:8px;margin:12px 0 14px}

/* 탭 */
.tab-list{display:grid;grid-template-columns:repeat(5,1fr);border:1px solid var(--line);background:#fff;box-shadow:0 3px 12px rgba(13,51,33,.06);margin-bottom:18px}
.tab-btn{min-height:56px;background:#fff;border:0;border-right:1px solid var(--line);border-bottom:1px solid var(--line);font-size:13px;font-weight:900;color:var(--ink2);transition:.15s;line-height:1.3;padding:10px 12px 10px 20px;text-align:left}
.tab-btn:nth-child(5n){border-right:0}
.tab-btn:nth-last-child(-n+5){border-bottom:0}
.tab-btn:hover{background:var(--soft);color:var(--deep)}
.tab-btn.active{background:var(--soft);color:var(--deep);box-shadow:inset 0 0 0 1.5px var(--accent);position:relative}
.tab-btn.active::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;background:var(--accent)}
.tab-btn.tab-pv{background:var(--blue-s);color:var(--blue)}
.tab-btn.tab-pv.active{background:var(--blue);color:#fff}

/* 패널 */
.panel{display:none}
.panel.active{display:block}
.wl{display:grid;grid-template-columns:440px minmax(0,1fr);gap:24px;align-items:start}
.rb{display:grid;grid-template-columns:440px minmax(0,1fr);gap:24px;align-items:start}

/* 입력폼 카드 */
.fc{background:#fff;border:1px solid var(--line);border-top:3px solid var(--deep);border-radius:10px;box-shadow:var(--sh);padding:22px 20px;position:sticky;top:14px;max-height:calc(100vh - 28px);overflow:auto}
.fc-title{font-size:17px;font-weight:900;color:var(--deep);margin-bottom:18px;display:flex;align-items:center;gap:8px}
.fc-title::before{content:"";width:4px;height:18px;background:var(--accent);border-radius:3px}
.fcsec{font-size:11px;font-weight:900;letter-spacing:.1em;color:var(--accent);margin:18px 0 10px;display:flex;align-items:center;gap:8px}
.fcsec::after{content:"";height:1px;background:var(--pale);flex:1}
.field{margin-bottom:13px}
.lbl{display:block;font-size:13px;font-weight:900;color:#4d5f58;margin-bottom:5px}
.inp,.txa,.sel{width:100%;border:1.5px solid var(--line);background:#fff;border-radius:8px;color:var(--ink);font-size:13px;outline:0;transition:.16s;font-family:'NanumSquareNeo','Malgun Gothic',sans-serif}
.inp,.sel{height:42px;padding:0 12px}
.txa{min-height:82px;padding:10px 12px;resize:vertical;line-height:1.65}
.inp:focus,.txa:focus,.sel:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(46,139,87,.1)}
.inp::placeholder,.txa::placeholder{color:#b1bab5}
.r2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.fc-acts{display:flex;gap:8px;margin-top:12px}
.fc-acts .btn{flex:1}
.mini{font-size:11.5px;color:#75827c;line-height:1.55;margin-top:5px}

/* 편집 테이블 */
.etbl{width:100%;border-collapse:collapse;margin-bottom:8px}
.etbl th{background:#f3f8f4;color:#255640;border:1px solid var(--line);padding:7px;font-size:11.5px;text-align:center}
.etbl td{border:1px solid var(--line2);padding:5px;background:#fff;vertical-align:middle}
.etbl input,.etbl textarea,.etbl select{width:100%;border:1px solid #e4edf5;border-radius:6px;padding:6px;font-size:11.5px;outline:0;font-family:'NanumSquareNeo','Malgun Gothic',sans-serif}
.etbl textarea{min-height:52px;resize:vertical}
.etbl input:focus,.etbl textarea:focus,.etbl select:focus{border-color:var(--accent);box-shadow:0 0 0 2px rgba(46,139,87,.1)}
.row-del-btn{background:none;border:none;color:#ccc;font-size:13px;cursor:pointer;padding:2px 4px;border-radius:4px;line-height:1;width:100%}
.row-del-btn:hover{color:var(--danger);background:#fff0ee}

/* 예시 팝업/툴팁 */
.ex-wrap{position:relative}
.ex-hint{display:none;position:absolute;left:0;top:100%;z-index:50;background:#1a2a3a;color:#d8ecf5;font-size:11px;line-height:1.7;padding:10px 14px;border-radius:8px;min-width:300px;max-width:400px;box-shadow:0 6px 20px rgba(0,0,0,.25);white-space:pre-wrap}
.ex-hint b{color:#7eb8e8}
.ex-wrap:hover .ex-hint{display:block}

/* 중량물 예시 패널 */
.load-ex-panel{background:#1a2a3a;border-radius:10px;padding:14px 16px;margin-bottom:14px;font-size:11.5px;color:#c8dff0;line-height:1.8}
.load-ex-panel strong{color:#7eb8e8;display:block;margin-bottom:6px;font-size:12px}
.load-ex-row{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:8px}
.load-ex-item{background:#243548;border-radius:6px;padding:8px 10px;cursor:pointer;border:1px solid #2e4a66;transition:.15s}
.load-ex-item:hover{background:#1565a7;border-color:#4a9ade}
.load-ex-item .le-name{font-weight:900;color:#a8d8f0;font-size:11px;margin-bottom:3px}
.load-ex-item .le-detail{font-size:10px;color:#8ab0cc;line-height:1.5}

/* 중량물 카드 */
.load-card{border:1px solid var(--line);border-radius:8px;padding:14px 16px;margin-bottom:10px;background:#fff;position:relative}
.load-card-no{font-size:11px;font-weight:900;color:var(--accent);margin-bottom:10px}
.load-card .field{margin-bottom:9px}
.load-card .lbl{font-size:12px}
.load-card .inp,.load-card .sel{height:38px;font-size:12.5px}
.load-card .txa{min-height:68px;font-size:12.5px}
.load-card-del{position:absolute;top:10px;right:10px;background:none;border:none;color:#bbb;font-size:14px;cursor:pointer;padding:2px 6px}
.load-card-del:hover{color:var(--danger)}


/* 운반경로 예시 */
.route-ex-item{background:#243548;border:1px solid #2e4a66;border-radius:6px;padding:7px 10px;cursor:pointer;font-size:11px;color:#a8c8e0;margin-bottom:5px;transition:.15s;line-height:1.55}
.route-ex-item:last-child{margin-bottom:0}
.route-ex-item:hover{background:#1565a7;border-color:#4a9ade;color:#fff}

/* 작업내용 예시 패널 */
.work-ex-item{background:#243548;border:1px solid #2e4a66;border-radius:6px;padding:8px 10px;cursor:pointer;transition:.15s}
.work-ex-item:hover{background:#1565a7;border-color:#4a9ade}
.we-title{font-size:11px;font-weight:900;color:#7eb8e8;margin-bottom:4px}
.work-ex-item:hover .we-title{color:#fff}
.we-desc{font-size:10.5px;color:#a8c8e0;line-height:1.6}
.work-ex-item:hover .we-desc{color:#e0f0ff}

/* 미리보기 */
.pw{background:#f6f7f5;border:1px solid var(--line);border-radius:10px;padding:22px 26px;overflow:auto;min-width:0}
.pw-lbl{font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;color:#999;margin-bottom:14px;display:flex;align-items:center;gap:8px}
.pw-lbl::after{content:"";height:1px;background:var(--line);flex:1}

/* ══════════════════════════════════════
   출력 문서 스타일
══════════════════════════════════════ */
.doc{background:#fff;border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,.07);padding:10mm 14mm;width:794px;max-width:none;margin:0 auto 18px;color:#111;font-family:'NanumSquareNeo','Malgun Gothic',sans-serif;position:relative;overflow:hidden}
.doc-title{text-align:center;font-size:24px;font-weight:900;letter-spacing:.12em;border-bottom:2.5px solid #111;padding-bottom:12px;margin-bottom:6px}
.doc-sub{text-align:center;font-size:12px;color:#666;margin-bottom:20px}

/* 대섹션 헤더 – 좌측 초록 세로선 + 연회색 배경 */
.doc-sh-main{font-size:13.5px;font-weight:900;background:#f2f4f3;color:#1a2a3a;padding:7px 12px 7px 16px;margin-bottom:10px;letter-spacing:.02em;border-left:4px solid #0D3321;border-bottom:1px solid #dde4de}
/* 소섹션 헤더 – 들여쓰기, 배경 없음, 기호 없음 */
.doc-sh-sub{font-size:13px;font-weight:900;color:#0D3321;padding:8px 0 5px 22px;margin-bottom:6px;letter-spacing:.02em;border-bottom:1px solid #e8ede9}

.doc-sec{margin-bottom:18px;break-inside:avoid}
.dt{width:100%;border-collapse:collapse;font-size:12px;table-layout:auto}
.dt th{background:#f7f7f5 !important;color:#333;border:1px solid #ccc;padding:7px 8px;font-weight:900;vertical-align:middle;text-align:center;word-break:keep-all}
.dt td{border:1px solid #ccc;padding:7px 8px;min-height:30px;vertical-align:top;white-space:pre-wrap;word-break:break-all;background:#fff !important}
.dt-lbl{border:1px solid #ccc;padding:7px 8px;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;background:#f7f7f5 !important;white-space:nowrap}
.dt .ctr{text-align:center;vertical-align:middle}
.doc-ol{margin:0;padding-left:18px;font-size:12px;line-height:2.0}
.doc-ol li{margin:3px 0}
.doc-ol li b{color:#0D3321}
.sign-h{height:44px}
.img-pv{max-width:100%;border:1px solid #ccc;border-radius:6px;background:#fff}

/* 워터마크 – 화면 미리보기: 중앙 대각선 1회 */
.wm-layer{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;overflow:hidden;z-index:10;display:flex;align-items:center;justify-content:center}
.wm-text{color:rgba(13,51,33,.07);font-size:88px;font-weight:900;white-space:nowrap;transform:rotate(-35deg);transform-origin:center;font-family:'NanumSquareNeo','Malgun Gothic',sans-serif;letter-spacing:.12em;user-select:none}

/* 표지 */
.doc-cover{min-height:1050px;display:flex;flex-direction:column;padding:14mm 16mm}
.cover-top{display:flex;justify-content:flex-end;margin-bottom:0}
/* 결재란 */
.approval-tbl{border-collapse:collapse;font-size:11px;width:auto;table-layout:fixed}
.approval-tbl th,.approval-tbl td{border:1px solid #444;text-align:center;vertical-align:middle;width:64px}
.approval-tbl th{background:#f0f0f0;font-weight:900;font-size:10px;padding:4px 0;height:22px}
.approval-tbl td{height:50px;font-size:11px;padding:4px 0}
.approval-tbl .apv-label{height:22px;padding:3px 0;font-size:10px;font-weight:900;background:#f0f0f0}

.cover-body{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:0;text-align:center}
.cover-main-title{font-size:36px;font-weight:900;letter-spacing:.2em;margin-bottom:10px;color:#111}
.cover-law{font-size:12px;color:#888;letter-spacing:.06em;margin-bottom:36px}
.cover-info-box{padding:28px 48px;text-align:center;min-width:440px;margin-bottom:16px}
.cover-info-box p{font-size:14px;line-height:2.2;color:#222}
.cover-info-box p span{font-weight:900;margin-right:12px}

.cover-bottom{display:flex;justify-content:flex-end;align-items:flex-end;padding-bottom:4mm;margin-top:auto}
.cover-co-center{flex:1;text-align:center;font-size:14px;font-weight:700;color:#333}
.cover-logo-right{text-align:right}
.cover-logo-ko{font-size:15px;font-weight:900;color:var(--deep);letter-spacing:.04em;line-height:1.4}
.cover-logo-en{font-size:10px;color:#888;letter-spacing:.06em}

/* 도면 편집기 */
.re-wrap{background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:var(--sh);overflow:hidden;margin-bottom:22px}
.re-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:13px 16px;border-bottom:1px solid var(--line);background:#f8fbf9}
.re-head strong{color:var(--deep);font-size:15px}
.r-wrap{display:grid;grid-template-columns:250px 1fr;min-height:680px}
.r-sb{background:#1a2a3a;color:#e0e8f0;display:flex;flex-direction:column;gap:9px;padding:14px 12px;overflow-y:auto}
.r-sb h3{font-size:12px;font-weight:900;color:#7eb8e8;padding-bottom:8px;border-bottom:1px solid #2c4060}
.tg{display:flex;flex-direction:column;gap:5px}
.tg label{font-size:10px;color:#8eb1d1;font-weight:900}
.tbtn{background:#243548;border:1px solid #2e4a66;color:#cde0f5;font-size:11px;padding:7px 9px;border-radius:7px;cursor:pointer;text-align:left}
.tbtn:hover,.tbtn.active{background:#1565a7;border-color:#4a9ade;color:#fff}
.sym-grid{display:grid;grid-template-columns:1fr 1fr;gap:5px}
.sbtn{background:#243548;border:1px solid #2e4a66;color:#cde0f5;font-size:10px;padding:7px 5px;border-radius:7px;cursor:pointer;text-align:center;line-height:1.35}
.sbtn.active{background:#1565a7;border-color:#4a9ade;color:#fff}
.si{display:block;font-size:16px}
.sl{font-size:9px;color:#91aeca}
.sbtn.active .sl{color:#d7ecff}
.crow{display:flex;gap:4px;flex-wrap:wrap}
.cdot{width:22px;height:22px;border-radius:50%;border:2px solid transparent;cursor:pointer}
.cdot.active{border-color:#fff}
.r-sb input[type=text],.r-sb select{background:#243548;border:1px solid #2e4a66;color:#cde0f5;font-size:11px;padding:6px 8px;border-radius:6px;width:100%;font-family:'NanumSquareNeo','Malgun Gothic',sans-serif}
.rtip{font-size:10px;color:#8aa8c4;line-height:1.6;background:#141e2a;border-radius:6px;padding:8px}
.r-cv{display:flex;flex-direction:column;min-width:0}
.cv-tb{background:#fff;border-bottom:1px solid var(--line);padding:9px 14px;display:flex;align-items:center;gap:10px;font-size:12px;color:#555}
.cv-badge{background:#e8f4fd;color:#1565a7;border:1px solid #b3d4f0;border-radius:999px;padding:2px 10px;font-size:10px;font-weight:900}
.cv-scroll{flex:1;overflow:auto;background:#d8dde2}
canvas{display:block;background:#fff;cursor:crosshair}

/* 자격사항 카드 */
.lic-card{border:1px solid var(--line);border-radius:8px;padding:14px;margin-bottom:10px;position:relative;background:#fff}
.lic-card-no{position:absolute;top:10px;left:12px;font-size:11px;font-weight:900;color:var(--accent)}
.lic-box{border:1.5px dashed var(--line);border-radius:8px;min-height:120px;display:flex;align-items:center;justify-content:center;background:#fafcff;color:#999;font-size:12px;padding:12px;margin-top:8px}
.lic-box img{max-width:100%;max-height:280px;border-radius:6px;display:none}

/* 워터마크 모달 */
.wm-modal{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:999;align-items:center;justify-content:center}
.wm-modal.open{display:flex}
.wm-box{background:#fff;border-radius:12px;padding:28px 32px;min-width:360px;box-shadow:0 20px 60px rgba(0,0,0,.25)}
.wm-box h3{font-size:18px;font-weight:900;color:var(--deep);margin-bottom:16px}
.wm-box p{font-size:13px;color:#666;margin-bottom:16px;line-height:1.7}
.wm-pw-row{display:flex;gap:10px}
.wm-pw-row input{flex:1;height:44px;border:1.5px solid var(--line);border-radius:8px;padding:0 12px;font-size:14px;font-family:'NanumSquareNeo','Malgun Gothic',sans-serif}
.wm-msg{font-size:12px;margin-top:8px;height:18px}

#pdf-area{position:absolute;left:-99999px;top:0;width:794px;background:#fff}
#pdf-area .dt{table-layout:fixed}
#pdf-area .dt th{background:#f7f7f5 !important}
#pdf-area .dt td{background:#fff !important}
#pdf-area .dt-lbl{background:#f7f7f5 !important}

/* 반응형 */
@media(max-width:1160px){
  .wl,.rb{grid-template-columns:1fr}
  .fc{position:static;max-height:none}
  .tab-list{grid-template-columns:repeat(2,1fr)}
  .r-wrap{grid-template-columns:1fr}
  .doc{padding:12mm 9mm}
}
@media(max-width:640px){
  .tool{padding:12px 10px 50px}
  .tab-list{grid-template-columns:1fr}
  .r2{grid-template-columns:1fr}
}

@media print{
  body{background:#fff}
  .tool{padding:0}
  .hd,.top-acts,.tab-list,.fc,.pw-lbl,.re-wrap,.np,.wm-modal{display:none!important}
  .panel{display:none!important}
  .panel.active{display:block!important}
  .pw{border:0;background:#fff;padding:0}
  .doc{box-shadow:none;border:0;border-radius:0;max-width:none;margin:0;padding:8mm 0 0;page-break-after:always}
  .doc:last-child{page-break-after:auto}
  @page{size:A4;margin:18mm 14mm 18mm 14mm}
}
.np{}

/* 워드프레스 테마 hover/zebra 강제 차단 */
.dt td:hover, .dt tr:hover td, .dt tbody tr:hover td { background:#fff !important; }
.dt td.dt-lbl:hover, .dt tr:hover td.dt-lbl { background:#f7f7f5 !important; }
.dt tbody tr:nth-child(odd) td { background:#fff !important; }
.dt tbody tr:nth-child(even) td { background:#fff !important; }
.dt tbody tr:nth-child(odd) td.dt-lbl { background:#f7f7f5 !important; }
.dt tbody tr:nth-child(even) td.dt-lbl { background:#f7f7f5 !important; }
</style>
</head>
<body>

<!-- 워터마크 해제 모달 -->
<div class="wm-modal" id="wmModal">
  <div class="wm-box">
    <h3>🔓 워터마크 해제</h3>
    <p>비밀번호를 입력하면 워터마크 없이 PDF를 저장합니다.</p>
    <div class="wm-pw-row">
      <input type="password" id="wmPwInput" placeholder="비밀번호 입력" onkeydown="if(event.key==='Enter')checkWmPw()">
      <button class="btn btn-primary" onclick="checkWmPw()">확인</button>
    </div>
    <div class="wm-msg" id="wmMsg"></div>
    <div style="margin-top:16px;text-align:right">
      <button class="btn btn-light btn-sm" onclick="closeWmModal()">취소</button>
    </div>
  </div>
</div>

<div class="tool" id="mainTool">

<header class="hd np">
  <div class="hd-eye">Safety Support · Forklift Work Plan</div>
  <h1 class="hd-title">지게차 작업계획서 작성도구</h1>
  <div class="hd-sub">작업계획서 작성 · 운반경로 도면 편집 · 교육자료 출력 · PDF 저장</div>
</header>

<div class="top-acts np">
  <button class="btn btn-light btn-sm" onclick="openWmModal()">🔓 워터마크 해제</button>
  <button class="btn btn-gold" id="pdfBtn" onclick="exportPDF()">PDF 저장</button>
</div>

<nav class="tab-list np">
  <button class="tab-btn active" data-tab="overview"  onclick="showTab('overview')">1. 작업개요</button>
  <button class="tab-btn"        data-tab="load"      onclick="showTab('load')">2. 중량물 제원</button>
  <button class="tab-btn"        data-tab="machine"   onclick="showTab('machine')">3. 장비 제원</button>
  <button class="tab-btn"        data-tab="route"     onclick="showTab('route')">4. 작업장소·운반경로</button>
  <button class="tab-btn"        data-tab="edu"       onclick="showTab('edu')">5. 관계자 교육</button>
  <button class="tab-btn"        data-tab="check"     onclick="showTab('check')">6. 안전작업 점검표</button>
  <button class="tab-btn"        data-tab="risk"      onclick="showTab('risk')">7. 위험요인·안전대책</button>
  <button class="tab-btn"        data-tab="method"    onclick="showTab('method')">8. 안전작업방법</button>
  <button class="tab-btn"        data-tab="license"   onclick="showTab('license')">9. 운전자 자격사항</button>
  <button class="tab-btn tab-pv" data-tab="preview"   onclick="renderAll();showTab('preview')">최종 미리보기</button>
</nav>

<main>

<!-- ══════════════════════════
  탭 1. 작업개요
══════════════════════════ -->
<section class="panel active" id="panel-overview">
  <div class="wl">
    <aside class="fc">
      <div class="fc-title">작업개요 입력</div>

      <div class="fcsec">표지 – 결재란</div>
      <div class="mini" style="margin-bottom:8px">직위명을 직접 입력하세요. 서명란은 출력 후 직접 서명합니다.</div>
      <div class="r2" style="grid-template-columns:repeat(4,1fr);gap:6px">
        <div class="field" style="margin-bottom:4px"><label class="lbl" style="font-size:11px">직위①</label><input class="inp" id="cvSign1" value="담당" style="height:34px;text-align:center;font-size:12px"></div>
        <div class="field" style="margin-bottom:4px"><label class="lbl" style="font-size:11px">직위②</label><input class="inp" id="cvSign2" value="검토" style="height:34px;text-align:center;font-size:12px"></div>
        <div class="field" style="margin-bottom:4px"><label class="lbl" style="font-size:11px">직위③</label><input class="inp" id="cvSign3" value="승인" style="height:34px;text-align:center;font-size:12px"></div>
        <div class="field" style="margin-bottom:4px"><label class="lbl" style="font-size:11px">직위④</label><input class="inp" id="cvSign4" value="대표이사" style="height:34px;text-align:center;font-size:12px"></div>
      </div>

      <div class="fcsec">표지 – 기본 정보</div>
      <div class="field"><label class="lbl">사업장명</label><input class="inp" id="siteName" placeholder="예: ㈜한국기계부품 화성공장"></div>
      <div class="field"><label class="lbl">작업명</label><input class="inp" id="workName" placeholder="예: 기계부품 완제품 지게차 출고 운반작업"></div>
      <div class="field"><label class="lbl">작성일자 (표지 표시)</label><input class="inp" id="writeDate" placeholder="예: 2026. 05. 01."></div>
      <div class="r2">
        <div class="field"><label class="lbl">작업일시</label><input class="inp" id="workDate" placeholder="예: 2026. 05. 01."></div>
        <div class="field"><label class="lbl">작업형태</label>
          <select class="sel" id="workType">
            <option value="">선택</option>
            <option value="단발성 작업">단발성 작업</option>
            <option value="반복적 작업">반복적 작업</option>
          </select>
        </div>
      </div>
      <div class="fcsec">일반현황</div>
      <div class="field"><label class="lbl">관리부서 / 책임자</label><input class="inp" id="dept" placeholder="예: 물류팀 / 김현장 팀장"></div>
      <div class="field"><label class="lbl">작업장소</label><input class="inp" id="workPlace" placeholder="예: 완제품 창고, 출하장, 연결 통로"></div>
      <div class="field">
        <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:5px">
          <label class="lbl" style="margin-bottom:0">작업내용</label>
          <button class="btn btn-light btn-xs" onclick="toggleWorkEx()" id="workExBtn">예시 선택 ▾</button>
        </div>
        <div id="workExPanel" style="display:none;background:#1a2a3a;border-radius:8px;padding:10px 12px;margin-bottom:8px">
          <div style="font-size:10px;color:#7eb8e8;font-weight:900;margin-bottom:8px">클릭하면 작업내용란에 자동 입력됩니다</div>
          <div style="display:flex;flex-direction:column;gap:6px">
            <div class="work-ex-item" onclick="fillWorkEx(0)">
              <div class="we-title">① 원자재 입고 운반</div>
              <div class="we-desc">외부 차량에서 하역된 원자재(금속소재, 판재류 등)를 입고장에서 지게차로 상차하여 지정 운반경로를 따라 원자재 창고 보관 위치까지 운반하고 파렛트 단위로 정위치에 하역한다.</div>
            </div>
            <div class="work-ex-item" onclick="fillWorkEx(1)">
              <div class="we-title">② 완제품 출고 운반</div>
              <div class="we-desc">완제품 창고에 보관 중인 기계부품 파렛트를 지게차로 상차하여 출하 대기 구역까지 운반하고 출하 순서에 따라 지정 위치에 정렬·하역한다. 출고 물량에 따라 반복 운반이 이루어진다.</div>
            </div>
            <div class="work-ex-item" onclick="fillWorkEx(2)">
              <div class="we-title">③ 공정 간 부분품 이송</div>
              <div class="we-desc">전(前)공정에서 가공 완료된 부분품(반제품)을 파렛트 또는 전용 운반구에 적재하여 지게차로 상차한 후 지정 운반경로를 따라 후(後)공정 작업 대기 위치까지 이송하고 정위치에 하역한다.</div>
            </div>
            <div class="work-ex-item" onclick="fillWorkEx(3)">
              <div class="we-title">④ 폐기물·스크랩 운반</div>
              <div class="we-desc">생산 공정에서 발생한 금속 스크랩, 폐포장재, 불량품 등을 지게차로 수거하여 사업장 내 폐기물 집하장 또는 스크랩 야적 구역까지 운반하고 종류별 분리 지점에 하역한다.</div>
            </div>
            <div class="work-ex-item" onclick="fillWorkEx(4)">
              <div class="we-title">⑤ 포장 작업을 위한 제품 이동</div>
              <div class="we-desc">포장 전 검사가 완료된 제품을 적재 파렛트 단위로 지게차로 상차하여 포장 작업 공간(포장라인 또는 포장 전용 구역)까지 운반하고, 포장 작업자가 작업하기 편리한 지정 위치에 정렬·하역한다.</div>
            </div>
          </div>
        </div>
        <textarea class="txa" id="workContent" style="min-height:90px" placeholder="예시를 선택하거나 직접 입력하세요."></textarea>
      </div>
      <div class="r2">
        <div class="field"><label class="lbl">신호방법</label><input class="inp" id="signal" placeholder="예: 유도자 수신호 및 무전기"></div>
        <div class="field"><label class="lbl">제한속도</label><input class="inp" id="speed" placeholder="예: 구내 8km/h 이하"></div>
      </div>

      <div class="fcsec">작업인원</div>
      <table class="etbl" id="peopleTable">
        <thead><tr><th>직책</th><th>성명/연락처</th><th>작업위치</th><th>자격사항</th><th>교육</th><th style="width:28px"></th></tr></thead>
        <tbody>
          <tr><td><input value="작업지휘자"></td><td><input placeholder="김현장 / 010-1234-5678"></td><td><input value="전 구간 총괄"></td><td><input value="해당 작업 지휘 경험 보유"></td><td><select><option>실시</option><option>미실시</option><option>해당없음</option></select></td><td><button class="row-del-btn" onclick="delRow(this)" title="삭제">✕</button></td></tr>
          <tr><td><input value="유도자(신호)"></td><td><input placeholder="이안전 / 010-2345-6789"></td><td><input value="출하장"></td><td><input value="신호방법 교육 이수"></td><td><select><option>실시</option><option>미실시</option><option>해당없음</option></select></td><td><button class="row-del-btn" onclick="delRow(this)" title="삭제">✕</button></td></tr>
          <tr><td><input value="운전자"></td><td><input placeholder="박기사 / 010-3456-7890"></td><td><input value="지게차 운전"></td><td><input value="지게차운전기능사 / 건설기계조종사면허"></td><td><select><option>실시</option><option>미실시</option><option>해당없음</option></select></td><td><button class="row-del-btn" onclick="delRow(this)" title="삭제">✕</button></td></tr>
        </tbody>
      </table>
      <div class="fc-acts"><button class="btn btn-light btn-sm" onclick="addRow('peopleTable')">작업인원 추가</button></div>

      <div class="fcsec">작업계획 순서</div>
      <table class="etbl" id="planTable">
        <thead><tr><th style="width:32px">순서</th><th>작업단계</th><th>세부 작업내용</th><th>핵심 확인사항</th></tr></thead>
        <tbody>
          <tr><td><input value="1"></td><td><input value="작업 전 TBM"></td><td><textarea>작업지휘자 주관으로 운전자·유도자·작업자를 소집하여 당일 작업물량·경로·제한속도·신호방법·보행자 통제구간·비상연락체계를 공유하고 작업계획서 서명을 받는다.</textarea></td><td><textarea>역할·배치위치 명확 여부, 신호방법 통일, 사각지대 공유, 서명 완료 여부</textarea></td></tr>
          <tr><td><input value="2"></td><td><input value="장비 사전 점검"></td><td><textarea>탑승 전 포크·체인·타이어를 육안 점검하고, 탑승 후 브레이크·조향·경광등·후진경보음·헤드가드·좌석안전띠·유압장치·배터리(전동식)/연료량을 확인한다. 이상 발견 시 즉시 운행 중지한다.</textarea></td><td><textarea>제동·경보·후방확인 장치 정상 작동, 포크·체인·타이어 이상 유무, 대체장비 또는 수리조치 여부</textarea></td></tr>
          <tr><td><input value="3"></td><td><input value="화물 상태 확인"></td><td><textarea>화물 중량이 정격하중 80% 이내인지 확인하고 파렛트 파손·랩핑·편하중 여부를 점검한다. 전방 시야 차단 시 후진 운행 또는 유도자를 배치한다.</textarea></td><td><textarea>정격하중 초과 여부, 포크 중앙 적재, 적재물 기울어짐·낙하 위험, 시야 확보 또는 유도자 배치</textarea></td></tr>
          <tr><td><input value="4"></td><td><input value="운반 작업"></td><td><textarea>지정 경로를 따라 구내 제한속도 준수하며 운행한다. 교차로·출입구·단차 구간은 일시정지 후 주변 확인, 후진 시 경보음 확인 및 유도자 신호에 따라 이동한다.</textarea></td><td><textarea>지정경로 이탈 여부, 제한속도 준수, 보행자 통제, 교차로 일시정지, 후진 시 유도자 신호 확인</textarea></td></tr>
          <tr><td><input value="5"></td><td><input value="하역 작업"></td><td><textarea>하역 위치 주변 장애물·작업자 접근 확인 후 하역한다. 급상승·급하강·급선회 금지, 하역 후 포크를 지상 15~20cm로 낮추고 마스트를 후방으로 기울인 후 이동한다.</textarea></td><td><textarea>하역 위치 작업자 통제, 포크 삽입 위치 및 편하중 확인, 적재물 안정성 확인 후 이동</textarea></td></tr>
          <tr><td><input value="6"></td><td><input value="작업 종료 및 주차"></td><td><textarea>지정 주차 위치로 이동 후 포크를 지면에 완전히 내리고 마스트를 수직으로 세운 뒤 주차브레이크 체결, 키 탈거하여 전원 차단한다. 이상사항·아차사고 발생 시 즉시 보고·기록한다.</textarea></td><td><textarea>포크 완전 하강, 주차브레이크·전원 차단, 충전/연료 확인, 이상사항 보고 여부</textarea></td></tr>
        </tbody>
      </table>
      <div class="fc-acts"><button class="btn btn-light btn-sm" onclick="addRow('planTable')">작업순서 추가</button></div>
    </aside>
    <div class="pw"><div class="pw-lbl">실시간 미리보기</div><article class="doc" id="doc-overview"></article></div>
  </div>
</section>

<!-- ══════════════════════════
  탭 2. 중량물 제원
══════════════════════════ -->
<section class="panel" id="panel-load">
  <div class="wl">
    <aside class="fc">
      <div class="fc-title">중량물 제원 입력</div>

      <div class="load-ex-panel">
        <strong>📦 예시 선택 – 클릭하면 자동 입력</strong>
        <div class="mini" style="color:#8ab0cc;margin-bottom:4px">기계부품 제조업 주요 화물 유형을 참고하세요.</div>
        <div class="load-ex-row">
          <div class="load-ex-item" onclick="fillLoadEx(0)">
            <div class="le-name">가공부품 파렛트</div>
            <div class="le-detail">박스형 / 1,100×1,100×900mm<br>350kg / 1파렛트/회<br>랩핑·밴딩 고정</div>
          </div>
          <div class="load-ex-item" onclick="fillLoadEx(1)">
            <div class="le-name">금속 환봉·파이프</div>
            <div class="le-detail">봉형 / φ50~200mm<br>500kg / 묶음 단위<br>밴딩 및 목재 받침</div>
          </div>
          <div class="load-ex-item" onclick="fillLoadEx(2)">
            <div class="le-name">완제품 박스 (포장)</div>
            <div class="le-detail">박스형 / 600×400×400mm<br>20kg/박스, 파렛트 18EA<br>스트레치 랩핑</div>
          </div>
          <div class="load-ex-item" onclick="fillLoadEx(3)">
            <div class="le-name">금형·지그</div>
            <div class="le-detail">비정형 / 800×800×600mm<br>1,200kg (중량물 주의)<br>체인+클램프 고정</div>
          </div>
          <div class="load-ex-item" onclick="fillLoadEx(4)">
            <div class="le-name">원자재 강판 코일</div>
            <div class="le-detail">봉형(코일) / φ1,200×600mm<br>2,000kg / 전용 코일 파렛트<br>기울어짐 방지 받침</div>
          </div>
          <div class="load-ex-item" onclick="fillLoadEx(5)">
            <div class="le-name">포장 자재 (카톤)</div>
            <div class="le-detail">박스형 / 1,100×1,100×1,400mm<br>280kg / 2단 적재 가능<br>습기 주의, 랩핑 필수</div>
          </div>
        </div>
      </div>

      <div class="mini" style="margin-bottom:10px">화물이 여러 종류일 경우 아래 카드를 추가하세요. 예시를 클릭하면 첫 번째 카드에 자동 입력됩니다.</div>
      <div id="loadCardList"></div>
      <div class="fc-acts"><button class="btn btn-light btn-sm" onclick="addLoadCard()">화물 추가</button></div>
    </aside>
    <div class="pw"><div class="pw-lbl">실시간 미리보기</div><article class="doc" id="doc-load"></article></div>
  </div>
</section>

<!-- ══════════════════════════
  탭 3. 장비 제원
══════════════════════════ -->
<section class="panel" id="panel-machine">
  <div class="wl">
    <aside class="fc">
      <div class="fc-title">장비 제원 입력</div>
      <div class="r2">
        <div class="field"><label class="lbl">기계명</label><input class="inp" id="machineName" placeholder="예: 전동식 지게차"></div>
        <div class="field"><label class="lbl">장비번호</label><input class="inp" id="machineNo" placeholder="예: FL-2026-001"></div>
      </div>
      <div class="r2">
        <div class="field"><label class="lbl">제조사 / 모델명</label><input class="inp" id="model" placeholder="예: 두산인프라코어 / B25X-7"></div>
        <div class="field"><label class="lbl">주행방식</label>
          <select class="sel" id="driveType"><option value="">선택</option><option>전동식</option><option>디젤식</option><option>LPG식</option><option>수소연료전지</option><option>기타</option></select>
        </div>
      </div>
      <div class="r2">
        <div class="field"><label class="lbl">기계규격</label><input class="inp" id="machineSpec" placeholder="예: 총중량 4,000kg, 포크 1,070mm"></div>
        <div class="field"><label class="lbl">최대적재능력</label><input class="inp" id="capacity" placeholder="예: 2.5톤"></div>
      </div>
      <div class="r2">
        <div class="field"><label class="lbl">운전자</label><input class="inp" id="driver" placeholder="예: 박기사"></div>
        <div class="field"><label class="lbl">운전자격</label><input class="inp" id="driverLic" placeholder="예: 지게차운전기능사"></div>
      </div>
      <div class="field"><label class="lbl">보험기간 / 검사여부</label><textarea class="txa" id="machineCheck" placeholder="예: 보험기간 2026.01.01.~2026.12.31. / 작업개시 전 자체점검 실시"></textarea></div>
    </aside>
    <div class="pw"><div class="pw-lbl">실시간 미리보기</div><article class="doc" id="doc-machine"></article></div>
  </div>
</section>

<!-- ══════════════════════════
  탭 4. 작업장소·운반경로
══════════════════════════ -->
<section class="panel" id="panel-route">
  <div class="re-wrap">
    <div class="re-head">
      <strong>운반경로 도면 편집기</strong>
      <div style="display:flex;gap:8px;align-items:center">
        <button class="btn btn-light btn-sm" onclick="captureRoute()">도면 반영</button>
        <button class="btn btn-gold btn-sm" onclick="savePNG()">PNG 저장</button>
      </div>
    </div>
    <div class="r-wrap">
      <aside class="r-sb np">
        <h3>도면 도구</h3>
        <div class="tg">
          <label>모드 선택</label>
          <button class="tbtn active" id="btn-select"    onclick="setMode('select')">↖ 선택 / 이동</button>
          <button class="tbtn"        id="btn-boundary"  onclick="setMode('boundary')">⬜ 부지 외곽선</button>
          <button class="tbtn"        id="btn-building"  onclick="setMode('building')">⬛ 건물·구역 추가</button>
          <button class="tbtn"        id="btn-symbol"    onclick="setMode('symbol')">★ 인원·장비 배치</button>
          <button class="tbtn"        id="btn-routeTool" onclick="setMode('routeTool')">➜ 이동경로 그리기</button>
          <button class="tbtn"        id="btn-delete"    onclick="setMode('delete')">✕ 삭제</button>
        </div>
        <div id="grp-boundary" class="tg" style="display:none">
          <label>외곽선 색상</label>
          <div class="crow" id="bd-row">
            <div class="cdot active" style="background:#444" data-c="#444" onclick="pickBD(this)"></div>
            <div class="cdot" style="background:#1565a7" data-c="#1565a7" onclick="pickBD(this)"></div>
            <div class="cdot" style="background:#186a3b" data-c="#186a3b" onclick="pickBD(this)"></div>
          </div>
          <div class="rtip">클릭으로 꼭짓점을 찍고<br>더블클릭으로 부지 경계 완성<br>내부는 반투명하게 표시됩니다</div>
        </div>
        <div id="grp-building" class="tg" style="display:none">
          <label>구역 이름</label>
          <input type="text" id="input-label" value="창고">
          <label>구역 색상</label>
          <div class="crow" id="color-row">
            <div class="cdot active" style="background:#b8d4f0" data-c="#b8d4f0" onclick="pickBC(this)"></div>
            <div class="cdot" style="background:#b8e8c8" data-c="#b8e8c8" onclick="pickBC(this)"></div>
            <div class="cdot" style="background:#f5d8a0" data-c="#f5d8a0" onclick="pickBC(this)"></div>
            <div class="cdot" style="background:#f5b8b8" data-c="#f5b8b8" onclick="pickBC(this)"></div>
            <div class="cdot" style="background:#e0d0f0" data-c="#e0d0f0" onclick="pickBC(this)"></div>
            <div class="cdot" style="background:#e8e8e8" data-c="#e8e8e8" onclick="pickBC(this)"></div>
          </div>
        </div>
        <div id="grp-symbol" class="tg" style="display:none">
          <label>심볼</label>
          <div class="sym-grid">
            <button class="sbtn active" onclick="pickSym('supervisor',this)"><span class="si">★</span><span class="sl">작업지휘자</span></button>
            <button class="sbtn" onclick="pickSym('guide',this)"><span class="si">▲</span><span class="sl">유도자</span></button>
            <button class="sbtn" onclick="pickSym('worker',this)"><span class="si">●</span><span class="sl">작업원</span></button>
            <button class="sbtn" onclick="pickSym('equipment',this)"><span class="si">⊡</span><span class="sl">지게차</span></button>
            <button class="sbtn" onclick="pickSym('exit',this)"><span class="si">🚪</span><span class="sl">출입구/출구</span></button>
          </div>
        </div>
        <div id="grp-route" class="tg" style="display:none">
          <label>경로 색상</label>
          <div class="crow" id="rc-row">
            <div class="cdot active" style="background:#e02020" data-c="#e02020" onclick="pickRC(this)"></div>
            <div class="cdot" style="background:#1565a7" data-c="#1565a7" onclick="pickRC(this)"></div>
            <div class="cdot" style="background:#186a3b" data-c="#186a3b" onclick="pickRC(this)"></div>
            <div class="cdot" style="background:#c07000" data-c="#c07000" onclick="pickRC(this)"></div>
            <div class="cdot" style="background:#555555" data-c="#555555" onclick="pickRC(this)"></div>
          </div>
          <label>경로 유형</label>
          <select id="route-style">
            <option value="dash" selected>점선 (기본)</option>
            <option value="solid">실선</option>
            <option value="dash-arrow">점선 + 화살표</option>
            <option value="solid-arrow">실선 + 화살표</option>
          </select>
        </div>
        <button class="tbtn" onclick="addLegend()">📋 범례 삽입</button>
        <button class="tbtn" onclick="clearCanvas()">🗑 전체 초기화</button>
        <div class="rtip">구역·심볼은 클릭으로 배치<br>경로는 클릭 연결 후 더블클릭 완성<br>선택 모드에서 드래그 이동<br>구역 <b>더블클릭 → 이름 변경</b> (모든 모드 가능)<br>부지 외곽선: 클릭→꼭짓점, 더블클릭→완성</div>
      </aside>
      <div class="r-cv">
        <div class="cv-tb np">
          <strong>지게차 작업 이동경로 도면</strong>
          <span class="cv-badge" id="cvBadge">선택·이동 모드</span>
          <span id="cvCoord" style="margin-left:auto;color:#aaa;font-size:11px"></span>
        </div>
        <div class="cv-scroll">
          <canvas id="main-canvas" width="860" height="640"></canvas>
        </div>
      </div>
    </div>
  </div>
  <div class="rb">
    <aside class="fc">
      <div class="fc-title">운반경로 정보</div>

      <div class="field">
        <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:5px">
          <label class="lbl" style="margin-bottom:0">작업장소 특성</label>
          <button class="btn btn-light btn-xs" onclick="toggleRouteEx('featureEx')">예시 ▾</button>
        </div>
        <div id="featureEx" style="display:none;background:#1a2a3a;border-radius:7px;padding:8px 10px;margin-bottom:6px">
          <div class="route-ex-item" onclick="fillRouteEx('routeFeature','완제품 창고·출하장 간 반복 왕복 구간으로, 지게차 전용 통행로와 보행자 동선이 교차하는 구간이 포함되어 있음. 실내 콘크리트 바닥이며, 출입구 전후 단차 구간 주의 필요.')">완제품 창고↔출하장 반복 이동</div>
          <div class="route-ex-item" onclick="fillRouteEx('routeFeature','원자재 창고에서 생산동 전 구간으로, 복수의 교차로와 출입문 통과 구간이 포함됨. 생산동 출입구 인근에서 작업자 보행 동선과 교차하며, 노면 일부 구간 균열·요철 상태 확인 필요.')">원자재 창고→생산동 구간</div>
          <div class="route-ex-item" onclick="fillRouteEx('routeFeature','야적장에서 출하장까지 외부 노출 구간을 포함한 이동 경로로, 우천 시 빗물 고임 구간과 경사 진입로가 포함됨. 야간 작업 시 조명 확보 및 반사경 상태 사전 확인 필요.')">야적장→출하장 외부 구간</div>
        </div>
        <textarea class="txa" id="routeFeature" placeholder="예: 완제품 창고와 출하장 사이 반복 이동, 일부 구간 보행동선 교차 가능성 있음"></textarea>
      </div>

      <div class="field">
        <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:5px">
          <label class="lbl" style="margin-bottom:0">운반경로 설명</label>
          <button class="btn btn-light btn-xs" onclick="toggleRouteEx('routeTextEx')">예시 ▾</button>
        </div>
        <div id="routeTextEx" style="display:none;background:#1a2a3a;border-radius:7px;padding:8px 10px;margin-bottom:6px">
          <div class="route-ex-item" onclick="fillRouteEx('routeText','완제품 창고 적재 위치 출발 → 지게차 안전선 따라 직진(약 30m) → ①교차로 유도자 신호 확인 → 통로 직진(약 20m) → 출하장 하역 지점 도착 · 하역 후 역방향 복귀')">완제품 창고→출하장</div>
          <div class="route-ex-item" onclick="fillRouteEx('routeText','입고장 하역 위치 출발 → 안전선 따라 이동(약 20m) → ①출입문 통과(서행) → 실내 통로 직진(약 40m) → ②교차로 일시정지·유도자 신호 → 원자재 창고 지정 위치 하역')">입고장→원자재 창고</div>
          <div class="route-ex-item" onclick="fillRouteEx('routeText','생산동 공정 간 이송 구간: A공정 출발 → 내부 통로(약 15m) → ①내부 교차로 서행·확인 → B공정 대기 위치 도착 · 하역 후 빈 파렛트 회수 후 복귀')">공정 간 내부 이송</div>
        </div>
        <textarea class="txa" id="routeText" placeholder="예: 완제품 창고 적재 위치 출발 → 안전선 따라 이동 → 교차로 유도자 신호 → 출하장 하역 위치 도착"></textarea>
      </div>

      <div class="r2">
        <div class="field">
          <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:5px">
            <label class="lbl" style="margin-bottom:0">통행로 폭</label>
            <button class="btn btn-light btn-xs" onclick="fillRouteEx('routeWidth','주 통행로 3.0m 이상, 교차로 구간 4.0m 이상 확보')">예시</button>
          </div>
          <input class="inp" id="routeWidth" placeholder="예: 주요 통행로 3.0m 이상 확보">
        </div>
        <div class="field">
          <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:5px">
            <label class="lbl" style="margin-bottom:0">경사·단차·노면</label>
            <button class="btn btn-light btn-xs" onclick="fillRouteEx('routeGround','출입구 하부 단차 2~3cm, 외부 구간 우천 시 빗물 고임 주의. 실내 콘크리트 양호')">예시</button>
          </div>
          <input class="inp" id="routeGround" placeholder="예: 출입구 단차 2cm, 외부 구간 빗물 고임 주의">
        </div>
      </div>

      <div class="field">
        <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:5px">
          <label class="lbl" style="margin-bottom:0">제한속도</label>
          <div style="display:flex;gap:4px">
            <button class="btn btn-light btn-xs" onclick="fillRouteEx('routeSpeed','구내 전 구간 8km/h 이하')">예시①</button>
            <button class="btn btn-light btn-xs" onclick="fillRouteEx('routeSpeed','구내 전 구간 8km/h 이하, 교차로·출입구 구간 3km/h 이하(일시정지 후 출발)')">예시②</button>
          </div>
        </div>
        <input class="inp" id="routeSpeed" placeholder="예: 구내 8km/h 이하, 교차로 구간 3km/h 이하">
      </div>

    </aside>
    <div class="pw"><div class="pw-lbl">실시간 미리보기</div><article class="doc" id="doc-route"></article></div>
  </div>
</section>

<!-- ══════════════════════════
  탭 5. 관계자 교육
══════════════════════════ -->
<section class="panel" id="panel-edu">
  <div class="wl">
    <aside class="fc">
      <div class="fc-title">관계자 교육 입력</div>
      <div class="r2">
        <div class="field"><label class="lbl">교육일시</label><input class="inp" id="eduDate" placeholder="예: 2026. 05. 01. 08:40~09:00"></div>
        <div class="field"><label class="lbl">교육장소</label><input class="inp" id="eduPlace" placeholder="예: 출하장 안전교육장"></div>
      </div>
      <div class="r2">
        <div class="field"><label class="lbl">교육자</label><input class="inp" id="eduTeacher" placeholder="예: 작업지휘자 김현장"></div>
        <div class="field"><label class="lbl">교육대상</label><input class="inp" id="eduTarget" placeholder="예: 운전자, 유도자, 작업자 전원"></div>
      </div>
      <div class="field">
        <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:5px">
          <label class="lbl" style="margin-bottom:0">교육내용</label>
          <button class="btn btn-light btn-xs" onclick="fillEduDefault()">기본값 입력</button>
        </div>
        <textarea class="txa" id="eduContent" style="min-height:120px" placeholder="교육 내용을 입력하거나 '기본값 입력' 버튼을 눌러주세요."></textarea>
      </div>
      <div class="fcsec">교육대상자 서명</div>
      <table class="etbl" id="signTable">
        <thead><tr><th>소속</th><th>직책</th><th>성명</th><th>서명</th><th>비고</th></tr></thead>
        <tbody>
          <tr><td><input></td><td><input></td><td><input></td><td><input></td><td><input></td></tr>
          <tr><td><input></td><td><input></td><td><input></td><td><input></td><td><input></td></tr>
          <tr><td><input></td><td><input></td><td><input></td><td><input></td><td><input></td></tr>
        </tbody>
      </table>
      <div class="fc-acts"><button class="btn btn-light btn-sm" onclick="addRow('signTable')">서명란 추가</button></div>
    </aside>
    <div class="pw"><div class="pw-lbl">실시간 미리보기</div><article class="doc" id="doc-edu"></article></div>
  </div>
</section>

<!-- ══════════════════════════
  탭 6. 안전작업 점검표
══════════════════════════ -->
<section class="panel" id="panel-check">
  <div class="wl">
    <aside class="fc">
      <div class="fc-title">점검표 입력</div>
      <div class="r2">
        <div class="field"><label class="lbl">점검시기</label>
          <select class="sel" id="checkPeriod"><option>작업 전 점검 (매회)</option><option selected>주간 정기점검</option><option>월간 정기점검</option><option>분기 점검</option></select>
        </div>
        <div class="field"><label class="lbl">점검일자</label><input class="inp" id="checkDate" placeholder="예: 2026. 05. 01."></div>
      </div>
      <div class="field"><label class="lbl">점검자</label><input class="inp" id="checkPerson" placeholder="예: 김현장 (작업지휘자)"></div>
      <div class="mini">※ 오른쪽 미리보기에서 직접 결과를 선택하고 조치사항을 기입하세요.</div>
    </aside>
    <div class="pw"><div class="pw-lbl">실시간 미리보기</div><article class="doc" id="doc-check"></article></div>
  </div>
</section>

<!-- ══════════════════════════
  탭 7. 위험요인·안전대책 (순서 바꿈)
══════════════════════════ -->
<section class="panel" id="panel-risk">
  <div class="wl">
    <aside class="fc">
      <div class="fc-title">위험요인 입력</div>
      <table class="etbl" id="riskTable">
        <thead><tr><th style="width:100px">위험요인 구분</th><th>발생원인</th><th>재해예방대책</th></tr></thead>
        <tbody>
          <tr><td><input value="지게차 전도·전락"></td><td><textarea>허용중량 초과 운행, 급선회·급제동, 경사로 운행, 타이어 이상, 노면 불량(요철·경사·습윤)</textarea></td><td><textarea>허용중량 초과 금지(정격하중 80% 이내), 급선회·급제동 금지, 경사로 저속 운행(적재물 경사 상향 방향), 출발 전 타이어 점검, 노면 이상 즉시 보고·보수</textarea></td></tr>
          <tr><td><input value="충돌·협착"></td><td><textarea>운전자 시야 미확보(화물 과적재), 후진 사각지대, 유도자 부재 또는 신호 미확립, 보행자·작업자 무단 진입</textarea></td><td><textarea>시야 미확보 시 후진 운행 또는 유도자 필수 배치, 후사경·후방카메라·경보음 작동 확인, 수신호 사전 통일, 지게차 운행 구역 출입 통제·표지판 설치</textarea></td></tr>
          <tr><td><input value="화물 낙하·비래"></td><td><textarea>파렛트 위 화물 고정 미흡(랩핑·밴딩 불량), 급출발·급선회, 포크 삽입 불량·편하중, 운행 중 포크 과다 상승</textarea></td><td><textarea>출발 전 랩핑·밴딩·적재 상태 확인 의무화, 급출발·급선회 금지, 포크 중심 삽입 후 출발, 운행 중 포크 높이 15~20cm 유지</textarea></td></tr>
          <tr><td><input value="추락"></td><td><textarea>지게차 포크 또는 팔레트 위에 근로자 탑승, 운전자 이외 동승, 불안정한 적재함 위 작업</textarea></td><td><textarea>포크 위 탑승 절대 금지(사업장 내 금지 표지 부착), 운전자 외 동승 금지, 고소작업 필요 시 전용 고소작업대 사용</textarea></td></tr>
          <tr><td><input value="적재물 붕괴"></td><td><textarea>3단 초과 적재, 파렛트 불량·편하중, 근로자 통행로 인접 과다 적재, 불안정 기울어짐 상태 방치</textarea></td><td><textarea>3단 초과 적재 금지, 적재 전 파렛트 상태 확인, 통행로 인접 1m 이내 과적 금지, 기울어짐·붕괴 위험 발견 시 즉시 재적재</textarea></td></tr>
          <tr><td><input value="화재·폭발 (LPG·배터리)"></td><td><textarea>LPG 연료 누기, 전동식 배터리 과충전·충전 중 스파크, 충전 구역 인화성 물질 존재</textarea></td><td><textarea>LPG 연결부 정기 점검·가스누기 탐지기 설치, 충전 구역 환기 및 인화성 물질 반입 금지, 배터리 충전 중 사용 금지, 화기 및 금연 표지 부착</textarea></td></tr>
        </tbody>
      </table>
      <div class="fc-acts"><button class="btn btn-light btn-sm" onclick="addRow('riskTable')">위험요인 추가</button></div>
    </aside>
    <div class="pw"><div class="pw-lbl">실시간 미리보기</div><article class="doc" id="doc-risk"></article></div>
  </div>
</section>

<!-- ══════════════════════════
  탭 8. 안전작업방법 (순서 바꿈)
══════════════════════════ -->
<section class="panel" id="panel-method">
  <div class="wl">
    <aside class="fc">
      <div class="fc-title">안전작업방법</div>
      <div class="mini">위험요인을 확인한 후 아래 안전작업방법을 숙지합니다.<br>고정 교육자료입니다. 오른쪽 미리보기에서 내용을 확인하세요.</div>
    </aside>
    <div class="pw"><div class="pw-lbl">실시간 미리보기</div><article class="doc" id="doc-method"></article></div>
  </div>
</section>

<!-- ══════════════════════════
  탭 9. 운전자 자격사항
══════════════════════════ -->
<section class="panel" id="panel-license">
  <div class="wl">
    <aside class="fc">
      <div class="fc-title">운전자 자격사항</div>
      <div class="mini" style="margin-bottom:10px">운전자가 여러 명인 경우 추가 버튼으로 등록하세요.</div>
      <div id="licDriverList">
        <div class="lic-card" id="licCard-0">
          <div class="lic-card-no">운전자 ①</div>
          <div style="margin-top:20px">
            <div class="field"><label class="lbl">성명</label><input class="inp lic-name" placeholder="예: 박기사"></div>
            <div class="field"><label class="lbl">자격증·면허증 업로드</label><input class="inp" type="file" accept="image/*" onchange="previewLic(event,0)" style="height:auto;padding:8px"></div>
            <div class="lic-box"><span class="lic-empty">업로드된 이미지가 없습니다</span><img class="lic-img" alt="자격사항 이미지"></div>
          </div>
        </div>
      </div>
      <div class="fc-acts" style="margin-top:14px"><button class="btn btn-light btn-sm" onclick="addLicDriver()">운전자 추가</button></div>
    </aside>
    <div class="pw"><div class="pw-lbl">실시간 미리보기</div><article class="doc" id="doc-license"></article></div>
  </div>
</section>

<!-- ══════════════════════════
  탭 10. 최종 미리보기
══════════════════════════ -->
<section class="panel" id="panel-preview">
  <div class="pw" style="background:#f6f7f5">
    <div class="pw-lbl np">전체 미리보기 (PDF 출력 기준)</div>
    <div id="full-docs"></div>
  </div>
</section>

</main>
</div>

<div id="pdf-area"></div>

<script>
/* ══════════════════════════════════════════
   상태 변수
══════════════════════════════════════════ */
var routeImage = '';
var logoImage = '';
var licenseImages = ['']; // 운전자별
var wmUnlocked = false;
var WM_PW = 'ossc02854';

/* ══════════════════════════════════════════
   유틸
══════════════════════════════════════════ */
function g(id){ return document.getElementById(id); }
function esc(s){ return String(s||'').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;'); }
function br(s){ return esc(s).split('\n').join('<br>'); }
function val(id){ var el = g(id); return el ? el.value.trim() : ''; }
function cell(v){ return v ? br(v) : '&nbsp;'; }

function tableData(id){
  var tbl = g(id); if(!tbl) return [];
  var out = [];
  tbl.querySelectorAll('tbody tr').forEach(function(tr){
    var row = [];
    tr.querySelectorAll('td').forEach(function(td){
      if(td.querySelector('.row-del-btn')) return; // 삭제 버튼 td 건너뜀
      var el = td.querySelector('input,textarea,select');
      row.push(el ? el.value.trim() : td.textContent.trim());
    });
    out.push(row);
  });
  return out;
}

/* ══════════════════════════════════════════
   탭
══════════════════════════════════════════ */
function showTab(id){
  document.querySelectorAll('.panel').forEach(function(p){ p.classList.remove('active'); });
  var panel = g('panel-' + id);
  if(panel) panel.classList.add('active');
  document.querySelectorAll('.tab-btn').forEach(function(b){
    b.classList.toggle('active', b.getAttribute('data-tab') === id);
  });
  renderAll();
  window.scrollTo({top:0, behavior:'smooth'});
}

/* ══════════════════════════════════════════
   행 추가
══════════════════════════════════════════ */
function addRow(id){
  var tbl = g(id); if(!tbl) return;
  var body = tbl.querySelector('tbody');
  var last = body.rows[body.rows.length-1];
  var row = last.cloneNode(true);
  row.querySelectorAll('input,textarea').forEach(function(el){ el.value=''; });
  row.querySelectorAll('select').forEach(function(el){ el.selectedIndex=0; });
  // 삭제 버튼이 없으면 추가
  var lastTd = row.cells[row.cells.length-1];
  if(!lastTd.querySelector('.row-del-btn')){
    var td = document.createElement('td');
    td.innerHTML = '<button class="row-del-btn" onclick="delRow(this)" title="삭제">✕</button>';
    row.appendChild(td);
  }
  body.appendChild(row);
  renderAll();
}

function delRow(btn){
  var row = btn.closest('tr');
  var tbody = row.parentNode;
  if(tbody.rows.length <= 1){ alert('최소 1행은 유지해야 합니다.'); return; }
  row.remove();
  renderAll();
}

/* ══════════════════════════════════════════
   워터마크 모달
══════════════════════════════════════════ */
function openWmModal(){ g('wmModal').classList.add('open'); g('wmPwInput').value=''; g('wmMsg').textContent=''; }
function closeWmModal(){ g('wmModal').classList.remove('open'); }
function checkWmPw(){
  if(g('wmPwInput').value === WM_PW){
    wmUnlocked = true;
    g('wmMsg').style.color='#186a3b'; g('wmMsg').textContent='✔ 워터마크가 해제되었습니다.';
    setTimeout(closeWmModal, 1000);
    renderAll();
  } else {
    g('wmMsg').style.color='#c0392b'; g('wmMsg').textContent='✗ 비밀번호가 올바르지 않습니다.';
    g('wmPwInput').value='';
  }
}

/* ══════════════════════════════════════════
   워터마크 HTML
══════════════════════════════════════════ */
function wmHTML(){
  if(wmUnlocked) return '';
  return '<div class="wm-layer"><div class="wm-text">산업안전지원센터</div></div>';
}

/* ══════════════════════════════════════════
   로고 미리보기
══════════════════════════════════════════ */
function previewLogo(e){
  var file = e.target.files && e.target.files[0]; if(!file) return;
  var r = new FileReader();
  r.onload = function(ev){ logoImage = ev.target.result; renderAll(); };
  r.readAsDataURL(file);
}

/* ══════════════════════════════════════════
   운전자 자격 추가
══════════════════════════════════════════ */
var licDriverCount = 1;
function addLicDriver(){
  var idx = licDriverCount++;
  licenseImages.push('');
  var nums = ['①','②','③','④','⑤','⑥','⑦','⑧'];
  var card = document.createElement('div');
  card.className = 'lic-card';
  card.id = 'licCard-'+idx;
  card.innerHTML =
    '<div class="lic-card-no">운전자 '+nums[idx]+'</div>'+
    '<div style="margin-top:20px">'+
    '<div class="field"><label class="lbl">성명</label><input class="inp lic-name" placeholder="예: 운전자명"></div>'+
    '<div class="field"><label class="lbl">자격증·면허증 업로드</label><input class="inp" type="file" accept="image/*" onchange="previewLic(event,'+idx+')" style="height:auto;padding:8px"></div>'+
    '<div class="lic-box"><span class="lic-empty">업로드된 이미지가 없습니다</span><img class="lic-img" alt="자격사항"></div>'+
    '</div>';
  g('licDriverList').appendChild(card);
  renderAll();
}

function previewLic(e, idx){
  var file = e.target.files && e.target.files[0]; if(!file) return;
  var r = new FileReader();
  r.onload = function(ev){
    licenseImages[idx] = ev.target.result;
    var card = g('licCard-'+idx);
    if(card){
      var img = card.querySelector('.lic-img');
      var empty = card.querySelector('.lic-empty');
      if(img){ img.src = ev.target.result; img.style.display='block'; }
      if(empty) empty.style.display='none';
    }
    renderAll();
  };
  r.readAsDataURL(file);
}

/* ══════════════════════════════════════════
   운반경로 예시
══════════════════════════════════════════ */
function toggleRouteEx(panelId){
  var p=g(panelId); if(!p) return;
  var open = p.style.display==='none';
  p.style.display = open ? 'block' : 'none';
}
function fillRouteEx(fieldId, text){
  var el=g(fieldId); if(!el) return;
  el.value=text;
  renderAll();
  // textarea인 경우 패널 닫기
  var panels=['featureEx','routeTextEx'];
  panels.forEach(function(pid){ var p=g(pid); if(p) p.style.display='none'; });
}

/* ══════════════════════════════════════════
   작업내용 예시
══════════════════════════════════════════ */
var WORK_EX = [
  '외부 차량에서 하역된 원자재(금속소재, 판재류 등)를 입고장에서 지게차로 상차하여 지정 운반경로를 따라 원자재 창고 보관 위치까지 운반하고 파렛트 단위로 정위치에 하역한다.',
  '완제품 창고에 보관 중인 기계부품 파렛트를 지게차로 상차하여 출하 대기 구역까지 운반하고 출하 순서에 따라 지정 위치에 정렬·하역한다. 출고 물량에 따라 반복 운반이 이루어진다.',
  '전(前)공정에서 가공 완료된 부분품(반제품)을 파렛트 또는 전용 운반구에 적재하여 지게차로 상차한 후 지정 운반경로를 따라 후(後)공정 작업 대기 위치까지 이송하고 정위치에 하역한다.',
  '생산 공정에서 발생한 금속 스크랩, 폐포장재, 불량품 등을 지게차로 수거하여 사업장 내 폐기물 집하장 또는 스크랩 야적 구역까지 운반하고 종류별 분리 지점에 하역한다.',
  '포장 전 검사가 완료된 제품을 적재 파렛트 단위로 지게차로 상차하여 포장 작업 공간(포장라인 또는 포장 전용 구역)까지 운반하고, 포장 작업자가 작업하기 편리한 지정 위치에 정렬·하역한다.'
];
function toggleWorkEx(){
  var p=g('workExPanel');
  var btn=g('workExBtn');
  if(!p) return;
  var open = p.style.display==='none';
  p.style.display = open ? 'block' : 'none';
  btn.textContent = open ? '예시 선택 ▴' : '예시 선택 ▾';
}
function fillWorkEx(idx){
  var el=g('workContent');
  if(el){ el.value=WORK_EX[idx]; renderAll(); }
  // 패널 닫기
  var p=g('workExPanel'); var btn=g('workExBtn');
  if(p) p.style.display='none';
  if(btn) btn.textContent='예시 선택 ▾';
}

/* ══════════════════════════════════════════
   교육내용 기본값
══════════════════════════════════════════ */
function fillEduDefault(){
  var t = g('eduContent');
  if(!t) return;
  t.value =
'① 지게차 작업계획서 주요 내용 및 작업 순서 확인\n'+
'② 당일 운반화물 종류·중량·파렛트 상태 및 정격하중 초과 금지\n'+
'③ 지게차 이동경로·교차로 위치·보행자 통제구간 공유\n'+
'④ 사업장 내 제한속도(구내 8km/h) 및 일시정지 위치 확인\n'+
'⑤ 유도자 배치 위치·수신호 방법 통일 (전진·후진·정지·좌우 신호)\n'+
'⑥ 후진 시 후방 확인(후사경·경보음) 및 사각지대 유도자 의무 배치\n'+
'⑦ 포크 탑승 금지, 동승 금지, 화물 위 탑승 금지\n'+
'⑧ 화물 낙하 방지 (랩핑·밴딩 확인, 포크 중심 삽입, 운행 중 높이 15~20cm 유지)\n'+
'⑨ 경사로 진입 시 안전수칙(상승 전진·하강 후진), 젖은 바닥·결빙 구간 주의\n'+
'⑩ 작업 종료 후 포크 완전 하강·주차브레이크·키 탈거 절차\n'+
'⑪ 비상상황 발생 시 즉시 운행 중지 및 작업지휘자·관리부서 연락 절차\n'+
'⑫ 아차사고 발생 시 즉시 보고 의무화 및 재발방지 조치 공유';
  renderAll();
}

/* ══════════════════════════════════════════
   중량물 예시 데이터
══════════════════════════════════════════ */
var LOAD_EX = [
  ['가공부품 파렛트','박스형','1,100×1,100×900','350kg/파렛트','1파렛트/회','약 350kg','파렛트 중앙 적재, 스트레치 랩핑·밴딩 고정. 파렛트 파손·편하중·포크 중심 삽입 확인 필수'],
  ['금속 환봉·파이프','봉형','φ50~200mm × L3,000','500kg/묶음','1묶음/회','약 500kg','밴딩 2개소 이상, 목재 받침 사용. 미끄러짐·롤링 방지, 양 끝 출입 통로 확인'],
  ['완제품 박스 (포장)','박스형','600×400×400','20kg/박스 (파렛트 18EA)','1파렛트/회','약 360kg','스트레치 랩핑 필수, 3단 이상 적재 금지. 박스 찌그러짐·낙하 주의'],
  ['금형·지그','비정형','800×800×600','1,200kg','1개/회','약 1,200kg','체인 + 클램프 2점 고정, 정격하중 80% 초과 금지. 무게중심 편하중 사전 확인'],
  ['원자재 강판 코일','봉형(코일)','φ1,200×600','2,000kg','1코일/회','약 2,000kg','전용 코일 파렛트 사용, 기울어짐 방지 목재 받침. 편하중 발생 시 즉시 중지'],
  ['포장 자재 (카톤)','박스형','1,100×1,100×1,400','280kg/파렛트','1파렛트/회','약 280kg','스트레치 랩핑 필수, 습기·눌림 주의, 2단 이상 적재 시 하중 집중 확인']
];

/* ══════════════════════════════════════════
   중량물 카드 관리
══════════════════════════════════════════ */
var loadCardCount = 0;
var SHAPE_OPTIONS = ['','박스형','봉형','묶음형','파렛트형','비정형','기타'];

function makeShapeSelect(selId, val){
  var opts = SHAPE_OPTIONS.map(function(o){
    return '<option value="'+o+'"'+(o===val?' selected':'')+'>'+( o||'선택')+'</option>';
  }).join('');
  return '<select id="'+selId+'" class="sel" style="height:38px;font-size:12.5px;width:100%" onchange="renderAll()">'+opts+'</select>';
}

function addLoadCard(data){
  var idx = loadCardCount++;
  var nums = ['①','②','③','④','⑤','⑥','⑦','⑧','⑨','⑩'];
  var d = data || {name:'',shape:'',spec:'',weight:'',qty:'',unit:'',note:''};
  var card = document.createElement('div');
  card.className = 'load-card';
  card.id = 'loadCard-'+idx;
  card.innerHTML =
    '<div class="load-card-no">화물 '+nums[Math.min(idx,nums.length-1)]+'</div>'+
    (idx>0 ? '<button class="load-card-del" onclick="removeLoadCard('+idx+')" title="삭제">✕</button>' : '')+
    '<div class="field"><label class="lbl">품명</label>'+
      '<input class="inp" id="lc'+idx+'_name" value="'+esc(d.name)+'" placeholder="예: 가공부품 파렛트" style="height:38px;font-size:12.5px" oninput="renderAll()"></div>'+
    '<div class="r2">'+
      '<div class="field"><label class="lbl">화물 형상</label>'+makeShapeSelect('lc'+idx+'_shape',d.shape)+'</div>'+
      '<div class="field"><label class="lbl">규격 (mm)</label>'+
        '<input class="inp" id="lc'+idx+'_spec" value="'+esc(d.spec)+'" placeholder="예: 1,100×1,100×900" style="height:38px;font-size:12.5px" oninput="renderAll()"></div>'+
    '</div>'+
    '<div class="r2">'+
      '<div class="field"><label class="lbl">화물 중량</label>'+
        '<input class="inp" id="lc'+idx+'_weight" value="'+esc(d.weight)+'" placeholder="예: 350kg/파렛트" style="height:38px;font-size:12.5px" oninput="renderAll()"></div>'+
      '<div class="field"><label class="lbl">운반 수량</label>'+
        '<input class="inp" id="lc'+idx+'_qty" value="'+esc(d.qty)+'" placeholder="예: 1파렛트/회" style="height:38px;font-size:12.5px" oninput="renderAll()"></div>'+
    '</div>'+
    '<div class="field"><label class="lbl">1회 운반중량</label>'+
      '<input class="inp" id="lc'+idx+'_unit" value="'+esc(d.unit)+'" placeholder="예: 약 350kg" style="height:38px;font-size:12.5px" oninput="renderAll()"></div>'+
    '<div class="field"><label class="lbl">적재·고정방법 / 취급 주의사항</label>'+
      '<textarea class="txa" id="lc'+idx+'_note" style="min-height:68px;font-size:12.5px" oninput="renderAll()" placeholder="예: 파렛트 중앙 적재, 랩핑·밴딩 고정. 파렛트 파손·편하중·시야차단 주의">'+esc(d.note)+'</textarea></div>';
  g('loadCardList').appendChild(card);
  renderAll();
}

function removeLoadCard(idx){
  var card = g('loadCard-'+idx);
  if(card) card.remove();
  renderAll();
}

function getLoadCardData(){
  var result = [];
  document.querySelectorAll('.load-card').forEach(function(card){
    var id = card.id.replace('loadCard-','');
    var getName = function(f){ var el=g('lc'+id+'_'+f); return el?el.value.trim():''; };
    result.push([getName('name'),getName('shape'),getName('spec'),getName('weight'),getName('qty'),getName('unit'),getName('note')]);
  });
  return result;
}

function fillLoadEx(idx){
  var ex = LOAD_EX[idx];
  // 마지막 카드에 입력
  var allCards = document.querySelectorAll('.load-card');
  if(!allCards.length) return;
  var lastCard = allCards[allCards.length - 1];
  var cid = lastCard.id.replace('loadCard-','');
  var setVal = function(f, v){ var el=g('lc'+cid+'_'+f); if(el) el.value=v; };
  setVal('name',  ex[0]);
  setVal('spec',  ex[2]);
  setVal('weight',ex[3]);
  setVal('qty',   ex[4]);
  setVal('unit',  ex[5]);
  setVal('note',  ex[6]);
  var sel = g('lc'+cid+'_shape');
  if(sel){ for(var i=0;i<sel.options.length;i++){ if(sel.options[i].value===ex[1]){ sel.selectedIndex=i; break; } } }
  renderAll();
}

/* ══════════════════════════════════════════
   문서 생성
══════════════════════════════════════════ */
function docHead(){
  return '<div class="doc-title">지게차 작업계획서</div>'+
    '<div class="doc-sub">산업안전보건법 제38조 · 안전보건규칙 제38조</div>';
}

/* 소섹션 헤더 (들여쓰기, 배경 없음) */
function subSh(t){
  return '<div class="doc-sh-sub">'+t+'</div>';
}

function makeOverview(){
  return docHead()+
    '<div class="doc-sec"><div class="doc-sh-main">1. 작업개요</div>'+

    subSh('1.1 일반현황')+
    '<table class="dt" style="width:100%"><colgroup><col style="width:18%"><col style="width:32%"><col style="width:18%"><col style="width:32%"></colgroup>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">사업장명</td><td class="ctr">'+cell(val('siteName'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">작업명</td><td class="ctr">'+cell(val('workName'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">관리부서</td><td class="ctr">'+cell(val('dept'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">작업일시</td><td class="ctr">'+cell(val('workDate'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">작업장소</td><td class="ctr">'+cell(val('workPlace'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">작업형태</td><td class="ctr">'+cell(val('workType'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">신호방법</td><td class="ctr">'+cell(val('signal'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">제한속도</td><td class="ctr">'+cell(val('speed'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">작업내용</td><td colspan="3">'+cell(val('workContent'))+'</td></tr>'+
    '</table>'+

    subSh('1.2 작업인원')+
    '<table class="dt" ><colgroup><col style="width:14%"><col style="width:22%"><col style="width:14%"><col><col style="width:10%"></colgroup>'+
    '<tr><th>직책</th><th>성명/연락처</th><th>작업위치</th><th>자격사항</th><th>교육</th></tr>'+
    tableData('peopleTable').map(function(r){
      return '<tr>'+r.map(function(c){ return '<td class="ctr">'+cell(c)+'</td>'; }).join('')+'</tr>';
    }).join('')+
    '</table>'+

    subSh('1.3 작업계획 순서')+
    '<table class="dt" ><colgroup><col style="width:5%"><col style="width:16%"><col><col style="width:28%"></colgroup>'+
    '<tr><th>순서</th><th>작업단계</th><th>세부 작업내용</th><th>핵심 확인사항</th></tr>'+
    tableData('planTable').map(function(r){
      return '<tr><td class="ctr">'+cell(r[0])+'</td><td class="ctr">'+cell(r[1])+'</td><td>'+cell(r[2])+'</td><td>'+cell(r[3])+'</td></tr>';
    }).join('')+
    '</table></div>';
}

function makeLoad(){
  var rows = getLoadCardData();
  return '<div class="doc-sec"><div class="doc-sh-main">2. 중량물(화물) 제원</div>'+
    '<table class="dt" >'+
    '<colgroup><col style="width:85px"><col style="width:60px"><col style="width:115px"><col style="width:70px"><col style="width:64px"><col style="width:78px"><col></colgroup>'+
    '<tr><th>품명</th><th>화물형상</th><th style="word-break:keep-all">화물규격<br>(mm)</th><th>화물중량</th><th>운반수량</th><th>1회<br>운반중량</th><th>적재·고정방법 / 취급 주의사항</th></tr>'+
    rows.map(function(r){
      return '<tr><td class="ctr">'+cell(r[0])+'</td><td class="ctr">'+cell(r[1])+'</td><td class="ctr" style="word-break:break-all">'+cell(r[2])+'</td><td class="ctr">'+cell(r[3])+'</td><td class="ctr">'+cell(r[4])+'</td><td class="ctr">'+cell(r[5])+'</td><td class="ctr">'+cell(r[6])+'</td></tr>';
    }).join('')+
    '</table></div>';
}

function makeMachine(){
  return '<div class="doc-sec"><div class="doc-sh-main">3. 장비 제원</div>'+
    '<table class="dt" style="width:100%"><colgroup><col style="width:22%"><col style="width:28%"><col style="width:22%"><col style="width:28%"></colgroup>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">기계명</td><td class="ctr">'+cell(val('machineName'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">장비번호</td><td class="ctr">'+cell(val('machineNo'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">제조사/모델명</td><td class="ctr">'+cell(val('model'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">주행방식</td><td class="ctr">'+cell(val('driveType'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">기계규격</td><td class="ctr">'+cell(val('machineSpec'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">최대적재능력</td><td class="ctr">'+cell(val('capacity'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">운전자</td><td class="ctr">'+cell(val('driver'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">운전자격</td><td class="ctr">'+cell(val('driverLic'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">보험기간/검사</td><td colspan="3">'+cell(val('machineCheck'))+'</td></tr>'+
    '</table></div>';
}

function makeRoute(){
  var img = routeImage
    ? '<img decoding="async" class="img-pv" src="'+routeImage+'" style="border:1.5px solid #ccc;border-radius:4px;max-width:100%">'
    : '<div style="height:200px;border:1px solid #ddd;background:#fafafa;display:flex;align-items:center;justify-content:center;color:#bbb;font-size:13px">도면을 작성한 후 "도면 반영" 버튼을 눌러주세요</div>';
  return '<div class="doc-sec"><div class="doc-sh-main">4. 작업장소 및 운반경로</div>'+

    subSh('4.1 운반경로 정보')+
    '<table class="dt" ><colgroup><col style="width:130px"><col></colgroup>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">작업장소 특성</td><td>'+cell(val('routeFeature'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">운반경로 설명</td><td>'+cell(val('routeText'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">통행로 폭</td><td>'+cell(val('routeWidth'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">경사·단차·노면</td><td>'+cell(val('routeGround'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">제한속도</td><td>'+cell(val('routeSpeed'))+'</td></tr>'+
    '</table>'+

    subSh('4.2 운반경로 도면')+
    img+
    '</div>';
}

function makeEdu(){
  var signRows = tableData('signTable').map(function(r, i){
    return '<tr><td class="ctr">'+(i+1)+'</td><td class="ctr">'+cell(r[0])+'</td><td class="ctr">'+cell(r[1])+'</td><td class="ctr">'+cell(r[2])+'</td><td class="sign-h"></td><td class="ctr">'+cell(r[4])+'</td></tr>';
  }).join('');
  return '<div class="doc-sec"><div class="doc-sh-main">5. 관계자 교육</div>'+
    '<table class="dt" style="table-layout:fixed;width:100%"><colgroup><col style="width:22%"><col style="width:28%"><col style="width:22%"><col style="width:28%"></colgroup>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">교육일시</td><td class="ctr">'+cell(val('eduDate'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">교육장소</td><td class="ctr">'+cell(val('eduPlace'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">교육자</td><td class="ctr">'+cell(val('eduTeacher'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">교육대상</td><td class="ctr">'+cell(val('eduTarget'))+'</td></tr>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">교육내용</td><td colspan="3" style="font-size:11.5px">'+cell(val('eduContent'))+'</td></tr>'+
    '</table>'+
    subSh('교육대상자 확인')+
    '<table class="dt" ><colgroup><col style="width:36px"><col style="width:18%"><col style="width:13%"><col style="width:13%"><col><col style="width:13%"></colgroup>'+
    '<tr><th>번호</th><th>소속</th><th>직책</th><th>성명</th><th>서명</th><th>비고</th></tr>'+
    signRows+
    '</table></div>';
}

/* ──────────────────────────────────────
   점검표 (셀 병합 적용)
────────────────────────────────────── */
var CHECK_ITEMS = [
  {cat:'운전자격\n적정여부',    no:1,  text:'운전원 면허·자격(조종교육 이수) 보유 여부'},
  {cat:'안전장치\n설치·사용',   no:2,  text:'좌석안전띠 설치 및 착용 상태'},
  {cat:'안전장치\n설치·사용',   no:3,  text:'전조등 및 후미등 점등 상태'},
  {cat:'안전장치\n설치·사용',   no:4,  text:'헤드가드 및 백레스트 설치 상태'},
  {cat:'안전장치\n설치·사용',   no:5,  text:'후방확인장치(후사경·룸미러·후방경보음·후방카메라 등) 설치 및 작동 상태'},
  {cat:'운전목적외\n사용금지',  no:6,  text:'포크 위 탑승 등 고소작업 용도 사용 금지 여부'},
  {cat:'화물적재·\n운행 안전성',no:7,  text:'운전자 시야 확보 여부 (화물 과다적재·과다 상승 운행 금지)'},
  {cat:'화물적재·\n운행 안전성',no:8,  text:'포크에 화물을 매단 상태 급선회 금지 여부'},
  {cat:'화물적재·\n운행 안전성',no:9,  text:'급선회 방지를 위한 핸들 노브(knob) 제거 여부'},
  {cat:'화물적재·\n운행 안전성',no:10, text:'화물 과다적재 및 편하중 적재 금지 여부'},
  {cat:'안전운행\n준수사항',    no:11, text:'지게차 전용통로 확보 및 보행자 출입통제 여부'},
  {cat:'안전운행\n준수사항',    no:12, text:'운행경로상 사각지대 반사경 또는 안전거울 설치 상태'},
  {cat:'안전운행\n준수사항',    no:13, text:'사업장 내 제한속도 지정 및 준수 여부'},
  {cat:'안전운행\n준수사항',    no:14, text:'승차석 외 근로자 탑승한 채 운행 금지 여부'},
  {cat:'안전운행\n준수사항',    no:15, text:'후진 시 협착위험 예방대책 수립 및 작업계획서 반영 여부'},
];

function renderCheckDoc(){
  // 기존 값 저장
  var saved={};
  CHECK_ITEMS.forEach(function(item){
    var sel=g('chk'+item.no); var memo=g('chkm'+item.no);
    saved['chk'+item.no]  = sel  ? sel.value  : '';
    saved['chkm'+item.no] = memo ? memo.value : '';
  });

  var catCounts={};
  CHECK_ITEMS.forEach(function(it){ catCounts[it.cat]=(catCounts[it.cat]||0)+1; });
  var html='<div class="doc-sec"><div class="doc-sh-main">6. 지게차 안전작업 점검표</div>'+
    '<table class="dt" ><colgroup><col style="width:80px"><col><col style="width:80px"><col><col style="width:60px"><col style="width:120px"></colgroup>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">점검시기</td><td class="ctr">'+cell(val('checkPeriod'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">점검일자</td><td class="ctr">'+cell(val('checkDate'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">점검자</td><td class="ctr">'+cell(val('checkPerson'))+'</td></tr>'+
    '</table>'+
    '<table class="dt" style="margin-top:8px">'+
    '<colgroup><col style="width:78px"><col style="width:34px"><col><col style="width:82px"><col style="width:150px"></colgroup>'+
    '<tr><th>항목</th><th>번호</th><th>점검내용</th><th>결과</th><th>조치사항</th></tr>';
  var lastCat=null;
  CHECK_ITEMS.forEach(function(item){
    html+='<tr>';
    if(item.cat!==lastCat){
      html+='<td rowspan="'+catCounts[item.cat]+'" style="vertical-align:middle;font-weight:900;font-size:11px;text-align:center;white-space:pre-wrap;background:#fff">'+esc(item.cat)+'</td>';
      lastCat=item.cat;
    }
    html+='<td class="ctr" style="color:#888;font-size:11px">'+item.no+'</td>';
    html+='<td style="font-size:11px;vertical-align:middle">'+esc(item.text)+'</td>';
    html+='<td><select id="chk'+item.no+'" style="width:100%;font-size:11px;border:1px solid #ddd;border-radius:4px;padding:3px;font-family:inherit" onchange="this.style.color=this.value===\'불량\'?\'#c0392b\':this.value===\'양호\'?\'#186a3b\':\'#555\'">'+
      '<option value="">-</option><option value="양호">✔ 양호</option><option value="불량">✗ 불량</option><option value="해당없음">— 해당없음</option></select></td>';
    html+='<td><input id="chkm'+item.no+'" style="width:100%;border:1px solid #ddd;border-radius:4px;padding:3px;font-size:11px;font-family:inherit" placeholder="조치사항 기재"></td>';
    html+='</tr>';
  });
  html+='</table></div>';
  var el=g('doc-check'); if(el) el.innerHTML=html;

  // 값 복원
  CHECK_ITEMS.forEach(function(item){
    var sel=g('chk'+item.no); var memo=g('chkm'+item.no);
    if(sel && saved['chk'+item.no]){
      sel.value=saved['chk'+item.no];
      sel.style.color=sel.value==='불량'?'#c0392b':sel.value==='양호'?'#186a3b':'#555';
    }
    if(memo) memo.value=saved['chkm'+item.no]||'';
  });
}

function getCheckData(){
  var catCounts={};
  CHECK_ITEMS.forEach(function(it){ catCounts[it.cat]=(catCounts[it.cat]||0)+1; });
  var lastCat=null;
  var rows=CHECK_ITEMS.map(function(item){
    var sel=g('chk'+item.no); var memo=g('chkm'+item.no);
    var res=sel?sel.value:''; var note=memo?memo.value:'';
    var catCell='';
    if(item.cat!==lastCat){
      catCell='<td rowspan="'+catCounts[item.cat]+'" style="vertical-align:middle;font-weight:900;font-size:11px;text-align:center;white-space:pre-wrap;background:#fff">'+esc(item.cat)+'</td>';
      lastCat=item.cat;
    }
    return '<tr>'+catCell+
      '<td class="ctr" style="font-size:11px;color:#888">'+item.no+'</td>'+
      '<td style="font-size:11px;vertical-align:middle">'+esc(item.text)+'</td>'+
      '<td style="font-weight:'+(res==='불량'?'900':'400')+';color:'+(res==='불량'?'#c0392b':res==='양호'?'#186a3b':'#555')+'">'+cell(res)+'</td>'+
      '<td style="font-size:11px">'+cell(note)+'</td></tr>';
  }).join('');
  return '<div class="doc-sec"><div class="doc-sh-main">6. 지게차 안전작업 점검표</div>'+
    '<table class="dt" ><colgroup><col style="width:80px"><col><col style="width:80px"><col><col style="width:60px"><col style="width:120px"></colgroup>'+
    '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">점검시기</td><td class="ctr">'+cell(val('checkPeriod'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">점검일자</td><td class="ctr">'+cell(val('checkDate'))+'</td><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">점검자</td><td class="ctr">'+cell(val('checkPerson'))+'</td></tr>'+
    '</table>'+
    '<table class="dt" style="margin-top:8px">'+
    '<colgroup><col style="width:78px"><col style="width:34px"><col><col style="width:82px"><col style="width:150px"></colgroup>'+
    '<tr><th>항목</th><th>번호</th><th>점검내용</th><th>결과</th><th>조치사항</th></tr>'+
    rows+'</table></div>';
}

/* ──────────────────────────────────────
   7. 위험요인·안전대책 (기존 8번 위치)
────────────────────────────────────── */
function makeRisk(){
  var rows=tableData('riskTable');
  return '<div class="doc-sec"><div class="doc-sh-main">7. 지게차 위험요인 및 안전대책</div>'+
    '<table class="dt" ><colgroup><col style="width:105px"><col><col></colgroup>'+
    '<tr><th>위험요인 구분</th><th>발생원인</th><th>재해예방대책</th></tr>'+
    rows.map(function(r){
      return '<tr><td style="text-align:center;vertical-align:middle;font-weight:900">'+cell(r[0])+'</td><td>'+cell(r[1])+'</td><td>'+cell(r[2])+'</td></tr>';
    }).join('')+
    '</table></div>';
}

/* ──────────────────────────────────────
   8. 안전작업방법 (기존 7번 위치, 내용 강화)
────────────────────────────────────── */
function makeMethod(){
  return '<div class="doc-sec"><div class="doc-sh-main">8. 지게차 안전작업방법</div>'+
    '<ol class="doc-ol">'+
    '<li><b>탑승 전 외관 점검 (출발 전 의무):</b> 포크 변형·균열·핀 이탈 여부, 체인 늘어짐·손상, 타이어 마모·공기압, 헤드가드·백레스트 이상 유무를 육안 확인한다. 이상 발견 즉시 탑승 중지 및 관리부서에 보고한다. 이상이 확인된 장비는 수리 완료 전까지 절대 사용하지 않는다.</li>'+
    '<li><b>탑승 후 시동 전 작동 점검:</b> 좌석안전띠 착용 후 브레이크·조향장치·경광등·후진경보음·후사경·후방카메라·유압장치를 순서에 따라 확인한다. 전동식은 배터리 잔량이 20% 이하이면 작업 전 충전하고, LPG·디젤식은 연료 잔량을 확인한다. 작동 불량 항목은 즉시 보고 후 운행을 중지한다.</li>'+
    '<li><b>화물 확인 및 적재 안전 점검:</b> 화물 중량이 정격하중의 80% 이내인지 반드시 확인한다. 파렛트 파손·랩핑·밴딩 상태와 편하중 여부를 점검한다. 포크를 화물 중심에 수평으로 완전히 삽입하고 화물을 지상 15~20cm로 들어 올린 후 마스트를 최대한 후방으로 기울여 출발한다. 전방 시야 차단 시 후진 운행 또는 유도자를 의무 배치한다.</li>'+
    '<li><b>운반 중 운행 안전수칙:</b> 지정 경로를 준수하며 구내 제한속도(8km/h) 이하로 운행한다. 교차로·출입구·경사로·단차 구간에서는 일시정지 후 전방·후방·측면을 모두 확인한다. 보행자 접근 시 즉시 정지하고 보행자가 완전히 벗어날 때까지 대기한다. 운반 중 급선회·급출발·급제동은 화물 낙하와 지게차 전도의 직접 원인이 되므로 절대 금지한다.</li>'+
    '<li><b>후진 및 사각지대 안전관리:</b> 후진 전 경보음 작동 여부를 반드시 확인하고 후사경·후방카메라로 후방을 확인한다. 사각지대가 발생하는 교차로·창고 출입구·구조물 인근에서는 유도자를 반드시 배치한다. 유도자 신호가 불명확하거나 응답이 없을 경우 즉시 정지하고 재확인 후 이동한다. 유도자는 지게차 진행 방향 전방에서 신호하며, 지게차 측면에 위치하지 않도록 한다.</li>'+
    '<li><b>하역 및 화물 거치:</b> 하역 전 목표 위치 주변의 장애물과 작업자 접근 여부를 확인하고 통제 후 하역을 시작한다. 포크를 천천히 하강시키며 화물을 거치하고 포크 인출 시 편하중이 발생하지 않도록 수평 상태를 유지한다. 화물 거치 후 포크를 완전히 인출하고 주행 안전 높이로 낮춘 후 이동한다. 급하강·급선회는 화물 낙하 및 주변 작업자 부상으로 이어지므로 절대 금지한다.</li>'+
    '<li><b>경사로 및 특수 구간 운행:</b> 경사로에서의 급출발·급제동·급선회를 금지한다. 적재 상태로 경사를 오를 때는 화물이 위쪽을 향하도록 전진 운행하고, 내려갈 때는 화물이 경사 위쪽을 향하도록 후진 운행한다. 젖은 바닥·기름기·결빙·이물질 구간은 운행 전 제거하거나 우회 경로를 사용한다. 경사로에서의 주정차는 원칙적으로 금지하며, 불가피한 경우 바퀴에 고임목을 사용한다.</li>'+
    '<li><b>작업 종료 및 주차 절차:</b> 작업 종료 후 지정 주차 위치로 이동하고 포크를 지면에 완전히 내린다. 마스트를 수직으로 세운 후 주차브레이크를 체결하고 키를 탈거하여 전원을 차단한다. 전동식은 배터리 충전 상태를 확인하고 충전기에 연결한다. 작업 중 발생한 이상사항·아차사고·근접재해는 즉시 작업지휘자 또는 관리부서에 보고하고 조치 내용을 기록·공유하여 재발을 방지한다.</li>'+
    '</ol></div>';
}

/* ──────────────────────────────────────
   9. 운전자 자격사항 (복수 운전자)
────────────────────────────────────── */
function makeLicense(){
  var nums=['①','②','③','④','⑤','⑥','⑦','⑧'];
  var cards='';
  var licCards = document.querySelectorAll('.lic-card');
  licCards.forEach(function(card, idx){
    var nameEl = card.querySelector('.lic-name');
    var driverName = nameEl ? nameEl.value.trim() : '';
    var img = licenseImages[idx];
    var imgHtml = img
      ? '<img decoding="async" class="img-pv" src="'+img+'" style="max-height:320px;display:block;margin:0 auto">'
      : '<div style="height:80px;border:1px solid #ddd;background:#fafafa;display:flex;align-items:center;justify-content:center;color:#bbb;font-size:12px">자격증 이미지 미업로드</div>';
    cards +=
      '<div style="margin-bottom:14px;padding:12px 14px;border:1px solid #e0e0e0;border-radius:6px">'+
      '<div style="font-weight:900;font-size:12px;color:#0D3321;margin-bottom:8px">운전자 '+nums[idx]+
      (driverName ? ' &nbsp; '+esc(driverName) : '')+
      '</div>'+
      '<table class="dt" style="margin-bottom:8px"><colgroup><col style="width:100px"><col></colgroup>'+
      '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">운전자 성명</td><td class="ctr">'+cell(driverName)+'</td></tr>'+
      '<tr><td class="dt-lbl" style="background:#f7f7f5 !important;font-weight:900;font-size:12px;color:#333;text-align:center;vertical-align:middle;white-space:nowrap;border:1px solid #ccc;padding:7px 8px">확인자료</td><td>자격증·면허증·교육이수증·사내 운전승인서</td></tr>'+
      '</table>'+
      imgHtml+
      '</div>';
  });
  return '<div class="doc-sec"><div class="doc-sh-main">9. 운전자 자격사항</div>'+
    cards+
    '<table class="dt" style="margin-top:8px">'+
    '<colgroup><col style="width:110px"><col><col style="width:130px"><col style="width:140px"></colgroup>'+
    '<tr><th>구분</th><th>자격사항</th><th>확인자료</th><th>비고</th></tr>'+
    '<tr><td class="ctr">3톤 이상</td><td class="ctr">지게차운전기능사 및 건설기계조종사면허</td><td class="ctr">자격증·면허증 사본</td><td class="ctr">건설기계관리법상 조종면허 확인</td></tr>'+
    '<tr><td class="ctr">3톤 미만</td><td class="ctr">소형건설기계 조종교육 이수</td><td class="ctr">교육이수증·내부 승인자료</td><td class="ctr">사업장 내 운행 범위 확인</td></tr>'+
    '<tr><td class="ctr">공통</td><td class="ctr">작업 전 안전교육 및 작업계획서 숙지</td><td class="ctr">교육일지·서명부</td><td class="ctr">작업 변경 시 추가 교육 권장</td></tr>'+
    '</table></div>';
}

/* ──────────────────────────────────────
   표지
────────────────────────────────────── */
function makeCover(){
  var s1=val('cvSign1')||'담당', s2=val('cvSign2')||'검토', s3=val('cvSign3')||'승인', s4=val('cvSign4')||'대표이사';

  var approvalTbl =
    '<table class="approval-tbl">'+
      '<tr>'+
        '<td class="apv-label">'+esc(s1)+'</td>'+
        '<td class="apv-label">'+esc(s2)+'</td>'+
        '<td class="apv-label">'+esc(s3)+'</td>'+
        '<td class="apv-label">'+esc(s4)+'</td>'+
      '</tr>'+
      '<tr><td></td><td></td><td></td><td></td></tr>'+
    '</table>';

  return '<article class="doc doc-cover">'+wmHTML()+
    /* 상단: 결재란 우측 정렬 */
    '<div class="cover-top">'+approvalTbl+'</div>'+
    /* 중앙 본문 */
    '<div class="cover-body">'+
      '<div style="text-align:center;margin-top:120px">'+
        '<div style="font-size:56px;font-weight:900;letter-spacing:-.02em;color:#111;margin-bottom:14px">지게차 작업계획서</div>'+
        '<div style="font-size:15.5px;color:#777;letter-spacing:.04em">산업안전보건법 제38조 · 안전보건규칙 제38조</div>'+
      '</div>'+
      '<div style="margin-top:230px;text-align:center">'+
        '<p style="font-size:20px;font-weight:700;letter-spacing:.01em;color:#333;line-height:9">'+
          (val('writeDate') ? '작 &nbsp; 성 &nbsp; 일 : &nbsp;'+cell(val('writeDate')) : '&nbsp;')+
        '</p>'+
        '<p style="font-size:30px;font-weight:800;letter-spacing:.01em;color:#111;line-height:2.4">'+
          (val('siteName') ? '사 업 장 명 : &nbsp;'+cell(val('siteName')) : '&nbsp;')+
        '</p>'+
      '</div>'+
    '</div>'+
    /* 하단: 로고 우측 최하단만 */
    '<div class="cover-bottom">'+
      '<div class="cover-logo-right">'+
        '<div class="cover-logo-ko">산업안전지원센터㈜</div>'+
        '<div class="cover-logo-en">Industrial Safety Support Center</div>'+
      '</div>'+
    '</div>'+
    '</article>';
}

function fullHTML(){
  return (
    /* 표지 – 1장 고정 */
    makeCover()+
    /* 1. 작업개요 – 연속 출력 */
    '<article class="doc doc-flow">'+wmHTML()+makeOverview()+'</article>'+
    /* 2. 중량물 + 3. 장비 – 1장 고정 */
    '<article class="doc doc-fixed">'+wmHTML()+makeLoad()+makeMachine()+'</article>'+
    /* 4. 작업장소·운반경로 – 1장 고정 */
    '<article class="doc doc-fixed">'+wmHTML()+makeRoute()+'</article>'+
    /* 5. 관계자 교육 – 1장 고정 */
    '<article class="doc doc-fixed">'+wmHTML()+makeEdu()+'</article>'+
    /* 6. 안전작업 점검표 – 1장 고정 */
    '<article class="doc doc-fixed">'+wmHTML()+getCheckData()+'</article>'+
    /* 7. 위험요인·안전대책 – 1장 고정 */
    '<article class="doc doc-fixed">'+wmHTML()+makeRisk()+'</article>'+
    /* 8. 안전작업방법 – 1장 고정 */
    '<article class="doc doc-fixed">'+wmHTML()+makeMethod()+'</article>'+
    /* 9. 운전자 자격사항 – 독립 출력 */
    '<article class="doc doc-flow">'+wmHTML()+makeLicense()+'</article>'
  );
}

/* ══════════════════════════════════════════
   렌더링
══════════════════════════════════════════ */
function renderAll(){
  if(g('doc-overview'))  g('doc-overview').innerHTML = makeOverview();
  if(g('doc-load'))      g('doc-load').innerHTML = makeLoad();
  if(g('doc-machine'))   g('doc-machine').innerHTML = makeMachine();
  if(g('doc-route'))     g('doc-route').innerHTML = makeRoute();
  if(g('doc-edu'))       g('doc-edu').innerHTML = makeEdu();
  renderCheckDoc();
  if(g('doc-risk'))      g('doc-risk').innerHTML = makeRisk();
  if(g('doc-method'))    g('doc-method').innerHTML = makeMethod();
  if(g('doc-license'))   g('doc-license').innerHTML = makeLicense();
  if(g('full-docs'))     g('full-docs').innerHTML = fullHTML();
}

document.addEventListener('input',  function(e){ if(e.target.closest&&e.target.closest('#mainTool')) renderAll(); });
document.addEventListener('change', function(e){ if(e.target.closest&&e.target.closest('#mainTool')) renderAll(); });

/* ══════════════════════════════════════════
   PDF 저장
══════════════════════════════════════════ */
function safeName(s){
  var name=String(s||'지게차작업계획서');
  ['\\','/',':', '*', '?', '"', '<', '>', '|'].forEach(function(ch){ name=name.split(ch).join(''); });
  return name.trim()||'지게차작업계획서';
}

async function exportPDF(){
  renderAll();
  var btn=g('pdfBtn');
  if(btn){ btn.textContent='PDF 생성 중...'; btn.style.opacity='.6'; btn.style.pointerEvents='none'; }

  var area=g('pdf-area');
  area.innerHTML=fullHTML();
  area.querySelectorAll('.wm-layer').forEach(function(el){ el.style.display='none'; });

  var docs=[].slice.call(area.querySelectorAll('.doc'));
  var pdf=new window.jspdf.jsPDF('p','mm','a4');
  var pW=210, pH=297, m=12, uw=pW-m*2, uh=pH-m*2;
  var pageIndex=0;

  function drawWatermark(ctx, w, h){
    if(wmUnlocked) return;
    ctx.save();
    ctx.translate(w/2, h/2);
    ctx.rotate(-35*Math.PI/180);
    ctx.font='bold '+(w*0.09)+'px NanumSquareNeo, sans-serif';
    ctx.fillStyle='rgba(13,51,33,0.07)';
    ctx.textAlign='center';
    ctx.textBaseline='middle';
    ctx.fillText('산업안전지원센터',0,0);
    ctx.restore();
  }

  function addPdfPage(sl, ppm){
    if(pageIndex>0) pdf.addPage();
    pdf.addImage(sl.toDataURL('image/jpeg',0.93),'JPEG',m,m,uw,sl.height/ppm);
    pageIndex++;
  }

  for(var i=0; i<docs.length; i++){
    var el=docs[i];
    if(el.offsetHeight<10) continue;

    var isFixed = el.classList.contains('doc-fixed') || el.classList.contains('doc-cover');
    var isFlow  = el.classList.contains('doc-flow');

    var cv=await html2canvas(el,{
      scale:2, useCORS:true, backgroundColor:'#ffffff',
      logging:false, scrollX:0, scrollY:0
    });

    var ppm = cv.width / uw;
    var a4H = Math.round(uh * ppm);

    if(isFixed){
      /* ── A4 고정: 항상 정확히 1장, 여백은 흰색 패딩 ── */
      var sl=document.createElement('canvas');
      sl.width=cv.width;
      sl.height=a4H;
      var slCtx=sl.getContext('2d');
      slCtx.fillStyle='#ffffff';
      slCtx.fillRect(0,0,sl.width,sl.height);
      var srcH=Math.min(cv.height, a4H);
      slCtx.drawImage(cv,0,0,cv.width,srcH,0,0,cv.width,srcH);
      drawWatermark(slCtx,sl.width,sl.height);
      addPdfPage(sl, ppm);

    } else {
      /* ── 연속 출력(doc-flow): 내용 높이 그대로, A4 단위로 슬라이스 ── */
      var y=0;
      while(y < cv.height){
        var sliceH=Math.min(a4H, cv.height-y);
        if(sliceH<10) break;

        var sl=document.createElement('canvas');
        sl.width=cv.width;
        sl.height=a4H; // 항상 A4 높이 (짧은 마지막 슬라이스도 흰 여백)
        var slCtx=sl.getContext('2d');
        slCtx.fillStyle='#ffffff';
        slCtx.fillRect(0,0,sl.width,sl.height);
        slCtx.drawImage(cv,0,y,cv.width,sliceH,0,0,cv.width,sliceH);
        drawWatermark(slCtx,sl.width,sl.height);
        addPdfPage(sl, ppm);
        y+=a4H;
      }
    }
  }

  pdf.save(safeName(val('workName')||'지게차작업계획서')+'.pdf');
  area.innerHTML='';
  if(btn){ btn.textContent='PDF 저장'; btn.style.opacity=''; btn.style.pointerEvents=''; }
}

/* ══════════════════════════════════════════
   캔버스 도면 편집기
══════════════════════════════════════════ */
var canvas=g('main-canvas');
var ctx=canvas.getContext('2d');
var GRID=20;
var cMode='select';
var buildings=[],symbols=[],routes=[],cLegend=null,boundaries=[];
var selObj=null,dragOff={x:0,y:0},dragging=false;
var curRoute=null,curBoundary=null;
var bColor='#b8d4f0',rColor='#e02020',bdColor='#444',curSym='supervisor';

var SYM={
  supervisor:{label:'작업지휘자',color:'#c05000'},
  guide:     {label:'유도자',    color:'#1565a7'},
  worker:    {label:'작업원',    color:'#186a3b'},
  equipment: {label:'지게차',    color:'#555555'},
  exit:      {label:'출입구',    color:'#7b0000'}
};
var MODE_NAMES={
  select:    '선택·이동 모드',
  boundary:  '부지 외곽선 모드',
  building:  '구역 추가 모드',
  symbol:    '인원·장비 배치 모드',
  routeTool: '이동경로 그리기 모드',
  delete:    '삭제 모드'
};

function snap(v){ return Math.round(v/GRID)*GRID; }

function setMode(m){
  if(curRoute&&curRoute.points.length>1) routes.push(curRoute);
  if(curBoundary&&curBoundary.points.length>2) boundaries.push(curBoundary);
  curRoute=null; curBoundary=null; selObj=null; cMode=m;
  ['select','boundary','building','symbol','routeTool','delete'].forEach(function(id){
    var el=g('btn-'+id); if(el) el.classList.toggle('active',id===m);
  });
  g('cvBadge').textContent=MODE_NAMES[m];
  g('grp-boundary').style.display = m==='boundary'?'':'none';
  g('grp-building').style.display = m==='building'?'':'none';
  g('grp-symbol').style.display   = m==='symbol'  ?'':'none';
  g('grp-route').style.display    = m==='routeTool'?'':'none';
  redraw();
}

function pickBC(el){ document.querySelectorAll('#color-row .cdot').forEach(function(d){ d.classList.remove('active'); }); el.classList.add('active'); bColor=el.dataset.c; }
function pickRC(el){ document.querySelectorAll('#rc-row .cdot').forEach(function(d){ d.classList.remove('active'); }); el.classList.add('active'); rColor=el.dataset.c; }
function pickBD(el){ document.querySelectorAll('#bd-row .cdot').forEach(function(d){ d.classList.remove('active'); }); el.classList.add('active'); bdColor=el.dataset.c; }
function pickSym(t,el){ document.querySelectorAll('.sbtn').forEach(function(b){ b.classList.remove('active'); }); el.classList.add('active'); curSym=t; }

function getPos(e){ var r=canvas.getBoundingClientRect(); return {x:e.clientX-r.left,y:e.clientY-r.top}; }

function getObjAt(x,y){
  for(var i=symbols.length-1;i>=0;i--){ var s=symbols[i]; if(Math.abs(x-s.x)<18&&Math.abs(y-s.y)<18) return s; }
  for(var i=buildings.length-1;i>=0;i--){ var b=buildings[i]; if(x>=b.x&&x<=b.x+b.w&&y>=b.y&&y<=b.y+b.h) return b; }
  if(cLegend&&x>=cLegend.x&&x<=cLegend.x+cLegend.w&&y>=cLegend.y&&y<=cLegend.y+cLegend.h) return cLegend;
  return null;
}

canvas.addEventListener('mousedown',function(e){
  var p=getPos(e),x=p.x,y=p.y;
  if(cMode==='select'){
    var obj=getObjAt(x,y); selObj=obj;
    if(obj){ dragOff={x:x-obj.x,y:y-obj.y}; dragging=true; }
    redraw();
  }
  if(cMode==='delete'){
    for(var i=symbols.length-1;i>=0;i--){ if(Math.abs(x-symbols[i].x)<18&&Math.abs(y-symbols[i].y)<18){ symbols.splice(i,1);redraw();return; }}
    for(var i=buildings.length-1;i>=0;i--){ var b=buildings[i]; if(x>=b.x&&x<=b.x+b.w&&y>=b.y&&y<=b.y+b.h){ buildings.splice(i,1);redraw();return; }}
    for(var i=routes.length-1;i>=0;i--){ if(nearRoute(routes[i],x,y)){ routes.splice(i,1);redraw();return; }}
    for(var i=boundaries.length-1;i>=0;i--){ if(nearBoundary(boundaries[i],x,y)){ boundaries.splice(i,1);redraw();return; }}
  }
});
canvas.addEventListener('mousemove',function(e){
  var p=getPos(e),x=p.x,y=p.y;
  g('cvCoord').textContent='x:'+Math.round(x)+'  y:'+Math.round(y);
  if(dragging&&selObj){ selObj.x=snap(x-dragOff.x); selObj.y=snap(y-dragOff.y); redraw(); }
  if(cMode==='routeTool'&&curRoute){ curRoute.preview={x:snap(x),y:snap(y)}; redraw(); }
  if(cMode==='boundary'&&curBoundary){ curBoundary.preview={x:snap(x),y:snap(y)}; redraw(); }
});
canvas.addEventListener('mouseup',function(){ dragging=false; });
canvas.addEventListener('click',function(e){
  var p=getPos(e),sx=snap(p.x),sy=snap(p.y);
  if(cMode==='building'){
    var lbl=g('input-label').value||'구역';
    buildings.push({type:'building',x:sx-70,y:sy-45,w:140,h:90,label:lbl,color:bColor});
    redraw();
  }
  if(cMode==='symbol'){ symbols.push({type:'symbol',kind:curSym,x:sx,y:sy}); redraw(); }
  if(cMode==='routeTool'){
    if(!curRoute) curRoute={points:[{x:sx,y:sy}],color:rColor,style:g('route-style').value};
    else curRoute.points.push({x:sx,y:sy});
    redraw();
  }
  if(cMode==='boundary'){
    if(!curBoundary) curBoundary={points:[{x:sx,y:sy}],color:bdColor};
    else curBoundary.points.push({x:sx,y:sy});
    redraw();
  }
});
canvas.addEventListener('dblclick',function(e){
  if(cMode==='routeTool'&&curRoute&&curRoute.points.length>=2){
    curRoute.preview=null; routes.push(curRoute); curRoute=null; redraw(); return;
  }
  if(cMode==='boundary'&&curBoundary&&curBoundary.points.length>=3){
    curBoundary.preview=null; boundaries.push(curBoundary); curBoundary=null; redraw(); return;
  }
  if(cMode==='select'){
    var p=getPos(e),x=p.x,y=p.y, found=null;
    for(var i=buildings.length-1;i>=0;i--){ var b=buildings[i]; if(x>=b.x&&x<=b.x+b.w&&y>=b.y&&y<=b.y+b.h){ found=b; break; }}
    if(found){ var n=prompt('구역 이름 변경:',found.label); if(n!==null){ found.label=n; redraw(); }}
  }
});


function nearRoute(route,mx,my){
  var pts=route.points;
  for(var i=0;i<pts.length-1;i++){
    var dx=pts[i+1].x-pts[i].x,dy=pts[i+1].y-pts[i].y,len=Math.sqrt(dx*dx+dy*dy);
    if(len<1) continue;
    var t=((mx-pts[i].x)*dx+(my-pts[i].y)*dy)/(len*len),tc=Math.max(0,Math.min(1,t));
    var nx=pts[i].x+tc*dx-mx,ny=pts[i].y+tc*dy-my;
    if(Math.sqrt(nx*nx+ny*ny)<10) return true;
  }
  return false;
}
function nearBoundary(bd,mx,my){
  return nearRoute({points:bd.points},mx,my);
}

function redraw(){
  ctx.clearRect(0,0,canvas.width,canvas.height);
  drawGrid();
  boundaries.forEach(drawBoundary);
  if(curBoundary) drawBoundaryWIP();
  buildings.forEach(drawBuilding);
  routes.forEach(drawRoute);
  if(curRoute) drawRouteWIP();
  symbols.forEach(drawSymbol);
  if(cLegend) drawLegend();
  if(selObj) drawSel(selObj);
}

function drawGrid(){
  ctx.save(); ctx.strokeStyle='#e8ecf0'; ctx.lineWidth=.5;
  for(var x=0;x<=canvas.width;x+=GRID){ ctx.beginPath();ctx.moveTo(x,0);ctx.lineTo(x,canvas.height);ctx.stroke(); }
  for(var y=0;y<=canvas.height;y+=GRID){ ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(canvas.width,y);ctx.stroke(); }
  ctx.restore();
}

function drawBoundary(bd){
  if(bd.points.length<2) return;
  ctx.save();
  ctx.strokeStyle=bd.color; ctx.lineWidth=2.5; ctx.setLineDash([8,4]);
  ctx.fillStyle='rgba(0,0,0,0.04)';
  ctx.beginPath(); ctx.moveTo(bd.points[0].x,bd.points[0].y);
  for(var i=1;i<bd.points.length;i++) ctx.lineTo(bd.points[i].x,bd.points[i].y);
  ctx.closePath(); ctx.fill(); ctx.stroke();
  // 라벨
  ctx.setLineDash([]); ctx.fillStyle=bd.color; ctx.font='bold 11px NanumSquareNeo,Malgun Gothic';
  ctx.textAlign='left'; ctx.fillText('부지 경계',bd.points[0].x+4,bd.points[0].y-5);
  ctx.restore();
}
function drawBoundaryWIP(){
  var bd=curBoundary; if(!bd) return;
  ctx.save(); ctx.strokeStyle=bd.color; ctx.lineWidth=2; ctx.setLineDash([6,4]); ctx.globalAlpha=.55;
  ctx.beginPath(); ctx.moveTo(bd.points[0].x,bd.points[0].y);
  for(var i=1;i<bd.points.length;i++) ctx.lineTo(bd.points[i].x,bd.points[i].y);
  if(bd.preview) ctx.lineTo(bd.preview.x,bd.preview.y);
  ctx.stroke(); ctx.restore();
}

function drawBuilding(b){
  ctx.save();
  ctx.shadowColor='rgba(0,0,0,.1)'; ctx.shadowBlur=5; ctx.shadowOffsetY=2;
  ctx.fillStyle=b.color; ctx.strokeStyle=darken(b.color); ctx.lineWidth=1.5;
  roundRect(ctx,b.x,b.y,b.w,b.h,5); ctx.fill();
  ctx.shadowColor='transparent'; ctx.stroke();
  ctx.fillStyle='#1a2a3a'; ctx.font='bold 13px NanumSquareNeo,Malgun Gothic';
  ctx.textAlign='center'; ctx.textBaseline='middle';
  wrapText(ctx,b.label,b.x+b.w/2,b.y+b.h/2,b.w-12,18);
  ctx.restore();
}

function drawSymbol(s){
  var def=SYM[s.kind]; ctx.save();
  if(s.kind==='equipment'){
    var sz=18;
    ctx.strokeStyle=def.color; ctx.lineWidth=2; ctx.fillStyle='rgba(255,255,255,.88)';
    ctx.fillRect(s.x-sz/2,s.y-sz/2,sz,sz); ctx.strokeRect(s.x-sz/2,s.y-sz/2,sz,sz);
    ctx.strokeRect(s.x-4,s.y-4,8,8);
    clbl('지게차',s.x,s.y+13,def.color);
  } else if(s.kind==='supervisor'){
    drawStar(ctx,s.x,s.y,12,5,def.color); clbl('지휘자',s.x,s.y+15,def.color);
  } else if(s.kind==='guide'){
    ctx.fillStyle=def.color; ctx.beginPath();
    ctx.moveTo(s.x,s.y-10); ctx.lineTo(s.x+12,s.y+8); ctx.lineTo(s.x-12,s.y+8); ctx.closePath(); ctx.fill();
    clbl('유도자',s.x,s.y+12,def.color);
  } else if(s.kind==='exit'){
    /* 출입구: 문 모양 */
    ctx.strokeStyle=def.color; ctx.lineWidth=2; ctx.fillStyle='rgba(200,50,50,.12)';
    ctx.beginPath(); ctx.rect(s.x-10,s.y-14,20,22); ctx.fill(); ctx.stroke();
    ctx.beginPath(); ctx.arc(s.x-4,s.y-2,3,0,Math.PI*2); ctx.fillStyle=def.color; ctx.fill();
    /* 화살표 */
    ctx.strokeStyle=def.color; ctx.lineWidth=1.5;
    ctx.beginPath(); ctx.moveTo(s.x+14,s.y-2); ctx.lineTo(s.x+22,s.y-2); ctx.stroke();
    ctx.beginPath(); ctx.moveTo(s.x+18,s.y-6); ctx.lineTo(s.x+22,s.y-2); ctx.lineTo(s.x+18,s.y+2); ctx.stroke();
    clbl('출입구',s.x,s.y+12,def.color);
  } else {
    ctx.fillStyle=def.color; ctx.beginPath(); ctx.arc(s.x,s.y,9,0,Math.PI*2); ctx.fill();
    clbl('작업원',s.x,s.y+13,def.color);
  }
  ctx.restore();
}

function clbl(t,x,y,c){
  ctx.fillStyle=c; ctx.font='10px NanumSquareNeo,Malgun Gothic';
  ctx.textAlign='center'; ctx.textBaseline='top'; ctx.fillText(t,x,y);
}
function drawStar(ctx,cx,cy,r,pts,color){
  ctx.save(); ctx.fillStyle=color; ctx.beginPath();
  var inner=r*.42;
  for(var i=0;i<pts*2;i++){
    var a=i*Math.PI/pts-Math.PI/2, rad=i%2===0?r:inner;
    var x=cx+rad*Math.cos(a), y=cy+rad*Math.sin(a);
    i===0?ctx.moveTo(x,y):ctx.lineTo(x,y);
  }
  ctx.closePath(); ctx.fill(); ctx.restore();
}
function drawRoute(r){
  if(r.points.length<2) return;
  var hasArrow=r.style.includes('arrow'),isDash=r.style.includes('dash');
  ctx.save(); ctx.strokeStyle=r.color; ctx.lineWidth=2.5; ctx.lineJoin='round'; ctx.lineCap='round';
  if(isDash) ctx.setLineDash([10,6]);
  ctx.beginPath(); ctx.moveTo(r.points[0].x,r.points[0].y);
  for(var i=1;i<r.points.length;i++) ctx.lineTo(r.points[i].x,r.points[i].y);
  ctx.stroke();
  if(hasArrow) for(var i=1;i<r.points.length;i++) drawArrow(r.points[i-1],r.points[i],r.color);
  ctx.restore();
}
function drawRouteWIP(){
  var r=curRoute; if(!r) return;
  ctx.save(); ctx.strokeStyle=r.color; ctx.lineWidth=2; ctx.setLineDash([6,4]); ctx.globalAlpha=.65;
  ctx.beginPath(); ctx.moveTo(r.points[0].x,r.points[0].y);
  for(var i=1;i<r.points.length;i++) ctx.lineTo(r.points[i].x,r.points[i].y);
  if(r.preview) ctx.lineTo(r.preview.x,r.preview.y);
  ctx.stroke(); ctx.restore();
}
function drawArrow(from,to,color){
  var dx=to.x-from.x,dy=to.y-from.y,len=Math.sqrt(dx*dx+dy*dy);
  if(len<20) return;
  var angle=Math.atan2(dy,dx),mx=from.x+dx*.6,my=from.y+dy*.6,sz=10;
  ctx.save(); ctx.setLineDash([]); ctx.fillStyle=color;
  ctx.beginPath();
  ctx.moveTo(mx+sz*Math.cos(angle),my+sz*Math.sin(angle));
  ctx.lineTo(mx+sz*Math.cos(angle+2.4),my+sz*Math.sin(angle+2.4));
  ctx.lineTo(mx+sz*Math.cos(angle-2.4),my+sz*Math.sin(angle-2.4));
  ctx.closePath(); ctx.fill(); ctx.restore();
}
function drawSel(obj){
  ctx.save(); ctx.strokeStyle='#1565a7'; ctx.lineWidth=2; ctx.setLineDash([5,3]);
  if(obj.type==='symbol') ctx.strokeRect(obj.x-20,obj.y-20,40,40);
  else ctx.strokeRect(obj.x-3,obj.y-3,(obj.w||195)+6,(obj.h||190)+6);
  ctx.restore();
}
function addLegend(){ cLegend={type:'legend',x:canvas.width-225,y:15,w:215,h:240}; redraw(); }
function drawLegend(){
  var l=cLegend;
  ctx.save();
  ctx.fillStyle='rgba(255,255,255,.95)'; ctx.strokeStyle='#9ab0c8'; ctx.lineWidth=1;
  roundRect(ctx,l.x,l.y,l.w,l.h,6); ctx.fill(); ctx.stroke();
  ctx.fillStyle='#1a2a3a'; ctx.font='bold 12px NanumSquareNeo,Malgun Gothic';
  ctx.textAlign='left'; ctx.fillText('[ 범  례 ]',l.x+10,l.y+18);
  ctx.font='11px NanumSquareNeo,Malgun Gothic';
  ctx.strokeStyle='#e02020'; ctx.lineWidth=2.5; ctx.setLineDash([8,5]);
  ctx.beginPath();ctx.moveTo(l.x+10,l.y+36);ctx.lineTo(l.x+34,l.y+36);ctx.stroke();
  ctx.setLineDash([]); ctx.fillStyle='#333'; ctx.fillText('지게차 이동경로',l.x+40,l.y+40);
  var li=[['supervisor','작업지휘자'],['guide','유도자'],['worker','작업원'],['equipment','지게차'],['exit','출입구']];
  li.forEach(function(it,i){
    var sy=l.y+66+i*30,def=SYM[it[0]];
    if(it[0]==='supervisor') drawStar(ctx,l.x+20,sy,8,5,def.color);
    else if(it[0]==='guide'){ctx.fillStyle=def.color;ctx.beginPath();ctx.moveTo(l.x+20,sy-8);ctx.lineTo(l.x+28,sy+6);ctx.lineTo(l.x+12,sy+6);ctx.closePath();ctx.fill();}
    else if(it[0]==='worker'){ctx.fillStyle=def.color;ctx.beginPath();ctx.arc(l.x+20,sy,7,0,Math.PI*2);ctx.fill();}
    else if(it[0]==='exit'){
      ctx.strokeStyle=def.color;ctx.lineWidth=1.5;ctx.fillStyle='rgba(200,50,50,.12)';
      ctx.beginPath();ctx.rect(l.x+13,sy-7,14,14);ctx.fill();ctx.stroke();
    } else {
      ctx.strokeStyle=def.color;ctx.lineWidth=1.5;ctx.fillStyle='rgba(255,255,255,.9)';
      ctx.fillRect(l.x+12,sy-7,16,14);ctx.strokeRect(l.x+12,sy-7,16,14);ctx.strokeRect(l.x+15,sy-4,10,8);
    }
    ctx.fillStyle='#333';ctx.font='11px NanumSquareNeo,Malgun Gothic';ctx.fillText(it[1],l.x+38,sy+4);
  });
  ctx.restore();
}
function wrapText(ctx,text,cx,cy,maxW,lineH){
  var words=String(text).split(' '),line='',lines=[];
  words.forEach(function(w){ var t=line+w+' '; if(ctx.measureText(t).width>maxW&&line){lines.push(line.trim());line=w+' ';}else line=t; });
  lines.push(line.trim());
  var startY=cy-((lines.length-1)*lineH)/2;
  lines.forEach(function(l,i){ ctx.fillText(l,cx,startY+i*lineH); });
}
function roundRect(ctx,x,y,w,h,r){
  ctx.beginPath();
  ctx.moveTo(x+r,y);ctx.lineTo(x+w-r,y);ctx.quadraticCurveTo(x+w,y,x+w,y+r);
  ctx.lineTo(x+w,y+h-r);ctx.quadraticCurveTo(x+w,y+h,x+w-r,y+h);
  ctx.lineTo(x+r,y+h);ctx.quadraticCurveTo(x,y+h,x,y+h-r);
  ctx.lineTo(x,y+r);ctx.quadraticCurveTo(x,y,x+r,y);
  ctx.closePath();
}
function darken(hex){
  var r=parseInt(hex.slice(1,3),16),g2=parseInt(hex.slice(3,5),16),b=parseInt(hex.slice(5,7),16);
  return 'rgb('+Math.max(0,r-50)+','+Math.max(0,g2-50)+','+Math.max(0,b-50)+')';
}
function clearCanvas(){
  if(!confirm('전체 도면을 초기화하시겠습니까?')) return;
  buildings=[];symbols=[];routes=[];cLegend=null;curRoute=null;selObj=null;boundaries=[];curBoundary=null;
  routeImage=''; redraw(); renderAll();
}
function captureRoute(){
  var prev=selObj; selObj=null; redraw();
  routeImage=canvas.toDataURL('image/png');
  selObj=prev; redraw(); renderAll();
}
function savePNG(){
  var prev=selObj; selObj=null; redraw();
  var a=document.createElement('a');
  a.download='지게차_이동경로도면_'+new Date().toISOString().slice(0,10)+'.png';
  a.href=canvas.toDataURL('image/png'); a.click();
  selObj=prev; redraw();
}

/* 초기 샘플 */
function initSample(){
  buildings=[
    {type:'building',x:50, y:70, w:140,h:75, label:'완제품 창고',  color:'#b8d4f0'},
    {type:'building',x:250,y:70, w:130,h:75, label:'원자재 창고',  color:'#f5d8a0'},
    {type:'building',x:440,y:70, w:130,h:75, label:'출하장',       color:'#b8e8c8'},
    {type:'building',x:60, y:250,w:200,h:100,label:'생산동',       color:'#e0d0f0'},
    {type:'building',x:360,y:230,w:120,h:65, label:'충전소',       color:'#f5b8b8'},
    {type:'building',x:560,y:220,w:140,h:90, label:'주차 구역',    color:'#e8e8e8'}
  ];
  symbols=[
    {type:'symbol',kind:'supervisor',x:200,y:195},
    {type:'symbol',kind:'guide',     x:320,y:120},
    {type:'symbol',kind:'worker',    x:150,y:310},
    {type:'symbol',kind:'equipment', x:430,y:185},
    {type:'symbol',kind:'exit',      x:620,y:148}
  ];
  routes=[
    {points:[{x:190,y:110},{x:250,y:110},{x:380,y:110},{x:440,y:110}], color:'#e02020', style:'dash-arrow'},
    {points:[{x:440,y:155},{x:440,y:240},{x:380,y:258},{x:360,y:258}], color:'#e02020', style:'dash'},
    {points:[{x:260,y:310},{x:360,y:310},{x:490,y:262},{x:560,y:262}], color:'#1565a7', style:'dash'}
  ];
  addLegend(); redraw(); setTimeout(captureRoute,150);
}

renderAll();
addLoadCard(); // 초기 중량물 카드 1개 생성
initSample();
</script>
</body>
</html>				</div>
				<div class="elementor-element elementor-element-21d3302 elementor-widget elementor-widget-html" data-id="21d3302" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3106752057307696"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="autorelaxed"
     data-ad-client="ca-pub-3106752057307696"
     data-ad-slot="7825472551"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
				</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>노사협의회와 산업안전보건위원회 비교</title>
		<link>https://safetysupport.co.kr/labor-management-council-vs-safety-health-committee/</link>
		
		<dc:creator><![CDATA[mangjil]]></dc:creator>
		<pubDate>Sat, 25 Apr 2026 19:56:04 +0000</pubDate>
				<category><![CDATA[칼럼]]></category>
		<category><![CDATA[근로자참여법]]></category>
		<category><![CDATA[노사협의회]]></category>
		<category><![CDATA[노사협의회설치기준]]></category>
		<category><![CDATA[산업안전보건법]]></category>
		<category><![CDATA[산업안전보건위원회]]></category>
		<category><![CDATA[안전보건관리]]></category>
		<category><![CDATA[안전보건위원회]]></category>
		<category><![CDATA[중대재해예방]]></category>
		<guid isPermaLink="false">https://safetysupport.co.kr/?p=3204</guid>

					<description><![CDATA[safetysupport insight · 법령해설 한국어 English safetysupport insight 법령해설 · LEGAL INSIGHT 같은 듯 다른 두 기구 —노사협의회와 산업안전보건위원회,당신의 사업장엔 어느 것이 필요한가? 두 기구 모두 노사가 함께 앉아 회의를 열지만, 법적 근거도 설치 기준도 의제도 본질적으로 다르다. 혼동하는 순간 법 위반이 된다. 현장에서 자주 듣는 질문 오전의 사업장 회의실을 상상해보자. 한쪽 테이블에서는 복지포인트 개선과 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3204" class="elementor elementor-3204" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-46b001c e-flex e-con-boxed e-con e-parent" data-id="46b001c" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-6f01564 elementor-widget elementor-widget-html" data-id="6f01564" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<div style="border:1px solid #b2cae0; border-radius:8px; padding:8px; overflow:hidden; background:#fff; margin-bottom:16px;">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3106752057307696"
     crossorigin="anonymous"></script>

<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-3106752057307696"
     data-ad-slot="2206462755"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
</div>				</div>
				<div class="elementor-element elementor-element-9e4409d elementor-widget elementor-widget-html" data-id="9e4409d" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<style>
@import url('https://hangeul.pstatic.net/hangeul_static/css/nanum-square-neo.css');
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=Noto+Serif:ital,wght@0,700;1,400&display=swap');

/* ── 색상 변수 ── */
:root {
  --green-deep:   #0D3321;
  --green-mid:    #164d30;
  --green-light:  #e8f2ec;
  --green-border: #b8d9c4;
  --gold:         #C9A961;
  --gold-light:   #f5ecd6;
  --navy:         #1e3a5f;
  --text-dark:    #1a2e1f;
  --text-body:    #2e3d32;
  --text-muted:   #6b7f6f;
  --bg-cream:     #fafaf7;
  --border:       #d4e6da;
}

.ss-wrap {
  max-width: 980px;
  margin: 0 auto;
  border-radius: 12px;
  overflow: hidden;
  border: 1px solid var(--border);
  background: #fff;
  font-family: 'NanumSquareNeo', 'Noto Sans KR', sans-serif;
}

/* ── 헤더 ── */
.ss-header {
  background: linear-gradient(100deg, #0D3321 0%, #164d30 55%, #0f3d26 100%);
  padding: 20px 32px;
  position: relative;
  overflow: hidden;
}

.ss-header::before {
  content: "";
  position: absolute;
  top: 0; left: 0;
  width: 5px; height: 100%;
  background: linear-gradient(180deg, #C9A961 0%, #a87d30 100%);
}

.ss-header::after {
  content: "";
  position: absolute;
  top: -60px; right: -60px;
  width: 200px; height: 200px;
  border-radius: 50%;
  background: rgba(201,169,97,0.06);
  pointer-events: none;
}

.ss-header-top {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 20px;
}

.ss-brand-top {
  font-size: 9px;
  color: var(--gold);
  letter-spacing: .22em;
  text-transform: uppercase;
  font-family: Inter, sans-serif;
  font-weight: 700;
}

.ss-brand-bottom {
  font-size: 11px;
  color: rgba(255,255,255,0.9);
  letter-spacing: .14em;
  text-transform: uppercase;
  font-family: Inter, sans-serif;
  font-weight: 700;
  margin-top: 3px;
}

.ss-divider-wrap {
  height: 1px;
  background: rgba(201,169,97,0.2);
  margin-top: 18px;
}

/* ── 토글 ── */
.ss-toggle {
  position: relative;
  width: 172px; height: 36px;
  border-radius: 30px;
  background: rgba(0,0,0,0.3);
  border: 1px solid rgba(201,169,97,0.3);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 10px;
  box-sizing: border-box;
  cursor: pointer;
}

.ss-thumb {
  position: absolute;
  left: 3px; top: 3px;
  width: 82px; height: 28px;
  background: #fff;
  border-radius: 22px;
  transition: transform .3s cubic-bezier(.4,0,.2,1);
}

.ss-thumb.right { transform: translateX(84px); }

.toggle-label {
  position: relative;
  z-index: 2;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .08em;
  font-family: Inter, sans-serif;
  background: transparent !important;
  border: 0 !important;
  outline: 0 !important;
  box-shadow: none !important;
  cursor: pointer;
  padding: 0; margin: 0;
  -webkit-appearance: none;
  appearance: none;
  transition: color .25s ease;
}

.toggle-label:hover,
.toggle-label:focus,
.toggle-label:active { background: transparent !important; box-shadow: none !important; }
.toggle-label.active  { color: var(--green-deep) !important; }
.toggle-label.inactive { color: rgba(255,255,255,0.5) !important; }

/* ── 패널 ── */
.ss-panel { display: none; }
.ss-panel.active { display: block; }

.ss-article {
  max-width: 780px;
  margin: 0 auto;
  padding: 48px 32px 100px;
}

.ss-ko { font-family: 'NanumSquareNeo', 'Noto Sans KR', sans-serif; }
.ss-en { font-family: Inter, sans-serif; }

/* ── 태그 ── */
.ss-tag-brand {
  font-size: 10px;
  color: var(--green-mid);
  text-transform: uppercase;
  letter-spacing: .2em;
  font-family: Inter, sans-serif;
  font-weight: 700;
}

.ss-tag-cat {
  font-size: 10px;
  color: var(--gold);
  text-transform: uppercase;
  letter-spacing: .18em;
  margin-top: 8px;
  font-family: Inter, sans-serif;
  font-weight: 700;
}

/* ── 제목 ── */
.ss-ko h1 {
  font-family: 'NanumSquareNeo', 'Noto Sans KR', sans-serif;
  font-size: 27px;
  font-weight: 700;
  color: var(--green-deep);
  line-height: 1.45;
  margin: 16px 0 0;
  letter-spacing: -0.03em;
}

.ss-en h1 {
  font-family: 'Noto Serif', serif;
  font-size: 27px;
  font-weight: 700;
  color: var(--green-deep);
  line-height: 1.45;
  margin: 16px 0 0;
}

.ss-subtitle {
  font-size: 15px;
  color: var(--text-muted);
  font-weight: 400;
  margin-top: 10px;
  line-height: 1.75;
}

.title-line {
  width: 40px;
  height: 3px;
  background: linear-gradient(90deg, var(--green-deep), var(--gold));
  margin: 24px 0 40px;
  border-radius: 2px;
}

/* ── 소제목 ── */
.ss-ko h2, .ss-en h2 {
  font-size: 19px;
  font-weight: 700;
  color: var(--green-deep);
  border-left: 3px solid var(--green-deep);
  padding-left: 13px;
  margin: 56px 0 20px;
  line-height: 1.5;
}

/* ── 본문 ── */
.ss-ko p, .ss-en p {
  font-size: 15.5px;
  color: var(--text-body);
  line-height: 2.0;
  margin: 0 0 18px;
  word-break: keep-all;
}

.ss-en p { word-break: normal; }

/* ── 리스트 ── */
.ss-ko ul, .ss-en ul {
  padding-left: 20px;
  margin: 10px 0 22px;
}

.ss-ko li, .ss-en li {
  font-size: 15px;
  line-height: 1.9;
  margin-bottom: 6px;
  color: var(--text-body);
}

/* ── 인용 ── */
.ss-ko blockquote {
  background: var(--green-light);
  border-left: 4px solid var(--green-deep);
  padding: 20px 26px;
  margin: 36px 0;
  font-size: 15.5px;
  line-height: 1.85;
  color: var(--green-deep);
  font-weight: 700;
  border-radius: 0 8px 8px 0;
}

.ss-en blockquote {
  background: var(--green-light);
  border-left: 4px solid var(--green-deep);
  padding: 20px 26px;
  margin: 36px 0;
  font-size: 15.5px;
  line-height: 1.85;
  color: var(--green-deep);
  font-weight: 600;
  font-style: italic;
  border-radius: 0 8px 8px 0;
}

/* ── 비교 박스 ── */
.ss-compare {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  margin: 32px 0 36px;
}

.ss-compare-box {
  border-radius: 10px;
  padding: 20px 22px;
  border: 1px solid var(--border);
}

.ss-compare-box.green {
  background: var(--green-light);
  border-color: var(--green-border);
}

.ss-compare-box.gold {
  background: var(--gold-light);
  border-color: #e0c98a;
}

.ss-compare-label {
  font-size: 9px;
  font-weight: 700;
  letter-spacing: .18em;
  text-transform: uppercase;
  font-family: Inter, sans-serif;
  margin-bottom: 8px;
}

.ss-compare-box.green .ss-compare-label { color: var(--green-deep); }
.ss-compare-box.gold  .ss-compare-label { color: #8a6520; }

.ss-compare-title {
  font-size: 15px;
  font-weight: 700;
  color: var(--text-dark);
  margin-bottom: 10px;
  line-height: 1.4;
}

.ss-compare-body {
  font-size: 13.5px;
  color: var(--text-muted);
  line-height: 1.75;
}

/* ── 기준표 ── */
.ss-table {
  width: 100%;
  border-collapse: collapse;
  margin: 24px 0 36px;
  font-size: 14px;
}

.ss-table th {
   background: #0D3321 !important;
  color: #ffffff !important;
  padding: 11px 14px;
  text-align: center;
  font-weight: 700;
  font-size: 13px;
  letter-spacing: .03em;
}

.ss-table th:first-child { border-radius: 8px 0 0 0; }
.ss-table th:last-child  { border-radius: 0 8px 0 0; }

.ss-table td {
  padding: 11px 14px;
  border-bottom: 1px solid var(--border);
  color: var(--text-body);
  line-height: 1.65;
  vertical-align: middle;
  text-align: center;
}

.ss-table tr:nth-child(even) td { background: var(--bg-cream); }
.ss-table tr:last-child td { border-bottom: none; }

.ss-table td:first-child {
  font-weight: 700;
  color: var(--green-deep);
  white-space: nowrap;
}

/* ── 포인트 박스 ── */
.ss-point {
  background: var(--green-deep);
  color: #fff;
  border-radius: 10px;
  padding: 22px 26px;
  margin: 36px 0;
  font-size: 15px;
  line-height: 1.85;
  font-weight: 500;
}

.ss-point strong { color: var(--gold); }

/* ── 구분선 ── */
.ss-divider {
  width: 100%;
  height: .5px;
  background: var(--border);
  margin: 56px 0 0;
}

/* ── 푸터 ── */
.ss-footer {
  margin-top: 60px;
  border-top: 1px solid var(--border);
  text-align: center;
  font-size: 12px;
  color: #aaa;
  letter-spacing: .05em;
  padding-top: 18px;
  font-family: Inter, sans-serif;
}

/* ── 영문 배지 ── */
.ss-en-badge {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--green-deep);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  padding: 4px 12px;
  border-radius: 20px;
  font-family: Inter, sans-serif;
  margin-bottom: 18px;
}

.ss-en-dot {
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--gold);
  display: inline-block;
}

@media (max-width: 600px) {
  .ss-article { padding: 32px 18px 80px; }
  .ss-compare { grid-template-columns: 1fr; }
  .ss-ko h1, .ss-en h1 { font-size: 22px; }
  .ss-table { font-size: 13px; }
}
</style>

<div class="ss-wrap">
  <div class="ss-header">
    <div class="ss-header-top">
      <div>
        <div class="ss-brand-top">safetysupport</div>
        <div class="ss-brand-bottom">insight · 법령해설</div>
      </div>
      <div class="ss-toggle" onclick="ssToggleLaborSafety()">
        <div id="ss-thumb-ls" class="ss-thumb"></div>
        <button id="ss-lbl-ko-ls" class="toggle-label active">한국어</button>
        <button id="ss-lbl-en-ls" class="toggle-label inactive">English</button>
      </div>
    </div>
    <div class="ss-divider-wrap"></div>
  </div>

  <!-- ======================== KOREAN PANEL ======================== -->
  <div id="ss-panel-ko-ls" class="ss-panel active">
    <div class="ss-article ss-ko">

      <div class="ss-tag-brand">safetysupport insight</div>
      <div class="ss-tag-cat">법령해설 · LEGAL INSIGHT</div>

      <h1>같은 듯 다른 두 기구 —<br>노사협의회와 산업안전보건위원회,<br>당신의 사업장엔 어느 것이 필요한가?</h1>
      <div class="ss-subtitle">두 기구 모두 노사가 함께 앉아 회의를 열지만, 법적 근거도 설치 기준도 의제도 본질적으로 다르다. 혼동하는 순간 법 위반이 된다.</div>
      <div class="title-line"></div>

      <h2>현장에서 자주 듣는 질문</h2>

      <p>오전의 사업장 회의실을 상상해보자. 한쪽 테이블에서는 복지포인트 개선과 교육훈련 계획을 논의하고, 다른 한쪽에서는 유해물질 취급 작업의 환경 측정 결과와 방호장치 점검 사항을 검토한다. 두 회의 모두 노사가 함께 앉아 머리를 맞댄다. 그런데 이 두 자리는 같은 자리가 아니다.</p>

      <p>"저희 회사에 노사협의회가 있는데, 산업안전보건위원회도 따로 만들어야 하나요?"</p>

      <p>안전관리 컨설팅 현장에서 심심치 않게 듣는 질문이다. 두 기구 모두 노사 대표가 참여하는 회의체라는 점에서 겉모습이 비슷하다 보니, 하나가 있으면 다른 하나는 생략해도 된다고 오해하는 경우가 많다. 결론부터 말하자면, 두 기구는 법적 근거도, 설치 기준도, 다루는 의제도 본질적으로 다르며, 각각 독립적으로 운영되어야 한다.</p>

      <div class="ss-divider"></div>
      <h2>뿌리가 다르다 — 법적 근거부터 다른 두 기구</h2>

      <p>노사협의회는 「근로자참여 및 협력증진에 관한 법률」에, 산업안전보건위원회는 「산업안전보건법」에 각각 뿌리를 두고 있다. 이름만 봐도 두 기구가 지향하는 바가 다르다는 것을 알 수 있다.</p>

      <div class="ss-compare">
        <div class="ss-compare-box green">
          <div class="ss-compare-label">노사협의회</div>
          <div class="ss-compare-title">기업 전반의 협력 기구</div>
          <div class="ss-compare-body">근로자참여 및 협력증진법 근거. 기업의 생산성 향상과 근로자 복지라는 <strong>'상생의 문화'</strong>를 구축하는 포괄적 협력 기구.</div>
        </div>
        <div class="ss-compare-box gold">
          <div class="ss-compare-label">산업안전보건위원회</div>
          <div class="ss-compare-title">안전·보건 특화 의사결정 기구</div>
          <div class="ss-compare-body">산업안전보건법 근거. 현장의 유해·위험요인으로부터 근로자의 생명을 지키는 <strong>'안전 특화 심의·의결 기구'</strong>.</div>
        </div>
      </div>

      <div class="ss-divider"></div>
      <h2>사업장의 규모가 결정하는 의무의 무게</h2>

      <p>설치 의무 기준도 다르다. 이 부분에서 실무자들이 가장 많이 혼동한다.</p>

      <table class="ss-table">
        <tr>
          <th>구분</th>
          <th>노사협의회</th>
          <th>산업안전보건위원회</th>
        </tr>
        <tr>
          <td>일반 사업장</td>
          <td>상시 근로자 30인 이상</td>
          <td>상시 근로자 100인 이상</td>
        </tr>
        <tr>
          <td>유해·위험 업종</td>
          <td>상시 근로자 30인 이상</td>
          <td>상시 근로자 50인 이상</td>
        </tr>
        <tr>
          <td>건설업</td>
          <td>상시 근로자 30인 이상</td>
          <td>공사금액 120억 원 이상<br>(토목 150억 원 이상)</td>
        </tr>
        <tr>
          <td>농업·금융업 등</td>
          <td>상시 근로자 30인 이상</td>
          <td>상시 근로자 300인 이상</td>
        </tr>
      </table>

      <p>즉, 노사협의회 설치 의무는 있어도 산업안전보건위원회 설치 의무는 없는 사업장이 존재한다. 반대로 산업안전보건위원회 설치 의무가 있는 사업장이라면 노사협의회 설치 의무도 당연히 함께 진다.</p>

      <div class="ss-divider"></div>
      <h2>무엇을 다루나 — 의제의 성격이 본질적으로 다르다</h2>

      <p>두 기구의 차이가 가장 선명하게 드러나는 지점이 바로 의제다.</p>

      <p><strong>노사협의회</strong>가 다루는 내용은 기업 경영 전반에 걸쳐 있다. 교육훈련 및 능력개발 기본계획, 복지시설 설치 및 관리, 사내근로복지기금, 인사·노무관리 제도 개선, 직장 내 성희롱 예방 등이 대표적이며, 쉽게 말해 <strong>"어떻게 하면 일하기 좋은 회사를 만들까"</strong>를 논의하는 자리다.</p>

      <p><strong>산업안전보건위원회</strong>는 다르다. 이 기구가 다루는 의제는 모두 현장의 생명과 직결된 사안들이다.</p>

      <ul>
        <li>산업재해 예방계획 수립</li>
        <li>안전보건관리규정 작성 및 변경</li>
        <li>근로자 안전·보건 교육</li>
        <li>작업환경 측정 및 개선</li>
        <li>중대재해 원인 조사 및 재발 방지 대책</li>
        <li>유해·위험 설비 도입 시 안전보건 조치</li>
      </ul>

      <p>단순한 협의가 아니라 <strong>심의·의결</strong>이라는 점도 중요하다. 의결된 사항은 사용자가 일방적으로 무시할 수 없으며, 그만큼 구속력이 강하다.</p>

      <div class="ss-divider"></div>
      <h2>헷갈리는 이유 — 겹치는 부분이 있긴 하다</h2>

      <p>실무에서 혼동이 생기는 데는 이유가 있다. 노사협의회의 협의 사항 안에 <strong>"안전·보건, 그 밖의 작업환경 개선과 근로자의 건강증진"</strong>이 포함되어 있기 때문이다. 안전보건 관련 사항이 노사협의회에도 등장하다 보니, "노사협의회에서 안전 얘기도 하는데 굳이 산업안전보건위원회가 따로 필요하냐"는 오해가 자연스럽게 생긴다.</p>

      <p>그러나 법령 해설서는 이 관계를 명확하게 정리하고 있다.</p>

      <div class="ss-point">
        <strong>산업안전보건위원회 설치 의무가 없는 사업장</strong>（상시 근로자 100인 미만, 유해·위험업종은 50인 미만）은 노사협의회에서 안전·보건 및 작업환경 개선에 관한 사항을 협의하거나 의결해야 한다. 산업안전보건위원회가 없다고 해서 안전보건 협의 의무 자체가 사라지는 것이 아니며, 이 경우 노사협의회가 그 역할을 담당하는 구조다.<br><br>
        반면 <strong>산업안전보건위원회 설치 의무가 있는 사업장</strong>（상시 근로자 100인 이상, 유해·위험업종은 50인 이상）은 안전보건에 관한 중요 사항을 반드시 산업안전보건위원회에서 심의·의결해야 한다. 노사협의회가 있다고 해서 산업안전보건위원회를 생략하거나 통합 운영하는 것은 <strong style="color:#F5CC45">법령이 허용하지 않는다.</strong>
      </div>

      <blockquote>
        두 기구는 서로를 갈음하지 않는다. 설치 의무가 있는 사업장이라면 노사협의회와 산업안전보건위원회를 각각 별도로 설치하고, 각자의 법적 역할에 맞게 독립적으로 운영해야 한다.
      </blockquote>

      <div class="ss-divider"></div>
      <h2>결론 — 협력은 경영의 본질이고, 안전은 타협의 대상이 아니다</h2>

      <p><strong>상시 근로자 30인 이상 ~ 100인 미만 사업장（일반업종 기준）</strong>은 노사협의회를 설치하고, 그 안에서 안전·보건에 관한 사항도 성실하게 협의해야 한다. 산업안전보건위원회가 없다고 해서 안전보건 협의 의무가 사라지는 것이 아님을 명심해야 한다.</p>

      <p><strong>상시 근로자 100인 이상 사업장（일반업종 기준）</strong>은 노사협의회와 산업안전보건위원회를 각각 설치하고 별도로 운영해야 한다. 두 기구는 다루는 법령도, 의제도, 구성 방식도 다르기 때문에 어느 하나가 다른 하나를 대체할 수 없다.</p>

      <p>노사협의회가 있으니 산업안전보건위원회는 생략해도 된다는 생각, 또는 반대로 산업안전보건위원회를 운영하고 있으니 노사협의회는 없어도 된다는 생각 — 둘 다 틀렸다.</p>

      <blockquote>
        노사협의회는 기업이 지속 가능하게 성장하기 위한 협력의 창구이며, 산업안전보건위원회는 그 성장의 과정에서 단 한 명의 근로자도 다치지 않도록 지키는 안전의 보루다. 협력은 경영의 본질이고, 안전은 타협의 대상이 아니다.
      </blockquote>

      <div class="ss-footer">산업안전지원센터㈜ · Occupational Safety Support Center</div>

      <div style="border:1px solid #b2cae0; border-radius:8px; padding:8px; overflow:hidden; margin-top:24px; background:#fff;">
        <ins class="adsbygoogle"
             style="display:block"
             data-ad-client="ca-pub-3106752057307696"
             data-ad-slot="5220315587"
             data-ad-format="auto"
             data-full-width-responsive="true"></ins>
        <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
      </div>

    </div>
  </div>

  <!-- ======================== ENGLISH PANEL ======================== -->
  <div id="ss-panel-en-ls" class="ss-panel">
    <div class="ss-article ss-en">

      <div class="ss-en-badge"><span class="ss-en-dot"></span>English Version</div>
      <div class="ss-tag-brand">safetysupport insight</div>
      <div class="ss-tag-cat">LEGAL INSIGHT</div>

      <h1>Two Bodies, Two Mandates —<br>Labor-Management Council vs. Industrial Safety &amp; Health Committee</h1>
      <div class="ss-subtitle">Both convene with labor and management seated at the same table, yet their legal foundations, establishment thresholds, and agenda items are fundamentally different. Conflating the two carries legal consequences.</div>
      <div class="title-line"></div>

      <h2>A Question Heard Often in the Field</h2>

      <p>Imagine a morning meeting room at a workplace. At one table, the discussion covers welfare points and training plans. At another, the agenda turns to environmental measurement results for hazardous substance handling and the status of protective guards. Both meetings seat labor and management side by side — but they are not the same meeting.</p>

      <p>"We already have a Labor-Management Council. Do we really need to set up a separate Industrial Safety and Health Committee?"</p>

      <p>This question comes up regularly in safety consulting engagements. Because both bodies involve representatives from both sides of the employment relationship, many workplaces assume that having one satisfies the obligation for the other. The answer is unambiguous: the two bodies differ in legal basis, establishment threshold, and agenda, and each must operate independently.</p>

      <div class="ss-divider"></div>
      <h2>Different Roots — Different Legal Foundations</h2>

      <p>The Labor-Management Council draws its authority from the Act on the Promotion of Worker Participation and Cooperation, while the Industrial Safety and Health Committee is grounded in the Occupational Safety and Health Act. The titles alone signal that the two bodies point in different directions.</p>

      <div class="ss-compare">
        <div class="ss-compare-box green">
          <div class="ss-compare-label">Labor-Management Council</div>
          <div class="ss-compare-title">Broad Cooperation Body</div>
          <div class="ss-compare-body">Rooted in labor-participation law. Builds a <strong>culture of co-prosperity</strong> — productivity growth alongside worker welfare across the full scope of business operations.</div>
        </div>
        <div class="ss-compare-box gold">
          <div class="ss-compare-label">Safety &amp; Health Committee</div>
          <div class="ss-compare-title">Safety-Specific Decision Body</div>
          <div class="ss-compare-body">Rooted in occupational safety law. Deliberates and resolves matters that directly protect workers' lives from hazardous and dangerous conditions on site.</div>
        </div>
      </div>

      <div class="ss-divider"></div>
      <h2>The Weight of Obligation Scales with Workforce Size</h2>

      <p>The thresholds for mandatory establishment differ as well — and this is precisely where confusion tends to arise in practice.</p>

      <table class="ss-table">
        <tr>
          <th>Category</th>
          <th>Labor-Management Council</th>
          <th>Safety &amp; Health Committee</th>
        </tr>
        <tr>
          <td>General workplace</td>
          <td>30 or more workers</td>
          <td>100 or more workers</td>
        </tr>
        <tr>
          <td>Hazardous industries</td>
          <td>30 or more workers</td>
          <td>50 or more workers</td>
        </tr>
        <tr>
          <td>Construction</td>
          <td>30 or more workers</td>
          <td>Contract value ≥ KRW 12 billion<br>(civil works ≥ KRW 15 billion)</td>
        </tr>
        <tr>
          <td>Agriculture, finance, etc.</td>
          <td>30 or more workers</td>
          <td>300 or more workers</td>
        </tr>
      </table>

      <p>A workplace may therefore be obligated to maintain a Labor-Management Council without being required to establish a Safety and Health Committee. The reverse is not possible: any workplace required to establish a Safety and Health Committee is also, by definition, required to maintain a Labor-Management Council.</p>

      <div class="ss-divider"></div>
      <h2>What Each Body Addresses — Fundamentally Different Agendas</h2>

      <p>The sharpest contrast between the two bodies lies in what they are designed to discuss.</p>

      <p>The <strong>Labor-Management Council</strong> covers the full breadth of business operations: training and development plans, welfare facilities, the Employee Welfare Fund, improvements to HR and labor management systems, and the prevention of workplace sexual harassment — in short, it answers the question of <strong>how to make the workplace better for everyone</strong>.</p>

      <p>The <strong>Industrial Safety and Health Committee</strong> operates in a narrower but more consequential domain — every item on its agenda is directly tied to life and physical safety on the shop floor.</p>

      <ul>
        <li>Formulation of occupational accident prevention plans</li>
        <li>Drafting and revision of safety and health management rules</li>
        <li>Worker safety and health training</li>
        <li>Work environment measurement and improvement</li>
        <li>Investigation of serious accidents and prevention of recurrence</li>
        <li>Safety and health measures for newly introduced hazardous equipment</li>
      </ul>

      <p>The procedural weight also differs: the Committee's outcomes are reached through <strong>deliberation and resolution</strong>, not mere consultation, meaning that decisions carry binding force that the employer cannot unilaterally override.</p>

      <div class="ss-divider"></div>
      <h2>Why the Confusion Exists — There Is Overlap, But It Does Not Mean Substitution</h2>

      <p>The source of confusion is real: the Labor-Management Council's consultation agenda includes <strong>safety, health, and improvement of the work environment and worker wellbeing</strong>. Because safety-related matters appear in both frameworks, some workplaces conclude — incorrectly — that the Council can absorb the Committee's function.</p>

      <div class="ss-point">
        <strong>Workplaces not required to establish a Safety and Health Committee</strong> (fewer than 100 regular workers; fewer than 50 in hazardous industries) must address safety, health, and work environment matters through the Labor-Management Council. The absence of a Committee does not extinguish the obligation to deliberate on these issues — it simply relocates that obligation to the Council.<br><br>
        <strong>Workplaces required to establish a Safety and Health Committee</strong> (100 or more regular workers; 50 or more in hazardous industries) must deliberate and resolve safety and health matters specifically through that Committee. Maintaining a Labor-Management Council does not exempt the workplace from this obligation, and operating the two bodies as a single body is <strong style="color:#F5CC45">not permitted under law.</strong>
      </div>

      <blockquote>
        The two bodies do not substitute for each other. Where both obligations apply, each body must be established separately and operate according to its own distinct legal mandate.
      </blockquote>

      <div class="ss-divider"></div>
      <h2>Conclusion — Cooperation Is the Essence of Management; Safety Is Not a Matter of Compromise</h2>

      <p><strong>Workplaces with 30 to fewer than 100 regular workers (general industries)</strong> must establish a Labor-Management Council and ensure that safety and health matters are addressed within it in good faith. The absence of a Safety and Health Committee does not reduce the obligation to consult on safety.</p>

      <p><strong>Workplaces with 100 or more regular workers (general industries)</strong> must establish and separately operate both a Labor-Management Council and an Industrial Safety and Health Committee. Because the two bodies differ in governing law, agenda, and composition, neither can stand in for the other.</p>

      <p>The assumption that a Labor-Management Council makes a Safety and Health Committee unnecessary — or the reverse — is incorrect in both directions.</p>

      <blockquote>
        The Labor-Management Council is the channel through which a business grows sustainably together with its workforce. The Industrial Safety and Health Committee is the safeguard that ensures not a single worker is lost along the way. Cooperation is the essence of management. Safety is not a matter for compromise.
      </blockquote>

      <div class="ss-footer">Occupational Safety Support Center · safetysupport.co.kr</div>

      <div style="border:1px solid #b2cae0; border-radius:8px; padding:8px; overflow:hidden; margin-top:24px; background:#fff;">
        <ins class="adsbygoogle"
             style="display:block"
             data-ad-client="ca-pub-3106752057307696"
             data-ad-slot="5220315587"
             data-ad-format="auto"
             data-full-width-responsive="true"></ins>
        <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
      </div>

    </div>
  </div>
</div>

<script>
var ssIsKoLs = true;
function ssToggleLaborSafety() {
  ssIsKoLs = !ssIsKoLs;
  var thumb = document.getElementById('ss-thumb-ls');
  var lblKo = document.getElementById('ss-lbl-ko-ls');
  var lblEn = document.getElementById('ss-lbl-en-ls');
  var pKo   = document.getElementById('ss-panel-ko-ls');
  var pEn   = document.getElementById('ss-panel-en-ls');
  if (ssIsKoLs) {
    thumb.classList.remove('right');
    lblKo.className = 'toggle-label active';
    lblEn.className = 'toggle-label inactive';
    pKo.classList.add('active');
    pEn.classList.remove('active');
  } else {
    thumb.classList.add('right');
    lblKo.className = 'toggle-label inactive';
    lblEn.className = 'toggle-label active';
    pKo.classList.remove('active');
    pEn.classList.add('active');
  }
}
</script>				</div>
				<div class="elementor-element elementor-element-e92be14 elementor-widget elementor-widget-html" data-id="e92be14" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<div style="border:1px solid #b2cae0; border-radius:8px; padding:8px; overflow:hidden; background:#fff; margin-top:16px;">
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-3106752057307696"
     data-ad-slot="2170284219"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
</div>				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>물질안전보건자료(MSDS) 교육</title>
		<link>https://safetysupport.co.kr/msds-safety-training/</link>
		
		<dc:creator><![CDATA[mangjil]]></dc:creator>
		<pubDate>Fri, 24 Apr 2026 04:45:00 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[GHS]]></category>
		<category><![CDATA[MSDS]]></category>
		<category><![CDATA[MSDS 교육]]></category>
		<category><![CDATA[경고표지]]></category>
		<category><![CDATA[물질안전보건자료]]></category>
		<category><![CDATA[물질안전보건자료 교육]]></category>
		<category><![CDATA[보호구 착용]]></category>
		<category><![CDATA[사업장 안전관리]]></category>
		<category><![CDATA[산업안전]]></category>
		<category><![CDATA[산업안전보건법]]></category>
		<category><![CDATA[안전보건교육]]></category>
		<category><![CDATA[위험성평가]]></category>
		<category><![CDATA[화학물질 관리]]></category>
		<category><![CDATA[화학물질 안전]]></category>
		<category><![CDATA[화학물질 취급]]></category>
		<guid isPermaLink="false">https://safetysupport.co.kr/?p=3122</guid>

					<description><![CDATA[목록으로 맨 위로 맨 아래로 EDUCATION MATERIAL 교육 자료 EDU 본 교육자료를 활용하여 관련 교육을 실시하시기 바랍니다. EDUCATION LOG 교육일지 작성 LOG 교육 실시 후 아래 양식에 교육일지를 작성하여 보관하시기 바랍니다. 안전보건교육일지 📋 안전보건교육일지 🔒 워터마크 ON 📥 PDF 저장 🔐 워터마크 해제 워터마크를 끄려면 관리자 비밀번호를입력하세요. 취소 확인 산업안전지원센터㈜ 산업안전지원센터㈜safetysupport.co.kr 안전보건교육일지 산업안전보건법에 따른 안전보건교육 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3122" class="elementor elementor-3122" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-0eb0e61 e-con-full e-flex e-con e-parent" data-id="0eb0e61" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-f33d82c elementor-widget elementor-widget-html" data-id="f33d82c" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<style>
.edu-float-nav{position:fixed;right:20px;top:50%;transform:translateY(-50%);z-index:9999;display:flex;flex-direction:column;gap:15px;}
.edu-float-btn{display:flex;align-items:center;justify-content:center;width:70px;height:70px;border-radius:50%;background:#0D4444;border:none;cursor:pointer;box-shadow:0 2px 8px rgba(13,68,68,.25);transition:all .22s ease;text-decoration:none;}
.edu-float-btn:hover{background:#1a6b6b;transform:scale(1.1);}
.edu-float-btn svg{width:30px;height:30px;stroke:#fff;flex-shrink:0;}
.edu-float-tooltip{position:absolute;right:65px;background:#0D4444;color:#fff;font-size:13px;font-weight:500;white-space:nowrap;padding:5px 10px;border-radius:6px;opacity:0;pointer-events:none;transition:opacity .15s ease;font-family:'NanumSquareNeo','Noto Sans KR',sans-serif;}
.edu-float-btn:hover .edu-float-tooltip{opacity:1;}
.edu-float-tooltip::after{content:'';position:absolute;left:100%;top:50%;transform:translateY(-50%);border-left:5px solid #0D4444;border-top:4px solid transparent;border-bottom:4px solid transparent;}
@media(max-width:768px){.edu-float-nav{right:12px;}.edu-float-btn{width:44px;height:44px;}.edu-float-btn svg{width:18px;height:18px;}}
</style>

<div class="edu-float-nav">
    <!-- 목록으로 -->
    <a class="edu-float-btn" href="https://safetysupport.co.kr/safety-education/">
        <span class="edu-float-tooltip">목록으로</span>
        <svg viewBox="0 0 24 24" fill="none" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
            <line x1="8" y1="6" x2="21" y2="6"/>
            <line x1="8" y1="12" x2="21" y2="12"/>
            <line x1="8" y1="18" x2="21" y2="18"/>
            <line x1="3" y1="6" x2="3.01" y2="6"/>
            <line x1="3" y1="12" x2="3.01" y2="12"/>
            <line x1="3" y1="18" x2="3.01" y2="18"/>
        </svg>
    </a>
    <!-- 맨 위로 -->
    <button class="edu-float-btn" onclick="window.scrollTo({top:0,behavior:'smooth'})">
        <span class="edu-float-tooltip">맨 위로</span>
        <svg viewBox="0 0 24 24" fill="none" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
            <polyline points="18 15 12 9 6 15"/>
        </svg>
    </button>
    <!-- 맨 아래로 -->
    <button class="edu-float-btn" onclick="window.scrollTo({top:document.body.scrollHeight,behavior:'smooth'})">
        <span class="edu-float-tooltip">맨 아래로</span>
        <svg viewBox="0 0 24 24" fill="none" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
            <polyline points="6 9 12 15 18 9"/>
        </svg>
    </button>
</div>				</div>
				<div class="elementor-element elementor-element-63d2ce8 elementor-widget elementor-widget-html" data-id="63d2ce8" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<!-- =====================================================
  섹션 구분자 - 교육 자료 (EDUCATION MATERIAL)
  용도: WordPress Elementor HTML 위젯
  위치: 이북/자료 콘텐츠 상단
  컬러: 딥그린 (#0D3321) 계열
====================================================== -->

<div style="
  border-radius: 12px;
  overflow: hidden;
  font-family: 'Pretendard', 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
  margin: 8px 0 20px;
">

  <!-- 상단 배너 -->
  <div style="
    background: linear-gradient(100deg, #0D3321 0%, #1a5c35 60%, #226b3f 100%);
    padding: 16px 28px;
    display: flex;
    align-items: center;
    gap: 18px;
  ">
    <!-- 아이콘 원형 -->
    <div style="
      width: 42px; height: 42px;
      background: rgba(255,255,255,0.12);
      border: 1px solid rgba(255,255,255,0.18);
      border-radius: 50%;
      display: flex; align-items: center; justify-content: center;
      flex-shrink: 0;
    ">
      <svg viewBox="0 0 24 24" style="width:19px;height:19px;fill:#a8debb;">
        <path d="M12 3L1 9l11 6 9-4.91V17h2V9M5 13.18v4L12 21l7-3.82v-4L12 17l-7-3.82z"/>
      </svg>
    </div>

    <!-- 텍스트 -->
    <div style="display:flex; flex-direction:column; gap:3px;">
      <span style="
        font-size: 10px; font-weight: 600; letter-spacing: 0.16em;
        color: #7dc49b; text-transform: uppercase;
      ">EDUCATION MATERIAL</span>
      <span style="
        font-size: 17px; font-weight: 700; color: #e8f5ed; letter-spacing: -0.01em;
      ">교육 자료</span>
    </div>

    <!-- 우측 태그 -->
    <div style="
      margin-left: auto;
      background: rgba(255,255,255,0.1);
      border: 0.5px solid rgba(255,255,255,0.22);
      color: #c5e8d0;
      font-size: 10px; font-weight: 600; letter-spacing: 0.12em;
      text-transform: uppercase;
      padding: 5px 14px;
      border-radius: 20px;
      flex-shrink: 0;
      white-space: nowrap;
    ">EDU</div>
  </div>

  <!-- 하단 서브텍스트 -->
  <div style="
    background: #f0f8f3;
    border: 0.5px solid #b8d9c4;
    border-top: none;
    border-radius: 0 0 12px 12px;
    padding: 9px 28px;
    display: flex;
    align-items: center;
    gap: 8px;
  ">
    <div style="
      width: 5px; height: 5px;
      border-radius: 50%;
      background: #3a7a50;
      flex-shrink: 0;
    "></div>
    <span style="
      font-size: 12px; color: #2d6043; font-weight: 500; letter-spacing: 0.01em;
    ">본 교육자료를 활용하여 관련 교육을 실시하시기 바랍니다.</span>
  </div>

</div>				</div>
				<div class="elementor-element elementor-element-7e74e4a elementor-widget elementor-widget-html" data-id="7e74e4a" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<div class="_df_book df-lite" id="df_3125"  _slug="3125" data-title="" wpoptions="true" thumbtype="" ></div><script class="df-shortcode-script" nowprocket type="application/javascript">window.option_df_3125 = {"outline":[],"autoEnableOutline":"false","autoEnableThumbnail":"false","overwritePDFOutline":"false","enableDownload":"false","direction":"1","pageSize":"1","pageMode":"1","singlePageMode":"0","source":"https:\/\/safetysupport.co.kr\/wp-content\/uploads\/2026\/04\/msds-safety-training_260424_V1.pdf","wpOptions":"true"}; if(window.DFLIP && window.DFLIP.parseBooks){window.DFLIP.parseBooks();}</script>				</div>
				<div class="elementor-element elementor-element-731c116 elementor-widget elementor-widget-html" data-id="731c116" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<div style="border:1px solid #b2cae0; border-radius:8px; padding:8px; overflow:hidden">
<!-- safetysupport_콘텐츠하단_반응형 -->
<ins class="adsbygoogle"
  style="display:block"
  data-ad-client="ca-pub-3106752057307696"
  data-ad-slot="5220315587"
  data-ad-format="auto"
  data-full-width-responsive="true"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
</div>				</div>
				<div class="elementor-element elementor-element-a43c2b8 elementor-widget elementor-widget-html" data-id="a43c2b8" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<!-- =====================================================
  섹션 구분자 - 교육일지 작성
  용도: WordPress Elementor HTML 위젯
  위치: 교육일지 콘텐츠 상단
  컬러: 딥그린 (#0D3321) 계열
====================================================== -->

<div style="
  border-radius: 12px;
  overflow: hidden;
  font-family: 'Pretendard', 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
  margin: 8px 0 20px;
">

  <!-- 상단 배너 -->
  <div style="
    background: linear-gradient(100deg, #0D3321 0%, #1a5c35 60%, #226b3f 100%);
    padding: 16px 28px;
    display: flex;
    align-items: center;
    gap: 18px;
  ">
    <!-- 아이콘 원형 -->
    <div style="
      width: 42px; height: 42px;
      background: rgba(255,255,255,0.12);
      border: 1px solid rgba(255,255,255,0.18);
      border-radius: 50%;
      display: flex; align-items: center; justify-content: center;
      flex-shrink: 0;
    ">
      <svg viewBox="0 0 24 24" style="width:19px;height:19px;fill:#a8debb;">
        <path d="M6 2h9l5 5v15a2 2 0 01-2 2H6a2 2 0 01-2-2V4a2 2 0 012-2zm0 2v16h12V8h-4V4H6zm2 8h8v1.5H8V12zm0 3h8v1.5H8V15zm0-6h4v1.5H8V9z"/>
      </svg>
    </div>

    <!-- 텍스트 -->
    <div style="display:flex; flex-direction:column; gap:3px;">
      <span style="
        font-size: 10px; font-weight: 600; letter-spacing: 0.16em;
        color: #7dc49b; text-transform: uppercase;
      ">EDUCATION LOG</span>
      <span style="
        font-size: 17px; font-weight: 700; color: #e8f5ed; letter-spacing: -0.01em;
      ">교육일지 작성</span>
    </div>

    <!-- 우측 태그 -->
    <div style="
      margin-left: auto;
      background: rgba(255,255,255,0.1);
      border: 0.5px solid rgba(255,255,255,0.22);
      color: #c5e8d0;
      font-size: 10px; font-weight: 600; letter-spacing: 0.12em;
      text-transform: uppercase;
      padding: 5px 14px;
      border-radius: 20px;
      flex-shrink: 0;
      white-space: nowrap;
    ">LOG</div>
  </div>

  <!-- 하단 서브텍스트 -->
  <div style="
    background: #f0f8f3;
    border: 0.5px solid #b8d9c4;
    border-top: none;
    border-radius: 0 0 12px 12px;
    padding: 9px 28px;
    display: flex;
    align-items: center;
    gap: 8px;
  ">
    <div style="
      width: 5px; height: 5px;
      border-radius: 50%;
      background: #3a7a50;
      flex-shrink: 0;
    "></div>
    <span style="
      font-size: 12px; color: #2d6043; font-weight: 500; letter-spacing: 0.01em;
    ">교육 실시 후 아래 양식에 교육일지를 작성하여 보관하시기 바랍니다.</span>
  </div>

</div>

				</div>
				<div class="elementor-element elementor-element-c54d12d elementor-widget elementor-widget-html" data-id="c54d12d" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>안전보건교육일지</title>
<style>
  @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap');

  :root {
    /* ════ 페이지 여백 ════ */
    --gap-page-top:            60px;
    --gap-page-side:           60px;
    --gap-page-bottom:         28px;
    --gap-page2-top:           60px;

    /* ════ 헤더 ════ */
    --gap-after-header:        5px;
    --approval-sign-height:    50px;

    /* ════ 작성일자행 ════ */
    --gap-after-writerow:      15px;

    /* ════ 섹션 간격 ════ */
    --gap-after-edutype:       20px;
    --gap-after-educount:      20px;
    --gap-after-educontent:    20px;
    --gap-after-loc:           20px;
    --gap-after-special:       10px;
    --gap-before-mini-roster:  12px;

    /* ════ 셀 높이/패딩 ════ */
    --main-cell-pad-v:         5px;
    --main-cell-pad-h:         8px;
    --educount-row-height:     26px;
    --educontent-min-height:   120px;
    --special-min-height:      60px;
    --loc-cell-pad-v:          7px;
    --mini-row-height:         25px;

    /* ════ 2페이지 ════ */
    --roster-row-height:       25px;

    /* ════ 워터마크 ════ */
    --watermark-opacity:       0.06;

    /* ════ 색상 ════ */
    --deep-green:  #0D3321;
    --light-green: #e8f5ed;
    --lighter-green: #f4faf6;
    --accent:      #3db86b;
    --border:      #888;
    --border-light:#ccc;
    --text:        #1a1a1a;
    --text-muted:  #555;

    /* ════ 테두리 두께 ════ */
    --main-border-width:       1px;
    --inner-table-border:      1px;
    --roster-divider-width:    1.5px;
  }

  * {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
  }

  body {
    font-family: 'Noto Sans KR', sans-serif;
    background: #f0f0f0;
    color: var(--text);
    font-size: 12px;
    line-height: 1.5;
  }

  #control-panel {
    background: var(--deep-green);
    color: #fff;
    padding: 10px 20px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
    position: sticky;
    top: 0;
    z-index: 100;
    box-shadow: 0 2px 8px rgba(0,0,0,0.3);
  }

  #control-panel h1 {
    font-size: 14px;
    font-weight: 700;
    white-space: nowrap;
  }

  .btn-pdf {
    background: var(--accent);
    color: #fff;
    border: none;
    padding: 8px 20px;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 700;
    cursor: pointer;
    white-space: nowrap;
    font-family: inherit;
  }

  .btn-pdf:hover { background: #2da05a; }
  .btn-pdf:disabled { opacity: 0.6; cursor: not-allowed; }

  .btn-wm {
    background: rgba(255,255,255,0.15);
    color: #fff;
    border: 1px solid rgba(255,255,255,0.35);
    padding: 7px 14px;
    border-radius: 6px;
    font-size: 12px;
    font-weight: 500;
    cursor: pointer;
    white-space: nowrap;
    font-family: inherit;
  }

  .btn-wm:hover { background: rgba(255,255,255,0.25); }

  #pw-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.55);
    z-index: 999;
    align-items: center;
    justify-content: center;
  }

  #pw-overlay.show { display: flex; }

  #pw-box {
    background: #fff;
    border-radius: 10px;
    padding: 28px 32px;
    width: 300px;
    box-shadow: 0 8px 32px rgba(0,0,0,0.25);
    text-align: center;
  }

  #pw-box h2 {
    font-size: 14px;
    font-weight: 700;
    color: var(--deep-green);
    margin-bottom: 6px;
  }

  #pw-box p {
    font-size: 11px;
    color: var(--text-muted);
    margin-bottom: 16px;
  }

  #pw-input {
    width: 100%;
    border: 1.5px solid var(--border);
    border-radius: 6px;
    padding: 8px 12px;
    font-size: 14px;
    text-align: center;
    letter-spacing: 4px;
    font-family: inherit;
    outline: none;
    margin-bottom: 6px;
  }

  #pw-input:focus { border-color: var(--accent); }

  #pw-input.error {
    border-color: #e24b4a;
    animation: shake 0.3s;
  }

  #pw-error {
    font-size: 11px;
    color: #e24b4a;
    height: 16px;
    margin-bottom: 12px;
  }

  #pw-box .pw-btns { display: flex; gap: 8px; }

  #pw-box .pw-btns button {
    flex: 1;
    padding: 8px;
    border-radius: 6px;
    font-size: 12px;
    font-weight: 700;
    cursor: pointer;
    font-family: inherit;
    border: none;
  }

  .pw-confirm { background: var(--deep-green); color: #fff; }
  .pw-cancel { background: #f0f0f0; color: var(--text); }

  @keyframes shake {
    0%,100% { transform: translateX(0); }
    25% { transform: translateX(-6px); }
    75% { transform: translateX(6px); }
  }

  #pages-wrap {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 24px;
    gap: 20px;
  }

  .a4-page {
    background: #fff;
    width: 794px;
    min-height: 1123px;
    padding: var(--gap-page-top) var(--gap-page-side) var(--gap-page-bottom);
    box-shadow: 0 2px 12px rgba(0,0,0,0.18);
    position: relative;
  }

  #page2 { padding-top: var(--gap-page2-top); }

  .watermark {
    display: none;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%) rotate(-35deg);
    font-size: 68px;
    font-weight: 700;
    color: #000;
    opacity: var(--watermark-opacity);
    white-space: nowrap;
    pointer-events: none;
    user-select: none;
    z-index: 10;
    letter-spacing: 2px;
  }

  .page-num {
    position: absolute;
    bottom: 14px;
    right: var(--gap-page-side);
    font-size: 10px;
    color: #bbb;
  }

  .doc-header {
    display: flex;
    align-items: stretch;
    border-bottom: 2.5px solid var(--deep-green);
    margin-bottom: var(--gap-after-header);
    padding-bottom: 10px;
    gap: 12px;
  }

  .doc-logo-area {
    display: flex;
    align-items: center;
    min-width: 150px;
    flex-shrink: 0;
  }

  .doc-logo-text {
    font-size: 11px;
    font-weight: 700;
    color: var(--deep-green);
    line-height: 1.5;
  }

  .doc-title-area {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
  }

  .doc-title-area .doc-title {
    font-size: 25px;
    font-weight: 700;
    color: var(--deep-green);
    letter-spacing: 1px;
  }

  .doc-title-area .doc-sub {
    font-size: 11px;
    color: var(--text-muted);
    margin-top: 3px;
  }

  .doc-approval {
    display: flex;
    align-items: stretch;
    flex-shrink: 0;
    border: var(--main-border-width) solid var(--border);
    border-radius: 3px;
    overflow: hidden;
  }

  .doc-approval .ap-cells { display: flex; align-items: stretch; }

  .doc-approval .ap-cell {
    width: 70px;
    text-align: center;
    border-left: var(--main-border-width) solid var(--border);
    display: flex;
    flex-direction: column;
  }

  .doc-approval .ap-cell:first-child { border-left: none; }

  .doc-approval .ap-cell .ap-role {
    font-size: 10px;
    font-weight: 700;
    padding: 3px 4px;
    border-bottom: var(--main-border-width) solid var(--border);
    background: var(--deep-green);
    color: #fff;
    text-align: center;
    word-break: keep-all;
    line-height: 1.4;
    flex: 1;
  }

  .doc-approval .ap-cell .ap-role[contenteditable]:focus {
    outline: 1px solid rgba(255,255,255,0.6);
    background: #1a5c35;
  }

  .doc-approval .ap-cell .ap-sign {
    flex: 1;
    min-height: var(--approval-sign-height);
    display: flex;
    align-items: flex-end;
    justify-content: center;
    font-size: 8px;
    color: #ccc;
    padding-bottom: 3px;
  }

  .write-row {
    display: flex;
    gap: 32px;
    font-size: 11px;
    color: var(--text-muted);
    padding: 5px 4px;
    border-bottom: var(--main-border-width) solid var(--border-light);
    margin-bottom: var(--gap-after-writerow);
  }

  .write-row span {
    display: flex;
    align-items: center;
    gap: 6px;
  }

  .write-row .write-val {
    border-bottom: var(--main-border-width) solid var(--border-light);
    min-width: 90px;
    outline: none;
    display: inline-block;
    color: var(--text);
    background: transparent;
  }

  .write-row .write-val:focus { background: #fffde7; }

  .main-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 12px;
    background: #fff;
  }

  .main-table th,
  .main-table td {
    border: var(--main-border-width) solid var(--border);
    vertical-align: middle;
    padding: var(--main-cell-pad-v) var(--main-cell-pad-h);
    background: #fff;
  }

  .main-table .section-row td {
    background: var(--deep-green) !important;
    color: #fff;
    font-weight: 700;
    font-size: 12px;
    padding: 5px 10px;
    letter-spacing: 0.3px;
    border-color: var(--deep-green);
  }

  .main-table .section-row td::before {
    content: '';
    display: inline-block;
    width: 3px;
    height: 11px;
    background: var(--accent);
    border-radius: 2px;
    margin-right: 7px;
    vertical-align: middle;
  }

  .main-table .row-th {
    background: var(--light-green) !important;
    color: var(--deep-green);
    font-weight: 700;
    text-align: center;
    white-space: nowrap;
    width: 52px;
    line-height: 1.4;
    font-size: 11px;
  }

  .section-label { background: var(--light-green) !important; }

  .main-table td[contenteditable] { background: #fff !important; }

  .main-table td[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 2px solid var(--accent);
    outline-offset: -2px;
  }

  /* ════ 교육내용 고정 텍스트 스타일 ════ */
  .edu-content-fixed {
    font-size: 11.5px;
    line-height: 2.0;
    color: var(--text);
    padding: 8px 10px;
    background: #fff;
    vertical-align: top;
  }

  .edu-content-fixed .edu-item {
    display: flex;
    align-items: flex-start;
    gap: 5px;
    margin-bottom: 1px;
  }

  .edu-content-fixed .edu-bullet {
    color: var(--deep-green);
    font-weight: 700;
    flex-shrink: 0;
    line-height: 2.0;
  }

  /* ════ 교육대상 화학물질 입력칸 ════ */
  .chem-input-wrap {
    padding: 8px 10px;
    background: #fff;
    vertical-align: top;
  }

  .chem-subheader {
    font-size: 10px;
    font-weight: 700;
    color: var(--deep-green);
    border-bottom: 1px solid var(--border-light);
    padding-bottom: 4px;
    margin-bottom: 6px;
    display: flex;
    align-items: center;
    gap: 5px;
  }

  .chem-subheader::before {
    content: '';
    display: inline-block;
    width: 3px;
    height: 10px;
    background: var(--accent);
    border-radius: 2px;
    flex-shrink: 0;
  }

  .chem-required-badge {
    font-size: 9px;
    background: #e74c3c;
    color: #fff;
    border-radius: 3px;
    padding: 1px 5px;
    font-weight: 700;
    margin-left: 4px;
  }

  .chem-input-area {
    width: 100%;
    min-height: 90px;
    border: 1.5px solid var(--border-light);
    border-radius: 4px;
    padding: 6px 8px;
    font-size: 11px;
    font-family: 'Noto Sans KR', sans-serif;
    color: var(--text);
    outline: none;
    resize: vertical;
    line-height: 1.7;
    background: #fff;
  }

  .chem-input-area:focus {
    border-color: var(--accent);
    background: #fffde7;
    outline: none;
  }

  .chem-notice {
    margin-top: 5px;
    font-size: 10px;
    color: #c0392b;
    line-height: 1.5;
    display: flex;
    align-items: flex-start;
    gap: 3px;
  }

  .chem-notice::before {
    content: '⚠';
    flex-shrink: 0;
    margin-top: 1px;
  }

  .edu-type-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 7px 2px;
    font-size: 11px;
    background: #fff;
  }

  .edu-type-grid label {
    display: flex;
    align-items: center;
    gap: 4px;
    cursor: pointer;
    background: #fff;
  }

  .edu-type-grid input[type="checkbox"] {
    accent-color: var(--deep-green);
    width: 12px;
    height: 12px;
    flex-shrink: 0;
  }

  .educount-row > td,
  .loc-row > td {
    vertical-align: top !important;
    padding: 0 !important;
    line-height: 0;
    font-size: 0;
    background: #fff !important;
  }

  .educount-row > th.row-th,
  .loc-row > th.row-th {
    vertical-align: middle !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
  }

  /* 교육내용행 - 두 칸이 나란히 있는 행 */
  .educontent-row > td.content-cell,
  .educontent-row > td.chem-cell {
    vertical-align: top;
    padding: 0 !important;
    line-height: 0;
    font-size: 0;
    background: #fff !important;
  }

  .educontent-row > th.row-th {
    vertical-align: middle !important;
  }

  .inw-table {
    width: 100%;
    border-collapse: collapse;
    border-spacing: 0;
    table-layout: fixed;
    font-size: 11px;
    margin: 0;
    background: #fff;
  }

  .inw-table th,
  .inw-table td {
    border: var(--inner-table-border) solid var(--border);
    text-align: center;
    padding: 3px 4px;
    height: var(--educount-row-height);
    background: transparent;
    vertical-align: middle;
  }

  .inw-table th {
    color: var(--deep-green);
    font-weight: 700;
  }

  .inw-head { background: var(--lighter-green) !important; }

  .inw-table td.row-label {
    background: #fff !important;
    font-weight: 700;
    text-align: left;
    padding-left: 18px;
    color: var(--deep-green);
  }

  .inw-label { background: var(--lighter-green) !important; }

  .inw-table td[contenteditable] { background: #fff !important; }

  .inw-table td[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
  }

  .inw-table .miss-reason {
    text-align: left;
    padding: 3px 6px;
    background: #fff !important;
  }

  .loc-table {
    width: 100%;
    border-collapse: collapse;
    border-spacing: 0;
    table-layout: fixed;
    font-size: 11px;
    margin: 0;
    background: #fff;
  }

  .loc-table th,
  .loc-table td {
    border: var(--inner-table-border) solid var(--border);
    padding: var(--loc-cell-pad-v) 8px;
    background: transparent;
    vertical-align: middle;
  }

  .loc-table th {
    color: var(--deep-green);
    font-weight: 700;
    text-align: center;
    white-space: nowrap;
    width: 14%;
  }

  .loc-label { background: var(--lighter-green) !important; }

  .loc-table td[contenteditable] { background: #fff !important; }

  .loc-table td[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
  }

  .mini-roster-wrap { margin-top: var(--gap-before-mini-roster); }

  .mini-roster-title {
    text-align: center;
    font-size: 12px;
    font-weight: 700;
    padding: 5px 10px;
    letter-spacing: 2px;
    background: var(--deep-green);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 7px;
  }

  .mini-roster-title::before {
    content: '';
    display: inline-block;
    width: 3px;
    height: 11px;
    background: var(--accent);
    border-radius: 2px;
  }

  .mini-roster-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 11px;
    table-layout: fixed;
  }

  .mini-roster-table th {
    background: var(--light-green);
    color: var(--deep-green);
    font-weight: 700;
    text-align: center;
    border: var(--main-border-width) solid var(--border);
    padding: 4px 3px;
  }

  .mini-roster-table td {
    border: var(--main-border-width) solid var(--border);
    padding: 2px 3px;
    text-align: center;
    height: var(--mini-row-height);
    vertical-align: middle;
    background: #fff;
  }

  .mini-roster-table td[contenteditable]:focus {
    background: #fffde7;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
  }

  .mini-roster-table .seq-cell {
    background: var(--light-green) !important;
    color: var(--deep-green);
    font-weight: 700;
    width: 22px;
  }

  .mini-roster-table .col-divider {
    border-right: var(--roster-divider-width) solid var(--deep-green) !important;
  }

  .page2-header {
    display: flex;
    align-items: stretch;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 12px;
    padding-bottom: 8px;
    border-bottom: 2.5px solid var(--deep-green);
  }

  .logo-text {
    font-size: 11px;
    font-weight: 700;
    color: var(--deep-green);
    line-height: 1.4;
  }

  .roster-meta {
    display: flex;
    gap: 24px;
    font-size: 11px;
    font-weight: 700;
    color: var(--text-muted);
    justify-content: center;
    margin: 12px 0 14px;
  }

  .roster-meta strong {
    font-weight: 400;
    border-bottom: var(--main-border-width) solid var(--border-light);
    min-width: 90px;
    display: inline-block;
    outline: none;
  }

  .roster-meta strong:focus { background: #fffde7; }

  .roster-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 11px;
    table-layout: fixed;
  }

  .roster-table thead th {
    background: var(--deep-green);
    color: #fff;
    font-weight: 700;
    padding: 5px 3px;
    border: var(--main-border-width) solid var(--border);
    text-align: center;
  }

  .roster-table tbody td {
    border: var(--main-border-width) solid var(--border);
    padding: 2px 3px;
    text-align: center;
    height: var(--roster-row-height);
    vertical-align: middle;
    background: #fff !important;
  }

  .roster-table tbody td[contenteditable]:focus {
    background: #fffde7 !important;
    outline: 1px solid var(--accent);
    outline-offset: -1px;
  }

  .roster-table .col-divider {
    border-right: var(--roster-divider-width) solid var(--deep-green) !important;
  }

  .legal-footer {
    margin-top: 14px;
    padding-top: 7px;
    border-top: var(--main-border-width) solid var(--border-light);
    font-size: 10px;
    color: var(--text-muted);
    line-height: 1.6;
  }

  @media print {
    body { background: #fff; }
    #control-panel { display: none; }
    #pw-overlay { display: none !important; }
    #pages-wrap { padding: 0; gap: 0; }
    .a4-page {
      box-shadow: none;
      margin: 0;
      page-break-after: always;
    }
    .chem-input-area { resize: none; }
  }
</style>
</head>
<body>

<div id="control-panel">
  <h1>📋 안전보건교육일지</h1>
  <div style="display:flex; gap:8px; align-items:center;">
    <button class="btn-wm" id="btn-wm" onclick="toggleWatermarkUI()">🔒 워터마크 ON</button>
    <button class="btn-pdf" onclick="generatePDF()">📥 PDF 저장</button>
  </div>
</div>

<div id="pw-overlay">
  <div id="pw-box">
    <h2>🔐 워터마크 해제</h2>
    <p>워터마크를 끄려면 관리자 비밀번호를<br>입력하세요.</p>
    <input type="password" id="pw-input" placeholder="비밀번호" maxlength="20"
      onkeydown="if(event.key==='Enter') confirmPW()">
    <div id="pw-error"></div>
    <div class="pw-btns">
      <button class="pw-cancel" onclick="closePW()">취소</button>
      <button class="pw-confirm" onclick="confirmPW()">확인</button>
    </div>
  </div>
</div>

<div id="pages-wrap">

<!-- ══════════════ 1페이지 ══════════════ -->
<div class="a4-page" id="page1">
<div class="watermark" id="wm-page1">산업안전지원센터㈜</div>

  <div class="doc-header">
    <div class="doc-logo-area">
      <div class="doc-logo-text">산업안전지원센터㈜<br><span style="font-weight:400; font-size:10px; color:#4a7a5a;">safetysupport.co.kr</span></div>
    </div>
    <div class="doc-title-area">
      <div class="doc-title">안전보건교육일지</div>
      <div class="doc-sub">산업안전보건법에 따른 안전보건교육 실시 확인 문서</div>
    </div>
    <div class="doc-approval">
      <div class="ap-cells">
        <div class="ap-cell">
          <div class="ap-role">담 당</div>
          <div class="ap-sign">서명</div>
        </div>
        <div class="ap-cell">
          <div class="ap-role" contenteditable="true" style="outline:none;" id="ap-role2">팀 장</div>
          <div class="ap-sign">서명</div>
        </div>
        <div class="ap-cell">
          <div class="ap-role" contenteditable="true" style="outline:none;" id="ap-role3">대 표</div>
          <div class="ap-sign">서명</div>
        </div>
      </div>
    </div>
  </div>

  <div class="write-row">
    <span>작성일자 : <span class="write-val" contenteditable="true" id="f-write-date"></span></span>
    <span>작성자 : <span class="write-val" contenteditable="true" id="f-writer" style="min-width:60px;"></span></span>
  </div>

  <table class="main-table">

    <!-- 교육 구분 -->
    <tr class="section-row"><td colspan="4">교육 구분</td></tr>
    <tr>
      <th class="row-th section-label">교육<br>구분</th>
      <td colspan="3" style="padding:8px 12px; background:#fff;">
        <div class="edu-type-grid">
          <label><input type="checkbox" name="edutype" value="정기교육"> 정기교육</label>
          <label><input type="checkbox" name="edutype" value="채용시교육"> 채용 시 교육</label>
          <label><input type="checkbox" name="edutype" value="작업내용변경"> 작업내용 변경시의 교육</label>
          <label><input type="checkbox" name="edutype" value="특별교육"> 특별교육</label>
          <label><input type="checkbox" name="edutype" value="물질안전보건자료교육" id="cb-msds"> 물질안전보건자료 교육</label>
          <div style="display:flex; align-items:center; gap:4px; font-size:11px; background:#fff;">
            <input type="checkbox" name="edutype" value="기타" id="cb-etc">
            <label for="cb-etc">기 타 (</label><span id="etc-input" contenteditable="true"
              style="min-width:30px; display:inline-block; outline:none; border-bottom:1px solid #ccc; background:#fff;"></span><span>) 교육</span>
          </div>
        </div>
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-edutype); border:none; background:#fff;"></td></tr>

    <!-- 교육 인원 -->
    <tr class="section-row"><td colspan="4">교육 인원</td></tr>
    <tr class="educount-row">
      <th class="row-th section-label">교육<br>인원</th>
      <td colspan="3" style="padding:0; line-height:0; font-size:0; vertical-align:top; background:#fff;">
        <table class="inw-table">
          <thead>
            <tr>
              <th class="inw-head" style="width:22%;">구분</th>
              <th class="inw-head" style="width:10%;">계</th>
              <th class="inw-head" style="width:10%;">남</th>
              <th class="inw-head" style="width:10%;">여</th>
              <th class="inw-head">교육미실시 사유</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td class="row-label inw-label">교육 대상자 수</td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td class="miss-reason" contenteditable="true" rowspan="3"></td>
            </tr>
            <tr>
              <td class="row-label inw-label">참석 인원</td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
            </tr>
            <tr>
              <td class="row-label inw-label">교육미실시자수</td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
              <td contenteditable="true"></td>
            </tr>
          </tbody>
        </table>
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-educount); border:none; background:#fff;"></td></tr>

    <!-- 교육 내용 + 교육대상 화학물질 -->
    <tr class="section-row"><td colspan="4">교육 내용 및 교육대상 화학물질</td></tr>
    <tr class="educontent-row">
      <th class="row-th section-label" style="vertical-align:middle;">교육<br>내용</th>

      <!-- 교육내용: 고정 텍스트 (편집 불가) -->
      <td class="content-cell" style="width:50%; vertical-align:top; padding:0; background:#fff; line-height:normal; font-size:12px;">
        <div class="edu-content-fixed">
          <div class="edu-item"><span class="edu-bullet">○</span><span>대상화학물질의 명칭(또는 제품명)</span></div>
          <div class="edu-item"><span class="edu-bullet">○</span><span>물리적 위험성 및 건강 유해성</span></div>
          <div class="edu-item"><span class="edu-bullet">○</span><span>취급상의 주의사항</span></div>
          <div class="edu-item"><span class="edu-bullet">○</span><span>적절한 보호구</span></div>
          <div class="edu-item"><span class="edu-bullet">○</span><span>응급조치 요령 및 사고 시 대처방법</span></div>
          <div class="edu-item"><span class="edu-bullet">○</span><span>물질안전보건자료 및 경고표지를 이해하는 방법</span></div>
        </div>
      </td>

      <!-- 교육대상 화학물질: 사용자 입력 -->
      <td class="chem-cell" style="width:calc(50% - 52px); vertical-align:top; padding:0; background:#fff; line-height:normal; font-size:12px;" colspan="2">
        <div class="chem-input-wrap" style="height:100%; min-height:var(--educontent-min-height);">
          <div class="chem-subheader">
            교육대상 화학물질
            <span class="chem-required-badge">직접 입력</span>
          </div>
          <textarea class="chem-input-area" id="f-chem-list"
            placeholder="취급하는 화학물질의 정확한 명칭을 입력하세요.&#10;&#10;예) AC-4599(절삭유), 에탄올 80%, 00방청유,&#10;    00크리너, IPA 등&#10;&#10;※ 제품명·농도 등을 MSDS와 동일하게 기재"></textarea>
          <div class="chem-notice">화학물질명은 MSDS(물질안전보건자료)에 기재된 명칭과 동일하게 입력하십시오.</div>
        </div>
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-educontent); border:none; background:#fff;"></td></tr>

    <!-- 교육실시자 및 장소 -->
    <tr class="section-row"><td colspan="4">교육실시자 및 장소</td></tr>
    <tr class="loc-row">
      <th class="row-th section-label" style="white-space:nowrap; font-size:10px; line-height:1.5;">교육실시자<br>및 장소</th>
      <td colspan="3" style="padding:0; line-height:0; font-size:0; vertical-align:top; background:#fff;">
        <table class="loc-table">
          <tr>
            <th class="loc-label">교육실시자</th>
            <td contenteditable="true" id="f-instructor"></td>
            <th class="loc-label">교육일시</th>
            <td contenteditable="true" id="f-date"></td>
          </tr>
          <tr>
            <th class="loc-label">교육시간</th>
            <td contenteditable="true" id="f-hours"></td>
            <th class="loc-label">교육장소</th>
            <td contenteditable="true" id="f-place"></td>
          </tr>
        </table>
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-loc); border:none; background:#fff;"></td></tr>

    <!-- 특기사항 -->
    <tr class="section-row"><td colspan="4">특기사항</td></tr>
    <tr>
      <th class="row-th section-label">특기<br>사항</th>
      <td colspan="3" contenteditable="true" id="f-remark"
        style="height:var(--special-min-height); vertical-align:top; padding:7px 10px; background:#fff;">
      </td>
    </tr>
    <tr><td colspan="4" style="padding:0; height:var(--gap-after-special); border:none; background:#fff;"></td></tr>

  </table>

  <!-- 참석자 명단 (8칸) -->
  <div class="mini-roster-wrap">
    <div class="mini-roster-title">참석자 명단</div>
    <table class="mini-roster-table">
      <thead>
        <tr>
          <th style="width:22px;">No</th>
          <th>직 책</th>
          <th>성 명</th>
          <th class="col-divider">서 명</th>
          <th style="width:22px;">No</th>
          <th>직 책</th>
          <th>성 명</th>
          <th>서 명</th>
        </tr>
      </thead>
      <tbody id="mini-roster-body"></tbody>
    </table>
  </div>

  <div class="page-num">1 / 2</div>
</div>

<!-- ══════════════ 2페이지 ══════════════ -->
<div class="a4-page" id="page2">
<div class="watermark" id="wm-page2">산업안전지원센터㈜</div>

  <div class="page2-header">
    <div style="display:flex; align-items:center; gap:8px; min-width:140px;">
      <div class="logo-text">산업안전지원센터㈜<br><span style="font-weight:400; font-size:10px;">safetysupport.co.kr</span></div>
    </div>
    <div style="flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center;">
      <div style="font-size:16px; font-weight:700; color:var(--deep-green);">교육 참석자 명단</div>
      <div style="font-size:11px; color:var(--text-muted); margin-top:2px;">안전보건교육 수강 확인 서명부</div>
    </div>
    <div style="min-width:140px;"></div>
  </div>

  <div class="roster-meta">
    <span>교육일시:&nbsp;<strong contenteditable="true" id="r-date"></strong></span>
    <span>교육장소:&nbsp;<strong contenteditable="true" id="r-place"></strong></span>
    <span>참석인원:&nbsp;<strong contenteditable="true" id="r-count"></strong></span>
  </div>

  <table class="roster-table">
    <thead>
      <tr>
        <th style="width:14%;">소속/부서</th>
        <th style="width:10%;">직위</th>
        <th style="width:11%;">성명</th>
        <th class="col-divider" style="width:15%;">서명</th>
        <th style="width:14%;">소속/부서</th>
        <th style="width:10%;">직위</th>
        <th style="width:11%;">성명</th>
        <th style="width:15%;">서명</th>
      </tr>
    </thead>
    <tbody id="roster-body"></tbody>
  </table>

  <div class="legal-footer">
    본 교육일지는 「산업안전보건법」 제29조(근로자에 대한 안전보건교육) 및 동법 시행규칙 제26조에 따른 안전보건교육 실시 확인 목적으로 작성되었으며, 3년간 보존하여야 합니다.
  </div>

  <div class="page-num">2 / 2</div>
</div>

</div><!-- /pages-wrap -->

<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script>
/* ── 참석자 명단 (8칸 = 4행 × 2열) ── */
(function buildMiniRoster() {
  var tbody = document.getElementById('mini-roster-body');
  for (var i = 0; i < 4; i++) {
    var n1 = i + 1, n2 = i + 5;
    var tr = document.createElement('tr');
    tr.innerHTML =
      '<td class="seq-cell">' + n1 + '</td>' +
      '<td contenteditable="true"></td>' +
      '<td contenteditable="true"></td>' +
      '<td class="col-divider"></td>' +
      '<td class="seq-cell">' + n2 + '</td>' +
      '<td contenteditable="true"></td>' +
      '<td contenteditable="true"></td>' +
      '<td></td>';
    tbody.appendChild(tr);
  }
})();

/* ── 2페이지 명단 (30행) ── */
(function buildRoster() {
  var tbody = document.getElementById('roster-body');
  for (var i = 0; i < 30; i++) {
    var tr = document.createElement('tr');
    tr.innerHTML =
      '<td contenteditable="true" style="font-size:11px;"></td>' +
      '<td contenteditable="true" style="font-size:11px;"></td>' +
      '<td contenteditable="true" style="font-size:11px;"></td>' +
      '<td class="col-divider"></td>' +
      '<td contenteditable="true" style="font-size:11px;"></td>' +
      '<td contenteditable="true" style="font-size:11px;"></td>' +
      '<td contenteditable="true" style="font-size:11px;"></td>' +
      '<td></td>';
    tbody.appendChild(tr);
  }
})();

/* ── 오늘 날짜 자동 입력 ── */
(function setToday() {
  var d = new Date();
  var str = d.getFullYear() + '년 ' + (d.getMonth()+1) + '월 ' + d.getDate() + '일';
  ['f-date','f-write-date','r-date'].forEach(function(id) {
    var el = document.getElementById(id);
    if (el && !el.textContent.trim()) el.textContent = str;
  });
})();

/* ── 교육일시/장소 동기화 ── */
document.getElementById('f-date').addEventListener('input', function() {
  document.getElementById('r-date').textContent = this.textContent.trim();
});
document.getElementById('f-place').addEventListener('input', function() {
  document.getElementById('r-place').textContent = this.textContent.trim();
});

/* ══ 워터마크 ══ */
var WM_PASSWORD = 'ossc01432';
var wmOn = true;

function toggleWatermark(show) {
  document.querySelectorAll('.watermark').forEach(function(el) {
    el.style.display = show ? 'block' : 'none';
  });
}
toggleWatermark(true);

function toggleWatermarkUI() {
  if (wmOn) {
    openPW();
  } else {
    wmOn = true;
    toggleWatermark(true);
    document.getElementById('btn-wm').textContent = '🔒 워터마크 ON';
  }
}

function openPW() {
  document.getElementById('pw-input').value = '';
  document.getElementById('pw-error').textContent = '';
  document.getElementById('pw-input').classList.remove('error');
  document.getElementById('pw-overlay').classList.add('show');
  setTimeout(function() { document.getElementById('pw-input').focus(); }, 50);
}

function closePW() {
  document.getElementById('pw-overlay').classList.remove('show');
}

function confirmPW() {
  var val = document.getElementById('pw-input').value;
  if (val === WM_PASSWORD) {
    closePW();
    wmOn = false;
    toggleWatermark(false);
    document.getElementById('btn-wm').textContent = '🔓 워터마크 OFF';
  } else {
    var inp = document.getElementById('pw-input');
    inp.classList.remove('error');
    void inp.offsetWidth;
    inp.classList.add('error');
    document.getElementById('pw-error').textContent = '비밀번호가 올바르지 않습니다.';
    inp.value = '';
    inp.focus();
  }
}

/* ══ 교육구분 텍스트 추출 (PDF용) ══ */
function buildEduTypeText() {
  var checked = document.querySelectorAll('input[name="edutype"]:checked');
  return Array.from(checked).map(function(c) {
    if (c.value === '기타') {
      var etc = document.getElementById('etc-input').textContent;
      return '■ 기타(' + (etc || '') + ')교육';
    }
    return '■ ' + c.value;
  }).join('  ') || '(선택 없음)';
}

/* ══ PDF 저장 ══ */
async function generatePDF() {
  var btn = document.querySelector('.btn-pdf');
  btn.disabled = true;
  btn.textContent = '생성 중…';

  /* 교육구분 체크박스 → 텍스트 치환 */
  var gridEl = document.querySelector('.edu-type-grid');
  var txtEl = document.createElement('span');
  txtEl.style.fontSize = '11px';
  txtEl.textContent = buildEduTypeText();
  gridEl.parentNode.insertBefore(txtEl, gridEl);
  gridEl.style.display = 'none';

  /* textarea → div 치환 (html2canvas textarea 렌더링 보정) */
  var chemTA = document.getElementById('f-chem-list');
  var chemDiv = document.createElement('div');
  chemDiv.className = 'chem-input-area';
  chemDiv.style.resize = 'none';
  chemDiv.style.whiteSpace = 'pre-wrap';
  chemDiv.style.overflow = 'hidden';
  chemDiv.textContent = chemTA.value;
  chemTA.parentNode.insertBefore(chemDiv, chemTA);
  chemTA.style.display = 'none';

  try {
    var jsPDF = window.jspdf.jsPDF;
    var pdf = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });
    var pages = ['page1', 'page2'];

    for (var i = 0; i < pages.length; i++) {
      var cvs = await html2canvas(document.getElementById(pages[i]), {
        scale: 2,
        useCORS: true,
        backgroundColor: '#ffffff',
        logging: false
      });
      if (i > 0) pdf.addPage();
      pdf.addImage(cvs.toDataURL('image/jpeg', 0.95), 'JPEG', 0, 0, 210, 297);
    }

    var today = new Date();
    var ds = today.getFullYear() +
      String(today.getMonth()+1).padStart(2,'0') +
      String(today.getDate()).padStart(2,'0');

    pdf.save('안전보건교육일지_' + ds + '.pdf');
  } catch(e) {
    alert('PDF 생성 오류: ' + e.message);
  } finally {
    gridEl.style.display = '';
    txtEl.remove();
    chemTA.style.display = '';
    chemDiv.remove();
    btn.disabled = false;
    btn.textContent = '📥 PDF 저장';
  }
}
</script>
</body>
</html>				</div>
				<div class="elementor-element elementor-element-8836766 elementor-widget elementor-widget-html" data-id="8836766" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
					<div style="border:1px solid #b2cae0; border-radius:8px; padding:8px; overflow:hidden">
<!-- safetysupport_콘텐츠하단_반응형 -->
<ins class="adsbygoogle"
  style="display:block"
  data-ad-client="ca-pub-3106752057307696"
  data-ad-slot="5220315587"
  data-ad-format="auto"
  data-full-width-responsive="true"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
</div>				</div>
				</div>
				</div>
		]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
