|
|
@@ -8,30 +8,63 @@
|
|
|
<style>
|
|
|
.row {
|
|
|
position: relative;
|
|
|
- padding: 20px 0;
|
|
|
- border-bottom: 1px solid #2a2a2a;
|
|
|
+ padding: 18px 0;
|
|
|
+ border-bottom: 1px solid #222;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
+ min-height: 48px;
|
|
|
}
|
|
|
.row:last-child { border-bottom: none; }
|
|
|
+
|
|
|
+ .row::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ top: 50%;
|
|
|
+ height: 1px;
|
|
|
+ background: #262626;
|
|
|
+ transform: translateY(-0.5px);
|
|
|
+ }
|
|
|
|
|
|
.square {
|
|
|
- width: 28px;
|
|
|
- height: 28px;
|
|
|
+ position: relative;
|
|
|
+ z-index: 1;
|
|
|
+ width: 18px;
|
|
|
+ height: 18px;
|
|
|
background-color: var(--highlight-color);
|
|
|
- border-radius: 2px;
|
|
|
- margin-right: 20px; /* Space if needed */
|
|
|
+ border-radius: 3px;
|
|
|
+ will-change: transform;
|
|
|
}
|
|
|
+
|
|
|
+ .sq-lg { width: 28px; height: 28px; border-radius: 4px; }
|
|
|
+ .sq-md { width: 20px; height: 20px; border-radius: 3px; }
|
|
|
+ .sq-sm { width: 14px; height: 14px; border-radius: 3px; }
|
|
|
+
|
|
|
#css-selector-id {
|
|
|
background-color: var(--accent-color);
|
|
|
}
|
|
|
+
|
|
|
+ .box-container { margin-top: 40px; }
|
|
|
+ .demo-visual { padding: 26px 30px; background: #151515; }
|
|
|
+
|
|
|
+ .demo-visual .row { margin: 0; }
|
|
|
+
|
|
|
+ .hint {
|
|
|
+ color: #888;
|
|
|
+ font-size: 13px;
|
|
|
+ margin-top: -8px;
|
|
|
+ margin-bottom: 18px;
|
|
|
+ }
|
|
|
</style>
|
|
|
</head>
|
|
|
<body>
|
|
|
|
|
|
<div class="container">
|
|
|
- <!-- Breadcrumb / Header -->
|
|
|
- <div style="font-size: 10px; font-weight: bold; letter-spacing: 1px; color: #ff4b4b; margin-bottom: 20px;">ANIMATION > TARGETS</div>
|
|
|
+ <div class="page-top">
|
|
|
+ <div class="crumb">ANIMATION › TARGETS</div>
|
|
|
+ <div class="since">SINCE 1.0.0</div>
|
|
|
+ </div>
|
|
|
|
|
|
<h1>CSS Selector</h1>
|
|
|
<p class="description">Targets one or multiple DOM Elements using a CSS selector.</p>
|
|
|
@@ -42,20 +75,28 @@
|
|
|
<div class="box-container">
|
|
|
<div class="box-header">
|
|
|
<div class="box-title">CSS Selector code example</div>
|
|
|
- <div class="tabs">
|
|
|
- <div class="tab active" onclick="switchTab('js')">JavaScript</div>
|
|
|
- <div class="tab" onclick="switchTab('html')">HTML</div>
|
|
|
+ <div class="box-right">
|
|
|
+ <button class="icon-btn" type="button" title="Copy" onclick="copyActiveCode()" aria-label="Copy code">
|
|
|
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
|
+ <rect x="9" y="9" width="13" height="13" rx="2"></rect>
|
|
|
+ <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
|
|
|
+ </svg>
|
|
|
+ </button>
|
|
|
+ <div class="tabs" role="tablist" aria-label="Code tabs">
|
|
|
+ <div class="tab active" role="tab" aria-selected="true" tabindex="0" onclick="switchTab('js')">JavaScript</div>
|
|
|
+ <div class="tab" role="tab" aria-selected="false" tabindex="-1" onclick="switchTab('html')">HTML</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<!-- JS Code View -->
|
|
|
<div id="js-code" class="code-view active">
|
|
|
-<span class="kwd">import</span> <span class="punc">{</span> animate <span class="punc">}</span> <span class="kwd">from</span> <span class="str">'animejs'</span><span class="punc">;</span>
|
|
|
+<span class="kwd">const</span> $ = <span class="fun">animal</span><span class="punc">;</span>
|
|
|
|
|
|
-<span class="fun">animate</span><span class="punc">(</span><span class="str">'.square'</span><span class="punc">,</span> <span class="punc">{</span> x<span class="punc">:</span> <span class="str">'17rem'</span> <span class="punc">}</span><span class="punc">)</span><span class="punc">;</span>
|
|
|
-<span class="fun">animate</span><span class="punc">(</span><span class="str">'#css-selector-id'</span><span class="punc">,</span> <span class="punc">{</span> rotate<span class="punc">:</span> <span class="str">'1turn'</span> <span class="punc">}</span><span class="punc">)</span><span class="punc">;</span>
|
|
|
-<span class="fun">animate</span><span class="punc">(</span><span class="str">'.row:nth-child(3) .square'</span><span class="punc">,</span> <span class="punc">{</span>
|
|
|
- scale<span class="punc">:</span> <span class="punc">[</span><span class="num">1</span><span class="punc">,</span> <span class="num">.5</span><span class="punc">,</span> <span class="num">1</span><span class="punc">]</span>
|
|
|
+<span class="fun">$</span><span class="punc">(</span><span class="str">'.square'</span><span class="punc">)</span>.<span class="fun">animate</span><span class="punc">({</span> x<span class="punc">:</span> <span class="str">'17rem'</span> <span class="punc">}</span><span class="punc">)</span><span class="punc">;</span>
|
|
|
+<span class="fun">$</span><span class="punc">(</span><span class="str">'#css-selector-id'</span><span class="punc">)</span>.<span class="fun">animate</span><span class="punc">({</span> rotate<span class="punc">:</span> <span class="str">'1turn'</span> <span class="punc">}</span><span class="punc">)</span><span class="punc">;</span>
|
|
|
+<span class="fun">$</span><span class="punc">(</span><span class="str">'.row:nth-child(3) .square'</span><span class="punc">)</span>.<span class="fun">animate</span><span class="punc">({</span>
|
|
|
+ scale<span class="punc">:</span> <span class="punc">[</span><span class="num">1</span><span class="punc">,</span> <span class="num">.5</span><span class="punc">]</span>
|
|
|
<span class="punc">}</span><span class="punc">)</span><span class="punc">;</span>
|
|
|
</div>
|
|
|
|
|
|
@@ -76,15 +117,15 @@
|
|
|
<div class="demo-visual">
|
|
|
<!-- Row 1 -->
|
|
|
<div class="medium row">
|
|
|
- <div class="square"></div>
|
|
|
+ <div class="square sq-lg"></div>
|
|
|
</div>
|
|
|
<!-- Row 2 -->
|
|
|
<div class="medium row">
|
|
|
- <div id="css-selector-id" class="square"></div>
|
|
|
+ <div id="css-selector-id" class="square sq-md"></div>
|
|
|
</div>
|
|
|
<!-- Row 3 -->
|
|
|
<div class="medium row">
|
|
|
- <div class="square"></div>
|
|
|
+ <div class="square sq-sm"></div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
@@ -93,8 +134,28 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
+ <div class="doc-nav" aria-label="Previous and next navigation">
|
|
|
+ <a href="#" onclick="goPrev(); return false;">
|
|
|
+ <span>
|
|
|
+ <span class="nav-label">Previous</span><br>
|
|
|
+ <span class="nav-title">Targets</span>
|
|
|
+ </span>
|
|
|
+ <span aria-hidden="true">←</span>
|
|
|
+ </a>
|
|
|
+ <div class="nav-center">Targets</div>
|
|
|
+ <a href="#" onclick="goNext(); return false;">
|
|
|
+ <span>
|
|
|
+ <span class="nav-label">Next</span><br>
|
|
|
+ <span class="nav-title">DOM Elements</span>
|
|
|
+ </span>
|
|
|
+ <span aria-hidden="true">→</span>
|
|
|
+ </a>
|
|
|
+ </div>
|
|
|
+
|
|
|
</div>
|
|
|
|
|
|
+ <div id="toast" class="toast" role="status" aria-live="polite"></div>
|
|
|
+
|
|
|
<script src="../../animal.js"></script>
|
|
|
<script>
|
|
|
function switchTab(tab) {
|
|
|
@@ -104,9 +165,48 @@
|
|
|
if (tab === 'js') {
|
|
|
document.querySelector('.tabs .tab:nth-child(1)').classList.add('active');
|
|
|
document.getElementById('js-code').classList.add('active');
|
|
|
+ document.querySelector('.tabs .tab:nth-child(1)').setAttribute('aria-selected', 'true');
|
|
|
+ document.querySelector('.tabs .tab:nth-child(2)').setAttribute('aria-selected', 'false');
|
|
|
+ document.querySelector('.tabs .tab:nth-child(1)').tabIndex = 0;
|
|
|
+ document.querySelector('.tabs .tab:nth-child(2)').tabIndex = -1;
|
|
|
} else {
|
|
|
document.querySelector('.tabs .tab:nth-child(2)').classList.add('active');
|
|
|
document.getElementById('html-code').classList.add('active');
|
|
|
+ document.querySelector('.tabs .tab:nth-child(1)').setAttribute('aria-selected', 'false');
|
|
|
+ document.querySelector('.tabs .tab:nth-child(2)').setAttribute('aria-selected', 'true');
|
|
|
+ document.querySelector('.tabs .tab:nth-child(1)').tabIndex = -1;
|
|
|
+ document.querySelector('.tabs .tab:nth-child(2)').tabIndex = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function showToast(msg) {
|
|
|
+ const el = document.getElementById('toast');
|
|
|
+ if (!el) return;
|
|
|
+ el.textContent = msg;
|
|
|
+ el.classList.add('show');
|
|
|
+ clearTimeout(el._t);
|
|
|
+ el._t = setTimeout(() => el.classList.remove('show'), 900);
|
|
|
+ }
|
|
|
+
|
|
|
+ async function copyActiveCode() {
|
|
|
+ const active = document.querySelector('.code-view.active, .html-view.active');
|
|
|
+ const text = active ? active.innerText.trimEnd() : '';
|
|
|
+ if (!text) return;
|
|
|
+
|
|
|
+ try {
|
|
|
+ await navigator.clipboard.writeText(text);
|
|
|
+ showToast('Copied');
|
|
|
+ } catch (e) {
|
|
|
+ // Fallback
|
|
|
+ const ta = document.createElement('textarea');
|
|
|
+ ta.value = text;
|
|
|
+ ta.style.position = 'fixed';
|
|
|
+ ta.style.opacity = '0';
|
|
|
+ document.body.appendChild(ta);
|
|
|
+ ta.select();
|
|
|
+ document.execCommand('copy');
|
|
|
+ ta.remove();
|
|
|
+ showToast('Copied');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -115,24 +215,61 @@
|
|
|
el.style.transform = 'none';
|
|
|
});
|
|
|
|
|
|
- animal.animate('.square', {
|
|
|
+ const $ = animal;
|
|
|
+
|
|
|
+ $('.square').animate({
|
|
|
x: '17rem',
|
|
|
duration: 1000,
|
|
|
easing: 'ease-out'
|
|
|
});
|
|
|
|
|
|
- animal.animate('#css-selector-id', {
|
|
|
+ $('#css-selector-id').animate({
|
|
|
rotate: '1turn',
|
|
|
duration: 1000,
|
|
|
easing: 'ease-out'
|
|
|
});
|
|
|
|
|
|
- animal.animate('.medium.row:nth-child(3) .square', {
|
|
|
- scale: [1, .5, 1],
|
|
|
- duration: 1000,
|
|
|
+ $('.medium.row:nth-child(3) .square').animate({
|
|
|
+ scale: [1, .5],
|
|
|
+ duration: 500,
|
|
|
easing: 'ease-in-out'
|
|
|
+ }).then(() => {
|
|
|
+ $('.medium.row:nth-child(3) .square').animate({
|
|
|
+ scale: [.5, 1],
|
|
|
+ duration: 500,
|
|
|
+ easing: 'ease-in-out'
|
|
|
+ });
|
|
|
});
|
|
|
}
|
|
|
+
|
|
|
+ function goPrev() {
|
|
|
+ if (window.parent && window.parent.loadContent) {
|
|
|
+ window.parent.loadContent('targets/overview.html');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function goNext() {
|
|
|
+ if (window.parent && window.parent.loadContent) {
|
|
|
+ window.parent.loadContent('targets/test_dom_elements.html');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Keyboard support for tabs
|
|
|
+ document.addEventListener('keydown', (e) => {
|
|
|
+ const focused = document.activeElement;
|
|
|
+ if (!focused || !focused.classList.contains('tab')) return;
|
|
|
+ if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return;
|
|
|
+ e.preventDefault();
|
|
|
+ const isJs = focused.textContent.trim().toLowerCase().includes('javascript');
|
|
|
+ switchTab(isJs ? 'html' : 'js');
|
|
|
+ const next = document.querySelector('.tab.active');
|
|
|
+ next?.focus();
|
|
|
+ });
|
|
|
+
|
|
|
+ // Sync middle list selection when loaded inside doc/index.html
|
|
|
+ try {
|
|
|
+ window.parent?.setMiddleActive?.('targets/test_css_selector.html');
|
|
|
+ } catch {}
|
|
|
|
|
|
setTimeout(runDemo, 500);
|
|
|
</script>
|