diff --git a/nextjs/public/svg/logo/consul-logo.svg b/nextjs/public/svg/logo/consul-logo.svg new file mode 100644 index 0000000..64364de --- /dev/null +++ b/nextjs/public/svg/logo/consul-logo.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nextjs/public/svg/logo/hashicorp-vault-logo.svg b/nextjs/public/svg/logo/hashicorp-vault-logo.svg new file mode 100644 index 0000000..f51682a --- /dev/null +++ b/nextjs/public/svg/logo/hashicorp-vault-logo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/nextjs/public/svg/logo/stackrox-logo.svg b/nextjs/public/svg/logo/stackrox-logo.svg new file mode 100644 index 0000000..2942dee --- /dev/null +++ b/nextjs/public/svg/logo/stackrox-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/nextjs/src/app/[locale]/theme/page.tsx b/nextjs/src/app/[locale]/theme/page.tsx index b304c23..7df3631 100644 --- a/nextjs/src/app/[locale]/theme/page.tsx +++ b/nextjs/src/app/[locale]/theme/page.tsx @@ -11,12 +11,12 @@ import { mediaSection, logoSection, journeySection, - example, ctaSection, resourcesSection, media2Section, statisticsSection, slaSection, + partnerSection, } from "./texts" import Container from "@/components/container" import CardSlider from "@/components/cards/card-slider" @@ -31,6 +31,7 @@ import CardColored from "@/components/cards/card-colored" import CardArticle from "@/components/cards/card-article" import CardCounter from "@/components/cards/card-counter" import CardService from "@/components/cards/card-service" +import SectionCardLogo from "@/components/sections/section-card-logo" export default function Theme() { return ( @@ -50,7 +51,7 @@ export default function Theme() { - + - + {mediaSection.media.map((item, i) => { return ( - + + + + + {partnerSection.partners.map((item, i) => { + return ( + + ) + })} + + ) } diff --git a/nextjs/src/app/[locale]/theme/raw/page.tsx b/nextjs/src/app/[locale]/theme/raw/page.tsx index e625641..e8da768 100644 --- a/nextjs/src/app/[locale]/theme/raw/page.tsx +++ b/nextjs/src/app/[locale]/theme/raw/page.tsx @@ -3,9 +3,34 @@ import Text from "@/components/text" import Title from "@/components/title" import Button from "@/components/button" -import { example } from "../texts" import LinkButton from "@/components/link-button" +const example = ` +# Heading 1 **Example** +## Heading 2 **Example** +### Heading 3 **Example** + +Originating in **Switzerland**, Adfinis draws *inspiration* from the ***majestic Swiss Alps***, embodying the spirit of exploration and the pursuit of excellence. We provide cutting-edge technology services, including ~~manual work~~ consulting, software development, and managed services, to help organizations optimize their IT environments and boost operational efficiency. Much like a journey through mountainous terrain, our deep expertise in various technologies and our strong commitment to open-source principles guide you through the complexities of IT landscapes. With Adfinis, you embark on a path towards greater flexibility, scalability, and security in your IT operations, ensuring your organization reaches new heights of success. Feel free to [visit our website](https://www.adfinis.com/en-US/theme). + +Originating in **Switzerland**, Adfinis draws *inspiration* from the ***majestic Swiss Alps***, embodying the spirit of exploration and the pursuit of excellence. We provide cutting-edge technology services, including ~~manual work~~ consulting, software development, and managed services, to help organizations optimize their IT environments and boost operational efficiency. Much like a journey through mountainous terrain, our deep expertise in various technologies and our strong commitment to open-source principles guide you through the complexities of IT landscapes. With Adfinis, you embark on a path towards greater flexibility, scalability, and security in your IT operations, ensuring your organization reaches new heights of success. Feel free to [visit our website](https://www.adfinis.com/en-US/theme). +> Blockquote example +1. Ordered list item 1 +2. Ordered list item 2 + 1. Nested ordered list item 1 + 2. Nested ordered list item 2 + +Small text. + +- Unordered list item 1 +- Unordered list item 2 + - Nested unordered list item 1 + - Nested unordered list item 2 + +### Lists with **long blocks** +- This is a very long sentence that is meant to test how well the markdown renderer handles text that spans multiple lines without any line breaks, ensuring that the text wraps correctly and maintains readability across different devices and screen sizes. +- Another extremely long sentence follows, designed to push the limits of the markdown formatting and see if it can gracefully manage extensive content without breaking the layout or causing any unexpected issues in the display, making sure that everything remains user-friendly and visually appealing. +` + export default function Buttons() { const handleClick = () => { console.log("Button clicked!") diff --git a/nextjs/src/app/[locale]/theme/texts.ts b/nextjs/src/app/[locale]/theme/texts.ts index 20d0786..1e2e7c3 100644 --- a/nextjs/src/app/[locale]/theme/texts.ts +++ b/nextjs/src/app/[locale]/theme/texts.ts @@ -424,31 +424,71 @@ export const slaSection = { ], } as const -export const example = ` -# Heading 1 **Example** -## Heading 2 **Example** -### Heading 3 **Example** - -Originating in **Switzerland**, Adfinis draws *inspiration* from the ***majestic Swiss Alps***, embodying the spirit of exploration and the pursuit of excellence. We provide cutting-edge technology services, including ~~manual work~~ consulting, software development, and managed services, to help organizations optimize their IT environments and boost operational efficiency. Much like a journey through mountainous terrain, our deep expertise in various technologies and our strong commitment to open-source principles guide you through the complexities of IT landscapes. With Adfinis, you embark on a path towards greater flexibility, scalability, and security in your IT operations, ensuring your organization reaches new heights of success. Feel free to [visit our website](https://www.adfinis.com/en-US/theme). - -Originating in **Switzerland**, Adfinis draws *inspiration* from the ***majestic Swiss Alps***, embodying the spirit of exploration and the pursuit of excellence. We provide cutting-edge technology services, including ~~manual work~~ consulting, software development, and managed services, to help organizations optimize their IT environments and boost operational efficiency. Much like a journey through mountainous terrain, our deep expertise in various technologies and our strong commitment to open-source principles guide you through the complexities of IT landscapes. With Adfinis, you embark on a path towards greater flexibility, scalability, and security in your IT operations, ensuring your organization reaches new heights of success. Feel free to [visit our website](https://www.adfinis.com/en-US/theme). -> Blockquote example -1. Ordered list item 1 -2. Ordered list item 2 - 1. Nested ordered list item 1 - 2. Nested ordered list item 2 - -Small text. - -- Unordered list item 1 -- Unordered list item 2 - - Nested unordered list item 1 - - Nested unordered list item 2 - -### Lists with **long blocks** -- This is a very long sentence that is meant to test how well the markdown renderer handles text that spans multiple lines without any line breaks, ensuring that the text wraps correctly and maintains readability across different devices and screen sizes. -- Another extremely long sentence follows, designed to push the limits of the markdown formatting and see if it can gracefully manage extensive content without breaking the layout or causing any unexpected issues in the display, making sure that everything remains user-friendly and visually appealing. -` +export const partnerSection = { + title: "## Security Technological Ecosystem", + partners: [ + { + title: "HashiCorp Vault", + description: + "HashiCorp Vault is secure software for managing secrets, authentication tokens, and encryption keys. It provides robust access control and audit capabilities.", + imageUrl: "/svg/logo/hashicorp-vault-logo.svg", + ctas: [ + { + text: "Get started", + href: "/contact", + variant: "primary", + size: "small", + }, + { + text: "More info", + href: "/services", + variant: "secondary", + size: "small", + }, + ], + }, + { + title: "HashiCorp Consul", + description: + "HashiCorp Consul is a service networking solution to connect and secure services across any runtime platform and public or private cloud.", + imageUrl: "/svg/logo/consul-logo.svg", + ctas: [ + { + text: "Get started", + href: "/contact", + variant: "primary", + size: "small", + }, + { + text: "More info", + href: "/services", + variant: "secondary", + size: "small", + }, + ], + }, + { + title: "StackRox", + description: + "StackRox is a Kubernetes-native security platform. It protects cloud-native applications across the full life cycle by providing visibility, vulnerability management, compliance, and runtime threat detection.", + imageUrl: "/svg/logo/stackrox-logo.svg", + ctas: [ + { + text: "Get started", + href: "/contact", + variant: "primary", + size: "small", + }, + { + text: "More info", + href: "/services", + variant: "secondary", + size: "small", + }, + ], + }, + ], +} as const export const footer = { columns: [ diff --git a/nextjs/src/app/homepage.tsx b/nextjs/src/app/homepage.tsx index bb60889..4a36697 100644 --- a/nextjs/src/app/homepage.tsx +++ b/nextjs/src/app/homepage.tsx @@ -81,7 +81,7 @@ export default async function Homepage({ )} {our_solutions && ( - + = ({ title, imageUrl }) => { + return ( +
+ {title +
+ ) +} + +export default CardLogo diff --git a/nextjs/src/components/container.tsx b/nextjs/src/components/container.tsx index 75ee559..4e044b6 100644 --- a/nextjs/src/components/container.tsx +++ b/nextjs/src/components/container.tsx @@ -12,7 +12,6 @@ const containerStyles = cva(["py-18 lg:py-24"], { padding: { "no-padding": "px-0", // edge-to-edge "both-padding": "px-4 lg:px-0", // padding on both sides - "start-padding": "pl-4 rtl:pr-4 rtl:pl-0", // padding on the start side, i.e. for sliders }, background: { white: "bg-white border border-jumbo/30", diff --git a/nextjs/src/components/logo-group.tsx b/nextjs/src/components/logo-group.tsx index 2deec5d..9e4e3fd 100644 --- a/nextjs/src/components/logo-group.tsx +++ b/nextjs/src/components/logo-group.tsx @@ -29,8 +29,6 @@ const LogoGroup: React.FC = ({ logos, columns = 4 }) => { key={key} src={logo.src} alt={logo.alt} - objectPosition="center" - objectFit="cover" /> ))} diff --git a/nextjs/src/components/sections/section-card-logo.tsx b/nextjs/src/components/sections/section-card-logo.tsx new file mode 100644 index 0000000..3753c14 --- /dev/null +++ b/nextjs/src/components/sections/section-card-logo.tsx @@ -0,0 +1,36 @@ +import React from "react" +import CardLogo from "../cards/card-logo" +import { type CTA } from "@/lib/cta" +import Text from "../text" +import ButtonGroup from "../button-group" +import Title from "../title" + +interface SectionCardLogoProps { + title: string + description?: string + imageUrl: string + ctas?: CTA[] +} +const SectionCardLogo: React.FC = ({ + title, + description, + imageUrl, + ctas, +}) => { + return ( +
+
+ +
+
+ + {title} + + {description && } + {ctas?.length && } +
+
+ ) +} + +export default SectionCardLogo diff --git a/nextjs/src/components/sections/section-group.css b/nextjs/src/components/sections/section-group.css new file mode 100644 index 0000000..ce0c195 --- /dev/null +++ b/nextjs/src/components/sections/section-group.css @@ -0,0 +1,8 @@ +.section-group-dividers>* { + /** + * Adds a vertical line between cards that are children. + */ + @apply relative after:content-[''] after:absolute last:after:hidden after:bg-jumbo/35; + @apply after:top-auto after:-bottom-6 after:right-0 after:left-0 after:w-full after:h-[1px]; + @apply after:lg:-bottom-8; +} \ No newline at end of file diff --git a/nextjs/src/components/sections/section-group.tsx b/nextjs/src/components/sections/section-group.tsx index 97a9f5a..486b098 100644 --- a/nextjs/src/components/sections/section-group.tsx +++ b/nextjs/src/components/sections/section-group.tsx @@ -3,13 +3,17 @@ import Title from "../title" import Text from "../text" import { cva, VariantProps } from "class-variance-authority" import clsx from "clsx" +import "./section-group.css" -const sectionGroupStyles = cva(["grid gap-10 lg:gap-16"], { +const sectionGroupStyles = cva(["grid gap-12 lg:gap-16"], { variants: { align: { start: "", center: "justify-start lg:justify-center", }, + hasDividers: { + true: "section-group-dividers", + }, }, defaultVariants: { align: "start", @@ -33,6 +37,7 @@ const SectionGroup: React.FC = ({ text, children, align, + hasDividers, }) => { return (
@@ -49,7 +54,7 @@ const SectionGroup: React.FC = ({
)} - {children} +
{children}
) } diff --git a/nextjs/src/components/title.tsx b/nextjs/src/components/title.tsx index 3d8eb0f..e7718da 100644 --- a/nextjs/src/components/title.tsx +++ b/nextjs/src/components/title.tsx @@ -6,9 +6,9 @@ import remarkGfm from "remark-gfm" const titleStyles = cva(["tracking-tight text-title-primary"], { variants: { level: { - 1: "text-35 lg:text-50 leading-[30px] lg:leading-[50px]", - 2: "text-35 lg:text-40 leading-[30px] lg:leading-[45px]", - 3: "text-30 leading-[25px] lg:leading-[40px]", + 1: "text-35 lg:text-50 leading-[35px] lg:leading-[50px]", + 2: "text-35 lg:text-40 leading-[35px] lg:leading-[40px]", + 3: "text-30 leading-[30px]", }, align: { center: "text-center", diff --git a/strapi/src/components/global/hallmark.json b/strapi/src/components/global/hallmark.json new file mode 100644 index 0000000..f6d60a6 --- /dev/null +++ b/strapi/src/components/global/hallmark.json @@ -0,0 +1,18 @@ +{ + "collectionName": "components_global_hallmarks", + "info": { + "displayName": "Hallmark", + "icon": "picture" + }, + "options": {}, + "attributes": { + "url": { + "type": "string", + "required": true + }, + "alt": { + "type": "string", + "required": true + } + } +} diff --git a/strapi/types/generated/contentTypes.d.ts b/strapi/types/generated/contentTypes.d.ts index 4202b3a..ae535aa 100644 --- a/strapi/types/generated/contentTypes.d.ts +++ b/strapi/types/generated/contentTypes.d.ts @@ -862,6 +862,15 @@ export interface ApiQuoteQuote extends Struct.CollectionTypeSchema { updatedAt: Schema.Attribute.DateTime; updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & Schema.Attribute.Private; + who_are_we: Schema.Attribute.Component< + 'sections.projects-card-section-with-external-link', + false + > & + Schema.Attribute.SetPluginOptions<{ + i18n: { + localized: true; + }; + }>; }; }