diff --git a/astro.config.mjs b/astro.config.mjs index 0a5e97b8..6414a691 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -186,7 +186,7 @@ export default defineConfig({ starlightLlmsTxt({ projectName: 'LocalStack', description: - 'LocalStack is a cloud service emulator that runs in a single container on your laptop or in your CI environment. It provides an easy-to-use test/mocking framework for developing cloud applications, with support for AWS services and Snowflake.', + 'LocalStack is a cloud service emulator that runs in a single container on your laptop or in your CI environment. It provides an easy-to-use test/mocking framework for developing cloud applications, with support for AWS services, Snowflake, and Azure.', customSets: [ { label: 'AWS', @@ -198,8 +198,13 @@ export default defineConfig({ description: 'Documentation for LocalStack Snowflake emulation', paths: ['snowflake/**'], }, + { + label: 'Azure', + description: 'Documentation for LocalStack Azure emulation', + paths: ['azure/**'], + }, ], - exclude: ['aws/changelog', 'snowflake/changelog'], + exclude: ['aws/changelog', 'snowflake/changelog', 'azure/changelog'], rawContent: true, }), starlightImageZoom({ @@ -547,6 +552,38 @@ export default defineConfig({ }, ], }, + { + label: 'Azure', + collapsed: true, + items: [ + { + label: 'Welcome', + slug: 'azure', + }, + { + label: 'Getting Started', + autogenerate: { directory: '/azure/getting-started' }, + collapsed: true, + }, + { + label: 'Local Azure Services', + slug: 'azure/services', + }, + { + label: 'Sample Apps', + slug: 'azure/sample-apps', + }, + { + label: 'Integrations', + autogenerate: { directory: '/azure/integrations' }, + collapsed: true, + }, + { + label: 'Changelog', + slug: 'azure/changelog', + }, + ], + }, ], }), markdoc(), diff --git a/public/js/icon-loader.js b/public/js/icon-loader.js index 7293957d..8efdb4b6 100644 --- a/public/js/icon-loader.js +++ b/public/js/icon-loader.js @@ -7,6 +7,7 @@ Welcome: 'cube-icon', 'Getting Started': 'rocket-icon', 'Local AWS Services': 'cube-icon', + 'Local Azure Services': 'cube-icon', Features: 'cube-icon', 'Feature Coverage': 'buildings-icon', 'Sample Apps': 'file-icon', @@ -101,6 +102,8 @@ window.location.href = '/aws/'; } else if (selectedValue === 'Snowflake') { window.location.href = '/snowflake/'; + } else if (selectedValue === 'Azure') { + window.location.href = '/azure/'; } setTimeout(() => { diff --git a/src/components/LanguageSelectWithGetStarted.astro b/src/components/LanguageSelectWithGetStarted.astro index f9d3129f..ceb3012f 100644 --- a/src/components/LanguageSelectWithGetStarted.astro +++ b/src/components/LanguageSelectWithGetStarted.astro @@ -4,11 +4,14 @@ import Default from '@astrojs/starlight/components/LanguageSelect.astro'; // Get the current page route const route = Astro.locals.starlightRoute; const isSnowflakePage = route.id.startsWith('snowflake'); +const isAzurePage = route.id.startsWith('azure'); let getStartedUrl = 'https://app.localstack.cloud/sign-up'; if (isSnowflakePage) { getStartedUrl += '?emulator=snowflake'; +} else if (isAzurePage) { + getStartedUrl += '?emulator=azure'; } --- diff --git a/src/components/PageTitleWithCopyButton.astro b/src/components/PageTitleWithCopyButton.astro index 1ab0bb0e..b135eb9a 100644 --- a/src/components/PageTitleWithCopyButton.astro +++ b/src/components/PageTitleWithCopyButton.astro @@ -22,6 +22,10 @@ const hiddenPaths = [ 'snowflake/sample-apps', 'snowflake/capabilities', 'snowflake/integrations', + 'azure', + 'azure/services', + 'azure/sample-apps', + 'azure/integrations', ]; // Check if copy page should be hidden (via frontmatter or path match) diff --git a/src/components/SearchableAzureServices.astro b/src/components/SearchableAzureServices.astro new file mode 100644 index 00000000..c514d82c --- /dev/null +++ b/src/components/SearchableAzureServices.astro @@ -0,0 +1,28 @@ +--- +import { getCollection } from 'astro:content'; +import { SearchableAzureServices } from './SearchableAzureServices.tsx'; + +const allServices = await getCollection('docs', ({ id }) => { + return id.startsWith('azure/services/') && !id.includes('/index'); +}); + +const sortedServices = allServices.sort((a, b) => { + const titleA = a.data.title || a.data.linkTitle || ''; + const titleB = b.data.title || b.data.linkTitle || ''; + return titleA.localeCompare(titleB); +}); + +const serviceData = sortedServices.map((service) => { + const title = service.data.title || service.data.linkTitle || 'Unknown Service'; + const description = service.data.description || `Implementation details for ${title} API`; + const href = `/${service.id}`; + + return { + title, + description, + href, + }; +}); +--- + + diff --git a/src/components/SearchableAzureServices.tsx b/src/components/SearchableAzureServices.tsx new file mode 100644 index 00000000..3f03b90f --- /dev/null +++ b/src/components/SearchableAzureServices.tsx @@ -0,0 +1,78 @@ +import React, { useMemo, useState } from 'react'; +import { ServiceBox } from './ServiceBox.tsx'; + +interface Service { + title: string; + description: string; + href: string; +} + +interface SearchableAzureServicesProps { + services: Service[]; +} + +export const SearchableAzureServices: React.FC = ({ + services, +}) => { + const [searchTerm, setSearchTerm] = useState(''); + + const filteredServices = useMemo(() => { + if (!searchTerm.trim()) { + return services; + } + + const lowercaseSearch = searchTerm.toLowerCase(); + return services.filter( + (service) => + service.title.toLowerCase().includes(lowercaseSearch) || + service.description.toLowerCase().includes(lowercaseSearch) + ); + }, [services, searchTerm]); + + return ( +
+
+
+ + + + setSearchTerm(e.target.value)} + className="search-input" + /> +
+
+ + {filteredServices.length === 0 && searchTerm.trim() ? ( +
+

No services found matching "{searchTerm}"

+
+ ) : ( +
+ {filteredServices.map((service, index) => ( + + ))} +
+ )} +
+ ); +}; diff --git a/src/config/docsearch.ts b/src/config/docsearch.ts index f93ee99e..2ca1ceb0 100644 --- a/src/config/docsearch.ts +++ b/src/config/docsearch.ts @@ -20,6 +20,8 @@ export default { boostFilter = "hierarchy.lvl0:LocalStack for AWS"; } else if (pathname.startsWith('/snowflake/')) { boostFilter = "hierarchy.lvl0:LocalStack for Snowflake"; + } else if (pathname.startsWith('/azure/')) { + boostFilter = "hierarchy.lvl0:LocalStack for Azure"; } if (!boostFilter) { diff --git a/src/content/docs/azure/changelog.mdx b/src/content/docs/azure/changelog.mdx new file mode 100644 index 00000000..33c4a48e --- /dev/null +++ b/src/content/docs/azure/changelog.mdx @@ -0,0 +1,12 @@ +--- +title: Changelog +description: Changelog for LocalStack for Azure. +template: doc +editUrl: false +--- + +This changelog will track updates to LocalStack's Azure support, including new services, enhancements, and compatibility fixes. + +### Upcoming + +- Initial Azure documentation navigation and service discovery pages. diff --git a/src/content/docs/azure/getting-started/index.mdx b/src/content/docs/azure/getting-started/index.mdx new file mode 100644 index 00000000..d043146e --- /dev/null +++ b/src/content/docs/azure/getting-started/index.mdx @@ -0,0 +1,7 @@ +--- +title: Installation +description: Installation guide to get started with LocalStack for Azure. +template: doc +sidebar: + order: 0 +--- diff --git a/src/content/docs/azure/index.mdx b/src/content/docs/azure/index.mdx new file mode 100644 index 00000000..952d3dc9 --- /dev/null +++ b/src/content/docs/azure/index.mdx @@ -0,0 +1,68 @@ +--- +title: Welcome to LocalStack for Azure Docs +description: Get started with LocalStack for Azure docs. +template: doc +editUrl: false +sidebar: + label: Welcome + order: 1 +--- + +import { OverviewCards, HeroCards } from '../../../components/OverviewCards'; +import rocketIcon from '../../../assets/images/GettingStarted_Color.svg'; +import connectionsIcon from '../../../assets/images/Integrations_Color.svg'; +import cubeIcon from '../../../assets/images/LSAWS_Color.svg'; +import fileIcon from '../../../assets/images/file.svg'; +import changeIcon from '../../../assets/images/change.svg'; + + + +## What would you like to do today? + + diff --git a/src/content/docs/azure/integrations/index.mdx b/src/content/docs/azure/integrations/index.mdx new file mode 100644 index 00000000..acba6bcb --- /dev/null +++ b/src/content/docs/azure/integrations/index.mdx @@ -0,0 +1,7 @@ +--- +title: Integrations +description: Integrate LocalStack for Azure with your preferred tools and frameworks. +template: doc +sidebar: + order: 5 +--- diff --git a/src/content/docs/azure/sample-apps.mdx b/src/content/docs/azure/sample-apps.mdx new file mode 100644 index 00000000..bf056cb3 --- /dev/null +++ b/src/content/docs/azure/sample-apps.mdx @@ -0,0 +1,7 @@ +--- +title: Sample Apps +description: Sample apps for LocalStack for Azure. +template: doc +sidebar: + order: 4 +--- diff --git a/src/content/docs/azure/services/index.mdx b/src/content/docs/azure/services/index.mdx new file mode 100644 index 00000000..1ee40b48 --- /dev/null +++ b/src/content/docs/azure/services/index.mdx @@ -0,0 +1,12 @@ +--- +title: Local Azure Services +description: Browse LocalStack's implemented Azure services and explore their capabilities. +template: doc +editUrl: false +sidebar: + order: 3 +--- + +import SearchableAzureServices from '../../../../components/SearchableAzureServices.astro'; + +