Refactor background.js and content.js for improved text selection and context menu handling; update Supabase URLs in multiple files; enhance UI elements in zzim.html; add new features for managing zzim operations and user settings.

This commit is contained in:
9700X_PC 2025-11-27 15:02:01 +09:00
parent 62a95c6fcc
commit b25d85099b
12 changed files with 4338 additions and 360 deletions

File diff suppressed because it is too large Load Diff

View File

@ -95,8 +95,8 @@ class BannedWordsManager {
});
// 기본값 설정
this.SUPABASE_URL = storageData.SUPABASE_URL || 'http://146.56.101.199:8000';
this.SUPABASE_ANON_KEY = storageData.SUPABASE_ANON_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE';
this.SUPABASE_URL = storageData.SUPABASE_URL || 'https://ko.wrmc.cc';
this.SUPABASE_ANON_KEY = storageData.SUPABASE_ANON_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU';
this.ACCESS_TOKEN = storageData.access_token;
}

File diff suppressed because it is too large Load Diff

View File

@ -11,11 +11,12 @@
"notifications",
"alarms",
"tabs",
"scripting"
"scripting",
"clipboardRead"
],
"host_permissions": [
"*://markinfo.kr/*",
"http://146.56.101.199:8000/*",
"https://ko.wrmc.cc/*",
"https://oci1ckh08045.duckdns.org:8000/*",
"*://smartstore.naver.com/*",
"*://translate.googleapis.com/*",
@ -59,6 +60,12 @@
"default": "Ctrl+Shift+Z"
},
"description": "한국어↔중국어 양방향 번역"
},
"direct-translate": {
"suggested_key": {
"default": "Ctrl+Shift+K"
},
"description": "직번역 (텍스트 바로 대체)"
}
},
"web_accessible_resources": [

View File

@ -427,7 +427,8 @@
<button class="btn management-btn" id="settings-btn">⚙️ 설정</button>
<button class="btn management-btn" id="banned-words-btn">🚫 금지어 관리</button>
<button class="btn management-btn" id="sayings-btn">💬 타냐대장경</button>
<button class="btn management-btn" id="zzim-btn" disabled>💝 찜관리</button>
<!-- <button class="btn management-btn" id="zzim-btn" disabled>💝 찜관리</button> -->
<button class="btn management-btn" id="zzim-btn">💝 찜관리</button>
<button class="btn management-btn" id="manual-btn">📚 매뉴얼</button>
</div>

View File

@ -24,8 +24,8 @@ async function getBackendConfig() {
// 폴백 설정
const fallbackConfig = {
SUPABASE_URL: "http://146.56.101.199:8000",
SUPABASE_ANON_KEY: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE"
SUPABASE_URL: "https://ko.wrmc.cc",
SUPABASE_ANON_KEY: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU"
};
console.log('[popup.js] 폴백 설정:', fallbackConfig);
@ -34,8 +34,8 @@ async function getBackendConfig() {
}
// 디버그 모드 플래그 (개발 시에만 true로 설정)
// const DEBUG_MODE = true; // false로 설정하면 디버그 정보 숨김
const DEBUG_MODE = false; // false로 설정하면 디버그 정보 숨김
const DEBUG_MODE = true; // false로 설정하면 디버그 정보 숨김
// const DEBUG_MODE = false; // false로 설정하면 디버그 정보 숨김
// 로그 레벨 정의
const LOG_LEVELS = {

View File

@ -93,8 +93,8 @@ class RestModal {
throw new Error('Access token not found');
}
const SUPABASE_URL = this.config.SUPABASE_URL || "http://146.56.101.199:8000";
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE";
const SUPABASE_URL = this.config.SUPABASE_URL || "https://ko.wrmc.cc";
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU";
// public.events 테이블에서 event_type이 'rest_time'인 데이터 가져오기
const apiUrl = `${SUPABASE_URL}/rest/v1/events?select=message&event_type=eq.rest_time&order=created_at.desc&limit=50`;
@ -170,8 +170,8 @@ class RestModal {
throw new Error('Access token not found');
}
const SUPABASE_URL = this.config.SUPABASE_URL || "http://146.56.101.199:8000";
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE";
const SUPABASE_URL = this.config.SUPABASE_URL || "https://ko.wrmc.cc";
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU";
// 최근 1달 이내의 승인된 어록 가져오기
const oneMonthAgo = new Date();

View File

@ -67,8 +67,8 @@ class SayingsManager {
});
// 기본값 설정
this.SUPABASE_URL = storageData.SUPABASE_URL || 'http://146.56.101.199:8000';
this.SUPABASE_ANON_KEY = storageData.SUPABASE_ANON_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE';
this.SUPABASE_URL = storageData.SUPABASE_URL || 'https://ko.wrmc.cc';
this.SUPABASE_ANON_KEY = storageData.SUPABASE_ANON_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU';
this.ACCESS_TOKEN = storageData.access_token;
}

View File

@ -116,8 +116,8 @@ class SettingsManager {
return;
}
const SUPABASE_URL = this.config.SUPABASE_URL || "http://146.56.101.199:8000";
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ey AgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE";
const SUPABASE_URL = this.config.SUPABASE_URL || "https://ko.wrmc.cc";
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU";
console.log('Supabase URL:', SUPABASE_URL);
console.log('토큰 존재 여부:', !!this.config.ACCESS_TOKEN);

View File

@ -140,45 +140,162 @@
}
.market-item {
border: 1px solid #ddd;
border-radius: 6px;
padding: 15px;
margin-bottom: 10px;
background: #f9f9f9;
border: 1px solid #e1e8ed;
border-radius: 12px;
padding: 20px;
margin-bottom: 15px;
background: white;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.market-item:hover {
transform: translateY(-2px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
border-color: #667eea;
}
.market-item::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(90deg, #667eea, #764ba2);
opacity: 0;
transition: opacity 0.3s ease;
}
.market-item:hover::before {
opacity: 1;
}
.market-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 15px;
}
.market-checkbox {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 10px;
}
.market-checkbox-input {
width: 18px;
height: 18px;
accent-color: #667eea;
cursor: pointer;
}
.market-checkbox-label {
font-size: 14px;
font-weight: 600;
color: #2c3e50;
cursor: pointer;
user-select: none;
}
.market-info {
flex: 1;
margin: 0 15px;
}
.market-name {
font-weight: bold;
color: #2c3e50;
margin-bottom: 5px;
font-size: 16px;
}
.market-nickname {
color: #666;
font-size: 12px;
margin-bottom: 5px;
font-size: 14px;
margin-bottom: 8px;
font-weight: 500;
}
.market-url {
color: #888;
font-size: 12px;
word-break: break-all;
background: #f8f9fa;
padding: 6px 10px;
border-radius: 6px;
border: 1px solid #e1e8ed;
margin-bottom: 10px;
font-family: 'Courier New', monospace;
}
.market-stats {
display: flex;
gap: 15px;
flex-wrap: wrap;
align-items: center;
}
.zzim-count {
font-size: 12px;
color: #666;
background: #e8f4f8;
padding: 4px 8px;
border-radius: 12px;
font-weight: 500;
}
.visibility-status {
font-size: 12px;
padding: 4px 10px;
border-radius: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.visibility-status.visible {
background: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
}
.visibility-status.hidden {
background: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
}
.created-date {
font-size: 12px;
color: #888;
background: #f8f9fa;
padding: 4px 8px;
border-radius: 12px;
}
.market-actions {
display: flex;
gap: 5px;
gap: 8px;
flex-direction: column;
}
.market-actions .btn {
padding: 8px 12px;
font-size: 12px;
border-radius: 6px;
min-width: 70px;
font-weight: 600;
transition: all 0.2s ease;
}
.market-actions .btn:hover {
transform: translateY(-1px);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.action-buttons {
@ -222,6 +339,257 @@
border-radius: 0 4px 4px 0 !important;
border-left: none !important;
}
/* 모달 스타일 */
.modal {
display: none;
position: fixed;
z-index: 1000;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(3px);
animation: fadeIn 0.3s ease;
}
.modal-content {
background-color: white;
margin: 5% auto;
padding: 0;
border: none;
border-radius: 12px;
width: 90%;
max-width: 500px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
animation: slideIn 0.3s ease;
overflow: hidden;
}
.modal-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px 25px;
border-bottom: none;
position: relative;
}
.modal-title {
margin: 0;
font-size: 20px;
font-weight: 600;
display: flex;
align-items: center;
gap: 10px;
}
.modal-close {
position: absolute;
right: 20px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
color: white;
font-size: 24px;
cursor: pointer;
width: 30px;
height: 30px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
transition: background-color 0.2s;
}
.modal-close:hover {
background-color: rgba(255, 255, 255, 0.2);
}
.modal-body {
padding: 25px;
}
.form-group {
margin-bottom: 20px;
}
.form-label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #2c3e50;
font-size: 14px;
}
.form-input {
width: 100%;
padding: 12px 15px;
border: 2px solid #e1e8ed;
border-radius: 8px;
font-size: 14px;
transition: all 0.3s ease;
box-sizing: border-box;
}
.form-input:focus {
outline: none;
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}
.form-textarea {
min-height: 80px;
resize: vertical;
font-family: inherit;
}
.modal-footer {
padding: 20px 25px;
border-top: 1px solid #e1e8ed;
display: flex;
justify-content: flex-end;
gap: 10px;
background-color: #f8f9fa;
}
.btn-modal {
padding: 10px 20px;
border: none;
border-radius: 6px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
min-width: 80px;
}
.btn-modal-cancel {
background-color: #6c757d;
color: white;
}
.btn-modal-cancel:hover {
background-color: #5a6268;
}
.btn-modal-save {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.btn-modal-save:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
}
.btn-modal-save:disabled {
background: #cccccc;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(-50px) scale(0.9);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
/* 체크박스 스타일링 */
.checkbox-container {
display: flex;
align-items: center;
gap: 10px;
margin-top: 15px;
padding: 15px;
background: #f8f9fa;
border-radius: 8px;
border: 2px solid #e1e8ed;
transition: border-color 0.3s ease;
}
.checkbox-container:hover {
border-color: #667eea;
}
.custom-checkbox {
position: relative;
display: inline-block;
width: 20px;
height: 20px;
}
.custom-checkbox input {
opacity: 0;
width: 0;
height: 0;
}
.checkbox-checkmark {
position: absolute;
top: 0;
left: 0;
height: 20px;
width: 20px;
background-color: white;
border: 2px solid #ddd;
border-radius: 4px;
transition: all 0.3s ease;
}
.custom-checkbox:hover input ~ .checkbox-checkmark {
border-color: #667eea;
}
.custom-checkbox input:checked ~ .checkbox-checkmark {
background-color: #667eea;
border-color: #667eea;
}
.checkbox-checkmark:after {
content: "";
position: absolute;
display: none;
}
.custom-checkbox input:checked ~ .checkbox-checkmark:after {
display: block;
}
.custom-checkbox .checkbox-checkmark:after {
left: 6px;
top: 2px;
width: 6px;
height: 10px;
border: solid white;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
}
.checkbox-label {
font-weight: 600;
color: #2c3e50;
cursor: pointer;
user-select: none;
}
.checkbox-description {
font-size: 12px;
color: #666;
margin-top: 5px;
}
</style>
</head>
<body>
@ -268,8 +636,65 @@
<div class="section">
<div class="section-title">
🎯 찜하기 작업
💝 찜하기 작업
</div>
<!-- 백그라운드 실행 옵션 추가 -->
<div style="margin-bottom: 20px; padding: 15px; background: #f8f9fa; border-radius: 6px;">
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<input type="checkbox" id="background-mode" style="transform: scale(1.2);">
<span style="font-weight: bold; color: #2c3e50;">🔄 백그라운드 모드</span>
</label>
<div style="font-size: 12px; color: #666; margin-top: 5px; margin-left: 25px;">
체크하면 새 탭에서 백그라운드로 찜하기를 실행합니다.
</div>
</div>
<!-- 찜하기 옵션 설정 -->
<div style="margin-bottom: 20px; padding: 20px; background: #f8f9fa; border-radius: 8px; border: 2px solid #e1e8ed;">
<h4 style="margin: 0 0 15px 0; color: #2c3e50; font-size: 16px;">⚙️ 찜하기 옵션</h4>
<!-- 찜하기 속도 설정 -->
<div style="margin-bottom: 15px;">
<label style="display: block; margin-bottom: 8px; font-weight: 600; color: #2c3e50; font-size: 14px;">
⏱️ 찜하기 속도 (찜 간격)
</label>
<div style="display: flex; align-items: center; gap: 10px; flex-wrap: wrap;">
<div style="display: flex; align-items: center; gap: 5px;">
<span style="font-size: 12px; color: #666;">기본 간격:</span>
<input type="number" id="base-delay" value="1000" min="1000" max="5000" step="100"
style="width: 80px; padding: 4px 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 12px;"
disabled>
<span style="font-size: 12px; color: #666;">ms</span>
</div>
<div style="display: flex; align-items: center; gap: 5px;">
<span style="font-size: 12px; color: #666;">+ 추가 간격:</span>
<input type="number" id="user-delay" value="0" min="0" max="9000" step="100"
style="width: 80px; padding: 4px 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 12px;">
<span style="font-size: 12px; color: #666;">ms</span>
</div>
<div style="display: flex; align-items: center; gap: 5px;">
<span style="font-size: 12px; color: #666;">= 총 간격:</span>
<span id="total-delay" style="font-weight: bold; color: #667eea;">1000ms</span>
</div>
</div>
<div style="font-size: 11px; color: #888; margin-top: 5px;">
💡 찜과 찜 사이의 대기 시간을 설정합니다. (1초~10초)
</div>
</div>
<!-- 최신상품 우선 찜하기 옵션 -->
<div style="margin-bottom: 10px;">
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<input type="checkbox" id="latest-first" style="transform: scale(1.2);">
<span style="font-weight: 600; color: #2c3e50;">🆕 최신상품 우선 찜하기</span>
</label>
<div style="font-size: 12px; color: #666; margin-top: 5px; margin-left: 25px;">
체크하면 전체상품(/category/ALL) 대신 최신상품(/best)부터 찜합니다.
</div>
</div>
</div>
<div class="action-buttons">
<button class="btn btn-success btn-large" id="my-market-zzim-btn">
💝 내 마켓 찜하기
@ -277,12 +702,78 @@
<button class="btn btn-warning btn-large" id="mutual-zzim-btn">
🤝 품앗이 찜하기
</button>
<button class="btn btn-danger btn-large" id="stop-zzim-btn" style="display: none;">
⏹️ 찜하기 중단
</button>
</div>
<!-- 진행률 표시 -->
<div id="zzim-progress" style="display: none; margin: 20px 0;">
<div style="display: flex; justify-content: space-between; margin-bottom: 5px;">
<span id="progress-text">진행 중...</span>
<span id="progress-percent">0%</span>
</div>
<div style="width: 100%; height: 8px; background: #e0e0e0; border-radius: 4px; overflow: hidden;">
<div id="progress-bar" style="height: 100%; background: #3498db; width: 0%; transition: width 0.3s ease;"></div>
</div>
</div>
<div id="zzim-status" class="loading" style="display: none;"></div>
<div id="zzim-error" class="error" style="display: none;"></div>
<div id="zzim-success" class="success" style="display: none;"></div>
</div>
<script src="zzim.js"></script>
<!-- 마켓 수정 모달 -->
<div id="edit-market-modal" class="modal">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title">
✏️ 마켓 정보 수정
</h3>
<button class="modal-close" id="modal-close-btn">&times;</button>
</div>
<div class="modal-body">
<div class="form-group">
<label class="form-label">마켓 URL</label>
<input type="text" id="edit-market-url" class="form-input" placeholder="https://smartstore.naver.com/your-store">
</div>
<div class="form-group">
<label class="form-label">마켓 이름</label>
<input type="text" id="edit-market-name" class="form-input" placeholder="마켓 이름을 입력하세요">
</div>
<div class="form-group">
<label class="form-label">마켓 별명</label>
<input type="text" id="edit-market-nickname" class="form-input" placeholder="마켓 별명을 입력하세요">
</div>
<div class="checkbox-container">
<label class="custom-checkbox">
<input type="checkbox" id="edit-market-for-zzim">
<span class="checkbox-checkmark"></span>
</label>
<div>
<label class="checkbox-label" for="edit-market-for-zzim">내가 찜하기 할 때 포함</label>
<div class="checkbox-description">체크하면 내 마켓 찜하기 작업 시 이 마켓이 포함됩니다.</div>
</div>
</div>
<div class="checkbox-container">
<label class="custom-checkbox">
<input type="checkbox" id="edit-market-visible">
<span class="checkbox-checkmark"></span>
</label>
<div>
<label class="checkbox-label" for="edit-market-visible">다른 사람에게 노출</label>
<div class="checkbox-description">체크하면 품앗이 찜하기에서 다른 사람들이 이 마켓을 찜할 수 있습니다.</div>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn-modal btn-modal-cancel" id="modal-cancel-btn">취소</button>
<button class="btn-modal btn-modal-save" id="modal-save-btn">저장</button>
</div>
</div>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

1
패킹.md Normal file
View File

@ -0,0 +1 @@
pyinstaller --onefile --windowed --add-data "wrmc_ext;wrmc_ext" --name "ExtensionInstaller" main.py