From 3ebb233ea85acd72de3701bb640c5cb546019787 Mon Sep 17 00:00:00 2001 From: 207studio Date: Mon, 2 Nov 2026 13:03:16 +0900 Subject: [PATCH 1/2] pages: night-sky oil look on about, blog, products, legal and 404 One shared sheet (assets/pages.css) loaded last on 31 pages: painted sky band, solid nav dock, gold-star brand, cream poster cards, stacked footer. 404 long URLs now wrap at 390. Co-Authored-By: Claude Opus 5.5 --- 404.html | 4 +- about/index.html | 4 +- assets/pages.css | 130 ++++++++++++++++++ blog/index.html | 3 +- blog/play-pptx-in-browser/index.html | 3 +- ko/about/index.html | 4 +- ko/blog/index.html | 3 +- ko/products/classroom-html-tools/index.html | 3 +- ko/products/exam-sheet-builder/index.html | 3 +- ko/products/index.html | 3 +- ko/products/omr-auto-grader/index.html | 3 +- ko/products/pairy-core-sdk/index.html | 3 +- ko/products/pptx-player-sdk/index.html | 3 +- ko/products/qr-cropper/index.html | 3 +- ko/products/scan-to-grade-bundle/index.html | 3 +- ko/products/send-approval-gate-mcp/index.html | 3 +- ko/products/shapefit/index.html | 3 +- ko/products/voice-command-engine/index.html | 3 +- legal/privacy/index.html | 4 +- legal/refunds/index.html | 4 +- legal/terms/index.html | 4 +- products/classroom-html-tools/index.html | 3 +- products/exam-sheet-builder/index.html | 3 +- products/index.html | 3 +- products/omr-auto-grader/index.html | 3 +- products/pairy-core-sdk/index.html | 3 +- products/pptx-player-sdk/index.html | 3 +- products/qr-cropper/index.html | 3 +- products/scan-to-grade-bundle/index.html | 3 +- products/send-approval-gate-mcp/index.html | 3 +- products/shapefit/index.html | 3 +- products/voice-command-engine/index.html | 3 +- 32 files changed, 198 insertions(+), 31 deletions(-) create mode 100644 assets/pages.css diff --git a/404.html b/404.html index 40ed311..82a214e 100644 --- a/404.html +++ b/404.html @@ -29,6 +29,7 @@ table{border-collapse:collapse;width:100%;margin-top:8px;font-size:16px} th,td{border-bottom:1px solid var(--line);text-align:left;padding:10px 8px;vertical-align:top} +

404: page not found

@@ -42,5 +43,6 @@

404: page not found

- Full reference with prices and buy links: https://207studio.dev/llms-full.txt - Contact: support@207studio.dev -
+ + diff --git a/about/index.html b/about/index.html index 56c9559..c024d0e 100644 --- a/about/index.html +++ b/about/index.html @@ -33,6 +33,7 @@ table{border-collapse:collapse;width:100%;margin-top:8px;font-size:16px} th,td{border-bottom:1px solid var(--line);text-align:left;padding:10px 8px;vertical-align:top} +
@@ -58,5 +59,6 @@

Contact

Email support@207studio.dev for support, licensing and Enterprise questions. We read every message.

Policies: Terms · Privacy · Refunds. Code: github.com/207studio.

For AI agents: llms.txt · llms-full.txt.

