|
@@ -129,6 +129,18 @@
|
|
|
background: var(--active-color);
|
|
background: var(--active-color);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /* Flat menu section title */
|
|
|
|
|
+ .nav-section-title {
|
|
|
|
|
+ margin-top: 18px;
|
|
|
|
|
+ padding: 10px 0 6px 0;
|
|
|
|
|
+ color: #7a7a7a;
|
|
|
|
|
+ font-size: 11px;
|
|
|
|
|
+ font-weight: 800;
|
|
|
|
|
+ letter-spacing: 1px;
|
|
|
|
|
+ text-transform: uppercase;
|
|
|
|
|
+ opacity: 0.9;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/* Search Box in sidebar */
|
|
/* Search Box in sidebar */
|
|
|
.sidebar-search {
|
|
.sidebar-search {
|
|
|
margin: 0 20px 20px 20px;
|
|
margin: 0 20px 20px 20px;
|
|
@@ -217,62 +229,21 @@
|
|
|
Search
|
|
Search
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div class="nav-tree">
|
|
|
|
|
- <!-- Group: Getting Started -->
|
|
|
|
|
- <div class="tree-group">
|
|
|
|
|
- <div class="tree-header" onclick="toggleTree(this)">Getting started</div>
|
|
|
|
|
- <div class="tree-children">
|
|
|
|
|
- <div class="nav-item" onclick="selectCategory('search.html', 'test_css_selector.html', this)">Installation</div>
|
|
|
|
|
- <div class="nav-item" onclick="selectCategory('search.html', 'test_css_selector.html', this)">Module imports</div>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
- <!-- Group: Timer -->
|
|
|
|
|
- <div class="tree-group">
|
|
|
|
|
- <div class="tree-header" onclick="toggleTree(this)">Timer</div>
|
|
|
|
|
- <div class="tree-children">
|
|
|
|
|
- <div class="nav-item">Settings</div>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
- <!-- Group: Animation -->
|
|
|
|
|
- <div class="tree-group">
|
|
|
|
|
- <div class="tree-header active-header" onclick="toggleTree(this)">Animation</div>
|
|
|
|
|
- <div class="tree-children expanded">
|
|
|
|
|
- <div class="nav-item active" onclick="selectCategory('targets/list.html', 'targets/overview.html', this)">Targets</div>
|
|
|
|
|
- <div class="nav-item" onclick="selectCategory('animatable_properties/list.html', 'animatable_properties/test_css_props.html', this)">Animatable properties</div>
|
|
|
|
|
- <div class="nav-item" onclick="selectCategory('tween_value_types/list.html', 'tween_value_types/test_numerical.html', this)">Tween value types</div>
|
|
|
|
|
- <div class="nav-item">Tween parameters</div>
|
|
|
|
|
- <div class="nav-item">Keyframes</div>
|
|
|
|
|
- <div class="nav-item">Playback settings</div>
|
|
|
|
|
-
|
|
|
|
|
- <!-- Callbacks Nested? Or separate? Reference shows Callbacks under Animation -->
|
|
|
|
|
- <div class="nav-item" onclick="selectCategory('list_callbacks.html', 'test_on_update.html', this)">Callbacks</div>
|
|
|
|
|
-
|
|
|
|
|
- <!-- Examples -->
|
|
|
|
|
- <div class="nav-item" onclick="selectCategory('examples/list.html', 'examples/controls.html', this)">Examples</div>
|
|
|
|
|
-
|
|
|
|
|
- <div class="nav-item">Methods</div>
|
|
|
|
|
- <div class="nav-item">Properties</div>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
- <!-- Group: Timeline -->
|
|
|
|
|
- <div class="tree-group">
|
|
|
|
|
- <div class="tree-header" onclick="toggleTree(this)">Timeline</div>
|
|
|
|
|
- <div class="tree-children">
|
|
|
|
|
- <div class="nav-item">Basics</div>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
- <!-- Group: Animatable -->
|
|
|
|
|
- <div class="tree-group">
|
|
|
|
|
- <div class="tree-header" onclick="toggleTree(this)">Animatable</div>
|
|
|
|
|
- <div class="tree-children">
|
|
|
|
|
- <div class="nav-item">Properties</div>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
|
|
+ <div class="nav-tree" aria-label="主菜单(扁平化)">
|
|
|
|
|
+ <div class="nav-section-title">Animal.js 动画</div>
|
|
|
|
|
+ <div class="nav-item active" onclick="selectCategory('targets/list.html', 'targets/overview.html', this)">目标 Targets</div>
|
|
|
|
|
+ <div class="nav-item" onclick="selectCategory('animatable_properties/list.html', 'animatable_properties/test_transforms.html', this)">可动画属性 Properties</div>
|
|
|
|
|
+ <div class="nav-item" onclick="selectCategory('tween_value_types/list.html', 'tween_value_types/test_numerical.html', this)">补间值类型 Tween 值</div>
|
|
|
|
|
+ <div class="nav-item" onclick="selectCategory('tween_parameters/list.html', 'tween_parameters/overview.html', this)">补间参数 Tween 参数</div>
|
|
|
|
|
+ <div class="nav-item" onclick="selectCategory('svg/list.html', 'svg/overview.html', this)">SVG 动画</div>
|
|
|
|
|
+ <div class="nav-item" onclick="selectCategory('list_callbacks.html', 'test_on_update.html', this)">回调 Callbacks</div>
|
|
|
|
|
+ <div class="nav-item" onclick="selectCategory('examples/list.html', 'examples/controls.html', this)">示例 Examples</div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="nav-section-title">Layer 弹窗</div>
|
|
|
|
|
+ <div class="nav-item" onclick="selectCategory('examples/list.html', 'examples/layer.html', this)">交互示例(Layer + 动画)</div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="nav-section-title">开发者</div>
|
|
|
|
|
+ <div class="nav-item" onclick="selectCategory('search.html', 'module.html', this)">模块开发与测试指南</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
@@ -292,16 +263,6 @@
|
|
|
</svg>
|
|
</svg>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
- function toggleTree(header) {
|
|
|
|
|
- const children = header.nextElementSibling;
|
|
|
|
|
- if (children) {
|
|
|
|
|
- children.classList.toggle('expanded');
|
|
|
|
|
-
|
|
|
|
|
- // Optional: Highlight header when expanded?
|
|
|
|
|
- // header.classList.toggle('active-header');
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
function selectCategory(listUrl, defaultContentUrl, el) {
|
|
function selectCategory(listUrl, defaultContentUrl, el) {
|
|
|
// 1. Highlight Nav Item
|
|
// 1. Highlight Nav Item
|
|
|
document.querySelectorAll('.nav-item').forEach(item => item.classList.remove('active'));
|
|
document.querySelectorAll('.nav-item').forEach(item => item.classList.remove('active'));
|
|
@@ -345,6 +306,87 @@
|
|
|
scheduleConnectionLineUpdate();
|
|
scheduleConnectionLineUpdate();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // =========================================================
|
|
|
|
|
+ // Global Prev/Next(组内顺序 + 跨组跳转,由路由表统一驱动)
|
|
|
|
|
+ // =========================================================
|
|
|
|
|
+ const DOC_PAGES = [
|
|
|
|
|
+ // Targets
|
|
|
|
|
+ { group: 'Targets', title: 'Targets 概览', url: 'targets/overview.html' },
|
|
|
|
|
+ { group: 'Targets', title: 'CSS Selector', url: 'targets/test_css_selector.html' },
|
|
|
|
|
+ { group: 'Targets', title: 'DOM Elements', url: 'targets/test_dom_elements.html' },
|
|
|
|
|
+ { group: 'Targets', title: 'JavaScript Objects', url: 'targets/test_js_objects.html' },
|
|
|
|
|
+ { group: 'Targets', title: 'Array of targets', url: 'targets/test_array_targets.html' },
|
|
|
|
|
+
|
|
|
|
|
+ // Animatable properties
|
|
|
|
|
+ { group: 'Properties', title: 'Transforms', url: 'animatable_properties/test_transforms.html' },
|
|
|
|
|
+ { group: 'Properties', title: 'CSS Properties', url: 'animatable_properties/test_css_props.html' },
|
|
|
|
|
+ { group: 'Properties', title: 'CSS Variables', url: 'animatable_properties/test_css_vars.html' },
|
|
|
|
|
+ { group: 'Properties', title: 'JS Properties', url: 'animatable_properties/test_js_props.html' },
|
|
|
|
|
+
|
|
|
|
|
+ // Tween value types
|
|
|
|
|
+ { group: 'Tween 值', title: 'Numerical', url: 'tween_value_types/test_numerical.html' },
|
|
|
|
|
+ { group: 'Tween 值', title: 'Unit', url: 'tween_value_types/test_unit.html' },
|
|
|
|
|
+ { group: 'Tween 值', title: 'Relative', url: 'tween_value_types/test_relative.html' },
|
|
|
|
|
+ { group: 'Tween 值', title: 'Colors', url: 'tween_value_types/test_colors.html' },
|
|
|
|
|
+
|
|
|
|
|
+ // Tween parameters
|
|
|
|
|
+ { group: 'Tween 参数', title: 'Tween parameters 概览', url: 'tween_parameters/overview.html' },
|
|
|
|
|
+ { group: 'Tween 参数', title: 'duration / delay', url: 'tween_parameters/test_duration_delay.html' },
|
|
|
|
|
+
|
|
|
|
|
+ // SVG
|
|
|
|
|
+ { group: 'SVG', title: 'SVG 概览', url: 'svg/overview.html' },
|
|
|
|
|
+ { group: 'SVG', title: 'draw() 路径描边', url: 'svg/test_draw_path.html' },
|
|
|
|
|
+ { group: 'SVG', title: 'Motion Path', url: 'svg/test_motion_path.html' },
|
|
|
|
|
+ { group: 'SVG', title: 'SVG 属性动画', url: 'svg/test_svg_attributes.html' },
|
|
|
|
|
+ { group: 'SVG', title: 'SVG transform', url: 'svg/test_svg_transforms.html' },
|
|
|
|
|
+
|
|
|
|
|
+ // Callbacks
|
|
|
|
|
+ { group: 'Callbacks', title: 'onUpdate', url: 'test_on_update.html' },
|
|
|
|
|
+
|
|
|
|
|
+ // Examples
|
|
|
|
|
+ { group: 'Examples', title: 'Controls', url: 'examples/controls.html' },
|
|
|
|
|
+ { group: 'Examples', title: 'Layer', url: 'examples/layer.html' },
|
|
|
|
|
+
|
|
|
|
|
+ // Developer
|
|
|
|
|
+ { group: 'Developer', title: '模块开发与测试指南', url: 'module.html' }
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ function normalizeDocUrl(url) {
|
|
|
|
|
+ return String(url || '')
|
|
|
|
|
+ .replace(/^[#/]+/, '')
|
|
|
|
|
+ .replace(/^\.\//, '')
|
|
|
|
|
+ .replace(/^\/+/, '');
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function docFindIndex(currentUrl) {
|
|
|
|
|
+ const u = normalizeDocUrl(currentUrl);
|
|
|
|
|
+ if (!u) return -1;
|
|
|
|
|
+ return DOC_PAGES.findIndex(p => u === p.url || u.endsWith(p.url));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function docGetPrevNext(currentUrl) {
|
|
|
|
|
+ const idx = docFindIndex(currentUrl);
|
|
|
|
|
+ if (idx < 0) return { idx: -1, prev: null, next: null, current: null };
|
|
|
|
|
+ const prev = (idx > 0) ? DOC_PAGES[idx - 1] : null;
|
|
|
|
|
+ const next = (idx < DOC_PAGES.length - 1) ? DOC_PAGES[idx + 1] : null;
|
|
|
|
|
+ return { idx, prev, next, current: DOC_PAGES[idx] };
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function docNavigatePrev(currentUrl) {
|
|
|
|
|
+ const { prev } = docGetPrevNext(currentUrl);
|
|
|
|
|
+ if (prev) loadContent(prev.url);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function docNavigateNext(currentUrl) {
|
|
|
|
|
+ const { next } = docGetPrevNext(currentUrl);
|
|
|
|
|
+ if (next) loadContent(next.url);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Expose to iframes (same origin)
|
|
|
|
|
+ window.docGetPrevNext = docGetPrevNext;
|
|
|
|
|
+ window.docNavigatePrev = docNavigatePrev;
|
|
|
|
|
+ window.docNavigateNext = docNavigateNext;
|
|
|
|
|
+
|
|
|
// =============================
|
|
// =============================
|
|
|
// Middle ↔ Right connection line
|
|
// Middle ↔ Right connection line
|
|
|
// =============================
|
|
// =============================
|