Skip to content

Commit 03448a4

Browse files
authored
Merge branch '4971-remove-cert-nodes-link' into 4972-rework-install
2 parents 1d93401 + 7af749b commit 03448a4

57 files changed

Lines changed: 316 additions & 121 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.eleventy.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const spacetime = require("spacetime");
1717
const { minify } = require("terser");
1818
const codeowners = require('codeowners');
1919
const pluginTOC = require('eleventy-plugin-toc');
20+
const { decodeHTML } = require('entities');
2021
const imageHandler = require('./lib/image-handler.js')
2122
const site = require("./src/_data/site");
2223
const coreNodeDoc = require("./lib/core-node-docs.js");
@@ -517,6 +518,10 @@ module.exports = function(eleventyConfig) {
517518
});
518519

519520

521+
eleventyConfig.addFilter("striptags", function(text) {
522+
return decodeHTML(String(text).replace(/<[^>]+>/g, ""));
523+
});
524+
520525
eleventyConfig.addFilter("restoreParagraphs", function(str) {
521526
const content = new String(str);
522527
return "<p>"+content.split(/\.\n/).join(".</p><p>")+"</p>"
@@ -1232,6 +1237,12 @@ module.exports = function(eleventyConfig) {
12321237
return nav;
12331238
});
12341239

1240+
eleventyConfig.addCollection("aiBlog", function(collectionApi) {
1241+
return collectionApi.getFilteredByTag("ai").filter(item => {
1242+
return !item.data.tags || !item.data.tags.includes("blueprints");
1243+
});
1244+
});
1245+
12351246
eleventyConfig.addCollection("homeLogos", function () {
12361247
const logosDir = path.join(__dirname, "src/images/home-logos");
12371248
const logos = fs.readdirSync(logosDir)

.github/workflows/calibreapp-image-actions.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
2020
- name: Compress Images
2121
id: calibre
22-
uses: calibreapp/image-actions@f32575787d333b0579f0b7d506ff03be63a669d1 # 1.4.1
22+
uses: calibreapp/image-actions@9d037c06280028c110ff61c433ad4dc7d33c3c43 # 1.5.0
2323
with:
2424
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2525
# For non-Pull Requests, run in compressOnly mode and we'll PR after.

src/_data/blogTags.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
[{
22
"label": "All",
33
"value": "posts"
4+
}, {
5+
"label": "How-To",
6+
"value": "how-to"
47
}, {
58
"label": "Node-RED",
69
"value": "node-red"
7-
}, {
8-
"label": "FlowFuse",
9-
"value": "flowfuse"
10+
}, {
11+
"label": "AI",
12+
"value": "ai"
1013
}, {
1114
"label": "UNS",
1215
"value": "uns"
1316
}, {
14-
"label": "How-To",
15-
"value": "how-to"
17+
"label": "Dashboard",
18+
"value": "dashboard"
1619
}, {
17-
"label": "Community",
18-
"value": "community"
20+
"label": "FlowFuse",
21+
"value": "flowfuse"
1922
}, {
2023
"label": "Releases",
2124
"value": "releases"
2225
}, {
2326
"label": "News",
2427
"value": "news"
25-
}, {
26-
"label": "Dashboard",
27-
"value": "dashboard"
2828
}]

src/_data/site.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"tagLine": "Build and Deploy Industrial Applications at Scale with FlowFuse",
1010
"subtitle": "FlowFuse is the universal platform that powers your factory, creating a secure and governed solution for your industrial operations.",
1111
"title": "Build workflows and integrations that optimize your industrial operations",
12-
"keywords": "Node-RED, Application Development, IoT, IIoT, Low-Code, open source, Integration, Workflow, Automation, Data Processing, Data Integration, Data Transformation, Data Visualization, Industrial Automation, Industrial IoT, Industry 4.0"
12+
"keywords": "Node-RED, Application Development, IoT, IIoT, Low-Code, open source, Integration, Workflow, Automation, Data Processing, Data Integration, Data Transformation, Data Visualization, Industrial Automation, Industrial IoT, Industry 4.0",
13+
"shortDescription": "FlowFuse is the enterprise platform that bridges the gap between physical assets and enterprise IT, delivering consistency at scale instead of one-off project \"snowflakes.\" Powered by Node-RED, teams unify real-time data through workflows, AI agents, and industrial applications, extending rigid vendor systems with a low-code agility layer that adapts without rip-and-replace. FlowFuse orchestrates lightweight, event-based data flows between the shop floor and the top floor only when real-world events occur, giving organizations the confidence to innovate and unlock new value in industrial automation."
1314
}
1415
}

src/_includes/blog/blog-posts.njk

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@
5050
<h2 class="mt-1 mb-0 text-xl font-medium group-hover:underline">{{ item.data.title }}</h2>
5151
</div>
5252
<div class="text-sm prose prose-blue md:prose-md py-1">
53-
{% include "summary.njk" %}
53+
{% set summary = item.data.excerpt or item.data.description or item.data.meta.description %}
54+
{% if summary %}{{ summary | md | striptags | truncate(20) }}{% endif %}
5455
</div>
5556
<div class="italic text-xs mb-3">
5657
<div class="author">

src/_includes/components/tier-badges.njk

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,23 @@
33
{% if showTierCloud or showTierSelfHosted %}
44
<div class="ff-tier-badges">
55
{% if showTierCloud %}
6-
<div class="ff-tier-badge ff-tier--available" onclick="capture('tier-badge-click',{hosting:'cloud',tier:'{{ tierCloud }}',page:location.pathname})">
6+
<div class="ff-tier-badge ff-tier--available"
7+
role="button"
8+
tabindex="0"
9+
aria-label="Cloud tier: {{ tierCloud }}"
10+
onclick="capture('tier-badge-click',{hosting:'cloud',tier:'{{ tierCloud }}',page:location.pathname})"
11+
onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();this.click()}">
712
<span class="ff-tier-badge__label">Cloud</span>
813
<span class="ff-tier-badge__value">{{ tierCloud }}</span>
914
</div>
1015
{% endif %}
1116
{% if showTierSelfHosted %}
12-
<div class="ff-tier-badge ff-tier--available" onclick="capture('tier-badge-click',{hosting:'self-hosted',tier:'{{ tierSelfHosted }}',page:location.pathname})">
17+
<div class="ff-tier-badge ff-tier--available"
18+
role="button"
19+
tabindex="0"
20+
aria-label="Self-Hosted tier: {{ tierSelfHosted }}"
21+
onclick="capture('tier-badge-click',{hosting:'self-hosted',tier:'{{ tierSelfHosted }}',page:location.pathname})"
22+
onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();this.click()}">
1323
<span class="ff-tier-badge__label">Self-Hosted</span>
1424
<span class="ff-tier-badge__value">{{ tierSelfHosted }}</span>
1525
</div>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<div class="bg-indigo-50 py-1 px-4 rounded-md w-full mx-auto text-center mt-12">
2-
<p>Looking for help with your project? <a href="/contact-us/">Contact us</a>; our experts will be happy to provide a solution for your needs.  </p>
2+
<p>Looking for help with your project? <a href="/contact-us/" class="underline">Contact us</a>; our experts will be happy to provide a solution for your needs.  </p>
33
</div>

