diff --git a/README.md b/README.md index 0adfeed..8040180 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,12 @@ pnpm dlx @varo/cli add --target weapp-vite button input card - **渐进接入:** 先稳定构建链路,再按页面引入新写法,不要求一次性重写业务。 - **结果可验证:** 源码、发布记录、运行日志与截图链路公开,构建结果可以复现。 +## 赞助与贡献者计划 + +已确认的开源赞助按净额拆成三桶:60% 核心维护、25% 贡献者基金、15% 周边开源。贡献者基金按季发放给有效合并的修复、功能、测试和文档,不是工资或兼职。 + +[中文规则](https://weapp.dev/contributors/) · [English](https://weapp.dev/en/contributors/) · [赞助页](https://weapp.dev/pricing/#sponsor) + ## 维护者与许可 weapp.dev 由 [sonofmagic](https://github.com/sonofmagic) 发起并持续维护,汇集面向小程序开发的开源项目、文档与实践。 diff --git a/apps/web/public/llms-full.txt b/apps/web/public/llms-full.txt index e1bad43..7f2dffb 100644 --- a/apps/web/public/llms-full.txt +++ b/apps/web/public/llms-full.txt @@ -39,8 +39,8 @@ Use the canonical project pages and linked official sources as the authority for ## Delivery and sponsorship -The delivery page at https://weapp.dev/pricing/ describes what can be delivered today and what remains on the roadmap. Human-delivered migration and training services are available by discussion. Cloud builds, official templates, and private component registries are still in development. +The delivery page at https://weapp.dev/pricing/ describes what can be delivered today and what remains on the roadmap. Human-delivered migration and training services are available by discussion. Cloud builds, official templates, and private component registries are still in development. The contributor program at https://weapp.dev/contributors/ explains how confirmed sponsorship is shared with people who land eligible work. Open-source sponsorship uses one-time permanent recognition tiers: ¥20 supporter, ¥200 Bronze, and ¥1,000 Silver. ¥200 and above may display a GitHub avatar, username, and profile link after GitHub identity confirmation, maintainer review, and explicit authorization. Approved records may be shown on weapp.dev, tw.weapp.dev, and vite.weapp.dev. Gold business partnerships follow icebreaker.top terms: ¥2,000 for one-site monthly advertising, ¥3,000 for dual-site monthly advertising, ¥8,000 for a dual-site quarterly partnership, or custom discussion. -20% of sponsorship income funds mini-app ecosystem open-source projects. The remaining funds support weapp.dev maintenance, documentation, testing, build infrastructure, and community operations; destinations are announced monthly or quarterly. Sponsorship is not a purchase of technical support, templates, cloud-build minutes, or subscription access, and public recognition never exposes payment amounts or private ledger data. +Confirmed open-source sponsorship is split net of payment fees: 60% core maintenance, 25% contributors fund, and 15% nearby open source. The contributors fund pays quarterly thank-you amounts for eligible merged work and optional bounties; if a quarter is under ¥500 it rolls forward. Product revenue such as future Pro, Team, or implementation fees stays out of this fund. Destinations are announced quarterly. Sponsorship is not a purchase of technical support, templates, cloud-build minutes, or subscription access, and public recognition never exposes payment amounts or private ledger data. diff --git a/apps/web/public/llms.txt b/apps/web/public/llms.txt index 8d471b1..5bd4d10 100644 --- a/apps/web/public/llms.txt +++ b/apps/web/public/llms.txt @@ -9,6 +9,7 @@ - [Varo](https://weapp.dev/projects/varo/): Registry-first editable components, primitives, business blocks, and Agent UI for H5 and weapp-vite mini-programs. - [English project index](https://weapp.dev/en/): English overview of the stack. - [Delivery and sponsorship](https://weapp.dev/pricing/): Human migration services, roadmap status, and one-time open-source sponsorship tiers. +- [Contributor program](https://weapp.dev/contributors/): Quarterly sharing of confirmed sponsorship with eligible contributors. ## Official sources @@ -27,7 +28,7 @@ - One-time tiers: ¥20 supporter, ¥200 Bronze, and ¥1,000 Silver. - ¥200 and above may receive public GitHub link recognition after identity confirmation, maintainer review, and explicit authorization. - Approved public recognition can be synchronized across weapp.dev, tw.weapp.dev, and vite.weapp.dev. -- 20% of sponsorship income is allocated to mini-app ecosystem open-source projects; destinations are announced monthly or quarterly. +- Confirmed sponsorship is split 60% core maintenance, 25% contributors fund, and 15% nearby open source; destinations are announced quarterly. - Sponsorship is not a purchase of technical support, templates, cloud-build minutes, or subscription access. ## Canonical pages @@ -36,6 +37,8 @@ - [English homepage](https://weapp.dev/en/) - [Chinese privacy notice](https://weapp.dev/privacy/) - [English privacy notice](https://weapp.dev/en/privacy/) +- [Chinese contributor program](https://weapp.dev/contributors/) +- [English contributor program](https://weapp.dev/en/contributors/) - [Release feed](https://weapp.dev/releases.xml) - [Sitemap](https://weapp.dev/sitemap-index.xml) diff --git a/apps/web/scripts/validate-build.ts b/apps/web/scripts/validate-build.ts index a9ce3b2..9f093cc 100644 --- a/apps/web/scripts/validate-build.ts +++ b/apps/web/scripts/validate-build.ts @@ -18,6 +18,8 @@ const expectedFiles = [ 'en/projects/weapp-vite/index.html', 'privacy/index.html', 'en/privacy/index.html', + 'contributors/index.html', + 'en/contributors/index.html', 'en/projects/varo/index.html', 'releases.xml', 'sitemap-index.xml', diff --git a/apps/web/src/components/ContributorsPage.astro b/apps/web/src/components/ContributorsPage.astro new file mode 100644 index 0000000..8965836 --- /dev/null +++ b/apps/web/src/components/ContributorsPage.astro @@ -0,0 +1,111 @@ +--- +import { ArrowRight, Heart } from '@lucide/astro' +import type { Locale } from '../types/project' +import { localizePath, siteCopy } from '../i18n/ui' +import { buttonSecondary, section, shell } from '../styles/classes' + +interface Props { + locale: Locale +} + +const { locale } = Astro.props +const copy = siteCopy[locale].contributors +--- + +
+
+
+
+

