@amsterdam/design-system-react 2.2.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/Column/Column.d.ts +1 -1
- package/dist/Grid/Grid.d.ts +1 -1
- package/dist/Grid/GridCell.d.ts +1 -1
- package/dist/Logo/Logo.d.ts +10 -5
- package/dist/Logo/Logo.js +17 -9
- package/dist/PageFooter/PageFooter.d.ts +4 -1
- package/dist/PageFooter/PageFooterMenu.d.ts +27 -2
- package/dist/PageFooter/PageFooterMenu.js +6 -2
- package/dist/PageHeader/PageHeader.d.ts +13 -4
- package/dist/PageHeader/PageHeader.js +3 -2
- package/dist/PageHeader/PageHeaderGridCellNarrowWindowOnly.js +2 -1
- package/dist/Paragraph/Paragraph.d.ts +2 -2
- package/dist/Paragraph/Paragraph.js +8 -1
- package/dist/Row/Row.d.ts +1 -1
- package/dist/Spotlight/Spotlight.d.ts +1 -1
- package/dist/common/useIsAfterBreakpoint.d.ts +4 -4
- package/dist/common/useIsAfterBreakpoint.js +12 -13
- package/dist/index.cjs.js +66 -34
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +44 -21
- package/dist/index.esm.js +67 -35
- package/dist/index.esm.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +10 -15
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Amsterdam Design System: React components
|
|
4
4
|
|
|
5
5
|
This package provides all React components from the [Amsterdam Design System](https://designsystem.amsterdam).
|
|
6
|
-
Use it to compose pages in your
|
|
6
|
+
Use it to compose pages in your websites.
|
|
7
7
|
|
|
8
8
|
## Introduction
|
|
9
9
|
|
package/dist/Column/Column.d.ts
CHANGED
|
@@ -56,5 +56,5 @@ export declare const Column: import("react").ForwardRefExoticComponent<{
|
|
|
56
56
|
gap?: ColumnGap;
|
|
57
57
|
} & HTMLAttributes<HTMLElement> & {
|
|
58
58
|
children?: import("react").ReactNode | undefined;
|
|
59
|
-
} & import("react").RefAttributes<
|
|
59
|
+
} & import("react").RefAttributes<any>>;
|
|
60
60
|
export {};
|
package/dist/Grid/Grid.d.ts
CHANGED
|
@@ -38,6 +38,6 @@ export type GridProps = {
|
|
|
38
38
|
* @see {@link https://designsystem.amsterdam/?path=/docs/components-layout-grid--docs Grid docs at Amsterdam Design System}
|
|
39
39
|
*/
|
|
40
40
|
export declare const Grid: import("react").ForwardRefExoticComponent<GridProps & import("react").RefAttributes<any>> & {
|
|
41
|
-
Cell: import("react").ForwardRefExoticComponent<import("./GridCell").GridCellProps & import("react").RefAttributes<
|
|
41
|
+
Cell: import("react").ForwardRefExoticComponent<import("./GridCell").GridCellProps & import("react").RefAttributes<any>>;
|
|
42
42
|
};
|
|
43
43
|
export {};
|
package/dist/Grid/GridCell.d.ts
CHANGED
|
@@ -21,5 +21,5 @@ export type GridCellProps = {
|
|
|
21
21
|
/** The HTML tag to use. */
|
|
22
22
|
as?: GridCellTag;
|
|
23
23
|
} & PropsWithChildren<HTMLAttributes<HTMLElement>> & (GridCellSpanAllProp | GridCellSpanAndStartProps);
|
|
24
|
-
export declare const GridCell: import("react").ForwardRefExoticComponent<GridCellProps & import("react").RefAttributes<
|
|
24
|
+
export declare const GridCell: import("react").ForwardRefExoticComponent<GridCellProps & import("react").RefAttributes<any>>;
|
|
25
25
|
export {};
|
package/dist/Logo/Logo.d.ts
CHANGED
|
@@ -2,13 +2,18 @@
|
|
|
2
2
|
* @license EUPL-1.2+
|
|
3
3
|
* Copyright Gemeente Amsterdam
|
|
4
4
|
*/
|
|
5
|
-
import type {
|
|
6
|
-
export
|
|
5
|
+
import type { ComponentType, SVGProps } from 'react';
|
|
6
|
+
export declare const logoBrands: readonly ["amsterdam", "ggd-amsterdam", "museum-weesp", "stadsarchief", "stadsbank-van-lening", "vga-verzekeringen"];
|
|
7
|
+
export type LogoBrand = (typeof logoBrands)[number];
|
|
7
8
|
export type LogoProps = {
|
|
8
|
-
/** The name of the brand for which to display the logo. */
|
|
9
|
-
brand?: LogoBrand;
|
|
9
|
+
/** The name of the brand for which to display the logo, or configuration for a custom logo. */
|
|
10
|
+
brand?: LogoBrand | LogoBrandConfig;
|
|
10
11
|
} & SVGProps<SVGSVGElement>;
|
|
12
|
+
export type LogoBrandConfig = {
|
|
13
|
+
label: string;
|
|
14
|
+
svg: ComponentType<SVGProps<SVGSVGElement>>;
|
|
15
|
+
};
|
|
11
16
|
/**
|
|
12
17
|
* @see {@link https://designsystem.amsterdam/?path=/docs/components-media-logo--docs Logo docs at Amsterdam Design System}
|
|
13
18
|
*/
|
|
14
|
-
export declare const Logo: ForwardRefExoticComponent<Omit<LogoProps, "ref"> & RefAttributes<SVGSVGElement>>;
|
|
19
|
+
export declare const Logo: import("react").ForwardRefExoticComponent<Omit<LogoProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
package/dist/Logo/Logo.js
CHANGED
|
@@ -2,38 +2,46 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { clsx } from 'clsx';
|
|
3
3
|
import { forwardRef } from 'react';
|
|
4
4
|
import { LogoAmsterdam, LogoGgdAmsterdam, LogoMuseumWeesp, LogoStadsarchief, LogoStadsbankVanLening, LogoVgaVerzekeringen, } from './brand';
|
|
5
|
+
export const logoBrands = [
|
|
6
|
+
'amsterdam',
|
|
7
|
+
'ggd-amsterdam',
|
|
8
|
+
'museum-weesp',
|
|
9
|
+
'stadsarchief',
|
|
10
|
+
'stadsbank-van-lening',
|
|
11
|
+
'vga-verzekeringen',
|
|
12
|
+
];
|
|
5
13
|
const logoConfig = {
|
|
6
14
|
amsterdam: {
|
|
7
15
|
label: 'Gemeente Amsterdam logo',
|
|
8
|
-
|
|
16
|
+
svg: LogoAmsterdam,
|
|
9
17
|
},
|
|
10
18
|
'ggd-amsterdam': {
|
|
11
19
|
label: 'GGD Amsterdam logo',
|
|
12
|
-
|
|
20
|
+
svg: LogoGgdAmsterdam,
|
|
13
21
|
},
|
|
14
22
|
'museum-weesp': {
|
|
15
23
|
label: 'Gemeente Amsterdam Museum Weesp logo',
|
|
16
|
-
|
|
24
|
+
svg: LogoMuseumWeesp,
|
|
17
25
|
},
|
|
18
26
|
stadsarchief: {
|
|
19
27
|
label: 'Gemeente Amsterdam Stadsarchief logo',
|
|
20
|
-
|
|
28
|
+
svg: LogoStadsarchief,
|
|
21
29
|
},
|
|
22
30
|
'stadsbank-van-lening': {
|
|
23
31
|
label: 'Gemeente Amsterdam Stadsbank van Lening logo',
|
|
24
|
-
|
|
32
|
+
svg: LogoStadsbankVanLening,
|
|
25
33
|
},
|
|
26
34
|
'vga-verzekeringen': {
|
|
27
35
|
label: 'Gemeente Amsterdam VGA Verzekeringen logo',
|
|
28
|
-
|
|
36
|
+
svg: LogoVgaVerzekeringen,
|
|
29
37
|
},
|
|
30
38
|
};
|
|
31
39
|
/**
|
|
32
40
|
* @see {@link https://designsystem.amsterdam/?path=/docs/components-media-logo--docs Logo docs at Amsterdam Design System}
|
|
33
41
|
*/
|
|
34
42
|
export const Logo = forwardRef(({ 'aria-label': ariaLabel, brand = 'amsterdam', className, ...restProps }, ref) => {
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
return (_jsx(LogoComponent, { ...restProps, "aria-label": ariaLabel ||
|
|
43
|
+
const config = typeof brand === 'string' ? logoConfig[brand] : brand;
|
|
44
|
+
const { label, svg: LogoComponent } = config;
|
|
45
|
+
return (_jsx(LogoComponent, { ...restProps, "aria-label": ariaLabel || label, className: clsx('ams-logo', className), ref: ref }));
|
|
38
46
|
});
|
|
39
47
|
Logo.displayName = 'Logo';
|
|
@@ -10,7 +10,10 @@ export type PageFooterProps = PropsWithChildren<HTMLAttributes<HTMLElement>>;
|
|
|
10
10
|
export declare const PageFooter: import("react").ForwardRefExoticComponent<HTMLAttributes<HTMLElement> & {
|
|
11
11
|
children?: import("react").ReactNode | undefined;
|
|
12
12
|
} & import("react").RefAttributes<HTMLElement>> & {
|
|
13
|
-
Menu: import("react").ForwardRefExoticComponent<
|
|
13
|
+
Menu: import("react").ForwardRefExoticComponent<{
|
|
14
|
+
heading?: string;
|
|
15
|
+
headingLevel?: import("..").HeadingProps["level"];
|
|
16
|
+
} & HTMLAttributes<HTMLUListElement> & {
|
|
14
17
|
children?: import("react").ReactNode | undefined;
|
|
15
18
|
} & import("react").RefAttributes<HTMLUListElement>>;
|
|
16
19
|
MenuLink: import("react").ForwardRefExoticComponent<import("react").AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
@@ -3,7 +3,32 @@
|
|
|
3
3
|
* Copyright Gemeente Amsterdam
|
|
4
4
|
*/
|
|
5
5
|
import type { HTMLAttributes, PropsWithChildren } from 'react';
|
|
6
|
-
|
|
7
|
-
export
|
|
6
|
+
import type { HeadingProps } from '../Heading';
|
|
7
|
+
export type PageFooterMenuProps = {
|
|
8
|
+
/**
|
|
9
|
+
* Describes the menu for users of assistive technology.
|
|
10
|
+
* The heading gets visually hidden – sighted users can infer the meaning of the menu from its appearance.
|
|
11
|
+
* @default Over deze website
|
|
12
|
+
*/
|
|
13
|
+
heading?: string;
|
|
14
|
+
/**
|
|
15
|
+
* The hierarchical level of the Footer Menu’s Heading within the document.
|
|
16
|
+
* The default value is 2. This will almost always be correct – but verify this yourself.
|
|
17
|
+
*/
|
|
18
|
+
headingLevel?: HeadingProps['level'];
|
|
19
|
+
} & PropsWithChildren<HTMLAttributes<HTMLUListElement>>;
|
|
20
|
+
export declare const PageFooterMenu: import("react").ForwardRefExoticComponent<{
|
|
21
|
+
/**
|
|
22
|
+
* Describes the menu for users of assistive technology.
|
|
23
|
+
* The heading gets visually hidden – sighted users can infer the meaning of the menu from its appearance.
|
|
24
|
+
* @default Over deze website
|
|
25
|
+
*/
|
|
26
|
+
heading?: string;
|
|
27
|
+
/**
|
|
28
|
+
* The hierarchical level of the Footer Menu’s Heading within the document.
|
|
29
|
+
* The default value is 2. This will almost always be correct – but verify this yourself.
|
|
30
|
+
*/
|
|
31
|
+
headingLevel?: HeadingProps["level"];
|
|
32
|
+
} & HTMLAttributes<HTMLUListElement> & {
|
|
8
33
|
children?: import("react").ReactNode | undefined;
|
|
9
34
|
} & import("react").RefAttributes<HTMLUListElement>>;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { clsx } from 'clsx';
|
|
3
3
|
import { forwardRef } from 'react';
|
|
4
|
-
|
|
4
|
+
import { getHeadingTag } from '../Heading/getHeadingTag';
|
|
5
|
+
export const PageFooterMenu = forwardRef(({ children, className, heading = 'Over deze website', headingLevel = 2, ...restProps }, ref) => {
|
|
6
|
+
const HeadingTag = getHeadingTag(headingLevel);
|
|
7
|
+
return (_jsxs(_Fragment, { children: [_jsx(HeadingTag, { className: "ams-visually-hidden", children: heading }), _jsx("ul", { ...restProps, className: clsx('ams-page-footer__menu', className), ref: ref, children: children })] }));
|
|
8
|
+
});
|
|
5
9
|
PageFooterMenu.displayName = 'PageFooter.Menu';
|
|
@@ -4,21 +4,26 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { AnchorHTMLAttributes, ComponentType, HTMLAttributes, ReactNode } from 'react';
|
|
6
6
|
import type { LogoBrand } from '../Logo';
|
|
7
|
+
import type { LogoBrandConfig } from '../Logo/Logo';
|
|
7
8
|
export type PageHeaderProps = {
|
|
8
9
|
/** The name of the application. */
|
|
9
10
|
brandName?: string;
|
|
10
11
|
/** The accessible name of the logo. */
|
|
11
12
|
logoAccessibleName?: string;
|
|
12
13
|
/** The name of the brand for which to display the logo. */
|
|
13
|
-
logoBrand?: LogoBrand;
|
|
14
|
+
logoBrand?: LogoBrand | LogoBrandConfig;
|
|
14
15
|
/** The url for the link on the logo. */
|
|
15
16
|
logoLink?: string;
|
|
16
17
|
/** The React component to use for the logo link. */
|
|
17
18
|
logoLinkComponent?: ComponentType<AnchorHTMLAttributes<HTMLAnchorElement>>;
|
|
18
19
|
/** The accessible text for the link on the logo. */
|
|
19
20
|
logoLinkTitle?: string;
|
|
20
|
-
/** The text for the menu button. */
|
|
21
|
+
/** The visible text for the menu button. */
|
|
21
22
|
menuButtonText?: string;
|
|
23
|
+
/** The text for screen readers when the button hides the menu. */
|
|
24
|
+
menuButtonTextForHide?: string;
|
|
25
|
+
/** The text for screen readers when the button shows the menu. */
|
|
26
|
+
menuButtonTextForShow?: string;
|
|
22
27
|
/** A slot for the menu items. Use PageHeader.MenuLink here. */
|
|
23
28
|
menuItems?: ReactNode;
|
|
24
29
|
/** The accessible label for the navigation section. */
|
|
@@ -35,15 +40,19 @@ export declare const PageHeader: import("react").ForwardRefExoticComponent<{
|
|
|
35
40
|
/** The accessible name of the logo. */
|
|
36
41
|
logoAccessibleName?: string;
|
|
37
42
|
/** The name of the brand for which to display the logo. */
|
|
38
|
-
logoBrand?: LogoBrand;
|
|
43
|
+
logoBrand?: LogoBrand | LogoBrandConfig;
|
|
39
44
|
/** The url for the link on the logo. */
|
|
40
45
|
logoLink?: string;
|
|
41
46
|
/** The React component to use for the logo link. */
|
|
42
47
|
logoLinkComponent?: ComponentType<AnchorHTMLAttributes<HTMLAnchorElement>>;
|
|
43
48
|
/** The accessible text for the link on the logo. */
|
|
44
49
|
logoLinkTitle?: string;
|
|
45
|
-
/** The text for the menu button. */
|
|
50
|
+
/** The visible text for the menu button. */
|
|
46
51
|
menuButtonText?: string;
|
|
52
|
+
/** The text for screen readers when the button hides the menu. */
|
|
53
|
+
menuButtonTextForHide?: string;
|
|
54
|
+
/** The text for screen readers when the button shows the menu. */
|
|
55
|
+
menuButtonTextForShow?: string;
|
|
47
56
|
/** A slot for the menu items. Use PageHeader.MenuLink here. */
|
|
48
57
|
menuItems?: ReactNode;
|
|
49
58
|
/** The accessible label for the navigation section. */
|
|
@@ -8,7 +8,7 @@ import { PageHeaderGridCellNarrowWindowOnly } from './PageHeaderGridCellNarrowWi
|
|
|
8
8
|
import { PageHeaderMenuIcon } from './PageHeaderMenuIcon';
|
|
9
9
|
import { PageHeaderMenuLink } from './PageHeaderMenuLink';
|
|
10
10
|
const LogoLinkContent = ({ brandName, logoAccessibleName, logoBrand, }) => (_jsxs(_Fragment, { children: [_jsx("span", { className: clsx(logoBrand === 'amsterdam' && Boolean(brandName) && 'ams-page-header__logo-container'), children: _jsx(Logo, { "aria-label": logoAccessibleName, brand: logoBrand }) }), brandName && (_jsx("span", { "aria-hidden": "true", className: "ams-page-header__brand-name", children: brandName }))] }));
|
|
11
|
-
const PageHeaderRoot = forwardRef(({ brandName, children, className, logoAccessibleName, logoBrand = 'amsterdam', logoLink = '/', logoLinkComponent = (props) => _jsx("a", { ...props }), logoLinkTitle = `Ga naar de homepage${brandName ? ` van ${brandName}` : ''}`, menuButtonText = 'Menu', menuItems, navigationLabel = 'Hoofdnavigatie', noMenuButtonOnWideWindow, ...restProps }, ref) => {
|
|
11
|
+
const PageHeaderRoot = forwardRef(({ brandName, children, className, logoAccessibleName, logoBrand = 'amsterdam', logoLink = '/', logoLinkComponent = (props) => _jsx("a", { ...props }), logoLinkTitle = `Ga naar de homepage${brandName ? ` van ${brandName}` : ''}`, menuButtonText = 'Menu', menuButtonTextForHide = 'Verberg navigatiemenu', menuButtonTextForShow = 'Laat navigatiemenu zien', menuItems, navigationLabel = 'Hoofdnavigatie', noMenuButtonOnWideWindow, ...restProps }, ref) => {
|
|
12
12
|
const [open, setOpen] = useState(false);
|
|
13
13
|
const Link = logoLinkComponent;
|
|
14
14
|
const hasMegaMenu = Boolean(children);
|
|
@@ -19,7 +19,8 @@ const PageHeaderRoot = forwardRef(({ brandName, children, className, logoAccessi
|
|
|
19
19
|
setOpen(false);
|
|
20
20
|
}
|
|
21
21
|
}, [isWideWindow]);
|
|
22
|
-
return (_jsxs("header", { ...restProps, className: clsx('ams-page-header', className), ref: ref, children: [_jsxs(Link, { className: "ams-page-header__logo-link", href: logoLink, children: [_jsx(LogoLinkContent, { brandName: brandName, logoAccessibleName: logoAccessibleName, logoBrand: logoBrand }), _jsx("span", { className: "ams-visually-hidden", children: ` ${logoLinkTitle}` })] }), (hasMegaMenu || menuItems) && (_jsxs("nav", { "aria-labelledby": "primary-navigation", className: "ams-page-header__navigation", children: [_jsx("h2", { "aria-hidden": true, className: "ams-visually-hidden", id: "primary-navigation", children: navigationLabel }), _jsx("div", { "aria-hidden": true, className: "ams-page-header__logo-link ams-page-header__logo-link--hidden", hidden: true, children: _jsx(LogoLinkContent, { brandName: brandName, logoBrand: logoBrand }) }), _jsxs("ul", { className: "ams-page-header__menu", children: [menuItems, hasMegaMenu && (_jsx("li", { className: clsx(
|
|
22
|
+
return (_jsxs("header", { ...restProps, className: clsx('ams-page-header', className), ref: ref, children: [_jsxs(Link, { className: "ams-page-header__logo-link", href: logoLink, children: [_jsx(LogoLinkContent, { brandName: brandName, logoAccessibleName: logoAccessibleName, logoBrand: logoBrand }), _jsx("span", { className: "ams-visually-hidden", children: ` ${logoLinkTitle}` })] }), (hasMegaMenu || menuItems) && (_jsxs("nav", { "aria-labelledby": "primary-navigation", className: "ams-page-header__navigation", children: [_jsx("h2", { "aria-hidden": true, className: "ams-visually-hidden", id: "primary-navigation", children: navigationLabel }), _jsx("div", { "aria-hidden": true, className: "ams-page-header__logo-link ams-page-header__logo-link--hidden", hidden: true, children: _jsx(LogoLinkContent, { brandName: brandName, logoBrand: logoBrand }) }), _jsxs("ul", { className: "ams-page-header__menu", children: [menuItems, hasMegaMenu && (_jsx("li", { className: clsx('ams-page-header__mega-menu-button-item', noMenuButtonOnWideWindow && 'ams-page-header__mega-menu-button-item--hide-on-wide-window'), hidden // Hide the list item containing the menu button until its CSS loads. If it doesn't load, the menu will always be visible.
|
|
23
|
+
: true, children: _jsxs("button", { "aria-controls": "ams-page-header-mega-menu", "aria-expanded": open, className: "ams-page-header__mega-menu-button", onClick: () => setOpen(!open), type: "button", children: [_jsx("span", { "aria-hidden": "true", className: "ams-page-header__mega-menu-button-label", children: menuButtonText }), _jsx("span", { className: "ams-visually-hidden", children: open ? menuButtonTextForHide : menuButtonTextForShow }), _jsx("span", { "aria-hidden": "true", className: "ams-page-header__mega-menu-button-hidden-label", children: menuButtonText }), _jsx(Icon, { svg: _jsx(PageHeaderMenuIcon, { className: clsx('ams-page-header__menu-icon', open && 'ams-page-header__menu-icon--open') }) })] }) }))] }), hasMegaMenu && (_jsx("div", { className: clsx('ams-page-header__mega-menu', !open && 'ams-page-header__mega-menu--closed'), id: "ams-page-header-mega-menu", children: children }))] }))] }));
|
|
23
24
|
});
|
|
24
25
|
PageHeaderRoot.displayName = 'PageHeader';
|
|
25
26
|
/**
|
|
@@ -2,5 +2,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { clsx } from 'clsx';
|
|
3
3
|
import { forwardRef } from 'react';
|
|
4
4
|
import { Grid } from '../Grid';
|
|
5
|
-
export const PageHeaderGridCellNarrowWindowOnly = forwardRef(({ children, className, ...restProps }, ref) => (_jsx(Grid.Cell, { ...restProps, className: clsx('ams-page-header__grid-cell-narrow-window-only', className),
|
|
5
|
+
export const PageHeaderGridCellNarrowWindowOnly = forwardRef(({ children, className, ...restProps }, ref) => (_jsx(Grid.Cell, { ...restProps, className: clsx('ams-page-header__grid-cell-narrow-window-only', className), hidden // Hide until its CSS loads; this cell duplicates the non-fixed links in the Page Header Menu.
|
|
6
|
+
: true, ref: ref, children: children })));
|
|
6
7
|
PageHeaderGridCellNarrowWindowOnly.displayName = 'PageHeader.GridCellNarrowWindowOnly';
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright (c) 2021 Robbert Broersma
|
|
4
4
|
* Copyright Gemeente Amsterdam
|
|
5
5
|
*/
|
|
6
|
-
import type { HTMLAttributes, PropsWithChildren } from 'react';
|
|
6
|
+
import type { HTMLAttributes, PropsWithChildren, ReactNode } from 'react';
|
|
7
7
|
export type ParagraphProps = {
|
|
8
8
|
/** Changes the text colour for readability on a dark background. */
|
|
9
9
|
color?: 'inverse';
|
|
@@ -19,5 +19,5 @@ export declare const Paragraph: import("react").ForwardRefExoticComponent<{
|
|
|
19
19
|
/** The size of the text. */
|
|
20
20
|
size?: "small" | "large";
|
|
21
21
|
} & HTMLAttributes<HTMLParagraphElement> & {
|
|
22
|
-
children?:
|
|
22
|
+
children?: ReactNode | undefined;
|
|
23
23
|
} & import("react").RefAttributes<HTMLParagraphElement>>;
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { clsx } from 'clsx';
|
|
3
3
|
import { forwardRef } from 'react';
|
|
4
|
+
const wrapChildren = (size, children) => {
|
|
5
|
+
if (size === 'large')
|
|
6
|
+
return _jsx("b", { className: "ams-paragraph__b", children: children });
|
|
7
|
+
if (size === 'small')
|
|
8
|
+
return _jsx("small", { className: "ams-paragraph__small", children: children });
|
|
9
|
+
return children;
|
|
10
|
+
};
|
|
4
11
|
/**
|
|
5
12
|
* @see {@link https://designsystem.amsterdam/?path=/docs/components-text-paragraph--docs Paragraph docs at Amsterdam Design System}
|
|
6
13
|
*/
|
|
7
|
-
export const Paragraph = forwardRef(({ children, className, color, size, ...restProps }, ref) => (_jsx("p", { className: clsx('ams-paragraph', color && `ams-paragraph--${color}`, size && `ams-paragraph--${size}`, className), ref: ref, ...restProps, children: children })));
|
|
14
|
+
export const Paragraph = forwardRef(({ children, className, color, size, ...restProps }, ref) => (_jsx("p", { className: clsx('ams-paragraph', color && `ams-paragraph--${color}`, size && `ams-paragraph--${size}`, className), ref: ref, ...restProps, children: wrapChildren(size, children) })));
|
|
8
15
|
Paragraph.displayName = 'Paragraph';
|
package/dist/Row/Row.d.ts
CHANGED
|
@@ -66,5 +66,5 @@ export declare const Row: import("react").ForwardRefExoticComponent<{
|
|
|
66
66
|
wrap?: boolean;
|
|
67
67
|
} & HTMLAttributes<HTMLElement> & {
|
|
68
68
|
children?: import("react").ReactNode | undefined;
|
|
69
|
-
} & import("react").RefAttributes<
|
|
69
|
+
} & import("react").RefAttributes<any>>;
|
|
70
70
|
export {};
|
|
@@ -23,5 +23,5 @@ export declare const Spotlight: import("react").ForwardRefExoticComponent<{
|
|
|
23
23
|
color?: SpotlightColor;
|
|
24
24
|
} & HTMLAttributes<HTMLElement> & {
|
|
25
25
|
children?: import("react").ReactNode | undefined;
|
|
26
|
-
} & import("react").RefAttributes<
|
|
26
|
+
} & import("react").RefAttributes<any>>;
|
|
27
27
|
export {};
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* Copyright Gemeente Amsterdam
|
|
4
4
|
*/
|
|
5
5
|
export declare const BREAKPOINTS: {
|
|
6
|
-
medium:
|
|
7
|
-
wide:
|
|
6
|
+
readonly medium: "37.5rem";
|
|
7
|
+
readonly wide: "72.5rem";
|
|
8
8
|
};
|
|
9
|
-
type
|
|
10
|
-
declare const useIsAfterBreakpoint: (breakpoint:
|
|
9
|
+
type Breakpoint = keyof typeof BREAKPOINTS;
|
|
10
|
+
declare const useIsAfterBreakpoint: (breakpoint: Breakpoint) => boolean;
|
|
11
11
|
export default useIsAfterBreakpoint;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @license EUPL-1.2+
|
|
3
3
|
* Copyright Gemeente Amsterdam
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { useEffect, useState } from 'react';
|
|
6
6
|
// TODO: we should set the breakpoint in JS somewhere and render this and the sass variables from that
|
|
7
7
|
export const BREAKPOINTS = {
|
|
8
8
|
medium: '37.5rem',
|
|
@@ -10,19 +10,18 @@ export const BREAKPOINTS = {
|
|
|
10
10
|
};
|
|
11
11
|
const useIsAfterBreakpoint = (breakpoint) => {
|
|
12
12
|
const [matches, setMatches] = useState(false);
|
|
13
|
-
|
|
13
|
+
useEffect(() => {
|
|
14
14
|
// Check for window object to avoid SSR issues
|
|
15
|
-
if (
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}, [matches, breakpoint]);
|
|
15
|
+
if (typeof window === 'undefined')
|
|
16
|
+
return undefined;
|
|
17
|
+
const query = `(min-width: ${BREAKPOINTS[breakpoint]})`;
|
|
18
|
+
const media = window.matchMedia(query);
|
|
19
|
+
const listener = () => setMatches(media.matches);
|
|
20
|
+
// Set initial state
|
|
21
|
+
setMatches(media.matches);
|
|
22
|
+
media.addEventListener('change', listener);
|
|
23
|
+
return () => media.removeEventListener('change', listener);
|
|
24
|
+
}, [breakpoint]);
|
|
26
25
|
return matches;
|
|
27
26
|
};
|
|
28
27
|
export default useIsAfterBreakpoint;
|
package/dist/index.cjs.js
CHANGED
|
@@ -661,6 +661,17 @@ CardHeading.displayName = 'Card.Heading';
|
|
|
661
661
|
var _excluded$1l = ["children", "className", "color", "size"];
|
|
662
662
|
function ownKeys$1u(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
663
663
|
function _objectSpread$1u(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1u(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1u(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
664
|
+
var wrapChildren = function wrapChildren(size, children) {
|
|
665
|
+
if (size === 'large') return jsxRuntime.jsx("b", {
|
|
666
|
+
className: "ams-paragraph__b",
|
|
667
|
+
children: children
|
|
668
|
+
});
|
|
669
|
+
if (size === 'small') return jsxRuntime.jsx("small", {
|
|
670
|
+
className: "ams-paragraph__small",
|
|
671
|
+
children: children
|
|
672
|
+
});
|
|
673
|
+
return children;
|
|
674
|
+
};
|
|
664
675
|
/**
|
|
665
676
|
* @see {@link https://designsystem.amsterdam/?path=/docs/components-text-paragraph--docs Paragraph docs at Amsterdam Design System}
|
|
666
677
|
*/
|
|
@@ -674,7 +685,7 @@ var Paragraph = /*#__PURE__*/react.forwardRef(function (_ref, ref) {
|
|
|
674
685
|
className: clsx.clsx('ams-paragraph', color && "ams-paragraph--".concat(color), size && "ams-paragraph--".concat(size), className),
|
|
675
686
|
ref: ref
|
|
676
687
|
}, restProps), {}, {
|
|
677
|
-
children: children
|
|
688
|
+
children: wrapChildren(size, children)
|
|
678
689
|
}));
|
|
679
690
|
});
|
|
680
691
|
Paragraph.displayName = 'Paragraph';
|
|
@@ -2107,27 +2118,27 @@ function _objectSpread$O(e) { for (var r = 1; r < arguments.length; r++) { var t
|
|
|
2107
2118
|
var logoConfig = {
|
|
2108
2119
|
amsterdam: {
|
|
2109
2120
|
label: 'Gemeente Amsterdam logo',
|
|
2110
|
-
|
|
2121
|
+
svg: LogoAmsterdam
|
|
2111
2122
|
},
|
|
2112
2123
|
'ggd-amsterdam': {
|
|
2113
2124
|
label: 'GGD Amsterdam logo',
|
|
2114
|
-
|
|
2125
|
+
svg: LogoGgdAmsterdam
|
|
2115
2126
|
},
|
|
2116
2127
|
'museum-weesp': {
|
|
2117
2128
|
label: 'Gemeente Amsterdam Museum Weesp logo',
|
|
2118
|
-
|
|
2129
|
+
svg: LogoMuseumWeesp
|
|
2119
2130
|
},
|
|
2120
2131
|
stadsarchief: {
|
|
2121
2132
|
label: 'Gemeente Amsterdam Stadsarchief logo',
|
|
2122
|
-
|
|
2133
|
+
svg: LogoStadsarchief
|
|
2123
2134
|
},
|
|
2124
2135
|
'stadsbank-van-lening': {
|
|
2125
2136
|
label: 'Gemeente Amsterdam Stadsbank van Lening logo',
|
|
2126
|
-
|
|
2137
|
+
svg: LogoStadsbankVanLening
|
|
2127
2138
|
},
|
|
2128
2139
|
'vga-verzekeringen': {
|
|
2129
2140
|
label: 'Gemeente Amsterdam VGA Verzekeringen logo',
|
|
2130
|
-
|
|
2141
|
+
svg: LogoVgaVerzekeringen
|
|
2131
2142
|
}
|
|
2132
2143
|
};
|
|
2133
2144
|
/**
|
|
@@ -2139,10 +2150,11 @@ var Logo = /*#__PURE__*/react.forwardRef(function (_ref, ref) {
|
|
|
2139
2150
|
brand = _ref$brand === void 0 ? 'amsterdam' : _ref$brand,
|
|
2140
2151
|
className = _ref.className,
|
|
2141
2152
|
restProps = _objectWithoutProperties(_ref, _excluded$M);
|
|
2142
|
-
var
|
|
2143
|
-
var
|
|
2153
|
+
var config = typeof brand === 'string' ? logoConfig[brand] : brand;
|
|
2154
|
+
var label = config.label,
|
|
2155
|
+
LogoComponent = config.svg;
|
|
2144
2156
|
return jsxRuntime.jsx(LogoComponent, _objectSpread$O(_objectSpread$O({}, restProps), {}, {
|
|
2145
|
-
"aria-label": ariaLabel ||
|
|
2157
|
+
"aria-label": ariaLabel || label,
|
|
2146
2158
|
className: clsx.clsx('ams-logo', className),
|
|
2147
2159
|
ref: ref
|
|
2148
2160
|
}));
|
|
@@ -2303,18 +2315,28 @@ var Page = /*#__PURE__*/react.forwardRef(function (_ref, ref) {
|
|
|
2303
2315
|
});
|
|
2304
2316
|
Page.displayName = 'Page';
|
|
2305
2317
|
|
|
2306
|
-
var _excluded$E = ["children", "className"];
|
|
2318
|
+
var _excluded$E = ["children", "className", "heading", "headingLevel"];
|
|
2307
2319
|
function ownKeys$G(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
2308
2320
|
function _objectSpread$G(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$G(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$G(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
2309
2321
|
var PageFooterMenu = /*#__PURE__*/react.forwardRef(function (_ref, ref) {
|
|
2310
2322
|
var children = _ref.children,
|
|
2311
2323
|
className = _ref.className,
|
|
2324
|
+
_ref$heading = _ref.heading,
|
|
2325
|
+
heading = _ref$heading === void 0 ? 'Over deze website' : _ref$heading,
|
|
2326
|
+
_ref$headingLevel = _ref.headingLevel,
|
|
2327
|
+
headingLevel = _ref$headingLevel === void 0 ? 2 : _ref$headingLevel,
|
|
2312
2328
|
restProps = _objectWithoutProperties(_ref, _excluded$E);
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2329
|
+
var HeadingTag = getHeadingTag(headingLevel);
|
|
2330
|
+
return jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
2331
|
+
children: [jsxRuntime.jsx(HeadingTag, {
|
|
2332
|
+
className: "ams-visually-hidden",
|
|
2333
|
+
children: heading
|
|
2334
|
+
}), jsxRuntime.jsx("ul", _objectSpread$G(_objectSpread$G({}, restProps), {}, {
|
|
2335
|
+
className: clsx.clsx('ams-page-footer__menu', className),
|
|
2336
|
+
ref: ref,
|
|
2337
|
+
children: children
|
|
2338
|
+
}))]
|
|
2339
|
+
});
|
|
2318
2340
|
});
|
|
2319
2341
|
PageFooterMenu.displayName = 'PageFooter.Menu';
|
|
2320
2342
|
|
|
@@ -2384,23 +2406,21 @@ var useIsAfterBreakpoint = function useIsAfterBreakpoint(breakpoint) {
|
|
|
2384
2406
|
_useState2 = _slicedToArray(_useState, 2),
|
|
2385
2407
|
matches = _useState2[0],
|
|
2386
2408
|
setMatches = _useState2[1];
|
|
2387
|
-
react.
|
|
2409
|
+
react.useEffect(function () {
|
|
2388
2410
|
// Check for window object to avoid SSR issues
|
|
2389
|
-
if (typeof window
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
return undefined;
|
|
2403
|
-
}, [matches, breakpoint]);
|
|
2411
|
+
if (typeof window === 'undefined') return undefined;
|
|
2412
|
+
var query = "(min-width: ".concat(BREAKPOINTS[breakpoint], ")");
|
|
2413
|
+
var media = window.matchMedia(query);
|
|
2414
|
+
var listener = function listener() {
|
|
2415
|
+
return setMatches(media.matches);
|
|
2416
|
+
};
|
|
2417
|
+
// Set initial state
|
|
2418
|
+
setMatches(media.matches);
|
|
2419
|
+
media.addEventListener('change', listener);
|
|
2420
|
+
return function () {
|
|
2421
|
+
return media.removeEventListener('change', listener);
|
|
2422
|
+
};
|
|
2423
|
+
}, [breakpoint]);
|
|
2404
2424
|
return matches;
|
|
2405
2425
|
};
|
|
2406
2426
|
|
|
@@ -2413,6 +2433,8 @@ var PageHeaderGridCellNarrowWindowOnly = /*#__PURE__*/react.forwardRef(function
|
|
|
2413
2433
|
restProps = _objectWithoutProperties(_ref, _excluded$A);
|
|
2414
2434
|
return jsxRuntime.jsx(Grid.Cell, _objectSpread$C(_objectSpread$C({}, restProps), {}, {
|
|
2415
2435
|
className: clsx.clsx('ams-page-header__grid-cell-narrow-window-only', className),
|
|
2436
|
+
hidden // Hide until its CSS loads; this cell duplicates the non-fixed links in the Page Header Menu.
|
|
2437
|
+
: true,
|
|
2416
2438
|
ref: ref,
|
|
2417
2439
|
children: children
|
|
2418
2440
|
}));
|
|
@@ -2463,7 +2485,7 @@ var PageHeaderMenuLink = /*#__PURE__*/react.forwardRef(function (_ref, ref) {
|
|
|
2463
2485
|
});
|
|
2464
2486
|
PageHeaderMenuLink.displayName = 'PageHeader.MenuLink';
|
|
2465
2487
|
|
|
2466
|
-
var _excluded$y = ["brandName", "children", "className", "logoAccessibleName", "logoBrand", "logoLink", "logoLinkComponent", "logoLinkTitle", "menuButtonText", "menuItems", "navigationLabel", "noMenuButtonOnWideWindow"];
|
|
2488
|
+
var _excluded$y = ["brandName", "children", "className", "logoAccessibleName", "logoBrand", "logoLink", "logoLinkComponent", "logoLinkTitle", "menuButtonText", "menuButtonTextForHide", "menuButtonTextForShow", "menuItems", "navigationLabel", "noMenuButtonOnWideWindow"];
|
|
2467
2489
|
function ownKeys$z(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
2468
2490
|
function _objectSpread$z(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$z(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$z(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
2469
2491
|
var LogoLinkContent = function LogoLinkContent(_ref) {
|
|
@@ -2501,6 +2523,10 @@ var PageHeaderRoot = /*#__PURE__*/react.forwardRef(function (_ref2, ref) {
|
|
|
2501
2523
|
logoLinkTitle = _ref2$logoLinkTitle === void 0 ? "Ga naar de homepage".concat(brandName ? " van ".concat(brandName) : '') : _ref2$logoLinkTitle,
|
|
2502
2524
|
_ref2$menuButtonText = _ref2.menuButtonText,
|
|
2503
2525
|
menuButtonText = _ref2$menuButtonText === void 0 ? 'Menu' : _ref2$menuButtonText,
|
|
2526
|
+
_ref2$menuButtonTextF = _ref2.menuButtonTextForHide,
|
|
2527
|
+
menuButtonTextForHide = _ref2$menuButtonTextF === void 0 ? 'Verberg navigatiemenu' : _ref2$menuButtonTextF,
|
|
2528
|
+
_ref2$menuButtonTextF2 = _ref2.menuButtonTextForShow,
|
|
2529
|
+
menuButtonTextForShow = _ref2$menuButtonTextF2 === void 0 ? 'Laat navigatiemenu zien' : _ref2$menuButtonTextF2,
|
|
2504
2530
|
menuItems = _ref2.menuItems,
|
|
2505
2531
|
_ref2$navigationLabel = _ref2.navigationLabel,
|
|
2506
2532
|
navigationLabel = _ref2$navigationLabel === void 0 ? 'Hoofdnavigatie' : _ref2$navigationLabel,
|
|
@@ -2552,7 +2578,9 @@ var PageHeaderRoot = /*#__PURE__*/react.forwardRef(function (_ref2, ref) {
|
|
|
2552
2578
|
}), jsxRuntime.jsxs("ul", {
|
|
2553
2579
|
className: "ams-page-header__menu",
|
|
2554
2580
|
children: [menuItems, hasMegaMenu && jsxRuntime.jsx("li", {
|
|
2555
|
-
className: clsx.clsx(noMenuButtonOnWideWindow && 'ams-page-header__mega-menu-button-item--hide-on-wide-window'),
|
|
2581
|
+
className: clsx.clsx('ams-page-header__mega-menu-button-item', noMenuButtonOnWideWindow && 'ams-page-header__mega-menu-button-item--hide-on-wide-window'),
|
|
2582
|
+
hidden // Hide the list item containing the menu button until its CSS loads. If it doesn't load, the menu will always be visible.
|
|
2583
|
+
: true,
|
|
2556
2584
|
children: jsxRuntime.jsxs("button", {
|
|
2557
2585
|
"aria-controls": "ams-page-header-mega-menu",
|
|
2558
2586
|
"aria-expanded": open,
|
|
@@ -2562,8 +2590,12 @@ var PageHeaderRoot = /*#__PURE__*/react.forwardRef(function (_ref2, ref) {
|
|
|
2562
2590
|
},
|
|
2563
2591
|
type: "button",
|
|
2564
2592
|
children: [jsxRuntime.jsx("span", {
|
|
2593
|
+
"aria-hidden": "true",
|
|
2565
2594
|
className: "ams-page-header__mega-menu-button-label",
|
|
2566
2595
|
children: menuButtonText
|
|
2596
|
+
}), jsxRuntime.jsx("span", {
|
|
2597
|
+
className: "ams-visually-hidden",
|
|
2598
|
+
children: open ? menuButtonTextForHide : menuButtonTextForShow
|
|
2567
2599
|
}), jsxRuntime.jsx("span", {
|
|
2568
2600
|
"aria-hidden": "true",
|
|
2569
2601
|
className: "ams-page-header__mega-menu-button-hidden-label",
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|