src/_includes/explore-more-content.njk

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@
1010
{% image "./images/home/blog.png", "Image of hands typing on laptop working on Node-RED flows", [448] %}
1111
</div>
1212
</a>
13-
<h4 class="text-xl font-bold pb-3">Latest on the blog</h4>
13+
<h3 class="text-xl font-bold pb-3">Latest on the blog</h3>
1414
{%- for item in collections[collectionName or 'posts'] | sort(attribute='item.date') | reverse | limit(3) -%}
1515
<a href="{{ item.url }}"
1616
class="w-full flex flex-col group {% if not loop.last %}border-b{% endif %}">
17-
<h5 class="my-2 font-light">
17+
<h4 class="my-2 font-light text-lg">
1818
<span class="text-gray-500 group-hover:text-blue-700">
1919
{{ item.data.title }}
2020
</span>
21-
</h5>
21+
</h4>
2222
</a>
2323
{%- endfor -%}
2424
</div>
@@ -35,9 +35,9 @@
3535
{% image "./images/home/webinar.png", "Image of hands typing on laptop working on Node-RED flows", [448] %}
3636
</div>
3737
</a>
38-
<h4 class="text-xl font-bold pb-3">{% if item.date | isFutureDate %}Upcoming{% else %}Latest{% endif %} Webinar</h4>
38+
<h3 class="text-xl font-bold pb-3">{% if item.date | isFutureDate %}Upcoming{% else %}Latest{% endif %} Webinar</h3>
3939
<div class="w-full flex flex-col">
40-
<h5 class="my-2 font-light"><span class="text-gray-500">{{ item.data.title }}</span></h5>
40+
<h4 class="my-2 font-light text-lg"><span class="text-gray-500">{{ item.data.title }}</span></h4>
4141
</div>
4242
<div class="webinar-title w-full border-t pt-3 font-light text-gray-500">
4343
<time value="{{ item.date }}">{{ item.date | shortDate }}</time>
@@ -56,8 +56,8 @@
5656
<div class="sm:max-h-none md:min-w-[40%] max-w-[448px] ff-image-cover ff-image-rounded mx-auto mb-4 aspect-video">
5757
{% image "./images/home/newsletter.png", "Image of hands typing on laptop working on Node-RED flows", [448] %}
5858
</div>
59-
<h4 class="text-xl font-bold pb-3">Newsletter</h4>
60-
<h5 class="font-bold pb-3 pt-2">Sign up for our monthly email updates</h5>
59+
<h3 class="text-xl font-bold pb-3">Newsletter</h3>
60+
<h4 class="font-bold pb-3 pt-2 text-lg">Sign up for our monthly email updates</h4>
6161
</div>
6262
<div class="-mb-1 self-end w-full">
6363
{% include hubspot.script %}