-
+ + diff --git a/assets/pages.css b/assets/pages.css new file mode 100644 index 0000000..3cdfddd --- /dev/null +++ b/assets/pages.css @@ -0,0 +1,130 @@ +/* 207 Studio inner pages: the homepage's night-sky oil look. + Loaded last on about, blog, products, legal and 404, over products.css, blog.css or the inline sheet. + Those sheets share token names (--bg, --ink, --muted, --line, --lime), so redefining them flips the theme. */ +@font-face { font-family: "DM Sans"; src: url("/assets/fonts/dm-sans-500-latin.woff2") format("woff2"); font-weight: 500; font-display: swap; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } +@font-face { font-family: "DM Sans"; src: url("/assets/fonts/dm-sans-700-latin.woff2") format("woff2"); font-weight: 700; font-display: swap; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } +@font-face { font-family: "Instrument Sans"; src: url("/assets/fonts/instrument-sans-latin.woff2") format("woff2"); font-weight: 400 700; font-stretch: 75% 100%; font-display: swap; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } + +:root { + --night: #0d1333; --night-2: #141a45; --gold: #e9c46a; --cream: #f4ecd8; + --bg: var(--night); --ink: var(--cream); --muted: #b9b4cc; --line: rgba(244, 236, 216, 0.16); --lime: var(--gold); + --link: #f3d68f; + --display: "DM Sans", "Apple SD Gothic Neo", "Malgun Gothic", "Noto Sans KR", sans-serif; + --body: "Instrument Sans", "Apple SD Gothic Neo", "Malgun Gothic", "Noto Sans KR", sans-serif; + --star: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23e9c46a' d='M12 1c.4 5.6 2.6 8 11 11-8.4 3-10.6 5.4-11 11-.4-5.6-2.6-8-11-11 8.4-3 10.6-5.4 11-11z'/%3E%3C/svg%3E"); + color-scheme: dark; +} +html { + background: + radial-gradient(1.5px 1.5px at 12% 18%, rgba(233, 196, 106, 0.7), transparent 60%), + radial-gradient(1px 1px at 68% 42%, rgba(244, 236, 216, 0.55), transparent 60%), + radial-gradient(1.5px 1.5px at 38% 76%, rgba(233, 196, 106, 0.55), transparent 60%), + radial-gradient(1px 1px at 88% 88%, rgba(244, 236, 216, 0.45), transparent 60%), + var(--night); + background-size: 520px 680px, 520px 680px, 520px 680px, 520px 680px, auto; +} +body { position: relative; overflow-x: clip; background: transparent; color: var(--ink); font-family: var(--body); } +::selection { background: rgba(233, 196, 106, 0.4); color: #fff; } +:focus-visible { outline: 2px solid var(--gold); outline-offset: 3px; } + +/* Painted header band: the homepage hero sky behind the top of every page, fading into the night. */ +body::before { + position: absolute; top: 0; left: 0; right: 0; z-index: -1; height: clamp(360px, 40vw, 540px); content: ""; pointer-events: none; + background: + linear-gradient(180deg, rgba(13, 19, 51, 0.5) 0%, rgba(13, 19, 51, 0.62) 55%, var(--night) 100%), + url("/assets/night/sky-1280.webp") center 28% / cover no-repeat; + background: + linear-gradient(180deg, rgba(13, 19, 51, 0.5) 0%, rgba(13, 19, 51, 0.62) 55%, var(--night) 100%), + image-set(url("/assets/night/sky-1280.avif") type("image/avif"), url("/assets/night/sky-1280.webp") type("image/webp")) center 28% / cover no-repeat; +} +@media (max-width: 700px) { + body::before { + height: 400px; + background: + linear-gradient(180deg, rgba(13, 19, 51, 0.55) 0%, rgba(13, 19, 51, 0.68) 55%, var(--night) 100%), + url("/assets/night/sky-m-480.webp") center 20% / cover no-repeat; + background: + linear-gradient(180deg, rgba(13, 19, 51, 0.55) 0%, rgba(13, 19, 51, 0.68) 55%, var(--night) 100%), + image-set(url("/assets/night/sky-m-480.avif") type("image/avif"), url("/assets/night/sky-m-480.webp") type("image/webp")) center 20% / cover no-repeat; + } +} + +/* Type */ +h1, h2, h3 { font-family: var(--display); font-weight: 700; color: var(--ink); } +h1 { letter-spacing: -0.01em; text-shadow: 0 2px 24px rgba(8, 10, 32, 0.45); } +a { color: var(--link); } +.muted, .eyebrow, .note, .summary, .lede, .intro, .crumbs, .post-meta, .includes, .also, .tier-note-small { color: var(--muted); } +.eyebrow { display: inline-flex; align-items: center; gap: 8px; } +.eyebrow::before { width: 12px; height: 12px; background: var(--star) center / contain no-repeat; content: ""; } + +/* Solid nav: the homepage dock, kept in flow so nothing slides under it. */ +.site-header, .top { + position: sticky; top: 10px; z-index: 20; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px 18px; + margin-top: 16px; padding: 10px 22px; border: 1px solid rgba(244, 236, 216, 0.16); border-radius: 999px; + background: var(--night); box-shadow: 0 10px 30px rgba(4, 6, 20, 0.35); font-family: var(--display); font-size: 14px; +} +.top { margin-bottom: 40px; } +.site-header nav { display: flex; flex-wrap: wrap; gap: 4px 18px; } +.site-header nav a, .top a { display: inline-flex; align-items: center; min-height: 44px; color: var(--ink); font-weight: 500; text-decoration: none; } +.site-header nav a:hover, .top a:hover { color: var(--gold); } +.site-header nav a[aria-current] { color: var(--gold); } +.brand { display: inline-flex; align-items: center; gap: 9px; color: var(--ink) !important; font-family: var(--display); font-size: 14px; font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase; text-decoration: none; } +.brand::before { flex: none; width: 18px; height: 18px; background: var(--star) center / contain no-repeat; content: ""; } +.brand-mark { padding: 0; border: 0; font-size: inherit; font-weight: inherit; letter-spacing: inherit; line-height: inherit; } +.brand > span + span { margin-left: -2px; } +@media (max-width: 520px) { + .site-header, .top { padding: 6px 16px; border-radius: 24px; font-size: 13px; } + .site-header nav { gap: 0 14px; } + .brand { font-size: 12px; letter-spacing: 0.13em; } +} + +/* Cream poster cards with their own dark ink, as on the homepage walk. */ +.card, .related-card, .tier-note, .upsell, .post-list li { + --ink: #1b1838; --muted: #5b5672; --line: rgba(27, 24, 56, 0.16); --link: #7a5a12; + position: relative; border: 0; border-radius: 3px; color: var(--ink); + background: radial-gradient(120% 90% at 20% 10%, rgba(255, 252, 240, 0.9), rgba(255, 252, 240, 0) 60%), linear-gradient(175deg, #f6eed8, #ece2c6); + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset, 0 18px 40px rgba(4, 6, 20, 0.5); +} +.card { padding: 18px 18px 14px; } +.card h3, .card h3 a, .related-card, .tier-note h2, .post-list h2, .post-list h2 a { color: var(--ink); } +.related-card { padding: 14px; } +.tier-note, .upsell { padding: 16px 20px; } +.post-list { display: grid; gap: 18px; } +.post-list li { padding: 18px 22px; border: 0; } +.card::before, .post-list li::before { position: absolute; top: -7px; left: 50%; width: 64px; height: 14px; margin-left: -32px; background: rgba(233, 196, 106, 0.5); content: ""; transform: rotate(-1.5deg); } +.card-media img, .hero-media img, .related-card img, .post-figure img { border-color: rgba(27, 24, 56, 0.16); } +.hero-media img, .post-figure img { border-color: var(--line); box-shadow: 0 18px 40px rgba(4, 6, 20, 0.5); } + +/* Buttons: gold primary, cream-lined secondary, as on the homepage. */ +.buy { border-color: var(--ink); color: var(--ink); border-radius: 999px; } +.buy.primary { border-color: var(--gold); background: var(--gold); color: #1b1838; } +.badge { background: var(--gold); color: #1b1838; } + +/* Tables, code, details */ +th, td { border-color: var(--line); } +tr.ours { background: rgba(233, 196, 106, 0.14); } +.prose th { background: rgba(244, 236, 216, 0.08); } +.prose code { background: rgba(244, 236, 216, 0.1); color: var(--ink); } +pre, .prose pre { border: 1px solid var(--line); background: #0a0f29; color: var(--cream); } +.prose blockquote { border-left-color: var(--gold); } +details { border-color: var(--line); } + +/* 404: long URLs wrap instead of pushing the page sideways. */ +pre { white-space: pre-wrap; overflow-wrap: anywhere; } + +/* Stacked footer, shared by every inner page. */ +.site-footer { margin-top: 72px; padding: 0 0 40px; border-top: 1px solid var(--line); color: var(--muted); } +.page-foot { max-width: 1240px; margin-inline: auto; } +.foot-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 24px; padding: 40px 0 8px; } +.foot-brand p { max-width: 26ch; margin: 10px 0 0; font-size: 14px; } +.foot-col { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; } +.foot-col h2 { margin: 0 0 6px; color: var(--muted); font-family: var(--body); font-size: 11px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; } +.foot-col a { display: inline-flex; align-items: center; min-height: 44px; color: var(--ink); font-size: 14px; text-decoration: none; } +.foot-col a:hover { color: var(--gold); text-decoration: underline; text-underline-offset: 4px; } +.foot-word { display: block; width: min(100%, 560px); height: auto; margin: 16px 0 8px; opacity: 0.1; } +.site-footer > p { font-size: 13px; } +.page-foot-hand { width: min(1240px, calc(100% - 48px)); margin-inline: auto; } +@media (max-width: 760px) { + .foot-grid { grid-template-columns: 1fr 1fr; } + .foot-brand { grid-column: 1 / -1; } +} diff --git a/blog/index.html b/blog/index.html index 7da98d2..f1c2759 100644 --- a/blog/index.html +++ b/blog/index.html @@ -25,6 +25,7 @@ + @@ -36,6 +37,6 @@

Writing

  • How to play a PPTX in the browser (without PowerPoint)

    Render a .pptx in the browser without a server or Office. What breaks the animations, three ways to do it, and how to test any viewer in five minutes.

  • - + diff --git a/blog/play-pptx-in-browser/index.html b/blog/play-pptx-in-browser/index.html index 0cdfc65..62f878f 100644 --- a/blog/play-pptx-in-browser/index.html +++ b/blog/play-pptx-in-browser/index.html @@ -23,6 +23,7 @@ + @@ -101,7 +102,7 @@

    FAQ

    Which licence tier do I need?

    Developer at $14 is one developer, and you can ship the player inside your own paid or free apps as bundled code. Commercial at $129 is for a company or organisation where more than one person uses it, and adds priority email support. Both include the full source. Neither lets you share the source itself.

    - + diff --git a/ko/about/index.html b/ko/about/index.html index 8163875..669b254 100644 --- a/ko/about/index.html +++ b/ko/about/index.html @@ -35,6 +35,7 @@ table{border-collapse:collapse;width:100%;margin-top:8px;font-size:16px} th,td{border-bottom:1px solid var(--line);text-align:left;padding:10px 8px;vertical-align:top} +
    @@ -60,5 +61,6 @@

    문의

    지원, 라이선스, Enterprise 문의는 support@207studio.dev로 보내 주세요. 모든 메일을 읽어요.

    정책: 이용약관 · 개인정보 처리방침 · 환불 정책. 코드: github.com/207studio.

    AI 에이전트용: llms.txt · llms-full.txt.

    -
    + + diff --git a/ko/blog/index.html b/ko/blog/index.html index 180ab0b..8302049 100644 --- a/ko/blog/index.html +++ b/ko/blog/index.html @@ -27,6 +27,7 @@ + @@ -38,6 +39,6 @@

    글

  • PPTX를 브라우저에서 재생하는 법 (PowerPoint 없이)

    서버도 Office도 없이 .pptx를 브라우저에서 렌더링해요. 애니메이션이 깨지는 이유, 세 가지 방법, 뷰어를 5분 만에 확인하는 법을 다뤄요.

    영어 글
  • - + diff --git a/ko/products/classroom-html-tools/index.html b/ko/products/classroom-html-tools/index.html index b819eae..e673eb8 100644 --- a/ko/products/classroom-html-tools/index.html +++ b/ko/products/classroom-html-tools/index.html @@ -26,6 +26,7 @@ + @@ -58,6 +59,6 @@

    Offline Classroom Tools: 자리 배치, PACER 타이머

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/exam-sheet-builder/index.html b/ko/products/exam-sheet-builder/index.html index db070d7..537130b 100644 --- a/ko/products/exam-sheet-builder/index.html +++ b/ko/products/exam-sheet-builder/index.html @@ -26,6 +26,7 @@ + @@ -58,6 +59,6 @@

    Exam + OMR Sheet Builder: 시험지, OMR 카드, 정답지

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/index.html b/ko/products/index.html index 38fbbb2..9ff94b1 100644 --- a/ko/products/index.html +++ b/ko/products/index.html @@ -26,6 +26,7 @@ + @@ -108,6 +109,6 @@

    Offline Classroom Tools: 자리 - + diff --git a/ko/products/omr-auto-grader/index.html b/ko/products/omr-auto-grader/index.html index dbd4953..85f0f51 100644 --- a/ko/products/omr-auto-grader/index.html +++ b/ko/products/omr-auto-grader/index.html @@ -26,6 +26,7 @@ + @@ -58,6 +59,6 @@

    OMR Auto-Grader: 버블, O/X, 동그라미 답안 채점

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/pairy-core-sdk/index.html b/ko/products/pairy-core-sdk/index.html index efeb363..fe18add 100644 --- a/ko/products/pairy-core-sdk/index.html +++ b/ko/products/pairy-core-sdk/index.html @@ -26,6 +26,7 @@ + @@ -58,6 +59,6 @@

    PairyCore SDK: Mac 화면을 iPad로 스트리밍 (Swift)

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/pptx-player-sdk/index.html b/ko/products/pptx-player-sdk/index.html index 244238f..4269753 100644 --- a/ko/products/pptx-player-sdk/index.html +++ b/ko/products/pptx-player-sdk/index.html @@ -26,6 +26,7 @@ + @@ -58,6 +59,6 @@

    PPTX Player SDK: 브라우저에서 PowerPoint 재생

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/qr-cropper/index.html b/ko/products/qr-cropper/index.html index 5afd931..e8d4924 100644 --- a/ko/products/qr-cropper/index.html +++ b/ko/products/qr-cropper/index.html @@ -26,6 +26,7 @@ + @@ -58,6 +59,6 @@

    QR Answer-Sheet Cropper: 답안 칸마다 잘라내기

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/scan-to-grade-bundle/index.html b/ko/products/scan-to-grade-bundle/index.html index ff68adb..f45293d 100644 --- a/ko/products/scan-to-grade-bundle/index.html +++ b/ko/products/scan-to-grade-bundle/index.html @@ -26,6 +26,7 @@ + @@ -58,6 +59,6 @@

    Scan-to-Grade: 스캔한 시험지를 Excel로 (Python)

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/send-approval-gate-mcp/index.html b/ko/products/send-approval-gate-mcp/index.html index b0bce9a..f73c809 100644 --- a/ko/products/send-approval-gate-mcp/index.html +++ b/ko/products/send-approval-gate-mcp/index.html @@ -26,6 +26,7 @@ + @@ -58,6 +59,6 @@

    Send Approval Gate MCP: AI 에이전트의 발송을 한 번만

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/shapefit/index.html b/ko/products/shapefit/index.html index 8b81660..3530ef5 100644 --- a/ko/products/shapefit/index.html +++ b/ko/products/shapefit/index.html @@ -26,6 +26,7 @@ + @@ -58,6 +59,6 @@

    ShapeFit: Swift와 Rust용 hold-to-shape

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/voice-command-engine/index.html b/ko/products/voice-command-engine/index.html index c140065..6130445 100644 --- a/ko/products/voice-command-engine/index.html +++ b/ko/products/voice-command-engine/index.html @@ -26,6 +26,7 @@ + @@ -58,6 +59,6 @@

    Context-Gated Voice Commands: 오프라인 음성 명령

    1회 구매.

    ← 전체 제품

    - + diff --git a/legal/privacy/index.html b/legal/privacy/index.html index 9aa6922..e67770b 100644 --- a/legal/privacy/index.html +++ b/legal/privacy/index.html @@ -30,6 +30,7 @@ table{border-collapse:collapse;width:100%;margin-top:8px;font-size:16px} th,td{border-bottom:1px solid var(--line);text-align:left;padding:10px 8px;vertical-align:top} +
    @@ -65,4 +66,5 @@

    7. Children

    Our products are sold to adults. We do not knowingly collect data from children.

    Terms of Service · Refund Policy · Home

    -
    + + diff --git a/legal/refunds/index.html b/legal/refunds/index.html index e1a4ddd..7ca08a2 100644 --- a/legal/refunds/index.html +++ b/legal/refunds/index.html @@ -28,6 +28,7 @@ .top{display:flex;justify-content:space-between;align-items:center;margin-bottom:40px;font-size:15px} .brand{font-weight:700;letter-spacing:.14em} +
    @@ -50,4 +51,5 @@

    5. Changing your mind

    Digital files are delivered immediately, so a change of mind after a successful download is handled under the store's policy, not ours. If you are unsure before buying, write to us with your question first; we answer setup questions before the sale.

    Terms of Service · Privacy Policy · Home

    -
    + + diff --git a/legal/terms/index.html b/legal/terms/index.html index 532bcbd..2da133e 100644 --- a/legal/terms/index.html +++ b/legal/terms/index.html @@ -28,6 +28,7 @@ .top{display:flex;justify-content:space-between;align-items:center;margin-bottom:40px;font-size:15px} .brand{font-weight:700;letter-spacing:.14em} +
    @@ -62,4 +63,5 @@

    9. Changes

    We may update these terms for future purchases. The version that applied to your order is the one published on the day you bought.

    Privacy Policy · Refund Policy · Home

    -
    + + diff --git a/products/classroom-html-tools/index.html b/products/classroom-html-tools/index.html index 868ba9d..4f29a5b 100644 --- a/products/classroom-html-tools/index.html +++ b/products/classroom-html-tools/index.html @@ -24,6 +24,7 @@ + @@ -63,6 +64,6 @@

    Offline Classroom Tools – Seating, PACER Timer

    ← All products

    - + diff --git a/products/exam-sheet-builder/index.html b/products/exam-sheet-builder/index.html index 77ffaad..396fb6f 100644 --- a/products/exam-sheet-builder/index.html +++ b/products/exam-sheet-builder/index.html @@ -24,6 +24,7 @@ + @@ -63,6 +64,6 @@

    Exam + OMR Sheet Builder – Paper, Sheet & Key

    ← All products

    - + diff --git a/products/index.html b/products/index.html index 989d7a4..31b8484 100644 --- a/products/index.html +++ b/products/index.html @@ -24,6 +24,7 @@ + @@ -115,6 +116,6 @@

    Offline Classroom Tools – Seatin - + diff --git a/products/omr-auto-grader/index.html b/products/omr-auto-grader/index.html index ba938e4..0a5067a 100644 --- a/products/omr-auto-grader/index.html +++ b/products/omr-auto-grader/index.html @@ -24,6 +24,7 @@ + @@ -68,6 +69,6 @@

    OMR Auto-Grader – Bubbles, O/X, Circled Answers

    ← All products

    - + diff --git a/products/pairy-core-sdk/index.html b/products/pairy-core-sdk/index.html index 1281bf4..5ecfe41 100644 --- a/products/pairy-core-sdk/index.html +++ b/products/pairy-core-sdk/index.html @@ -24,6 +24,7 @@ + @@ -63,6 +64,6 @@

    PairyCore SDK: Mac-to-iPad Screen Streaming

    ← All products

    - + diff --git a/products/pptx-player-sdk/index.html b/products/pptx-player-sdk/index.html index c091b59..bebf5f5 100644 --- a/products/pptx-player-sdk/index.html +++ b/products/pptx-player-sdk/index.html @@ -24,6 +24,7 @@ + @@ -65,6 +66,6 @@

    PPTX Player SDK – Play PowerPoint in the Browser

    ← All products

    - + diff --git a/products/qr-cropper/index.html b/products/qr-cropper/index.html index 887315f..beec0f6 100644 --- a/products/qr-cropper/index.html +++ b/products/qr-cropper/index.html @@ -24,6 +24,7 @@ + @@ -66,6 +67,6 @@

    QR Answer-Sheet Cropper – Crop Every Answer Box

    ← All products

    - + diff --git a/products/scan-to-grade-bundle/index.html b/products/scan-to-grade-bundle/index.html index ac314e1..6477a4b 100644 --- a/products/scan-to-grade-bundle/index.html +++ b/products/scan-to-grade-bundle/index.html @@ -24,6 +24,7 @@ + @@ -65,6 +66,6 @@

    Scan-to-Grade: Scanned Exams to Excel (Python)

    ← All products

    - + diff --git a/products/send-approval-gate-mcp/index.html b/products/send-approval-gate-mcp/index.html index 288b2e6..65ad45e 100644 --- a/products/send-approval-gate-mcp/index.html +++ b/products/send-approval-gate-mcp/index.html @@ -24,6 +24,7 @@ + @@ -60,6 +61,6 @@

    Send Approval Gate MCP: Plan, Approve, Send, Verify

    ← All products

    - + diff --git a/products/shapefit/index.html b/products/shapefit/index.html index fb9bfce..987cee5 100644 --- a/products/shapefit/index.html +++ b/products/shapefit/index.html @@ -24,6 +24,7 @@ + @@ -63,6 +64,6 @@

    ShapeFit – Hold-to-Shape for Swift & Rust

    ← All products

    - + diff --git a/products/voice-command-engine/index.html b/products/voice-command-engine/index.html index d510411..da930e4 100644 --- a/products/voice-command-engine/index.html +++ b/products/voice-command-engine/index.html @@ -24,6 +24,7 @@ + @@ -64,6 +65,6 @@

    Context-Gated Voice Commands – Offline

    ← All products

    - + From 07e84925b32e5938f57db939ce173abe32755ad2 Mon Sep 17 00:00:00 2001 From: 207studio Date: Mon, 2 Nov 2026 14:13:16 +0900 Subject: [PATCH 2/2] pages: one footer row; pay and pairy in the oil look; generator matches the pages - Old footer lines replaced by a single row: copyright, country, language link. - pay/ gets the site header, footer and pages.css; pairy stubs get pages.css. - _products templates now render what the hand-edited pages carry: icons, hreflang, twitter meta, pages.css, footer grid, org logo and seller @id, BlogPosting, figure size. Sitemap, robots and llms renderers untouched. Co-Authored-By: Claude Opus 5.5 --- 404.html | 2 +- _blog/posts.json | 2 ++ _products/blog-gen.mjs | 36 +++++++++++++------ _products/gen/src/main.rs | 36 ++++++++++++------- about/index.html | 2 +- assets/pages.css | 9 +++-- blog/index.html | 2 +- blog/play-pptx-in-browser/index.html | 2 +- ko/about/index.html | 2 +- ko/blog/index.html | 2 +- ko/products/classroom-html-tools/index.html | 2 +- ko/products/exam-sheet-builder/index.html | 2 +- ko/products/index.html | 2 +- ko/products/omr-auto-grader/index.html | 2 +- ko/products/pairy-core-sdk/index.html | 2 +- ko/products/pptx-player-sdk/index.html | 2 +- ko/products/qr-cropper/index.html | 2 +- ko/products/scan-to-grade-bundle/index.html | 2 +- ko/products/send-approval-gate-mcp/index.html | 2 +- ko/products/shapefit/index.html | 2 +- ko/products/voice-command-engine/index.html | 2 +- legal/privacy/index.html | 2 +- legal/refunds/index.html | 2 +- legal/terms/index.html | 2 +- pairy/index.html | 1 + pairy/mac/index.html | 1 + pay/index.html | 14 +++++--- products/classroom-html-tools/index.html | 2 +- products/exam-sheet-builder/index.html | 2 +- products/index.html | 2 +- products/omr-auto-grader/index.html | 2 +- products/pairy-core-sdk/index.html | 2 +- products/pptx-player-sdk/index.html | 2 +- products/qr-cropper/index.html | 2 +- products/scan-to-grade-bundle/index.html | 2 +- products/send-approval-gate-mcp/index.html | 2 +- products/shapefit/index.html | 2 +- products/voice-command-engine/index.html | 2 +- 38 files changed, 100 insertions(+), 61 deletions(-) diff --git a/404.html b/404.html index 82a214e..5f44e0a 100644 --- a/404.html +++ b/404.html @@ -43,6 +43,6 @@

    404: page not found

    - Full reference with prices and buy links: https://207studio.dev/llms-full.txt - Contact: support@207studio.dev - + diff --git a/_blog/posts.json b/_blog/posts.json index fb0a34f..4cb5e3b 100644 --- a/_blog/posts.json +++ b/_blog/posts.json @@ -11,6 +11,8 @@ "pptx" ], "image": "/assets/products/pptx-player-sdk-1200.jpg", + "image_width": 1200, + "image_height": 675, "image_alt": "PPTX Player SDK diagram: a slide stepped with click 1, click 2, then a morph transition", "image_caption": "A deck steps the way PowerPoint plays it: click 1, click 2, then a morph transition between slides." } diff --git a/_products/blog-gen.mjs b/_products/blog-gen.mjs index 018a732..c919c80 100644 --- a/_products/blog-gen.mjs +++ b/_products/blog-gen.mjs @@ -192,26 +192,39 @@ const CSS = `:root{--bg:#fafbf8;--ink:#102b32;--muted:#52646a;--line:#d6dedb;--l .post-list time{font-size:.88rem;color:var(--muted)} `; -function head(title, description, canonical, ogImage, extraCss = '/blog/blog.css') { - const image = ogImage ? `\n\n` : ''; +// opts.ko: the Korean twin's URL (adds hreflang). opts.cardImage: og/twitter image for pages without a hero image. +function head(title, description, canonical, ogImage, opts = {}) { + const extraCss = opts.extraCss || '/blog/blog.css'; + const image = ogImage + ? `\n\n` + : opts.cardImage ? `\n` : ''; + const twImage = ogImage || opts.cardImage; + const alternates = opts.ko + ? `\n\n\n` + : ''; return ` - + + + ${esc(title)} - +${alternates} ${image} + + +${twImage ? `\n` : ''} `; } @@ -220,8 +233,11 @@ function header(current) { return ``; } -function footer() { - return `

    207 Studio (207studio.dev), South Korea. Support: ${esc(data.support_email)}

    Last updated ${esc(data.last_updated)}. \u00a9 2026 207 Studio

    `; +const FOOT_GRID = ''; + +function footer(ko) { + const lang = ko ? `\ud55c\uad6d\uc5b4` : ''; + return `
    ${FOOT_GRID}
    \u00a9 2026 207 Studio \u00b7 South Korea${lang}
    `; } const scriptTag = (obj) => @@ -254,7 +270,7 @@ for (const post of posts) { const graph = [ { - '@type': 'Article', + '@type': 'BlogPosting', '@id': `${canonical}#article`, headline: h1, description: post.description, @@ -288,7 +304,7 @@ for (const post of posts) { const ogImage = post.image ? `${BASE}${post.image}` : ''; const figure = post.image - ? `
    ${esc(post.image_alt || '')}${post.image_caption ? `
    ${inline(post.image_caption)}
    ` : ''}
    ` + ? `
    ${esc(post.image_alt || '')}${post.image_caption ? `
    ${inline(post.image_caption)}
    ` : ''}
    ` : ''; const page = `${head(post.meta_title || post.title, post.description, canonical, ogImage)} @@ -320,7 +336,7 @@ const listItems = posts ) .join('\n'); -const listPage = `${head('Writing \u2013 notes on browser rendering and classroom tools | 207 Studio', 'Practical notes from 207 Studio on rendering documents in the browser, offline classroom tools, and the code behind them.', `${BASE}/blog/`)} +const listPage = `${head('Writing \u2013 notes on browser rendering and classroom tools | 207 Studio', 'Practical notes from 207 Studio on rendering documents in the browser, offline classroom tools, and the code behind them.', `${BASE}/blog/`, '', { ko: `${BASE}/ko/blog/`, cardImage: posts.find((p) => p.image) ? `${BASE}${posts.find((p) => p.image).image}` : '' })} ${header('blog')}
    @@ -331,7 +347,7 @@ ${header('blog')} ${listItems}
    -${footer()} +${footer(`${BASE}/ko/blog/`)} `; diff --git a/_products/gen/src/main.rs b/_products/gen/src/main.rs index 8dc86cb..d37b0cc 100644 --- a/_products/gen/src/main.rs +++ b/_products/gen/src/main.rs @@ -81,7 +81,9 @@ struct Tier { paddle_price_id: Option, } -const FAVICON: &str = ""; +const FAVICON: &str = "\n\n"; +// Footer columns shared with every inner page (assets/pages.css styles them). +const FOOT_GRID: &str = r##""##; fn main() { let args: Vec = env::args().collect(); @@ -173,6 +175,7 @@ fn head( image_jpg: &str, ) -> String { let image = esc(&absolute(&data.base_url, image_jpg)); + let ko = esc(&ko_url(&data.base_url, canonical)); let canonical = esc(canonical); let title = esc(title); let description = esc(description); @@ -188,6 +191,9 @@ fn head( {title}\n\ \n\ \n\ +\n\ +\n\ +\n\ \n\ \n\ \n\ @@ -195,6 +201,10 @@ fn head( \n\ \n\ \n\ +\n\ +\n\ +\n\ +\n\ \n" ) } @@ -210,11 +220,16 @@ fn header(products_current: bool) -> String { ) } -fn footer(data: &SiteData) -> String { - let email = esc(&data.support_email); - let updated = esc(&data.last_updated); +// The Korean twin of an English page: /products/x/ -> /ko/products/x/. +fn ko_url(base_url: &str, canonical: &str) -> String { + canonical.replacen(&format!("{base_url}/"), &format!("{base_url}/ko/"), 1) +} + +fn footer(data: &SiteData, canonical: &str) -> String { + let ko = esc(&ko_url(&data.base_url, canonical)); + let grid = FOOT_GRID.replace("support@207studio.dev", &esc(&data.support_email)); format!( - "

    207 Studio (207studio.dev), South Korea. Support: {email}

    Last updated {updated}. © 2026 207 Studio

    \n" + "
    {grid}
    © 2026 207 Studio · South Korea한국어
    \n" ) } @@ -244,11 +259,7 @@ fn offers(data: &SiteData, product: &Product) -> Vec { "priceCurrency": "USD", "availability": "https://schema.org/InStock", "url": tier.url, - "seller": { - "@type": "Organization", - "name": data.organization.name, - "url": data.organization.url, - }, + "seller": { "@id": format!("{}/#org", data.organization.url) }, "shippingDetails": shipping_details(), "hasMerchantReturnPolicy": return_policy(), }) @@ -564,6 +575,7 @@ fn render_listing(data: &SiteData) -> Result { "name": org.name, "url": org.url, "email": org.email, + "logo": format!("{}/assets/logo.png", org.url), "address": { "@type": "PostalAddress", "addressCountry": org.country }, "sameAs": org.same_as, }, @@ -582,7 +594,7 @@ fn render_listing(data: &SiteData) -> Result { }))); out.push_str("\n"); - out.push_str(&footer(data)); + out.push_str(&footer(data, &canonical)); out.push_str("\n\n"); Ok(out) } @@ -719,7 +731,7 @@ fn render_product(data: &SiteData, product: &Product) -> Result }))); out.push_str("\n"); - out.push_str(&footer(data)); + out.push_str(&footer(data, &canonical)); out.push_str("\n\n"); Ok(out) } diff --git a/about/index.html b/about/index.html index c024d0e..1132cf0 100644 --- a/about/index.html +++ b/about/index.html @@ -59,6 +59,6 @@

    Contact

    Email support@207studio.dev for support, licensing and Enterprise questions. We read every message.

    Policies: Terms · Privacy · Refunds. Code: github.com/207studio.

    For AI agents: llms.txt · llms-full.txt.

    - + diff --git a/assets/pages.css b/assets/pages.css index 3cdfddd..4b3a612 100644 --- a/assets/pages.css +++ b/assets/pages.css @@ -1,5 +1,5 @@ /* 207 Studio inner pages: the homepage's night-sky oil look. - Loaded last on about, blog, products, legal and 404, over products.css, blog.css or the inline sheet. + Loaded last on about, blog, products, legal, pay, pairy and 404, over products.css, blog.css or the inline sheet. Those sheets share token names (--bg, --ink, --muted, --line, --lime), so redefining them flips the theme. */ @font-face { font-family: "DM Sans"; src: url("/assets/fonts/dm-sans-500-latin.woff2") format("woff2"); font-weight: 500; font-display: swap; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: "DM Sans"; src: url("/assets/fonts/dm-sans-700-latin.woff2") format("woff2"); font-weight: 700; font-display: swap; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @@ -14,7 +14,7 @@ --star: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23e9c46a' d='M12 1c.4 5.6 2.6 8 11 11-8.4 3-10.6 5.4-11 11-.4-5.6-2.6-8-11-11 8.4-3 10.6-5.4 11-11z'/%3E%3C/svg%3E"); color-scheme: dark; } -html { +html, :root { background: radial-gradient(1.5px 1.5px at 12% 18%, rgba(233, 196, 106, 0.7), transparent 60%), radial-gradient(1px 1px at 68% 42%, rgba(244, 236, 216, 0.55), transparent 60%), @@ -122,7 +122,10 @@ pre { white-space: pre-wrap; overflow-wrap: anywhere; } .foot-col a { display: inline-flex; align-items: center; min-height: 44px; color: var(--ink); font-size: 14px; text-decoration: none; } .foot-col a:hover { color: var(--gold); text-decoration: underline; text-underline-offset: 4px; } .foot-word { display: block; width: min(100%, 560px); height: auto; margin: 16px 0 8px; opacity: 0.1; } -.site-footer > p { font-size: 13px; } +.foot-bottom { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0 24px; padding-top: 8px; border-top: 1px solid var(--line); font-size: 13px; } +.foot-bottom span { padding-block: 12px; } +.foot-bottom a { display: inline-flex; align-items: center; min-height: 44px; color: var(--ink); text-decoration: none; } +.foot-bottom a:hover { color: var(--gold); } .page-foot-hand { width: min(1240px, calc(100% - 48px)); margin-inline: auto; } @media (max-width: 760px) { .foot-grid { grid-template-columns: 1fr 1fr; } diff --git a/blog/index.html b/blog/index.html index f1c2759..7993682 100644 --- a/blog/index.html +++ b/blog/index.html @@ -37,6 +37,6 @@

    Writing

  • How to play a PPTX in the browser (without PowerPoint)

    Render a .pptx in the browser without a server or Office. What breaks the animations, three ways to do it, and how to test any viewer in five minutes.

  • - + diff --git a/blog/play-pptx-in-browser/index.html b/blog/play-pptx-in-browser/index.html index 62f878f..745af1e 100644 --- a/blog/play-pptx-in-browser/index.html +++ b/blog/play-pptx-in-browser/index.html @@ -102,7 +102,7 @@

    FAQ

    Which licence tier do I need?

    Developer at $14 is one developer, and you can ship the player inside your own paid or free apps as bundled code. Commercial at $129 is for a company or organisation where more than one person uses it, and adds priority email support. Both include the full source. Neither lets you share the source itself.

    - + diff --git a/ko/about/index.html b/ko/about/index.html index 669b254..3999f9b 100644 --- a/ko/about/index.html +++ b/ko/about/index.html @@ -61,6 +61,6 @@

    문의

    지원, 라이선스, Enterprise 문의는 support@207studio.dev로 보내 주세요. 모든 메일을 읽어요.

    정책: 이용약관 · 개인정보 처리방침 · 환불 정책. 코드: github.com/207studio.

    AI 에이전트용: llms.txt · llms-full.txt.

    - + diff --git a/ko/blog/index.html b/ko/blog/index.html index 8302049..c5368c5 100644 --- a/ko/blog/index.html +++ b/ko/blog/index.html @@ -39,6 +39,6 @@

    글

  • PPTX를 브라우저에서 재생하는 법 (PowerPoint 없이)

    서버도 Office도 없이 .pptx를 브라우저에서 렌더링해요. 애니메이션이 깨지는 이유, 세 가지 방법, 뷰어를 5분 만에 확인하는 법을 다뤄요.

    영어 글
  • - + diff --git a/ko/products/classroom-html-tools/index.html b/ko/products/classroom-html-tools/index.html index e673eb8..5d20f50 100644 --- a/ko/products/classroom-html-tools/index.html +++ b/ko/products/classroom-html-tools/index.html @@ -59,6 +59,6 @@

    Offline Classroom Tools: 자리 배치, PACER 타이머

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/exam-sheet-builder/index.html b/ko/products/exam-sheet-builder/index.html index 537130b..cd42a08 100644 --- a/ko/products/exam-sheet-builder/index.html +++ b/ko/products/exam-sheet-builder/index.html @@ -59,6 +59,6 @@

    Exam + OMR Sheet Builder: 시험지, OMR 카드, 정답지

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/index.html b/ko/products/index.html index 9ff94b1..1b49928 100644 --- a/ko/products/index.html +++ b/ko/products/index.html @@ -109,6 +109,6 @@

    Offline Classroom Tools: 자리 - + diff --git a/ko/products/omr-auto-grader/index.html b/ko/products/omr-auto-grader/index.html index 85f0f51..76e1d0c 100644 --- a/ko/products/omr-auto-grader/index.html +++ b/ko/products/omr-auto-grader/index.html @@ -59,6 +59,6 @@

    OMR Auto-Grader: 버블, O/X, 동그라미 답안 채점

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/pairy-core-sdk/index.html b/ko/products/pairy-core-sdk/index.html index fe18add..4553739 100644 --- a/ko/products/pairy-core-sdk/index.html +++ b/ko/products/pairy-core-sdk/index.html @@ -59,6 +59,6 @@

    PairyCore SDK: Mac 화면을 iPad로 스트리밍 (Swift)

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/pptx-player-sdk/index.html b/ko/products/pptx-player-sdk/index.html index 4269753..3df2873 100644 --- a/ko/products/pptx-player-sdk/index.html +++ b/ko/products/pptx-player-sdk/index.html @@ -59,6 +59,6 @@

    PPTX Player SDK: 브라우저에서 PowerPoint 재생

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/qr-cropper/index.html b/ko/products/qr-cropper/index.html index e8d4924..d711235 100644 --- a/ko/products/qr-cropper/index.html +++ b/ko/products/qr-cropper/index.html @@ -59,6 +59,6 @@

    QR Answer-Sheet Cropper: 답안 칸마다 잘라내기

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/scan-to-grade-bundle/index.html b/ko/products/scan-to-grade-bundle/index.html index f45293d..b8cc2b0 100644 --- a/ko/products/scan-to-grade-bundle/index.html +++ b/ko/products/scan-to-grade-bundle/index.html @@ -59,6 +59,6 @@

    Scan-to-Grade: 스캔한 시험지를 Excel로 (Python)

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/send-approval-gate-mcp/index.html b/ko/products/send-approval-gate-mcp/index.html index f73c809..78a2abb 100644 --- a/ko/products/send-approval-gate-mcp/index.html +++ b/ko/products/send-approval-gate-mcp/index.html @@ -59,6 +59,6 @@

    Send Approval Gate MCP: AI 에이전트의 발송을 한 번만

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/shapefit/index.html b/ko/products/shapefit/index.html index 3530ef5..138e631 100644 --- a/ko/products/shapefit/index.html +++ b/ko/products/shapefit/index.html @@ -59,6 +59,6 @@

    ShapeFit: Swift와 Rust용 hold-to-shape

    1회 구매.

    ← 전체 제품

    - + diff --git a/ko/products/voice-command-engine/index.html b/ko/products/voice-command-engine/index.html index 6130445..deac082 100644 --- a/ko/products/voice-command-engine/index.html +++ b/ko/products/voice-command-engine/index.html @@ -59,6 +59,6 @@

    Context-Gated Voice Commands: 오프라인 음성 명령

    1회 구매.

    ← 전체 제품

    - + diff --git a/legal/privacy/index.html b/legal/privacy/index.html index e67770b..b806164 100644 --- a/legal/privacy/index.html +++ b/legal/privacy/index.html @@ -66,5 +66,5 @@

    7. Children

    Our products are sold to adults. We do not knowingly collect data from children.

    Terms of Service · Refund Policy · Home

    - + diff --git a/legal/refunds/index.html b/legal/refunds/index.html index 7ca08a2..bfc3b49 100644 --- a/legal/refunds/index.html +++ b/legal/refunds/index.html @@ -51,5 +51,5 @@

    5. Changing your mind

    Digital files are delivered immediately, so a change of mind after a successful download is handled under the store's policy, not ours. If you are unsure before buying, write to us with your question first; we answer setup questions before the sale.

    Terms of Service · Privacy Policy · Home

    - + diff --git a/legal/terms/index.html b/legal/terms/index.html index 2da133e..aa32296 100644 --- a/legal/terms/index.html +++ b/legal/terms/index.html @@ -63,5 +63,5 @@

    9. Changes

    We may update these terms for future purchases. The version that applied to your order is the one published on the day you bought.

    Privacy Policy · Refund Policy · Home

    - + diff --git a/pairy/index.html b/pairy/index.html index 603f5c0..ce13991 100644 --- a/pairy/index.html +++ b/pairy/index.html @@ -23,6 +23,7 @@ +

    Pairy: Connecting Devices

    diff --git a/pairy/mac/index.html b/pairy/mac/index.html index 749990b..4e46bea 100644 --- a/pairy/mac/index.html +++ b/pairy/mac/index.html @@ -22,6 +22,7 @@ +

    Pairy for Mac

    diff --git a/pay/index.html b/pay/index.html index 41e6d01..54efeeb 100644 --- a/pay/index.html +++ b/pay/index.html @@ -5,16 +5,19 @@ Checkout · 207studio - + + +

    Checkout

    Polar is the main checkout. Paddle is the alternative, for card or PayPal, and is the merchant of record for those purchases. Paddle handles tax and receipts. One-time purchase, no subscription. Use the Polar buttons on each product page.

    @@ -22,6 +25,7 @@

    Checkout

    Commercial licenses are for companies with annual revenue up to $1M; larger companies, contact support@207studio.dev for an Enterprise license. See terms and refunds.

    + - + diff --git a/products/exam-sheet-builder/index.html b/products/exam-sheet-builder/index.html index 396fb6f..9eb0ceb 100644 --- a/products/exam-sheet-builder/index.html +++ b/products/exam-sheet-builder/index.html @@ -64,6 +64,6 @@

    Exam + OMR Sheet Builder – Paper, Sheet & Key

    ← All products

    - + diff --git a/products/index.html b/products/index.html index 31b8484..d567a57 100644 --- a/products/index.html +++ b/products/index.html @@ -116,6 +116,6 @@

    Offline Classroom Tools – Seatin - + diff --git a/products/omr-auto-grader/index.html b/products/omr-auto-grader/index.html index 0a5067a..7052042 100644 --- a/products/omr-auto-grader/index.html +++ b/products/omr-auto-grader/index.html @@ -69,6 +69,6 @@

    OMR Auto-Grader – Bubbles, O/X, Circled Answers

    ← All products

    - + diff --git a/products/pairy-core-sdk/index.html b/products/pairy-core-sdk/index.html index 5ecfe41..ccf86a4 100644 --- a/products/pairy-core-sdk/index.html +++ b/products/pairy-core-sdk/index.html @@ -64,6 +64,6 @@

    PairyCore SDK: Mac-to-iPad Screen Streaming

    ← All products

    - + diff --git a/products/pptx-player-sdk/index.html b/products/pptx-player-sdk/index.html index bebf5f5..742db58 100644 --- a/products/pptx-player-sdk/index.html +++ b/products/pptx-player-sdk/index.html @@ -66,6 +66,6 @@

    PPTX Player SDK – Play PowerPoint in the Browser

    ← All products

    - + diff --git a/products/qr-cropper/index.html b/products/qr-cropper/index.html index beec0f6..255f482 100644 --- a/products/qr-cropper/index.html +++ b/products/qr-cropper/index.html @@ -67,6 +67,6 @@

    QR Answer-Sheet Cropper – Crop Every Answer Box

    ← All products

    - + diff --git a/products/scan-to-grade-bundle/index.html b/products/scan-to-grade-bundle/index.html index 6477a4b..4f28f5d 100644 --- a/products/scan-to-grade-bundle/index.html +++ b/products/scan-to-grade-bundle/index.html @@ -66,6 +66,6 @@

    Scan-to-Grade: Scanned Exams to Excel (Python)

    ← All products

    - + diff --git a/products/send-approval-gate-mcp/index.html b/products/send-approval-gate-mcp/index.html index 65ad45e..9c67f3d 100644 --- a/products/send-approval-gate-mcp/index.html +++ b/products/send-approval-gate-mcp/index.html @@ -61,6 +61,6 @@

    Send Approval Gate MCP: Plan, Approve, Send, Verify

    ← All products

    - + diff --git a/products/shapefit/index.html b/products/shapefit/index.html index 987cee5..4fc8c03 100644 --- a/products/shapefit/index.html +++ b/products/shapefit/index.html @@ -64,6 +64,6 @@

    ShapeFit – Hold-to-Shape for Swift & Rust

    ← All products

    - + diff --git a/products/voice-command-engine/index.html b/products/voice-command-engine/index.html index da930e4..455fd83 100644 --- a/products/voice-command-engine/index.html +++ b/products/voice-command-engine/index.html @@ -65,6 +65,6 @@

    Context-Gated Voice Commands – Offline

    ← All products

    - +