diff --git a/README.md b/README.md index 19db1e0..ee2d71c 100644 --- a/README.md +++ b/README.md @@ -111,9 +111,10 @@ not repeat the same scenario. ## Terraform Modules Open `/terraform-modules/` to explore public AWS Terraform modules -maintained by the native-cube GitHub organization. The catalogue covers Amazon -EKS, EKS Auto Mode, managed node groups, Fargate profiles, KMS, and VPC Flow -Logs, with direct links to each GitHub repository and Terraform Registry page. +maintained by the native-cube GitHub organization. The catalogue covers +Kubernetes platforms, security, networking, messaging, databases, caching, and +object storage, with direct links to each GitHub repository and Terraform +Registry page. Module names, descriptions, categories, complete-example paths, and visual treatments are maintained in `terraform-modules/modules.json`. Registry diff --git a/assets/social/terraform-modules.png b/assets/social/terraform-modules.png index 52db165..e9e20de 100644 Binary files a/assets/social/terraform-modules.png and b/assets/social/terraform-modules.png differ diff --git a/assets/social/terraform-modules.svg b/assets/social/terraform-modules.svg index b05a2b9..2ab40cd 100644 --- a/assets/social/terraform-modules.svg +++ b/assets/social/terraform-modules.svg @@ -48,7 +48,7 @@ MAIN.TF module "platform" { source = "native-cube/eks/aws" - version = "1.4.0" + version = "1.5.0" } @@ -57,6 +57,6 @@ - EKS PLATFORMS · SECURITY · NETWORK OBSERVABILITY + KUBERNETES · SECURITY · NETWORKING · DATA SERVICES diff --git a/index.html b/index.html index 982a555..0043bc3 100644 --- a/index.html +++ b/index.html @@ -637,7 +637,8 @@

YAML & JSON Formatter

Terraform Modules

- Explore reusable AWS modules for EKS, KMS, and network observability. + Explore reusable AWS Terraform modules for Kubernetes, security, + networking, messaging, databases, caching, and storage.

diff --git a/scripts/sync-terraform-modules.py b/scripts/sync-terraform-modules.py index 5e69fd0..79a12af 100755 --- a/scripts/sync-terraform-modules.py +++ b/scripts/sync-terraform-modules.py @@ -489,6 +489,7 @@ def render_card(catalogue, module): input_markup = render_required_inputs(metadata["required_inputs"]) icon = ICONS[module["icon"]] published_date = metadata["published_at"].split("T", 1)[0] + category_slug = re.sub(r"[^a-z0-9]+", "-", module["category"].lower()).strip("-") license_label = metadata["license"] or "Not declared" license_link = ( @@ -504,7 +505,11 @@ def render_card(catalogue, module): else "" ) - return f'''
+ return f'''

{escape(module["title"])}

{escape(module["summary"])}

-
+
-
Latest
+
Version
v{escape(metadata["version"])}
Required
{required_label} {required_detail}
-
-
Released
-
-
-

- Terraform {escape(metadata["terraform_requirement"])} - AWS {escape(metadata["provider_requirement"])} -

{escape(urls["source"])}
-
+ +
- View usage and required inputs + Usage & requirements -
+
+
+
+
Released
+
+
+
+
Terraform
+
{escape(metadata["terraform_requirement"])}
+
+
+
AWS provider
+
{escape(metadata["provider_requirement"])}
+
+

Module block

{escape(example)}
- -

- {license_link} - Source updated -

''' diff --git a/sitemap.xml b/sitemap.xml index c897c49..843eb66 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,7 +2,7 @@ https://native-cube.com/ - 2026-08-19 + 2026-08-28 https://native-cube.com/k8s-manifest-builder/ @@ -30,6 +30,6 @@ https://native-cube.com/terraform-modules/ - 2026-08-19 + 2026-08-28 diff --git a/terraform-modules/app.js b/terraform-modules/app.js index 740736e..63fcaab 100644 --- a/terraform-modules/app.js +++ b/terraform-modules/app.js @@ -2,7 +2,43 @@ const copyButtons = document.querySelectorAll("[data-module-copy]"); const copyStatus = document.querySelector("#copy-status"); +const moduleSearch = document.querySelector("#module-search"); +const categoryButtons = document.querySelectorAll("[data-category]"); +const moduleCards = document.querySelectorAll(".module-card"); +const moduleResults = document.querySelector("#module-results"); +const noModuleResults = document.querySelector("#no-module-results"); let copyStatusTimer; +let activeCategory = "all"; + +function normalized(value) { + return value.trim().toLocaleLowerCase(); +} + +function filterModules() { + const query = normalized(moduleSearch.value); + let visibleCount = 0; + + for (const card of moduleCards) { + const matchesCategory = + activeCategory === "all" || card.dataset.category === activeCategory; + const matchesQuery = !query || normalized(card.textContent).includes(query); + const isVisible = matchesCategory && matchesQuery; + card.hidden = !isVisible; + visibleCount += Number(isVisible); + } + + const noun = visibleCount === 1 ? "module" : "modules"; + moduleResults.textContent = `${visibleCount} ${noun}`; + noModuleResults.hidden = visibleCount !== 0; +} + +function selectCategory(button) { + activeCategory = button.dataset.category; + for (const categoryButton of categoryButtons) { + categoryButton.setAttribute("aria-pressed", String(categoryButton === button)); + } + filterModules(); +} function showCopyStatus(message, isError = false) { window.clearTimeout(copyStatusTimer); @@ -122,3 +158,15 @@ async function copySource(button) { for (const button of copyButtons) { button.addEventListener("click", () => copySource(button)); } + +moduleSearch.addEventListener("input", filterModules); +moduleSearch.addEventListener("keydown", (event) => { + if (event.key === "Escape" && moduleSearch.value) { + moduleSearch.value = ""; + filterModules(); + } +}); + +for (const button of categoryButtons) { + button.addEventListener("click", () => selectCategory(button)); +} diff --git a/terraform-modules/index.html b/terraform-modules/index.html index 5732b63..bd1886a 100644 --- a/terraform-modules/index.html +++ b/terraform-modules/index.html @@ -9,10 +9,10 @@ /> - + AWS Terraform Modules | Native Cube - - + +