src/_includes/faq.njk

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,19 @@
1010
<div class="prose max-w-none">
1111
{% for faq in meta.faq %}
1212
<div class="w-full {% if not loop.last %}border-b{% endif %} py-4">
13-
<h5 class="question flex flex-row justify-between items-center w-full m-0 gap-6 cursor-pointer"
14-
id="question-{{ loop.index }}">
15-
<span>{{ faq.question }}</span>
16-
<div class="chevron transition-transform ease-in-out duration-300"
17-
id="chevron-{{ loop.index }}">
18-
{% include "components/icons/chevron-down.svg" %}
19-
</div>
20-
</h5>
13+
<h3 class="m-0">
14+
<button class="question flex flex-row justify-between items-center w-full m-0 p-0 gap-6 cursor-pointer text-left bg-transparent border-0 text-lg font-semibold"
15+
id="question-{{ loop.index }}"
16+
type="button"
17+
aria-expanded="false"
18+
aria-controls="answer-{{ loop.index }}">
19+
<span>{{ faq.question }}</span>
20+
<div class="chevron transition-transform ease-in-out duration-300"
21+
id="chevron-{{ loop.index }}">
22+
{% include "components/icons/chevron-down.svg" %}
23+
</div>
24+
</button>
25+
</h3>
2126
<div class="answer px-6 mt-6 hidden" id="answer-{{ loop.index }}">
2227
<p>{{ faq.answer | safe }}</p>
2328
</div>
@@ -33,14 +38,15 @@
3338
question.addEventListener('click', () => {
3439
const answer = document.querySelector(`#answer-${index + 1}`);
3540
const chevron = document.querySelector(`#chevron-${index + 1}`);
36-
if (answer.classList.contains('hidden')) {
37-
// Show the clicked answer and rotate its chevron
41+
const isHidden = answer.classList.contains('hidden');
42+
if (isHidden) {
3843
answer.classList.remove('hidden');
3944
chevron.style.transform = 'rotate(180deg)';
45+
question.setAttribute('aria-expanded', 'true');
4046
} else {
41-
// Hide the clicked answer and rotate its chevron to original state
4247
answer.classList.add('hidden');
4348
chevron.style.transform = 'rotate(0deg)';
49+
question.setAttribute('aria-expanded', 'false');
4450
}
4551
});
4652
});

src/_includes/get-started.njk

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
<div class="m-auto w-full text-center sm:text-left mb-2">
22
<h2 class="font-bold"><span class="text-red-600">Get Started</span> with FlowFuse</h2>
3-
<p class="-mt-1">Explore our <a href="/pricing/">pricing</a></p>
3+
<p class="-mt-1">Explore our <a href="/pricing/" class="underline">pricing</a></p>
44
</div>
55
<div class="w-full sm:grid sm:grid-cols-2 gap-6 sm:gap-8">
66
<div class="w-full mt-4 md:mt-0 flex flex-col justify-between">
77
<div>
88
<div class="flex justify-center sm:justify-start mt-3 mb-2 max-sm:mx-auto md:mx-0 w-6 h-6">
99
{% include "components/icons/cloud.svg" %}
1010
</div>
11-
<h4 class="flex justify-center sm:justify-start font-semibold">FlowFuse Cloud</h4>
11+
<h3 class="flex justify-center sm:justify-start font-semibold text-xl">FlowFuse Cloud</h3>
1212
<p class="font-light mt-6">Our managed hosted solution, maintained and supported by the FlowFuse team. Experience flexibility, scalability, and expert assistance to drive your business forward.</p>
1313
</div>
1414
<a class="mt-4 ff-btn ff-btn--highlight uppercase inline-block self-center sm:self-start"
@@ -20,7 +20,7 @@
2020
<div class="flex justify-center sm:justify-start mt-3 mb-2 max-sm:mx-auto md:mx-0 w-6 h-6">
2121
{% include "components/icons/building-office-2.svg" %}
2222
</div>
23-
<h4 class="flex justify-center sm:justify-start font-semibold">On Premise</h4>
23+
<h3 class="flex justify-center sm:justify-start font-semibold text-xl">On Premise</h3>
2424
<p class="font-light mt-6">Deploy FlowFuse on your hardware for enhanced flexibility. Opt for self-hosted deployment with FlowFuse, enabling on-premises installation and full control over your deployment process.</p>
2525
</div>
2626
<a class="mt-4 mb-6 sm:mb-0 ff-btn ff-btn--primary uppercase inline-block self-center sm:self-start"

0 commit comments

Comments
 (0)