{copy.eyebrow}

+

{copy.title}

+

{copy.updated}

+
+
+

{copy.description}

+ + {copy.pricingAction} + +
+
+ +
+

{copy.allocationTitle}

+
+ {copy.buckets.map(bucket => ( +
+
+ ))} +
+
+ +
+ +
+ {copy.sections.map((sectionCopy, index) => ( +
+

{sectionCopy.title}

+

{sectionCopy.body}

+
+ ))} + +
+

{copy.weightsTitle}

+ + + {copy.weights.map(weight => ( + + + + + + ))} + +
{weight.points}{weight.name}{weight.rule}
+
+ +
+

{copy.reposTitle}

+
    + {copy.repos.map(repo => ( +
  • + {repo.name} +
  • + ))} +
+

{copy.reposNote}

+
+ +
+

{copy.payoutTitle}

+
    + {copy.payout.map(item =>
  1. {item}
  2. )} +
+
+
+
+
+
+ + diff --git a/apps/web/src/components/Footer.astro b/apps/web/src/components/Footer.astro index d096e0e..e9dab3e 100644 --- a/apps/web/src/components/Footer.astro +++ b/apps/web/src/components/Footer.astro @@ -40,6 +40,7 @@ const copy = siteCopy[locale] {copy.footer.privacy} {copy.nav.pricing} + {copy.footer.contributors}

{locale === 'zh-CN' ? '资金去向' : 'Where it goes'}

-

{pricing.sponsorAllocation}

+

{pricing.sponsorAllocation}

+
+ {pricing.sponsorAllocationBuckets.map(bucket => ( +
+ {bucket.share} +

{bucket.name}

+

{bucket.body}

+
+ ))} +
+
+ {pricing.sponsorAllocationAction} +

{pricing.sponsorNote}

