Update: 将子项目从 submodule 转为完整内容

- 移除 GovAI, nomifun-tauri, 算力盒子 的 submodule 引用
- 添加所有子项目的完整源代码
- 保留原始 .git 为 .git.bak 备份
This commit is contained in:
freedak
2026-07-04 19:20:46 +08:00
parent 54d6465fa7
commit f7a720204a
3360 changed files with 802660 additions and 3 deletions
@@ -0,0 +1,272 @@
#!/bin/bash
set -e
# Build script for 12-duotone-split
# Duotone Split — bold two-color split screen with morph between different split ratios
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DECK="$SCRIPT_DIR/mixed__duotone_split.pptx"
echo "Building: mixed--duotone-split (Duotone Split)"
# Clean up if exists
rm -f "$DECK"
# Create deck + slide 1
officecli create "$DECK"
officecli add "$DECK" '/' --type slide --prop layout=blank --prop background=FFFFFF
###############################################################################
# SLIDE 1 — hero: 50/50 left-right split
# Dark left: 0,0 -> 16.63 x 19.05
# Divider: 16.63,0 -> 0.3 x 19.05
# Warm right: 16.93,0 -> 16.94 x 19.05
###############################################################################
echo '[
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!panel-dark","preset":"rect","fill":"2D3436",
"x":"0cm","y":"0cm","width":"16.63cm","height":"19.05cm","opacity":"1.0"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!panel-warm","preset":"rect","fill":"E17055",
"x":"16.93cm","y":"0cm","width":"16.94cm","height":"19.05cm","opacity":"1.0"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!divider","preset":"rect","fill":"FFFFFF",
"x":"16.63cm","y":"0cm","width":"0.3cm","height":"19.05cm","opacity":"1.0"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!accent-dot-1","preset":"ellipse","fill":"FFFFFF",
"x":"2cm","y":"13cm","width":"3cm","height":"3cm","opacity":"0.15"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!accent-dot-2","preset":"ellipse","fill":"E17055",
"x":"12cm","y":"1cm","width":"2cm","height":"2cm","opacity":"0.3"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!accent-line","preset":"rect","fill":"FFFFFF",
"x":"1.2cm","y":"11cm","width":"8cm","height":"0.08cm","opacity":"0.4"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!hero-title","text":"Form Follows\nFunction","font":"Segoe UI Black",
"size":"54","bold":"true","color":"FFFFFF",
"x":"1.2cm","y":"3cm","width":"14cm","height":"6cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!hero-subtitle","text":"Architecture Studio","font":"Segoe UI Light",
"size":"24","color":"FFFFFF",
"x":"1.2cm","y":"9cm","width":"14cm","height":"2cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!body-text","text":"","font":"Segoe UI Light",
"size":"18","color":"FFFFFF",
"x":"36cm","y":"2cm","width":"0.1cm","height":"0.1cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!stat-1-num","text":"","font":"Segoe UI Black",
"size":"48","color":"FFFFFF",
"x":"36cm","y":"5cm","width":"0.1cm","height":"0.1cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!stat-1-label","text":"","font":"Segoe UI Light",
"size":"18","color":"FFFFFF",
"x":"36cm","y":"8cm","width":"0.1cm","height":"0.1cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!stat-2-num","text":"","font":"Segoe UI Black",
"size":"48","color":"FFFFFF",
"x":"37cm","y":"2cm","width":"0.1cm","height":"0.1cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!stat-2-label","text":"","font":"Segoe UI Light",
"size":"18","color":"FFFFFF",
"x":"37cm","y":"5cm","width":"0.1cm","height":"0.1cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!stat-3-num","text":"","font":"Segoe UI Black",
"size":"48","color":"FFFFFF",
"x":"37cm","y":"8cm","width":"0.1cm","height":"0.1cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!stat-3-label","text":"","font":"Segoe UI Light",
"size":"18","color":"FFFFFF",
"x":"37cm","y":"11cm","width":"0.1cm","height":"0.1cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!pillar-1","text":"","font":"Segoe UI Black",
"size":"28","color":"FFFFFF",
"x":"38cm","y":"2cm","width":"0.1cm","height":"0.1cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!pillar-2","text":"","font":"Segoe UI Black",
"size":"28","color":"FFFFFF",
"x":"38cm","y":"5cm","width":"0.1cm","height":"0.1cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!pillar-3","text":"","font":"Segoe UI Black",
"size":"28","color":"FFFFFF",
"x":"38cm","y":"8cm","width":"0.1cm","height":"0.1cm","fill":"none"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{
"name":"!!cta-text","text":"","font":"Segoe UI Black",
"size":"48","color":"FFFFFF",
"x":"38cm","y":"11cm","width":"0.1cm","height":"0.1cm","fill":"none"}}
]' | officecli batch "$DECK"
# Clone slide 1 four times for slides 2-5
officecli add "$DECK" '/' --from '/slide[1]' && \
officecli add "$DECK" '/' --from '/slide[1]' && \
officecli add "$DECK" '/' --from '/slide[1]' && \
officecli add "$DECK" '/' --from '/slide[1]'
# Set morph transitions on slides 2-5
echo '[
{"command":"set","path":"/slide[2]","props":{"transition":"morph"}},
{"command":"set","path":"/slide[3]","props":{"transition":"morph"}},
{"command":"set","path":"/slide[4]","props":{"transition":"morph"}},
{"command":"set","path":"/slide[5]","props":{"transition":"morph"}}
]' | officecli batch "$DECK"
###############################################################################
# SLIDE 2 — statement: 70/30 top-bottom
# Dark top: 0,0 -> 33.87 x 13.04
# Divider: 0,13.04 -> 33.87 x 0.3
# Warm bot: 0,13.34 -> 33.87 x 5.71
###############################################################################
echo '[
{"command":"set","path":"/slide[2]/shape[1]","props":{
"x":"0cm","y":"0cm","width":"33.87cm","height":"13.04cm"}},
{"command":"set","path":"/slide[2]/shape[2]","props":{
"x":"0cm","y":"13.34cm","width":"33.87cm","height":"5.71cm"}},
{"command":"set","path":"/slide[2]/shape[3]","props":{
"x":"0cm","y":"13.04cm","width":"33.87cm","height":"0.3cm"}},
{"command":"set","path":"/slide[2]/shape[4]","props":{
"x":"28cm","y":"1cm","width":"3cm","height":"3cm"}},
{"command":"set","path":"/slide[2]/shape[5]","props":{
"x":"4cm","y":"14.5cm","width":"2cm","height":"2cm","opacity":"0.4"}},
{"command":"set","path":"/slide[2]/shape[6]","props":{
"x":"22cm","y":"5cm","width":"8cm","height":"0.08cm"}},
{"command":"set","path":"/slide[2]/shape[7]","props":{
"text":"Every Line Has\na Purpose","size":"64","color":"FFFFFF",
"x":"2cm","y":"2.5cm","width":"30cm","height":"7cm"}},
{"command":"set","path":"/slide[2]/shape[7]/paragraph[1]","props":{"align":"center"}},
{"command":"set","path":"/slide[2]/shape[8]","props":{
"text":"","x":"36cm","y":"2cm","width":"0.1cm","height":"0.1cm"}}
]' | officecli batch "$DECK"
###############################################################################
# SLIDE 3 — pillars: Dark shrinks to left 30%, warm expands right 70%
# Dark left: 0,0 -> 10.16 x 19.05
# Divider: 10.16,0 -> 0.3 x 19.05
# Warm right: 10.46,0 -> 23.41 x 19.05
###############################################################################
echo '[
{"command":"set","path":"/slide[3]/shape[1]","props":{
"x":"0cm","y":"0cm","width":"10.16cm","height":"19.05cm"}},
{"command":"set","path":"/slide[3]/shape[2]","props":{
"x":"10.46cm","y":"0cm","width":"23.41cm","height":"19.05cm"}},
{"command":"set","path":"/slide[3]/shape[3]","props":{
"x":"10.16cm","y":"0cm","width":"0.3cm","height":"19.05cm"}},
{"command":"set","path":"/slide[3]/shape[4]","props":{
"x":"1cm","y":"14cm","width":"3cm","height":"3cm","opacity":"0.15"}},
{"command":"set","path":"/slide[3]/shape[5]","props":{
"x":"30cm","y":"14cm","width":"2cm","height":"2cm","opacity":"0.3"}},
{"command":"set","path":"/slide[3]/shape[6]","props":{
"x":"12cm","y":"16cm","width":"8cm","height":"0.08cm","opacity":"0.4"}},
{"command":"set","path":"/slide[3]/shape[7]","props":{
"text":"Our\nPillars","size":"40","color":"FFFFFF",
"x":"1.2cm","y":"2cm","width":"8cm","height":"5cm"}},
{"command":"set","path":"/slide[3]/shape[8]","props":{
"text":"Three ideas that drive everything we do","size":"16","color":"FFFFFF",
"x":"1.2cm","y":"7cm","width":"8cm","height":"3cm"}},
{"command":"set","path":"/slide[3]/shape[16]","props":{
"text":"Concept","size":"28","color":"FFFFFF",
"x":"12cm","y":"2.5cm","width":"10cm","height":"3cm"}},
{"command":"set","path":"/slide[3]/shape[17]","props":{
"text":"Build","size":"28","color":"FFFFFF",
"x":"12cm","y":"7cm","width":"10cm","height":"3cm"}},
{"command":"set","path":"/slide[3]/shape[18]","props":{
"text":"Live","size":"28","color":"FFFFFF",
"x":"12cm","y":"11.5cm","width":"10cm","height":"3cm"}}
]' | officecli batch "$DECK"
###############################################################################
# SLIDE 4 — evidence/diagonal: Dark rotated covers top-left, warm bottom-right
# Dark: large rect rotated -10deg, positioned to cover top-left ~60%
# Warm: large rect rotated -10deg, positioned to cover bottom-right ~40%
###############################################################################
echo '[
{"command":"set","path":"/slide[4]/shape[1]","props":{
"x":"0cm","y":"0cm","width":"28cm","height":"19.05cm","rotation":"-8"}},
{"command":"set","path":"/slide[4]/shape[2]","props":{
"x":"10cm","y":"6cm","width":"28cm","height":"18cm","rotation":"-8"}},
{"command":"set","path":"/slide[4]/shape[3]","props":{
"x":"8cm","y":"3cm","width":"0.3cm","height":"22cm","rotation":"-8"}},
{"command":"set","path":"/slide[4]/shape[4]","props":{
"x":"3cm","y":"2cm","width":"3cm","height":"3cm","opacity":"0.15"}},
{"command":"set","path":"/slide[4]/shape[5]","props":{
"x":"26cm","y":"14cm","width":"2cm","height":"2cm","opacity":"0.3"}},
{"command":"set","path":"/slide[4]/shape[6]","props":{
"x":"2cm","y":"8cm","width":"8cm","height":"0.08cm","opacity":"0.4"}},
{"command":"set","path":"/slide[4]/shape[7]","props":{
"text":"Our Impact","size":"40","color":"FFFFFF",
"x":"1.2cm","y":"1cm","width":"14cm","height":"3cm"}},
{"command":"set","path":"/slide[4]/shape[8]","props":{
"text":"","x":"36cm","y":"2cm","width":"0.1cm","height":"0.1cm"}},
{"command":"set","path":"/slide[4]/shape[10]","props":{
"text":"85","size":"64","color":"FFFFFF",
"x":"1.2cm","y":"4.5cm","width":"8cm","height":"3cm"}},
{"command":"set","path":"/slide[4]/shape[11]","props":{
"text":"Projects","size":"18","color":"FFFFFF",
"x":"1.2cm","y":"7.5cm","width":"8cm","height":"1.5cm"}},
{"command":"set","path":"/slide[4]/shape[12]","props":{
"text":"12","size":"64","color":"FFFFFF",
"x":"1.2cm","y":"10cm","width":"8cm","height":"3cm"}},
{"command":"set","path":"/slide[4]/shape[13]","props":{
"text":"Countries","size":"18","color":"FFFFFF",
"x":"1.2cm","y":"13cm","width":"8cm","height":"1.5cm"}},
{"command":"set","path":"/slide[4]/shape[14]","props":{
"text":"3","size":"64","color":"FFFFFF",
"x":"20cm","y":"10cm","width":"8cm","height":"3cm"}},
{"command":"set","path":"/slide[4]/shape[15]","props":{
"text":"Pritzker Nominations","size":"18","color":"FFFFFF",
"x":"20cm","y":"13cm","width":"10cm","height":"1.5cm"}}
]' | officecli batch "$DECK"
###############################################################################
# SLIDE 5 — cta: Dark expands 80% as full backdrop, warm = small accent bar bottom
# Dark: 0,0 -> 33.87 x 15.24 (80%)
# Divider: 0,15.24 -> 33.87 x 0.3
# Warm bar: 0,15.54 -> 33.87 x 3.51
###############################################################################
echo '[
{"command":"set","path":"/slide[5]/shape[1]","props":{
"x":"0cm","y":"0cm","width":"33.87cm","height":"15.24cm","rotation":"0"}},
{"command":"set","path":"/slide[5]/shape[2]","props":{
"x":"0cm","y":"15.54cm","width":"33.87cm","height":"3.51cm","rotation":"0"}},
{"command":"set","path":"/slide[5]/shape[3]","props":{
"x":"0cm","y":"15.24cm","width":"33.87cm","height":"0.3cm","rotation":"0"}},
{"command":"set","path":"/slide[5]/shape[4]","props":{
"x":"28cm","y":"2cm","width":"3cm","height":"3cm","opacity":"0.15"}},
{"command":"set","path":"/slide[5]/shape[5]","props":{
"x":"2cm","y":"16cm","width":"2cm","height":"2cm","opacity":"0.3"}},
{"command":"set","path":"/slide[5]/shape[6]","props":{
"x":"10cm","y":"7cm","width":"8cm","height":"0.08cm","opacity":"0.4"}},
{"command":"set","path":"/slide[5]/shape[7]","props":{
"text":"See Our Work","size":"64","color":"FFFFFF",
"x":"2cm","y":"3cm","width":"30cm","height":"5cm"}},
{"command":"set","path":"/slide[5]/shape[7]/paragraph[1]","props":{"align":"center"}},
{"command":"set","path":"/slide[5]/shape[8]","props":{
"text":"architecture@studio.com","size":"20","color":"FFFFFF",
"x":"2cm","y":"8.5cm","width":"30cm","height":"2cm"}},
{"command":"set","path":"/slide[5]/shape[8]/paragraph[1]","props":{"align":"center"}},
{"command":"set","path":"/slide[5]/shape[19]","props":{
"text":"","x":"38cm","y":"11cm","width":"0.1cm","height":"0.1cm"}},
{"command":"set","path":"/slide[5]/shape[10]","props":{"x":"36cm","y":"5cm","text":""}},
{"command":"set","path":"/slide[5]/shape[11]","props":{"x":"36cm","y":"8cm","text":""}},
{"command":"set","path":"/slide[5]/shape[12]","props":{"x":"37cm","y":"2cm","text":""}},
{"command":"set","path":"/slide[5]/shape[13]","props":{"x":"37cm","y":"5cm","text":""}},
{"command":"set","path":"/slide[5]/shape[14]","props":{"x":"37cm","y":"8cm","text":""}},
{"command":"set","path":"/slide[5]/shape[15]","props":{"x":"37cm","y":"11cm","text":""}},
{"command":"set","path":"/slide[5]/shape[16]","props":{"x":"38cm","y":"2cm","text":""}},
{"command":"set","path":"/slide[5]/shape[17]","props":{"x":"38cm","y":"5cm","text":""}},
{"command":"set","path":"/slide[5]/shape[18]","props":{"x":"38cm","y":"8cm","text":""}}
]' | officecli batch "$DECK"
# Validate and review
echo "Validating..."
python3 "$(dirname "$0")/../../morph-helpers.py" final-check "$DECK"
echo "✅ Build complete: $DECK"
@@ -0,0 +1,67 @@
# 12 Duotone Split — Duotone Split
## Style Overview
Charcoal and terracotta dual-color panels split the canvas in different proportions, morph produces "shifting canvas" effect.
- **Scene**: Brand launches, architectural design, high-end presentations
- **Mood**: Bold, architectural feel, high-end, minimalist
- **Tone**: Dual-color contrast (deep dark + warm color), white dividers
## Color Palette
| Name | Hex | Usage |
| ------------- | ------- | ------------------------------ |
| Pure White | #FFFFFF | Page background, divider lines |
| Charcoal Gray | #2D3436 | Dark panel |
| Terracotta | #E17055 | Warm panel |
## Typography
| Element | Font | Size |
| ------------- | -------------- | ------- |
| Main Title | Segoe UI Black | 40-64pt |
| Data Numbers | Segoe UI Black | 48-64pt |
| Column Title | Segoe UI Black | 28pt |
| Body/Subtitle | Segoe UI Light | 16-24pt |
## Design Techniques
- **Dual-panel split**: Two large rect (!!panel-dark + !!panel-warm) cover entire canvas, split in different proportions
- **White divider line**: 0.3cm wide white rect as precise divider between two panels
- **Split proportion changes**: S1 left-right 50/50 → S2 top-bottom 70/30 → S3 left-right 30/70 → S4 diagonal rotation → S5 top-bottom 80/20
- **Morph choreography**: Massive changes in panel size and position produce "shifting canvas" effect, divider line follows movement
- **Rotation variation**: S4 panels rotated -8 degrees, breaking orthogonal layout for added dynamism
- **Restrained decoration**: Only 2 semi-transparent dots + 1 ultra-thin line, maintaining minimalism
## Scene Elements
| Name | Type | Description |
| ---------------- | ----------------- | ------------------------------------------ |
| `!!panel-dark` | rect | Charcoal main panel |
| `!!panel-warm` | rect | Terracotta warm panel |
| `!!divider` | rect (0.3cm) | White panel divider line |
| `!!accent-dot-1` | ellipse | White semi-transparent decorative dot |
| `!!accent-dot-2` | ellipse | Terracotta semi-transparent decorative dot |
| `!!accent-line` | rect (ultra-thin) | White semi-transparent decorative line |
## Page Structure (5 pages)
| Slide | Type | Elements | Description |
| ----- | --------- | --------------------------------------------------------------------------------------------------------------- | ----------- |
| S1 | hero | Cover — left-right 50/50 split, title on dark panel |
| S2 | statement | Statement — top-bottom 70/30 split (dark occupies top 70%), centered large title |
| S3 | pillars | Three-column — left-right 30/70 (narrow dark left column + wide warm right column), three pillars on warm panel |
| S4 | evidence | Data — panels rotated -8 degrees forming diagonal split, data scattered across both panels |
| S5 | cta | Closing — top-bottom 80/20 (dark occupies top 80%), call to action centered |
## Reference Script
Complete build script available in `build.sh`.
**Recommended slides to read for understanding core design techniques**:
- **Slide 1 (hero)** — Initial layout of 6 scene actors, understanding panel + divider line structure
- **Slide 4 (evidence)** — Panel rotation + diagonal split implementation
No need to read all — skim 2-3 representative slides.