diff --git a/.gitignore b/.gitignore index 6706cd8d..1dda4a95 100644 --- a/.gitignore +++ b/.gitignore @@ -134,4 +134,5 @@ dist/ ############################ # overige-objecten-api ############################ -apps/overige-objecten-api/src/types \ No newline at end of file +apps/overige-objecten-api/src/types +output-html diff --git a/apps/overige-objecten-api/package.json b/apps/overige-objecten-api/package.json index 2084ce2c..df9f7e59 100644 --- a/apps/overige-objecten-api/package.json +++ b/apps/overige-objecten-api/package.json @@ -27,7 +27,11 @@ "js-yaml": "4.1.0", "swagger-ui-express": "5.0.1", "lodash.merge": "4.6.2", - "lodash.snakecase": "4.1.1" + "lodash.snakecase": "4.1.1", + "react": "18.2.0", + "@utrecht/web-component-library-react": "3.0.0", + "@utrecht/component-library-react": "7.3.5", + "@frameless/ui": "0.1.0" }, "devDependencies": { "@types/cors": "2.8.17", diff --git a/apps/overige-objecten-api/src/components/AccordionSection.tsx b/apps/overige-objecten-api/src/components/AccordionSection.tsx new file mode 100644 index 00000000..448e8b2d --- /dev/null +++ b/apps/overige-objecten-api/src/components/AccordionSection.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { Markdown } from './Markdown'; + +export interface AccordionSectionProps { + label: string; + body: string; + headingLevel: number; +} +export const AccordionSection = ({ body, headingLevel = 2, label }: AccordionSectionProps) => { + const CustomHeading = `h${headingLevel}` as keyof React.JSX.IntrinsicElements; + return ( +
+ {label} + {body} +
+ ); +}; diff --git a/apps/overige-objecten-api/src/components/Markdown.tsx b/apps/overige-objecten-api/src/components/Markdown.tsx new file mode 100644 index 00000000..69f917e6 --- /dev/null +++ b/apps/overige-objecten-api/src/components/Markdown.tsx @@ -0,0 +1,5 @@ +import React from 'react'; +import xss from 'xss'; + +export const Markdown = ({ children }: { children: string }) => + children ?
: null; diff --git a/apps/overige-objecten-api/src/queries/index.ts b/apps/overige-objecten-api/src/queries/index.ts index 29035b50..2d6ee81d 100644 --- a/apps/overige-objecten-api/src/queries/index.ts +++ b/apps/overige-objecten-api/src/queries/index.ts @@ -40,28 +40,127 @@ query getAllProducts( description } sections { + ... on ComponentComponentsInternalBlockContent { + component: __typename + internal_field { + data { + attributes { + content { + uuid + contentBlock { + content + kennisartikelCategorie + } + } + } + } + } + } ... on ComponentComponentsUtrechtRichText { id content kennisartikelCategorie component: __typename } - ... on ComponentComponentsInternalBlockContent { + ... on ComponentComponentsUtrechtImage { component: __typename - internal_field { + categorie2:kennisartikelCategorie + imageData { data { attributes { - content { - uuid - contentBlock { - content - kennisartikelCategorie - } + name + alternativeText + caption + width + height + formats + url + } + } + } + } + ... on ComponentComponentsUtrechtLogoButton { + component: __typename + categorie3:kennisartikelCategorie + appearance + href + label + logo + openFormsEmbed + textContent + } + ... on ComponentComponentsUtrechtSpotlight { + component: __typename + categorie4:kennisartikelCategorie + content + type + logoButton { + id + label + href + textContent + logo + appearance + __typename + } + } + ... on ComponentComponentsUtrechtRichText { + component: __typename + categorie5:kennisartikelCategorie + content + } + ... on ComponentComponentsUtrechtMultiColumnsButton { + component: __typename + categorie6:kennisartikelCategorie + column { + id + title + logoButton { + component: __typename + appearance + href + label + logo + openFormsEmbed + textContent + } + } + } + ... on ComponentComponentsUtrechtLink { + component: __typename + categorie7:kennisartikelCategorie + href + textContent + icon + language + } + ... on ComponentComponentsFaq { + component: __typename + categorie8:kennisartikelCategorie + pdc_faq { + data { + attributes { + title + faq(pagination: { start: 0, limit: -1 }) { + body + headingLevel + id + label } } } } } + ... on ComponentComponentsUtrechtAccordion { + component: __typename + categorie9:kennisartikelCategorie + item(pagination: { start: 0, limit: -1 }) { + body + headingLevel + id + label + } + } } kennisartikelMetadata { uuid @@ -83,7 +182,6 @@ query getAllProducts( } } } - `); export const GET_PRODUCT_BY_UUID = gql(` @@ -108,12 +206,6 @@ export const GET_PRODUCT_BY_UUID = gql(` description } sections { - ... on ComponentComponentsUtrechtRichText { - id - content - kennisartikelCategorie - component:__typename - } ... on ComponentComponentsInternalBlockContent { component: __typename internal_field { @@ -130,6 +222,111 @@ export const GET_PRODUCT_BY_UUID = gql(` } } } + ... on ComponentComponentsUtrechtRichText { + id + content + kennisartikelCategorie + component: __typename + } + ... on ComponentComponentsUtrechtImage { + component: __typename + categorie2:kennisartikelCategorie + imageData { + data { + attributes { + name + alternativeText + caption + width + height + formats + url + } + } + } + } + ... on ComponentComponentsUtrechtLogoButton { + component: __typename + categorie3:kennisartikelCategorie + appearance + href + label + logo + openFormsEmbed + textContent + } + ... on ComponentComponentsUtrechtSpotlight { + component: __typename + categorie4:kennisartikelCategorie + content + type + logoButton { + id + label + href + textContent + logo + appearance + __typename + } + } + ... on ComponentComponentsUtrechtRichText { + component: __typename + categorie5:kennisartikelCategorie + content + } + ... on ComponentComponentsUtrechtMultiColumnsButton { + component: __typename + categorie6:kennisartikelCategorie + column { + id + title + logoButton { + component: __typename + appearance + href + label + logo + openFormsEmbed + textContent + } + } + } + ... on ComponentComponentsUtrechtLink { + component: __typename + categorie7:kennisartikelCategorie + href + textContent + icon + language + } + ... on ComponentComponentsFaq { + component: __typename + categorie8:kennisartikelCategorie + pdc_faq { + data { + attributes { + title + faq(pagination: { start: 0, limit: -1 }) { + body + headingLevel + id + label + } + } + } + } + } + ... on ComponentComponentsUtrechtAccordion { + component: __typename + categorie9:kennisartikelCategorie + item(pagination: { start: 0, limit: -1 }) { + body + headingLevel + id + label + } + } } kennisartikelMetadata { uuid diff --git a/apps/overige-objecten-api/src/utils/convertLogoButtonToHTML.tsx b/apps/overige-objecten-api/src/utils/convertLogoButtonToHTML.tsx new file mode 100644 index 00000000..4f2042f1 --- /dev/null +++ b/apps/overige-objecten-api/src/utils/convertLogoButtonToHTML.tsx @@ -0,0 +1,115 @@ +import { ButtonLink, Heading } from '@utrecht/component-library-react'; +import { UtrechtDigidLogo, UtrechtEherkenningLogo, UtrechtEidasLogo } from '@utrecht/web-component-library-react'; +import kebabCase from 'lodash.kebabcase'; +import React from 'react'; +import { renderToString } from 'react-dom/server'; + +interface IconProps { + logo?: string; +} + +export const Icon = ({ logo }: IconProps) => { + switch (logo) { + case 'eidas': + return ; + case 'digid': + return ; + case 'eherkenning': + return ; + default: + return null; + } +}; +export type LogoButtonItemType = { + logo?: string; + href?: string; + appearance?: string; + label?: string; + openFormsEmbed?: string | null; + textContent?: string | null; +}; +export interface LogoButtonProps { + item: LogoButtonItemType; + headingLevel?: number; + withDesignSystem?: boolean; +} +export interface BasicLogoButtonProps { + item: LogoButtonItemType; + headingLevel?: number; +} +export const BasicLogoButton = ({ item, headingLevel }: BasicLogoButtonProps) => { + const HeadingComponent = `h${headingLevel || 3}` as keyof React.JSX.IntrinsicElements; + const mappingIcon = { + eidas: 'eIDAS', + digid: 'DigiD', + eherkenning: 'eHerkenning', + without_logo: null, + }; + return ( +
+ {item?.label && {item.label}} +
+ {item?.logo && {mappingIcon[item?.logo as keyof typeof mappingIcon]}}{' '} + {item?.href && item?.textContent && {item.textContent}} +
+
+ ); +}; +export const LogoButton = ({ item, headingLevel, withDesignSystem = false }: LogoButtonProps) => { + const getOpenFormsEmbed = (openFormsEmbed: any) => { + if (!openFormsEmbed) return null; + const parsOpenFormsEmbedData = new URLSearchParams(openFormsEmbed); + const slug = parsOpenFormsEmbedData.get('slug'); + const label = parsOpenFormsEmbedData.get('label'); + const pdcFrontendURL = 'http://localhost:3000'; //TODO use env variable or update strapi-plugin-open-forms-embed package to send the frontend URL + return { + href: `${pdcFrontendURL}/form/${slug}`, + textContent: label, + }; + }; + const openFormsEmbed = getOpenFormsEmbed(item?.openFormsEmbed); + if (withDesignSystem) { + if (openFormsEmbed) { + return ( +
+ {item?.label} +
+ + + {item?.textContent || openFormsEmbed.textContent} + +
+
+ ); + } + + return ( +
+ {item?.label} +
+ + + {item?.textContent} + +
+
+ ); + } + if (openFormsEmbed) { + return ( + + ); + } + return ; +}; + +export const convertLogoButtonToHTML = (item: any) => { + return renderToString(); +}; diff --git a/apps/overige-objecten-api/src/utils/convertMultiColumnsButtonToHTML.tsx b/apps/overige-objecten-api/src/utils/convertMultiColumnsButtonToHTML.tsx new file mode 100644 index 00000000..ddadb96c --- /dev/null +++ b/apps/overige-objecten-api/src/utils/convertMultiColumnsButtonToHTML.tsx @@ -0,0 +1,40 @@ +import { Heading } from '@utrecht/component-library-react'; +import React from 'react'; +import { renderToString } from 'react-dom/server'; +import type { LogoButtonItemType } from './convertLogoButtonToHTML'; +import { BasicLogoButton, LogoButton } from './convertLogoButtonToHTML'; + +type MultiColumnsButtonType = { + title: string; + logoButton: LogoButtonItemType[]; +}; +interface MultiColumnsButtonProps { + item: MultiColumnsButtonType; + withDesignSystem?: boolean; +} + +const MultiColumnsButton = ({ item, withDesignSystem }: MultiColumnsButtonProps) => { + if (withDesignSystem) { + return ( +
+ {item.title} + {item.logoButton.map((btn: LogoButtonItemType, index: number) => ( + + ))} +
+ ); + } + return ( +
+

{item.title}

+ {item.logoButton.map((btn: LogoButtonItemType, index: number) => ( + + ))} +
+ ); +}; + +export const convertMultiColumnsButtonToHTML = (item: any, withDesignSystem?: boolean) => + item.column.map((col: any) => + renderToString(), + ); diff --git a/apps/overige-objecten-api/src/utils/convertSpotlightToHTML.tsx b/apps/overige-objecten-api/src/utils/convertSpotlightToHTML.tsx new file mode 100644 index 00000000..10debde7 --- /dev/null +++ b/apps/overige-objecten-api/src/utils/convertSpotlightToHTML.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { renderToString } from 'react-dom/server'; +import { BasicLogoButton } from './convertLogoButtonToHTML'; +import { Markdown } from '../components/Markdown'; +export const convertSpotlightToHTML = (item: any) => { + return renderToString( +
+ {item?.content} + {item.logoButton && item.logoButton.map((btn: any, index: number) => )} +
, + ); +}; diff --git a/apps/overige-objecten-api/src/utils/createHTMLFiles.tsx b/apps/overige-objecten-api/src/utils/createHTMLFiles.tsx new file mode 100644 index 00000000..e9514f07 --- /dev/null +++ b/apps/overige-objecten-api/src/utils/createHTMLFiles.tsx @@ -0,0 +1,140 @@ +import { Document, Heading, Page, PageContent, Separator } from '@utrecht/component-library-react'; +import fs from 'node:fs'; +import path from 'node:path'; +import React from 'react'; +import { renderToString } from 'react-dom/server'; +import { Markdown } from '../components/Markdown'; + +const categoryStyle = { border: '1px solid #ccc', padding: '10px', marginBottom: '10px' }; +const Category = ({ data }: { data: any }) => { + return ( + <> + {data?.tekst && ( +
+ Categorie - Tekst + + {data?.tekst} +
+ )} + {data?.procedureBeschrijving && ( +
+ Categorie - Procedure Beschrijving + + {data?.procedureBeschrijving} +
+ )} + {data?.bewijs && ( +
+ Categorie - Bewijs + + {data?.bewijs} +
+ )} + {data?.uitvoeringsinstructies && ( +
+ Categorie - Uitvoeringsinstructies + + {data?.uitvoeringsinstructies} +
+ )} + {data?.bezwaarEnBeroep && ( +
+ Categorie - Bezwaar + + {data?.bezwaarEnBeroep} +
+ )} + {data?.vereisten && ( +
+ Categorie - Vereisten + + {data?.vereisten} +
+ )} + {data?.kostenEnBetaalmethoden && ( +
+ Categorie - Kosten en betaalmethoden + + {data?.kostenEnBetaalmethoden} +
+ )} + {data?.contact && ( +
+ Categorie - Contact + + {data?.contact} +
+ )} + {data?.wtdBijGeenReactie && ( +
+ Categorie - WTD Bij Geen Reactie + + {data?.wtdBijGeenReactie} +
+ )} + {data?.notice && ( +
+ Categorie - Notice + + {data?.notice} +
+ )} + {data?.deskMemo && ( +
+ Categorie - Desk Memo (Interne velden) + + {data?.deskMemo} +
+ )} + + ); +}; + +const PageComponent = ({ data }: { data: any }) => ( + + + + + + + + + + Kennisartikelen Categories + + + + + + Kennisartikelen Categories + + + + + + + +); + +export const createHTMLFiles = (data: any) => { + const outputDir = './output-html'; + + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir, { recursive: true }); + } + const filePath = path.join(outputDir, `preview.html`); + fs.writeFileSync(filePath, renderToString(), 'utf8'); +}; diff --git a/apps/overige-objecten-api/src/utils/generateKennisartikelObject.ts b/apps/overige-objecten-api/src/utils/generateKennisartikelObject.ts index 57b8abc8..5ebd5396 100644 --- a/apps/overige-objecten-api/src/utils/generateKennisartikelObject.ts +++ b/apps/overige-objecten-api/src/utils/generateKennisartikelObject.ts @@ -1,9 +1,7 @@ -import { combineSimilarCategories } from './combineSimilarCategories'; -import { mapContentByCategory } from './mapContentByCategory'; +import { combineSimilarCategories, createHTMLFiles, normalizeCategories, processData } from './index'; import { processToDeskMemo } from './processToDeskMemo'; import { Attributes } from '../strapi-product-type'; import { components } from '../types/openapi'; - interface GenerateKennisartikelObjectTypes { attributes: Attributes; url: string; @@ -15,19 +13,16 @@ export const generateKennisartikelObject = ({ attributes, url, id }: GenerateKen const trefwoorden = metaTags?.keymatch?.split(', ').map((trefwoord: string) => ({ trefwoord })) || []; const kennisartikelMetadata = attributes.kennisartikelMetadata; const publicatieDatum = new Date(attributes.createdAt).toISOString().split('T')[0]; - const contentBlock = attributes?.sections - .filter(({ component }) => component === 'ComponentComponentsUtrechtRichText') - .map(({ kennisartikelCategorie, content }) => mapContentByCategory(kennisartikelCategorie, content)); const getInternalBlockComponent = attributes?.sections.find( ({ component }) => component === 'ComponentComponentsInternalBlockContent', ); const deskMemoInternalBlock = getInternalBlockComponent?.internal_field?.data?.attributes?.content?.contentBlock; const { deskMemo } = deskMemoInternalBlock ? processToDeskMemo(deskMemoInternalBlock) : { deskMemo: '' }; + const sections = combineSimilarCategories(processData(normalizeCategories(attributes?.sections))); - // combine similar categories - const reducedContentBlock = combineSimilarCategories(contentBlock); - const bothContentBlock = { ...reducedContentBlock, deskMemo }; + const bothContentBlock = { ...sections, deskMemo }; + createHTMLFiles(bothContentBlock); const vertalingen = [ { ...bothContentBlock, diff --git a/apps/overige-objecten-api/src/utils/index.ts b/apps/overige-objecten-api/src/utils/index.ts index f0d2d2d4..0dfb8ace 100644 --- a/apps/overige-objecten-api/src/utils/index.ts +++ b/apps/overige-objecten-api/src/utils/index.ts @@ -7,8 +7,14 @@ export { getCurrentTypeParam } from './getCurrentTypeParam'; export { getPaginatedResponse } from './getPaginatedResponse'; export { getTheServerURL } from './getTheServerURL'; export { mapContentByCategory } from './mapContentByCategory'; +export { normalizeCategories } from './normalizeCategories'; export { processToDeskMemo } from './processToDeskMemo'; export { readFile } from './readFile'; export type { CombineSimilarCategoriesProps } from './combineSimilarCategories'; export type { PaginationType } from './getPaginatedResponse'; export type { ProcessToDeskMemoData } from './processToDeskMemo'; +export { convertLogoButtonToHTML } from './convertLogoButtonToHTML'; +export { processData } from './processData'; +export { convertSpotlightToHTML } from './convertSpotlightToHTML'; +export { convertMultiColumnsButtonToHTML } from './convertMultiColumnsButtonToHTML'; +export { createHTMLFiles } from './createHTMLFiles'; diff --git a/apps/overige-objecten-api/src/utils/normalizeCategories.ts b/apps/overige-objecten-api/src/utils/normalizeCategories.ts new file mode 100644 index 00000000..3587e496 --- /dev/null +++ b/apps/overige-objecten-api/src/utils/normalizeCategories.ts @@ -0,0 +1,13 @@ +export const normalizeCategories = (data: any) => { + return data.map((item: any) => { + // Find the key that starts with 'categorie' + const categorieKey = Object.keys(item).find((key) => key.startsWith('categorie')); + if (categorieKey) { + const { [categorieKey]: categorieValue, ...rest } = item; + return { ...rest, categorie: categorieValue }; + } + + // Return the item unchanged if no 'categorieX' field is found + return item; + }); +}; diff --git a/apps/overige-objecten-api/src/utils/processData.tsx b/apps/overige-objecten-api/src/utils/processData.tsx new file mode 100644 index 00000000..35fdd1fd --- /dev/null +++ b/apps/overige-objecten-api/src/utils/processData.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { renderToString } from 'react-dom/server'; +import { + convertLogoButtonToHTML, + convertMultiColumnsButtonToHTML, + convertSpotlightToHTML, + mapContentByCategory, +} from './index'; +import { AccordionSection, type AccordionSectionProps } from '../components/AccordionSection'; +import { Markdown } from '../components/Markdown'; + +export const processData = (data: any) => + data.map((item: any) => { + if (item.component === 'ComponentComponentsUtrechtRichText') { + return mapContentByCategory(item.categorie, renderToString({item?.content})); + } + if (item.component === 'ComponentComponentsUtrechtLogoButton') { + const mappedContent = mapContentByCategory(item.categorie, convertLogoButtonToHTML(item)); + return mappedContent; + } + if (item.component === 'ComponentComponentsUtrechtSpotlight') { + const mappedContent = mapContentByCategory(item.categorie, convertSpotlightToHTML(item)); + return mappedContent; + } + if (item.component === 'ComponentComponentsUtrechtMultiColumnsButton') { + const mappedContent = mapContentByCategory(item.categorie, convertMultiColumnsButtonToHTML(item)); + return mappedContent; + } + if (item.component === 'ComponentComponentsUtrechtImage') { + const imageUrl = item.imageData.data.attributes.url; + + if (!imageUrl) return {}; + if (!item.categorie) return {}; + + const mappedContent = mapContentByCategory( + item.categorie, + renderToString( + {item?.imageData?.data?.attributes?.alternativeText, + ), + ); + return mappedContent; + } + if (item.component === 'ComponentComponentsFaq') { + const FAQs = item?.pdc_faq?.data?.attributes?.faq.map((faq: AccordionSectionProps, index: number) => ( + + )); + const mappedContent = mapContentByCategory(item.categorie, renderToString(FAQs)); + return mappedContent; + } + if (item.component === 'ComponentComponentsUtrechtLink') { + if (!item.categorie) return {}; + const mappedContent = mapContentByCategory( + item.categorie, + renderToString({item.textContent}), + ); + return mappedContent; + } + if (item.component === 'ComponentComponentsUtrechtAccordion') { + if (!item.categorie) return {}; + + const mappedContent = mapContentByCategory( + item.categorie, + renderToString( + Array.isArray(item.item) && + item.item.map((accordionItem: AccordionSectionProps) => ( + + )), + ), + ); + if (Object.keys(mappedContent).length > 0) { + return mappedContent; + } + } + return {}; + }); diff --git a/apps/overige-objecten-api/tsconfig.json b/apps/overige-objecten-api/tsconfig.json index 88a636e4..86357fba 100644 --- a/apps/overige-objecten-api/tsconfig.json +++ b/apps/overige-objecten-api/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "jsx": "react", "moduleResolution": "node", "noUnusedLocals": true, "noUnusedParameters": true, diff --git a/yarn.lock b/yarn.lock index 9c7678f0..2bed3a4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8149,6 +8149,43 @@ resolved "https://registry.yarnpkg.com/@utrecht/backdrop-css/-/backdrop-css-1.1.0.tgz#08f8f9efbfdf87866216c03f17a74ac56d0a9bba" integrity sha512-oTGdo7OdFH4FJRqcwJp1DpxZQAR5LQWITYe1IJ7X+px9Wuu+9zSabYGn2dfIZgWaPYUAvAboiUtMpn21Z9yE3g== +"@utrecht/button-react@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@utrecht/button-react/-/button-react-2.0.2.tgz#7bc99dcbd45ff944c2ee8de0531e5ad500953f87" + integrity sha512-Nt8hSZApoACqUtu/nTRCjELWAi9KQ7n1Vffs5sXyA0Xjw9r99xRkrIQsFyDxJV2y14Kisp89fkDNY8MwAtJYDA== + dependencies: + clsx "2.1.1" + +"@utrecht/calendar-css@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@utrecht/calendar-css/-/calendar-css-1.3.0.tgz#6d462e436c5f700381d1d5c659aa9784552ad082" + integrity sha512-4w1CLoKhw6PVDg8NHvgYBvzQMFsqPizQzcmQF17x3AACURdsrlc/99De2ou5JXs2KZM4xLtaiWKTLtE06iz9aA== + +"@utrecht/calendar-react@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@utrecht/calendar-react/-/calendar-react-1.0.5.tgz#635be175f0e5ef514019a4537a3d43fa44caffc8" + integrity sha512-HlfT6cEE0T8gGu3bpWJRvTNwY9rGNHnJC9nCA6reCn9Nn6uC0A2c6rdy5BAH4I6CdZM71rVpCOP1VC7fPBSSGg== + dependencies: + "@utrecht/button-react" "2.0.2" + "@utrecht/calendar-css" "1.3.0" + clsx "2.1.1" + date-fns "2.30.0" + lodash-es "4.17.21" + +"@utrecht/checkbox-react@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@utrecht/checkbox-react/-/checkbox-react-1.0.2.tgz#19adb0e5ddf6f2cd061ebe8243d2936f347b118e" + integrity sha512-WYqGXgBJ2W/4xGzKlLVjyToM7N2aCzWIdcAftnfp3pGg3mJ0L2i2TmVMJQKDh2RwLq5lsftk3OxPhH3IxOMWJA== + dependencies: + clsx "2.1.1" + +"@utrecht/combobox-react@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@utrecht/combobox-react/-/combobox-react-0.0.3.tgz#3e07f44ebe72cb785b2cab4877dc723d41d41a8b" + integrity sha512-l543Y0iaw68ZT0SuETjvzGp37pLtw72sfzh/QzkNGyr9kk9twUmo+gYEp1QedAsOGaK9ETjcAoeKL2lgreiUKQ== + dependencies: + clsx "2.1.1" + "@utrecht/component-library-css@4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@utrecht/component-library-css/-/component-library-css-4.2.0.tgz#16475b4af03daf238a4fac58b8b2a4b320286657" @@ -8162,31 +8199,128 @@ clsx "2.1.1" lodash.chunk "4.2.0" +"@utrecht/component-library-react@7.3.5": + version "7.3.5" + resolved "https://registry.yarnpkg.com/@utrecht/component-library-react/-/component-library-react-7.3.5.tgz#19c3fbbb81775b4424fdd4ab16c9e57b1aa5731b" + integrity sha512-ZVkwZ9HsF9VMDq5qUh2tLp9o2zIbrf/rY1oSBDAfltkBc+qNURBanLmwxVU77qebpM9hUP8UqERMHYOQMvW2gQ== + dependencies: + "@utrecht/button-react" "2.0.2" + "@utrecht/calendar-react" "1.0.5" + "@utrecht/checkbox-react" "1.0.2" + "@utrecht/combobox-react" "0.0.3" + "@utrecht/fieldset-react" "1.0.2" + "@utrecht/form-field-checkbox-react" "1.0.4" + "@utrecht/form-field-description-react" "1.0.2" + "@utrecht/form-field-error-message-react" "1.0.2" + "@utrecht/form-field-react" "1.0.2" + "@utrecht/form-label-react" "1.0.2" + "@utrecht/link-react" "1.0.2" + "@utrecht/listbox-react" "1.0.3" + "@utrecht/radio-button-react" "1.0.2" + "@utrecht/textbox-react" "1.0.2" + clsx "2.1.1" + lodash.chunk "4.2.0" + "@utrecht/design-tokens@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@utrecht/design-tokens/-/design-tokens-1.1.0.tgz#0377dbfac70564fc8fc33f9ad53323351f83004e" integrity sha512-1P9aVSL5xlBx2sFEzm1v+obgAPvwiLj4dg0vAZnFxLF6ZLbPPu0kP+tQhW3Gj945DU3qkwL/tIuimObYulYVAg== +"@utrecht/fieldset-react@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@utrecht/fieldset-react/-/fieldset-react-1.0.2.tgz#b126b7bc0c77c6037dc7e06812002096efbd600f" + integrity sha512-I44EK9yrsGNfKvfijIWxymxXGt+iBw8J0t3aZISF6oqnDOIPOgU25bDiTVxgnuXc0QRz1fpyLiy11Zl0PHL2pQ== + dependencies: + clsx "2.1.1" + "@utrecht/focus-ring-css@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@utrecht/focus-ring-css/-/focus-ring-css-1.1.0.tgz#3a3b426b81d9aefc792288287e7ffc6981ab1ed6" integrity sha512-MDxrC7b1AZ+S0+oqfMA/QD05GDhBTnc7q5VR3a+39jwJkgXtG7gJSQ7Pr8kdK8/Brx94SayIAEP5vAjuBee6bQ== +"@utrecht/form-field-checkbox-react@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@utrecht/form-field-checkbox-react/-/form-field-checkbox-react-1.0.4.tgz#879efaf6c68c281de8b042c65383133df7d5c367" + integrity sha512-rsVs0wQd9q/Es8LTiJKbuRlIGigjTix5QCqJ8PdIexOJ7AgyAl2O0Z57EuDsUVQm5rvz/F8LvD0eRRakAkFeeA== + dependencies: + "@utrecht/checkbox-react" "1.0.2" + "@utrecht/form-field-description-react" "1.0.2" + "@utrecht/form-field-error-message-react" "1.0.2" + "@utrecht/form-field-react" "1.0.2" + "@utrecht/form-label-react" "1.0.2" + clsx "2.1.1" + +"@utrecht/form-field-description-react@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@utrecht/form-field-description-react/-/form-field-description-react-1.0.2.tgz#c7b133b1d0d49860a571e537fdee7cd2593d7809" + integrity sha512-trki74s07AAMp59SO/VpR4RguvepaMGZ89xp54mbzYeJMqEspCCyEzKJSL/UdM0Kv8IVc3YpDv8grDV4hpT4Kw== + dependencies: + clsx "2.1.1" + +"@utrecht/form-field-error-message-react@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@utrecht/form-field-error-message-react/-/form-field-error-message-react-1.0.2.tgz#27db05351c210f0e91423ab56a8098be85421aa6" + integrity sha512-SwJWACl09GHbXVK7LhliHeU8steEqMED8rb2GTppJz8N4SN0J97Z43rPaVxdfpX4vxslb60M3+b33GO5UQ8Uuw== + dependencies: + clsx "2.1.1" + +"@utrecht/form-field-react@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@utrecht/form-field-react/-/form-field-react-1.0.2.tgz#3d6f312bf56580046a856f10ca360dda0953768a" + integrity sha512-8R8cjpX6pGgUwjEeQVQrqt+Rrdfir4QcNKY4QuPvixJo9Xk78RQYITt0HwrGHNSI2JbuyUIVnwCTZmwkfm+bLA== + dependencies: + clsx "2.1.1" + "@utrecht/form-label-css@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@utrecht/form-label-css/-/form-label-css-1.1.0.tgz#aa611c084fff3157b345e4b5c0ac3756d59b1163" integrity sha512-6DeD2tLgSm8PiflP4jCk5D70H4RptEP6aJnHmXJCc0mbhHz0obONkrcl9pf4urRLQ+DuYa8x9fiHQHvjNCTeRg== +"@utrecht/form-label-react@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@utrecht/form-label-react/-/form-label-react-1.0.2.tgz#9620218979dce23f04b9513cde27202d11108502" + integrity sha512-7VgtnaVSQqImpehEvubxyq/7JO+AdBM6DWWmRv8qjm1WxqSs8ZCUDJkwH7OrFY405DVWJB2Yi4PZwD/jUT/nIQ== + dependencies: + clsx "2.1.1" + +"@utrecht/link-react@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@utrecht/link-react/-/link-react-1.0.2.tgz#244e00418e7114a325bdcc338cd3b2619580df84" + integrity sha512-eOckJ+pTOc8qHTP6zvgiNufTO7p7SjxDUT5ncoXAvxGlmDY0znqyfq8sXuTWGm4rpuq4k7vbLKozVmq+jxue0g== + dependencies: + clsx "2.1.1" + +"@utrecht/listbox-react@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@utrecht/listbox-react/-/listbox-react-1.0.3.tgz#9b9e636a7e87c5a4bf884627ce83aaf230f6b2e2" + integrity sha512-Pjp4jCJTrPOj9GpmIvf2EKYSZDJD4OFxC73GXfxEwQpyFLYC+x8Q2mKuth044jFhNZm1+G0lEAeUH9fZ3u+kPg== + dependencies: + clsx "2.1.1" + "@utrecht/multiline-data-css@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@utrecht/multiline-data-css/-/multiline-data-css-1.1.0.tgz#1cebc601d155efa57153fcd9709815547e18da26" integrity sha512-9ZqOZ6TVzA4TTAp64UWND99+8Bb6tVmO6GUrLHibs69hVT6sCMXpI0H9a0LtHHkFg5KURqGonISzzKcWXzvxIg== +"@utrecht/radio-button-react@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@utrecht/radio-button-react/-/radio-button-react-1.0.2.tgz#3431f124aff2996e30623b6f44849bd1d89b021f" + integrity sha512-y4r3913L0PxIZqVQbjs1bV8cuiez6X4Oaqhjo7d8tdeOtnMjIjvv2s8tyRzDuyU8PioGXcMjtfavY+bDdrfc7g== + dependencies: + clsx "2.1.1" + "@utrecht/textbox-css@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@utrecht/textbox-css/-/textbox-css-1.2.0.tgz#41be4783d178ab227b9bd188253407a688e69226" integrity sha512-b7bfn3Vo/iSepcglS1+jGyoUMpSfL0N7Dc0J8HKpAZSm8452I5s3SUHJyCiB/fsbM2F4ZFafwYT5n0rKucKZLQ== +"@utrecht/textbox-react@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@utrecht/textbox-react/-/textbox-react-1.0.2.tgz#54f849a977b065dd63582b32f0d5ed399d33c97f" + integrity sha512-qO8/1bOL+6NdEtPz6y1hQot0Jex3qNCa/vnJSmuQZbFSy70vRkeancP6Khl8q7o1YIvqpMpbSG3nhZaVM3lIiw== + dependencies: + clsx "2.1.1" + "@utrecht/web-component-library-react@1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@utrecht/web-component-library-react/-/web-component-library-react-1.3.0.tgz#5caae1ace5a76ea987f95c31ea9d69c045c8d99e" @@ -8194,6 +8328,13 @@ dependencies: "@utrecht/web-component-library-stencil" "1.4.0" +"@utrecht/web-component-library-react@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@utrecht/web-component-library-react/-/web-component-library-react-3.0.0.tgz#c7d08359cd99f43e126691fcf648d19a872141c1" + integrity sha512-lgJOzhRK1/9TRTz6ECgJk3yJPhh+t2Df1uj0xjTzca0qWU2UVR/kQwbdlmKRqu7D86iOm5kBfa0jP2yzUkLFvw== + dependencies: + "@utrecht/web-component-library-stencil" "2.2.0" + "@utrecht/web-component-library-stencil@1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@utrecht/web-component-library-stencil/-/web-component-library-stencil-1.4.0.tgz#a880bea2e9f2ffb4375c43fa248b79233ef4c027" @@ -8201,6 +8342,13 @@ dependencies: "@stencil/core" "4.18.3" +"@utrecht/web-component-library-stencil@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@utrecht/web-component-library-stencil/-/web-component-library-stencil-2.2.0.tgz#26a2239d578d2be8b0074e33cf3b03e7aedf97d4" + integrity sha512-2ny336xp8dVcUaey0bWe65V+zqooyeApyMW8Vi44IxKJTcqNvKdOawT/mI1t1lTTsGoUhxxi0QQYT4AfXMU0aQ== + dependencies: + "@stencil/core" "4.18.3" + "@vercel/blob@0.12.5": version "0.12.5" resolved "https://registry.yarnpkg.com/@vercel/blob/-/blob-0.12.5.tgz#1816a9bcac95bf45b690e15beb3f7a4d501d5511" @@ -18244,7 +18392,7 @@ locate-path@^7.1.0: dependencies: p-locate "^6.0.0" -lodash-es@^4.17.15, lodash-es@^4.17.21: +lodash-es@4.17.21, lodash-es@^4.17.15, lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==