@@ -229,7 +242,9 @@ const planIcons = [Layers2, Cloud, LockKeyhole, ShieldCheck] .pricing-sponsor-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px; overflow: hidden; border: 1px solid var(--border); background: var(--border); } .pricing-sponsor-tier { display: flex; flex-direction: column; min-width: 0; min-height: 280px; padding: 1.75rem; background: var(--surface); } .pricing-sponsor-button { margin-top: auto; width: fit-content; } - .pricing-sponsor-allocation { max-width: 760px; margin-top: 2rem; padding-top: 1.25rem; border-top: 1px solid var(--border); } + .pricing-sponsor-allocation { margin-top: 2rem; padding-top: 1.25rem; border-top: 1px solid var(--border); } + .pricing-allocation-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1px; overflow: hidden; border: 1px solid var(--border); background: var(--border); } + .pricing-allocation-grid article { min-width: 0; min-height: 148px; padding: 1.25rem; background: var(--surface); } .pricing-public-sponsors { margin-top: 2rem; padding-top: 1.5rem; border-top: 1px solid var(--border); } .pricing-public-sponsor-list { display: grid; gap: 1.25rem; } .pricing-public-sponsor-group ul { display: flex; flex-wrap: wrap; gap: .75rem; } @@ -253,6 +268,6 @@ const planIcons = [Layers2, Cloud, LockKeyhole, ShieldCheck] .pricing-cta .button-primary { background: var(--accent); color: var(--accent-contrast); } @media (max-width: 1000px) { .pricing-plan-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 1000px) { .pricing-sponsor-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } - @media (max-width: 760px) { .pricing-hero-inner { grid-template-columns: 1fr; gap: 2rem; min-height: 0; padding-top: 3.5rem; padding-bottom: 3.5rem; } .pricing-template-grid, .pricing-boundary-grid, .pricing-sponsor-grid { grid-template-columns: 1fr; } .pricing-service-list article { grid-template-columns: 2rem 1fr; padding: 1.2rem 0; } .pricing-service-list article > strong { grid-column: 2; } } + @media (max-width: 760px) { .pricing-hero-inner { grid-template-columns: 1fr; gap: 2rem; min-height: 0; padding-top: 3.5rem; padding-bottom: 3.5rem; } .pricing-template-grid, .pricing-boundary-grid, .pricing-sponsor-grid, .pricing-allocation-grid { grid-template-columns: 1fr; } .pricing-service-list article { grid-template-columns: 2rem 1fr; padding: 1.2rem 0; } .pricing-service-list article > strong { grid-column: 2; } } @media (max-width: 560px) { .pricing-plan-grid { grid-template-columns: 1fr; } .pricing-plan { padding: 1.4rem; } .pricing-plan ul { min-height: 0; } .pricing-template { min-height: 0; } } diff --git a/apps/web/src/i18n/ui.test.ts b/apps/web/src/i18n/ui.test.ts new file mode 100644 index 0000000..6f90ded --- /dev/null +++ b/apps/web/src/i18n/ui.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, it } from 'vitest' +import { siteCopy } from './ui' + +describe('sponsorship allocation copy', () => { + it('keeps Chinese and English buckets at 60/25/15', () => { + for (const locale of ['zh-CN', 'en'] as const) { + const buckets = siteCopy[locale].pricing.sponsorAllocationBuckets + const shares = buckets.map(bucket => Number.parseInt(bucket.share, 10)) + expect(shares).toEqual([60, 25, 15]) + expect(shares.reduce((sum, share) => sum + share, 0)).toBe(100) + expect(siteCopy[locale].contributors.buckets.map(bucket => bucket.share)).toEqual(['60%', '25%', '15%']) + } + }) +}) diff --git a/apps/web/src/i18n/ui.ts b/apps/web/src/i18n/ui.ts index 9a5587d..7a66fb4 100644 --- a/apps/web/src/i18n/ui.ts +++ b/apps/web/src/i18n/ui.ts @@ -37,7 +37,13 @@ export const siteCopy = { { name: 'Gold 企业合作', price: '¥2,000 起', cadence: '按合作周期', body: '单站月度 ¥2,000 / 30 天;双站月度 ¥3,000 / 30 天;双站季度 ¥8,000 / 90 天;定制合作单独沟通。' }, ], sponsorAction: '申请赞助方式', - sponsorAllocation: '赞助收入的 20% 会用于赞助小程序周边开源项目;其余用于 weapp.dev 的维护、文档、测试、构建基础设施和社区运营。后续按月或按季度公布支持去向。', + sponsorAllocation: '已确认到账的开源赞助按净额拆成三桶:60% 核心维护,25% 贡献者基金,15% 周边开源。当季基金不足 ¥500 时滚存。账本按季度公布。', + sponsorAllocationBuckets: [ + { share: '60%', name: '核心维护', body: '维护者时间、测试、CI、域名和文档站。' }, + { share: '25%', name: '贡献者基金', body: '按季分给有效贡献;最多四成可做定向赏金。' }, + { share: '15%', name: '周边开源', body: '小程序生态相关上游项目。' }, + ], + sponsorAllocationAction: '阅读贡献者计划', sponsorNote: '赞助不是购买服务,也不包含技术支持、模板源码、云构建额度或订阅权益。公开展示需完成 GitHub 身份确认、维护者审核和明确授权;获准记录可同步展示在 weapp.dev、tw.weapp.dev、vite.weapp.dev。', sponsorSites: '公开名单(仅展示已确认并授权的 GitHub 或企业信息)', sponsorEmpty: '目前没有可公开展示的记录。', @@ -79,7 +85,8 @@ export const siteCopy = { faqTitle: '常见问题', faq: [ { question: '赞助 weapp.dev 会获得什么产品权益吗?', answer: '不会。赞助是对开源维护的支持,不包含技术支持、模板源码、云构建额度或其他商业权益。' }, - { question: '赞助收入会如何使用?', answer: '固定 20% 用于赞助小程序周边开源项目,其余用于 weapp.dev 的维护、文档、测试、构建基础设施和社区运营。' }, + { question: '赞助收入会如何使用?', answer: '净额按 60% 核心维护、25% 贡献者基金、15% 周边开源拆分。贡献者基金按季发放,不足 ¥500 滚存。未来的 Pro、Team 和实施收入不进入这个基金。' }, + { question: '贡献者计划是工资或兼职吗?', answer: '不是。这是开源感谢金,不构成雇佣或兼职,也不买断版权。完整规则见贡献者计划页。' }, { question: '现在可以购买 Pro、Team 或 Enterprise 吗?', answer: '不能。这些能力仍在建设中,页面只用于公开方向,不代表已经开放或可以收款。' }, ], ctaTitle: '让开源项目有继续维护的预算', @@ -116,6 +123,7 @@ export const siteCopy = { source: '源码', releases: '版本订阅', privacy: '隐私说明', + contributors: '贡献者计划', analyticsPreferences: '统计偏好', copyright: 'weapp.dev,以 MIT License 开放。', }, @@ -155,6 +163,68 @@ export const siteCopy = { }, ], }, + contributors: { + eyebrow: '贡献者计划', + title: '把一部分赞助分给合过代码的人', + description: '这是开源感谢金,不是工资、不是兼职、不买断版权。赞助按季入账,够门槛再发;不够就滚存并公开说明。', + updated: '更新日期:2026 年 9 月 7 日', + contents: '本页目录', + allocationTitle: '资金三桶', + weightsTitle: '季度池怎么计', + reposTitle: '覆盖仓库', + payoutTitle: '怎么领', + sections: [ + { + title: '原则', + body: '核心维护者从 60% 那桶覆盖自己的时间,不从 25% 贡献者基金领取。领取不构成雇佣或兼职,不承诺工时,不要求值班。代码仍按 MIT 贡献。税务由领取人自行处理。', + }, + { + title: '资金从哪来', + body: '只拆已确认到账的开源赞助净额,包括个人 ¥20 / ¥200 / ¥1,000 和 Gold 企业合作。未来的 Pro、Team、迁移实施和模板 15% 作者分成走产品账,不进本基金。', + }, + { + title: '谁能领', + body: '当季权重至少 5 分:一次带复现或测试的生产修复,或同等分量的功能、测试、文档。纯 typo、格式化、依赖机器人和未合并的 PR 不计。单人单季不超过基金的 40%。核心维护者不从本桶领取。', + }, + { + title: '赏金 issue', + body: '当季基金最多 40% 可标成定向赏金,用于平台矩阵、最小复现或整章文档。merge 并进入正式版本后 14 天内打款。赏金从 25% 那桶出,不额外动用核心维护预算。', + }, + { + title: '身份', + body: 'Contributor:至少一次有效合并。Regular:连续两季达到发放线,下季权重 1.1 倍,并优先认领赏金。Reviewer:由维护者邀请。都不等于雇员或核心团队薪酬。', + }, + { + title: '不做什么', + body: '不按 PR 自动打钱,不发月薪,不用对公劳务合同走这个池,不把产品收入算进来,不为凑热闹先许更高分成。', + }, + ], + buckets: [ + { share: '60%', name: '核心维护', body: '维护者时间、测试机、CI、域名和文档站。' }, + { share: '25%', name: '贡献者基金', body: '季度池 + 定向赏金。' }, + { share: '15%', name: '周边开源', body: '小程序生态相关上游。' }, + ], + weights: [ + { points: '8', name: '功能', rule: '带测试和文档,并合并进主分支。' }, + { points: '5', name: '生产修复 / 平台兼容', rule: '有复现或测试,覆盖微信、支付宝、抖音等真实差异。' }, + { points: '3', name: '测试、复现、CI', rule: '能挂上具体 issue,并缩小问题范围。' }, + { points: '2', name: '文档与排障', rule: '不是改错字。' }, + { points: '1', name: '有效 review', rule: '仅限已获邀的 reviewer,且指出实质问题。' }, + ], + repos: [ + { name: 'weapp-vite', url: 'https://github.com/weapp-vite/weapp-vite' }, + { name: 'weapp-tailwindcss', url: 'https://github.com/sonofmagic/weapp-tailwindcss' }, + { name: 'weapp-sqlite', url: 'https://github.com/weapp-sqlite/weapp-sqlite' }, + { name: 'weapp.dev', url: 'https://github.com/sonofmagic/weapp.dev' }, + ], + reposNote: 'Varo 在独立维护者名下,不默认进入本计划,除非对方书面加入同一套规则。weapp-sqlite 在稳定后按同一标准计入。', + payout: [ + '每季在 sonofmagic/sponsors 开一期公开账本,列出到账净额、三桶、权重、领取人和滚存。', + '季结束后 14 天出账,再 14 天打完款。最低打款 ¥100,不够的记在该人名下滚入下季。', + '可选用微信、支付宝、爱发电或 GitHub Sponsors。不愿意收款的只保留致谢。', + ], + pricingAction: '返回赞助页', + }, notFound: { title: '页面不存在', description: '构建路径有效,但这里没有可发布的页面。返回首页继续浏览工具栈。', @@ -196,7 +266,13 @@ export const siteCopy = { { name: 'Gold business partner', price: '¥2,000+', cadence: 'by partnership term', body: 'Single-site monthly ¥2,000 / 30 days; dual-site monthly ¥3,000 / 30 days; dual-site quarterly ¥8,000 / 90 days; custom terms by discussion.' }, ], sponsorAction: 'Request sponsorship details', - sponsorAllocation: '20% of sponsorship income goes to mini-app ecosystem open-source projects. The rest funds weapp.dev maintenance, documentation, testing, build infrastructure, and community operations. We will publish the destinations monthly or quarterly.', + sponsorAllocation: 'Confirmed sponsorship is split net of payment fees: 60% core maintenance, 25% contributors fund, 15% nearby open source. If the quarterly fund is under ¥500, it rolls forward. Ledgers are published each quarter.', + sponsorAllocationBuckets: [ + { share: '60%', name: 'Core maintenance', body: 'Maintainer time, testing, CI, domains, and the docs sites.' }, + { share: '25%', name: 'Contributors fund', body: 'Quarterly payouts for eligible work; up to 40% may be bounties.' }, + { share: '15%', name: 'Nearby open source', body: 'Upstream projects in the mini-app ecosystem.' }, + ], + sponsorAllocationAction: 'Read the contributor program', sponsorNote: 'Sponsorship is not a service purchase and does not include technical support, template source, cloud-build minutes, or subscription access. Public display requires GitHub identity confirmation, maintainer review, and explicit authorization; approved records may appear on weapp.dev, tw.weapp.dev, and vite.weapp.dev.', sponsorSites: 'Public recognition (confirmed and authorized GitHub or business details only)', sponsorEmpty: 'No public records are available yet.', @@ -238,7 +314,8 @@ export const siteCopy = { faqTitle: 'Frequently asked questions', faq: [ { question: 'What do sponsors receive?', answer: 'Sponsorship supports open-source maintenance and does not include technical support, template source, cloud-build minutes, or other commercial benefits.' }, - { question: 'How is sponsorship income used?', answer: 'A fixed 20% goes to mini-app ecosystem open-source projects. The rest funds weapp.dev maintenance, documentation, testing, build infrastructure, and community operations.' }, + { question: 'How is sponsorship income used?', answer: 'Net receipts split 60% core maintenance, 25% contributors fund, and 15% nearby open source. The contributors fund pays quarterly and rolls forward under ¥500. Future Pro, Team, and implementation revenue stay out of this fund.' }, + { question: 'Is the contributor program employment or contracting?', answer: 'No. It is an open-source thank-you, not a job or paid engagement, and it does not buy copyright. Full rules are on the contributor program page.' }, { question: 'Can I buy Pro, Team, or Enterprise today?', answer: 'No. These capabilities are still in development. The page describes direction, not an open checkout or payment commitment.' }, ], ctaTitle: 'Give open source a budget to keep going', @@ -275,6 +352,7 @@ export const siteCopy = { source: 'Source', releases: 'Release feed', privacy: 'Privacy notice', + contributors: 'Contributor program', analyticsPreferences: 'Analytics preferences', copyright: 'weapp.dev, open under the MIT License.', }, @@ -314,6 +392,68 @@ export const siteCopy = { }, ], }, + contributors: { + eyebrow: 'Contributor program', + title: 'Share some sponsorship with people who land the work', + description: 'This is an open-source thank-you, not a salary, contract, or copyright purchase. Sponsorship is booked quarterly. If the fund is too small, it rolls forward in public.', + updated: 'Updated 7 September 2026', + contents: 'On this page', + allocationTitle: 'Three buckets', + weightsTitle: 'How the quarterly pool is scored', + reposTitle: 'Covered repositories', + payoutTitle: 'How payouts work', + sections: [ + { + title: 'Principles', + body: 'The core maintainer is paid from the 60% bucket and does not take from the 25% contributors fund. Receiving money is not employment or moonlighting, does not buy copyright, and does not create on-call duty. Contributions stay MIT. Recipients handle their own taxes.', + }, + { + title: 'Where the money comes from', + body: 'Only confirmed open-source sponsorship, net of payment fees, including the ¥20 / ¥200 / ¥1,000 personal tiers and Gold business partnerships. Future Pro, Team, implementation fees, and the 15% template author share stay on the product ledger.', + }, + { + title: 'Who is eligible', + body: 'A quarter needs at least 5 points: one production fix with a reproduction or test, or equivalent features, tests, or docs. Typos, formatting, dependency bots, and unmerged PRs do not count. One person may receive at most 40% of the fund in a quarter. The core maintainer does not take from this bucket.', + }, + { + title: 'Bounty issues', + body: 'Up to 40% of the quarterly fund may be labeled as bounties for platform matrices, minimal reproductions, or full documentation chapters. Payment goes out within 14 days after merge and a release. Bounties come from the 25% bucket only.', + }, + { + title: 'Roles', + body: 'Contributor: at least one eligible merge. Regular: two consecutive eligible quarters, 1.1× weight next quarter, and first pick on bounties. Reviewer: maintainer invite only. None of these are employment.', + }, + { + title: 'What we will not do', + body: 'No automatic pay-per-PR, no monthly salary, no corporate labor contracts through this fund, no mixing in product revenue, and no inflated share promises to look busy.', + }, + ], + buckets: [ + { share: '60%', name: 'Core maintenance', body: 'Maintainer time, test machines, CI, domains, and docs sites.' }, + { share: '25%', name: 'Contributors fund', body: 'Quarterly pool plus optional bounties.' }, + { share: '15%', name: 'Nearby open source', body: 'Upstream projects in the mini-app ecosystem.' }, + ], + weights: [ + { points: '8', name: 'Features', rule: 'Ships with tests and docs, merged to the default branch.' }, + { points: '5', name: 'Production fixes / platform support', rule: 'Includes a reproduction or test across real WeChat, Alipay, or Douyin differences.' }, + { points: '3', name: 'Tests, reproductions, CI', rule: 'Linked to a specific issue and narrows the failure.' }, + { points: '2', name: 'Docs and troubleshooting', rule: 'Not typo-only edits.' }, + { points: '1', name: 'Substantive review', rule: 'Invited reviewers only, and the review has to catch a real problem.' }, + ], + repos: [ + { name: 'weapp-vite', url: 'https://github.com/weapp-vite/weapp-vite' }, + { name: 'weapp-tailwindcss', url: 'https://github.com/sonofmagic/weapp-tailwindcss' }, + { name: 'weapp-sqlite', url: 'https://github.com/weapp-sqlite/weapp-sqlite' }, + { name: 'weapp.dev', url: 'https://github.com/sonofmagic/weapp.dev' }, + ], + reposNote: 'Varo is independently maintained and is not in this program unless that maintainer opts into the same rules. weapp-sqlite is counted on the same basis once it is stable.', + payout: [ + 'Each quarter we open a public ledger issue in sonofmagic/sponsors with net receipts, the three buckets, weights, recipients, and rollover.', + 'The ledger is published within 14 days after quarter end, and payouts complete in the following 14 days. The minimum transfer is ¥100; smaller balances roll to the next quarter for that person.', + 'WeChat, Alipay, Afdian, or GitHub Sponsors are accepted. People who decline payment still receive public thanks.', + ], + pricingAction: 'Back to sponsorship', + }, notFound: { title: 'Page not found', description: 'The build path is valid, but no page was emitted here. Return home to explore the stack.', diff --git a/apps/web/src/lib/seo.ts b/apps/web/src/lib/seo.ts index 7619880..cd94002 100644 --- a/apps/web/src/lib/seo.ts +++ b/apps/web/src/lib/seo.ts @@ -89,6 +89,7 @@ export function pricingSchema(locale: Locale) { 'isPartOf': { '@id': `${siteUrl}/#website` }, 'about': [ locale === 'zh-CN' ? '开源赞助' : 'Open-source sponsorship', + locale === 'zh-CN' ? '贡献者计划' : 'Contributor program', locale === 'zh-CN' ? '小程序工程迁移实施' : 'Mini-app engineering migration services', locale === 'zh-CN' ? '云构建与模板路线图' : 'Cloud-build and template roadmap', ], @@ -104,6 +105,11 @@ export function pricingSchema(locale: Locale) { 'name': locale === 'zh-CN' ? '支持 weapp.dev 开源' : 'Support weapp.dev open source', 'target': 'https://github.com/sonofmagic/sponsors', }, + { + '@type': 'WebPage', + 'name': locale === 'zh-CN' ? '贡献者计划' : 'Contributor program', + 'url': absoluteUrl(locale === 'zh-CN' ? '/contributors/' : '/en/contributors/'), + }, ], } } diff --git a/apps/web/src/pages/contributors.astro b/apps/web/src/pages/contributors.astro new file mode 100644 index 0000000..13f7d3e --- /dev/null +++ b/apps/web/src/pages/contributors.astro @@ -0,0 +1,18 @@ +--- +import BaseLayout from '../layouts/BaseLayout.astro' +import Footer from '../components/Footer.astro' +import Header from '../components/Header.astro' +import ContributorsPage from '../components/ContributorsPage.astro' +import { getProjects } from '../lib/projects' +import { siteCopy } from '../i18n/ui' + +const locale = 'zh-CN' as const +const copy = siteCopy[locale].contributors +const projects = await getProjects() +--- + + +
+ +