[Claude Code Desktop 자동 설치 환경]
- setup/CLAUDE.md: 트리거 키워드 + 설치 패키지 설명
- setup/.claude/skills/guardia-install/SKILL.md: 6단계 설치 오케스트레이터
Phase 0: 의도 파악 → Phase 1: OS 감지 → Phase 2: 사전 확인
Phase 3: 설치 실행 → Phase 4: 라이선스 발급 → Phase 5: 검증 → Phase 6: 완료보고
[통합 자동 설치 스크립트]
- setup/install_auto.sh: Linux 통합 (OS 자동 감지 ubuntu/centos/rhel)
- --license trial30|trial7|<key> 파라미터
- 설치 완료 후 GUARDiA 자동 실행 + 브라우저 자동 열기
- --test 검증 모드
- setup/install_auto.ps1: Windows 통합 (ASCII 전용, PS 5.1 호환)
- 설치 후 NSSM 서비스 자동 시작 + 브라우저 자동 열기
- -Test 파라미터로 검증 전용 실행
[라이선스 엔진 개선]
- core/license.py: generate_trial_key(days=None) 파라미터 추가
- TRIAL_DURATION_DAYS = TRIAL_DURATION_DAYS 환경변수로 조정 가능
- routers/license.py: TrialRequest.days 필드 + 30일 체험판 지원
POST /api/license/trial {"days": 30} 로 30일 발급
사용자 경험:
1. setup/ 폴더를 새 PC에 복사
2. Claude Code Desktop 열고 해당 폴더 open
3. "GUARDiA 시스템 1달 사용자로 설치해 줘" 입력
4. 자동으로 OS 감지 → 설치 → 30일 라이선스 → 브라우저 열림
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
200 lines
8.4 KiB
HTML
200 lines
8.4 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<head>
|
|
|
|
<meta charset="UTF-8">
|
|
<meta name="robots" content="index,follow">
|
|
<meta name="mobile-web-app-capable" content="yes">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
|
<meta name="description" content="A javascript class that animates a numerical value by counting to it.">
|
|
|
|
<title>CountUp.js</title>
|
|
|
|
<link rel="stylesheet" type="text/css" href="https://inorganik.github.io/assets/css/style.css">
|
|
<style>
|
|
h1.jumbo {
|
|
line-height: 200px;
|
|
}
|
|
.dot-matrix {
|
|
background-image:radial-gradient(circle, #898989 1px, transparent 1px);
|
|
background-size:1em 1em;
|
|
}
|
|
[type="button"].indigo {
|
|
background-color: #4d63bc ;
|
|
color: #fff;
|
|
}
|
|
@media (prefers-color-scheme: dark) {
|
|
[type="button"].indigo {
|
|
background-color: #6e90da;
|
|
}
|
|
}
|
|
</style>
|
|
|
|
<script src="demo/demo.js" type="module"></script>
|
|
<script nomodule src="dist/countUp.umd.js"></script>
|
|
<script nomodule src="demo/demo-nomodule.js"></script>
|
|
|
|
<!-- Google tag (gtag.js) -->
|
|
<script async src="https://www.googletagmanager.com/gtag/js?id=G-QXSCCPQ13N"></script>
|
|
<script>
|
|
window.dataLayer = window.dataLayer || [];
|
|
function gtag(){dataLayer.push(arguments);}
|
|
gtag('js', new Date());
|
|
|
|
gtag('config', 'G-QXSCCPQ13N');
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
<a class="forkMe" href="https://github.com/inorganik/CountUp.js"><img src="https://inorganik.github.io/assets/img/forkme_custom_indigo.png" alt="Fork me on GitHub"></a>
|
|
<div id="wrap">
|
|
<header>
|
|
<div id="github"><a class="block" href="https://inorganik.github.io"></a></div>
|
|
<div class="leaderLine">////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</div>
|
|
<div id="logo"><a class="block" href="https://inorganik.net" alt="inorganik produce, inc"></a></div>
|
|
</header>
|
|
<section>
|
|
<div class="col full">
|
|
<h1>CountUp.js <small id="version" class="lt-gray"></small></h1>
|
|
</div>
|
|
<div class="col full">
|
|
<p>CountUp.js is a dependency-free, lightweight JavaScript class that animates a numerical value by counting to it.</p>
|
|
<p>Install via npm/yarn using the package name <code class="indigo large">countup.js</code>.</p>
|
|
<h3 class="marginTop marginBottom"><a class="lime weight700" href="https://github.com/inorganik/CountUp.js">View on GitHub</a></h3>
|
|
</div>
|
|
</section>
|
|
<section>
|
|
<p style="position:absolute; top:5px; left:0;">Current stars:</p>
|
|
<h1 class="jumbo" id="myTargetElement">0</h1>
|
|
</section>
|
|
<section id="errorSection" style="background-color:#FFDCDC; display:none" class="col-inner">
|
|
<h4 id="error" style="color: red" class="noMargin"></h4>
|
|
</section>
|
|
<section id="paramsSection">
|
|
<form>
|
|
<h4 class="inlineLeft noMargin weight300">Params:</h4>
|
|
<div class="inlineLeft marginLeft marginRight">
|
|
<input type="text" value="0" id="startVal" style="width:80px" class="updateCodeVis">
|
|
<label class="inlineLabel">Start</label>
|
|
</div>
|
|
<input id="swapValues" type="button" class="inlineLeft marginRight" value="Swap" style="width:80px;">
|
|
<div class="inlineLeft marginRight">
|
|
<input type="text" value="94.62" id="endVal" style="width:80px" class="updateCodeVis">
|
|
<label class="inlineLabel">End</label>
|
|
</div>
|
|
<div class="inlineLeft marginRight">
|
|
<input type="number" value="0" id="decimalPlaces" step="1" style="width:50px" class="updateCodeVis">
|
|
<label class="inlineLabel">Decimal places</label>
|
|
</div>
|
|
<div class="inlineLeft marginRight">
|
|
<input type="number" value="2" id="duration" step=".1" style="width:50px" class="updateCodeVis">
|
|
<label class="inlineLabel">Duration</label>
|
|
</div>
|
|
</form>
|
|
</section>
|
|
<section id="optionsSection">
|
|
<form>
|
|
<h4 class="inlineLeft noMargin weight300">Options:</h4>
|
|
<div class="inlineLeft marginLeft marginRight">
|
|
<input id="useGrouping" type="checkbox" checked><label class="inlineLabel updateCodeVis">Use grouping</label>
|
|
</div>
|
|
<div class="inlineLeft marginRight">
|
|
<input id="useIndianSeparators" type="checkbox"><label class="inlineLabel updateCodeVis">Use Indian separators</label>
|
|
</div>
|
|
<div class="inlineLeft marginRight">
|
|
<input type="text" value="," id="separator" style="width:25px; padding:0 5px;" class="updateCodeVis">
|
|
<label class="inlineLabel">Separator</label>
|
|
</div>
|
|
<div class="inlineLeft marginRight">
|
|
<input type="text" value="." id="decimal" style="width:25px; padding:0 5px;" class="updateCodeVis">
|
|
<label class="inlineLabel">Decimal</label>
|
|
</div>
|
|
<div class="inlineLeft marginRight">
|
|
<input type="text" value="" id="prefix" style="width:50px; padding:0 5px;" class="updateCodeVis">
|
|
<label class="inlineLabel">Prefix</label>
|
|
</div>
|
|
<h4 class="inlineLeft noMargin weight300">+ many more</h4>
|
|
</form>
|
|
</section>
|
|
<section id="methodsSection">
|
|
<form>
|
|
<h4 class="inlineLeft noMargin weight300">Methods:</h4>
|
|
<input type="button" value="Start" id="start" class="inlineLeft marginLeft marginRight indigo">
|
|
<input type="button" value="Pause/Resume" id="pauseResume" class="inlineLeft marginRight">
|
|
<input type="button" value="Reset" id="reset" class="inlineLeft marginRight">
|
|
<input type="button" value="Update:" id="update" class="inlineLeft" style="margin-right:5px">
|
|
<div class="inlineLeft marginRight">
|
|
<input type="text" value="6789" id="updateVal" style="width:80px">
|
|
</div>
|
|
<div class="inlineLeft">
|
|
<input type="checkbox" id="useOnComplete" class="updateCodeVis"><label class="inlineLabel">Alert on complete</label>
|
|
</div>
|
|
</form>
|
|
</section>
|
|
<section id="easingSection">
|
|
<form>
|
|
<h4 class="inlineLeft noMargin weight300">Custom:</h4>
|
|
<div class="inlineLeft marginLeft">
|
|
<label class="inlineLabel">Easing: </label>
|
|
<select id="easingFnsDropdown" class="marginRight updateCodeVis">
|
|
<option value="easeOutExpo" selected>easeOutExpo (default, built-in)</option>
|
|
<option value="outQuintic">outQuintic</option>
|
|
<option value="outCubic">outCubic</option>
|
|
</select>
|
|
</div>
|
|
<div class="inlineLeft marginRight">
|
|
<label class="inlineLabel">Numerals: </label>
|
|
<select id="numeralsDropdown" class="updateCodeVis">
|
|
<option value="" selected>Default ("1234")</option>
|
|
<option value="ea">Eastern Arabic ("١٢٣٤")</option>
|
|
<option value="fa">Farsi ("۱۲۳۴")</option>
|
|
</select>
|
|
</div>
|
|
<div class="inlineLeft">
|
|
<input type="button" id="apply" value="Apply">
|
|
</div>
|
|
</form>
|
|
</section>
|
|
<section id="codeVisualizerSection">
|
|
<div class="col full marginBottom marginTop">
|
|
<div class="code-contain indigo">
|
|
<code id="codeVisualizer" class="indigo"></code>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<section id="scrollSpySection">
|
|
<form>
|
|
<h3 class="inlineLeft noMargin">Auto animate demos (scroll down)</h3>
|
|
<div class="inlineLeft marginLeft marginRight">
|
|
<input id="autoAnimateOnce" type="checkbox"><label class="inlineLabel">Once</label>
|
|
</div>
|
|
<div class="inlineLeft marginRight">
|
|
<input type="number" value="0" id="autoAnimateDelay" step="100" min="0" style="width:70px">
|
|
<label class="inlineLabel">Delay (ms)</label>
|
|
</div>
|
|
</form>
|
|
<p>Use the <code class="indigo">autoAnimate</code> option to animate when the target element appears.</p>
|
|
<div class="dot-matrix" style="height:60vh;"></div>
|
|
<h1 class="jumbo" id="scrollSpyTarget">0</h1>
|
|
<div class="dot-matrix" style="height:20vh;"></div>
|
|
</section>
|
|
<section id="hiddenAtInitSection" style="padding-top:20px;">
|
|
<h3>Hidden at init</h3>
|
|
<p><input type="button" value="Toggle visibility" id="toggleVisibility"></p>
|
|
<div style="height: 200px;">
|
|
<h1 class="jumbo" id="hiddenAtInitTarget" style="display:none;">0</h1>
|
|
</div>
|
|
</section>
|
|
<section id="modalSection" style="padding-top:20px;" class="marginBottom">
|
|
<h3>Inside a modal</h3>
|
|
<p><input type="button" value="Open modal" id="openModal"></p>
|
|
<dialog id="modalDialog" style="width: 650px; padding:40px 60px; border:1px solid #ccc; border-radius:16px; box-shadow:0 4px 24px rgba(0,0,0,.2); text-align:center;">
|
|
<h1 class="jumbo" id="modalTarget">0</h1>
|
|
<p><input type="button" value="Close" id="closeModal"></p>
|
|
</dialog>
|
|
<div class="dot-matrix" style="height:20vh"></div>
|
|
</section>
|
|
</div>
|
|
</body>
|
|
</html>
|