feat: Initial clean release of CHM
一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
这个提交包含在:
@@ -0,0 +1,10 @@
|
||||
<script>
|
||||
if (window.location.hostname !== 'localhost') {
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-103586105-1', 'auto');
|
||||
ga('send', 'pageview');
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,18 @@
|
||||
<footer class="darkblue-bg">
|
||||
<div class="container">
|
||||
{{> socialFeeds}}
|
||||
|
||||
<div class="row bottom-links-row">
|
||||
<div class="col-12 col-md-6">
|
||||
<p class="text-center-sm">Copyright © 2016-{{yyyy}} Laurent Cozic</p>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<p class="text-right text-center-sm right-links">
|
||||
<span class="footer-right">
|
||||
<a href="{{baseUrl}}/privacy/">Privacy Policy</a>
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
@@ -0,0 +1,9 @@
|
||||
<!-- Monthly/Yearly plan A/B testing -->
|
||||
<!--
|
||||
<script src="https://www.googleoptimize.com/optimize.js?id=OPT-PW3ZPK3"></script>
|
||||
-->
|
||||
|
||||
<!-- Donate button A/B testing -->
|
||||
<!--
|
||||
<script async src="https://www.googleoptimize.com/optimize.js?id=OPT-PW3ZPK3"></script>
|
||||
-->
|
||||
@@ -0,0 +1,4 @@
|
||||
<!-- Google Tag Manager (noscript) -->
|
||||
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-579DTGX"
|
||||
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
||||
<!-- End Google Tag Manager (noscript) -->
|
||||
@@ -0,0 +1,7 @@
|
||||
<!-- Google Tag Manager -->
|
||||
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
||||
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
||||
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
||||
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
||||
})(window,document,'script','dataLayer','GTM-579DTGX');</script>
|
||||
<!-- End Google Tag Manager -->
|
||||
@@ -0,0 +1,4 @@
|
||||
{{#availableLocales}}
|
||||
<link rel="alternate" hreflang="{{hreflang}}" href="https://joplinapp.org{{#pathPrefix}}/{{pathPrefix}}{{/pathPrefix}}{{currentPath}}" />
|
||||
{{/availableLocales}}
|
||||
<link rel="alternate" hreflang="x-default" href="https://joplinapp.org{{currentPath}}" />
|
||||
@@ -0,0 +1 @@
|
||||
<a href="{{baseUrl}}/plans/" class="button-link btn-trans plans-button">Joplin Cloud</a>
|
||||
@@ -0,0 +1,100 @@
|
||||
<div class="{{#isFrontPage}}navbar-frontpage blue-bg{{/isFrontPage}} {{^isFrontPage}}navbar-main white-bg{{/isFrontPage}}" id="nav-section">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-3">
|
||||
<a href="{{baseUrl}}/">
|
||||
<img
|
||||
src="{{#isFrontPage}}{{imageBaseUrl}}/logo-text.svg{{/isFrontPage}}{{^isFrontPage}}{{imageBaseUrl}}/logo-text-blue.svg{{/isFrontPage}}"
|
||||
alt=""
|
||||
id="top-logo"
|
||||
width="180"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-9 text-right d-none d-md-block">
|
||||
{{> twitterLink}}
|
||||
<a href="{{baseUrl}}/plugins/" class="fw500">Plugins</a>
|
||||
<a href="{{baseUrl}}/news/" class="fw500">News</a>
|
||||
<a href="{{baseUrl}}/help/" class="fw500">Help</a>
|
||||
<a href="{{forumUrl}}" class="fw500">Forum</a>
|
||||
|
||||
<div class="dropdown language-switcher">
|
||||
<button class="fw500" type="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<i class="fas fa-globe"></i> {{locale.code}}
|
||||
</button>
|
||||
<ul class="dropdown-menu dropdown-menu-end">
|
||||
{{#availableLocales}}
|
||||
<li><a class="dropdown-item {{#isActive}}active{{/isActive}}" href="{{baseUrl}}/{{pathPrefix}}" onclick="setLocalePreference('{{code}}', this.href); return false;">{{name}}</a></li>
|
||||
{{/availableLocales}}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{{#showJoplinCloudLinks}}
|
||||
{{> joplinCloudButton}}
|
||||
{{/showJoplinCloudLinks}}
|
||||
{{> supportButton}}
|
||||
</div>
|
||||
<div class="col-9 text-right d-block d-md-none navbar-mobile-content">
|
||||
{{> twitterLink}}
|
||||
{{> joplinCloudButton}}
|
||||
{{> supportButton}}
|
||||
|
||||
<span class="pointer"
|
||||
><img
|
||||
src="{{#isFrontPage}}{{imageBaseUrl}}/mobile-menu-open-icon.png{{/isFrontPage}}{{^isFrontPage}}{{imageBaseUrl}}/mobile-menu-black-open-icon.png{{/isFrontPage}}"
|
||||
id="open-menu-mobile"
|
||||
alt=""
|
||||
/></span>
|
||||
|
||||
|
||||
<div id="menu-mobile">
|
||||
<div>
|
||||
<div class="text-right">
|
||||
<img
|
||||
src="{{imageBaseUrl}}/close-icon.png"
|
||||
alt=""
|
||||
class="pointer"
|
||||
id="close-menu-mobile"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="text-center menu-mobile-top">
|
||||
<a href="{{baseUrl}}/plugins/" class="fw500 mobile-menu-link">Plugins</a>
|
||||
<a href="{{baseUrl}}/news/" class="fw500 mobile-menu-link">News</a>
|
||||
<a href="{{baseUrl}}/help/" class="fw500 mobile-menu-link">Help</a>
|
||||
<a href="{{forumUrl}}" class="fw500 mobile-menu-link">Forum</a>
|
||||
</div>
|
||||
|
||||
<div class="menu-mobile-buttons">
|
||||
{{#showJoplinCloudLinks}}
|
||||
{{> joplinCloudButton}}
|
||||
{{/showJoplinCloudLinks}}
|
||||
{{> supportButton}}
|
||||
</div>
|
||||
|
||||
<div class="text-center menu-mobile-language">
|
||||
<p class="fw500 mobile-menu-language-label"><i class="fas fa-globe"></i> Language</p>
|
||||
{{#availableLocales}}
|
||||
<a href="{{baseUrl}}/{{pathPrefix}}" class="fw500 mobile-menu-link mobile-language-link {{#isActive}}active{{/isActive}}" onclick="setLocalePreference('{{code}}', this.href); return false;">{{name}}</a>
|
||||
{{/availableLocales}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#showToc}}
|
||||
<div id="toc-mobile">{{{tocHtml}}}</div>
|
||||
{{/showToc}}
|
||||
|
||||
{{> socialFeeds}}
|
||||
|
||||
<div>
|
||||
<p class="light-blue mobile-menu-link-bottom text-center">
|
||||
Copyright © 2016-{{yyyy}} Laurent Cozic
|
||||
<br/>
|
||||
<a href="{{baseUrl}}/privacy/" class="fw500">Privacy Policy</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,14 @@
|
||||
{{#openGraph}}
|
||||
<meta name="description" content="{{openGraph.description}}" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@joplinapp" />
|
||||
<meta property="og:url" content="{{{openGraph.url}}}" />
|
||||
<meta property="og:title" content="{{openGraph.title}}" />
|
||||
<meta property="twitter:title" content="{{openGraph.title}}" />
|
||||
<meta property="og:description" content="{{openGraph.description}}" />
|
||||
<meta property="twitter:description" content="{{openGraph.description}}" />
|
||||
{{#openGraph.image}}
|
||||
<meta property="og:image" content="{{{openGraph.image}}}" />
|
||||
<meta property="twitter:image" content="{{{openGraph.image}}}" />
|
||||
{{/openGraph.image}}
|
||||
{{/openGraph}}
|
||||
@@ -0,0 +1,109 @@
|
||||
<div class="col-12 col-lg-4 account-type-{{priceMonthly.accountType}} hosting-type-{{hostingType}}">
|
||||
<div class="price-container {{#featured}}price-container-blue{{/featured}}">
|
||||
<div class="price-row">
|
||||
<div class="plan-type">
|
||||
<img src="{{imageBaseUrl}}/{{iconName}}.png"/> {{title}}
|
||||
</div>
|
||||
|
||||
{{#priceMonthly.formattedMonthlyAmount}}
|
||||
<div class="plan-price plan-price-monthly">
|
||||
{{priceMonthly.formattedMonthlyAmount}}<sub class="per-month"> <span translate>/month</span>{{#footnote}} (*){{/footnote}}</sub>
|
||||
</div>
|
||||
|
||||
<div class="plan-price plan-price-yearly">
|
||||
{{priceYearly.formattedMonthlyAmount}}<sub class="per-month"> <span translate>/month</span>{{#footnote}} (*){{/footnote}}</sub>
|
||||
</div>
|
||||
{{/priceMonthly.formattedMonthlyAmount}}
|
||||
</div>
|
||||
|
||||
{{#priceYearly.formattedMonthlyAmount}}
|
||||
<div class="plan-price-yearly-per-year">
|
||||
<div>
|
||||
({{priceYearly.formattedAmount}}<sub class="per-year"> <span translate>/year</span></sub>)
|
||||
</div>
|
||||
</div>
|
||||
{{/priceYearly.formattedMonthlyAmount}}
|
||||
|
||||
{{#featureLabelsOn}}
|
||||
<p>
|
||||
<i class="fas fa-check feature feature-on"></i>{{label}}
|
||||
{{#actions}}
|
||||
<button type="button" class="action-link action-{{actionId}}">→ <span class="action-label">{{label}}</span></button>
|
||||
{{/actions}}
|
||||
</p>
|
||||
{{/featureLabelsOn}}
|
||||
|
||||
{{#featureLabelsOff}}
|
||||
<p class="unchecked-text"><i class="fas fa-times feature feature-off"></i>{{label}}</p>
|
||||
{{/featureLabelsOff}}
|
||||
|
||||
{{#pricingTable}}
|
||||
<strong translate>Pricing</strong>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr><th translate>Users</th><th translate>Price</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#rows}}
|
||||
<tr><td>{{condition}}</td><td>{{priceMonthly}}</td></tr>
|
||||
{{/rows}}
|
||||
</tbody>
|
||||
</table>
|
||||
<p class="pricing-table-billed-annually">{{billedAnnually}}</p>
|
||||
{{/pricingTable}}
|
||||
|
||||
<p class="text-center subscribe-wrapper">
|
||||
<a id="subscribeButton-{{name}}" href="{{cfaUrl}}" class="button-link btn-white subscribeButton cfa-button">{{cfaLabel}}</a>
|
||||
|
||||
{{#learnMoreUrl}}
|
||||
<a id="learnMore-{{name}}" href="{{learnMoreUrl}}" class="button-link btn-white learnMoreButton cfa-button">Learn more</a>
|
||||
{{/learnMoreUrl}}
|
||||
|
||||
{{#cfaDescription}}
|
||||
<p class="cfa-description">{{cfaDescription}}</p>
|
||||
{{/cfaDescription}}
|
||||
</p>
|
||||
|
||||
{{#footnote}}<sub>(*) {{.}}</sub>{{/footnote}}
|
||||
</div>
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
const stripePricesIds = {
|
||||
monthly: '{{{priceMonthly.id}}}',
|
||||
yearly: '{{{priceYearly.id}}}',
|
||||
};
|
||||
const planName = '{{{name}}}';
|
||||
const buttonId = 'subscribeButton-' + planName;
|
||||
const buttonElement = document.getElementById(buttonId);
|
||||
|
||||
function handleResult() {
|
||||
console.info('Redirected to checkout');
|
||||
}
|
||||
|
||||
buttonElement.addEventListener("click", function(evt) {
|
||||
const priceId = stripePricesIds[subscriptionPeriod];
|
||||
|
||||
if (!priceId) {
|
||||
console.error('Invalid period: ' + subscriptionPeriod);
|
||||
return;
|
||||
}
|
||||
|
||||
evt.preventDefault();
|
||||
|
||||
createCheckoutSession(priceId).then(function(data) {
|
||||
stripe.redirectToCheckout({
|
||||
sessionId: data.sessionId
|
||||
})
|
||||
.then(handleResult);
|
||||
});
|
||||
});
|
||||
|
||||
for (const button of document.querySelectorAll('button.action-toggleIncreaseStorage')) {
|
||||
button.onclick = () => {
|
||||
document.body.classList.toggle('-increased-storage');
|
||||
};
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
@@ -0,0 +1,22 @@
|
||||
<div class="carousel-indicators">
|
||||
<button
|
||||
type="button"
|
||||
data-bs-target="#{{id}}"
|
||||
data-bs-slide-to="0"
|
||||
class="active"
|
||||
aria-current="true"
|
||||
aria-label="Slide 1"
|
||||
></button>
|
||||
<button
|
||||
type="button"
|
||||
data-bs-target="#{{id}}"
|
||||
data-bs-slide-to="1"
|
||||
aria-label="Slide 2"
|
||||
></button>
|
||||
<button
|
||||
type="button"
|
||||
data-bs-target="#{{id}}"
|
||||
data-bs-slide-to="2"
|
||||
aria-label="Slide 3"
|
||||
></button>
|
||||
</div>
|
||||
@@ -0,0 +1,23 @@
|
||||
<div class="carousel-item {{active}} press-carousel" data-bs-interval="10000">
|
||||
<img
|
||||
src="{{imageBaseUrl}}/transparent-bg.png"
|
||||
class="d-block w-100"
|
||||
alt=""
|
||||
/>
|
||||
<div class="carousel-caption">
|
||||
<img
|
||||
src="{{imageBaseUrl}}/{{imageName}}"
|
||||
alt=""
|
||||
class="img-fluid img-center photo"
|
||||
/>
|
||||
<br />
|
||||
<p class="text-center">
|
||||
“{{body}}”
|
||||
</p>
|
||||
<br />
|
||||
<p class="fw500 text-center">
|
||||
<a href="{{url}}">{{source}}</a>
|
||||
</p>
|
||||
<p class="fw400 small text-center">By {{author}}</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1 @@
|
||||
<link rel="alternate" type="application/rss+xml" title="Joplin RSS feed" href="https://joplinapp.org/rss.xml" />
|
||||
@@ -0,0 +1,11 @@
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-12 social-links">
|
||||
<a class="social-link-bluesky" href="https://bsky.app/profile/joplinapp.bsky.social" title="Joplin Bluesky feed"><i class="fa-brands fa-bluesky"></i></a>
|
||||
<a class="social-link-mastodon" href="https://mastodon.social/@joplinapp" title="Joplin Mastodon feed"><i class="fab fa-mastodon"></i></a>
|
||||
<a class="social-link-patreon" href="https://www.patreon.com/joplin" title="Joplin Patreon"><i class="fab fa-patreon"></i></a>
|
||||
<a class="social-link-youtube" href="https://youtube.com/@joplinapp" title="Joplin YouTube channel"><i class="fab fa-youtube"></i></a>
|
||||
<a class="social-link-discord" href="https://discord.gg/VSj7AFHvpq" title="Joplin Discord chat"><i class="fab fa-discord"></i></a>
|
||||
<a class="social-link-linkedin" href="https://www.linkedin.com/company/joplin" title="Joplin LinkedIn Feed"><i class="fab fa-linkedin"></i></a>
|
||||
<a class="social-link-github" href="https://github.com/laurent22/joplin/" title="Joplin GitHub repository"><i class="fab fa-github"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,3 @@
|
||||
<a class="button-link btn-blue sponsor-button" href="{{baseUrl}}/donate">
|
||||
<i class="fas fa-heart heart-full"></i><i class="far fa-heart heart-line"></i><span class="sponsor-button-label"> Support us</span>
|
||||
</a>
|
||||
@@ -0,0 +1 @@
|
||||
<a href="https://bsky.app/profile/joplinapp.bsky.social" title="Joplin Bluesky feed" class="fw500 twitter-link"><i class="fa-brands fa-bluesky"></i></a>
|
||||
在新工单中引用
屏蔽一个用户