@superrb/react-addons 3.0.0-0 → 3.0.0-10

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.
Files changed (64) hide show
  1. package/actions.d.ts +6 -0
  2. package/actions.d.ts.map +1 -0
  3. package/actions.js +18 -0
  4. package/components/button.d.ts +1 -1
  5. package/components/context-wrapper.d.ts.map +1 -1
  6. package/components/context-wrapper.js +1 -2
  7. package/components/cookie-banner.d.ts +16 -12
  8. package/components/cookie-banner.d.ts.map +1 -1
  9. package/components/cookie-banner.js +13 -8
  10. package/components/form/field.d.ts.map +1 -1
  11. package/components/form/field.js +3 -0
  12. package/components/form/submit-button.d.ts +1 -1
  13. package/components/form/submit-button.d.ts.map +1 -1
  14. package/components/form.d.ts +1 -1
  15. package/components/form.d.ts.map +1 -1
  16. package/components/form.js +27 -18
  17. package/components/menu-toggle.d.ts.map +1 -1
  18. package/components/menu-toggle.js +3 -3
  19. package/components/modal.js +3 -3
  20. package/components/slideshow-buttons.d.ts +9 -0
  21. package/components/slideshow-buttons.d.ts.map +1 -0
  22. package/components/slideshow-buttons.js +6 -0
  23. package/components.d.ts +2 -1
  24. package/components.d.ts.map +1 -1
  25. package/components.js +2 -1
  26. package/context/cookies-context-provider.d.ts +3 -0
  27. package/context/cookies-context-provider.d.ts.map +1 -1
  28. package/context/cookies-context-provider.js +13 -0
  29. package/context.d.ts +2 -1
  30. package/context.d.ts.map +1 -1
  31. package/context.js +2 -1
  32. package/hooks/use-async.d.ts.map +1 -1
  33. package/hooks/use-draggable-scroll.d.ts.map +1 -1
  34. package/hooks/use-event-listener.d.ts +1 -1
  35. package/hooks/use-event-listener.d.ts.map +1 -1
  36. package/hooks/use-modal.d.ts.map +1 -1
  37. package/hooks/use-modal.js +5 -8
  38. package/hooks/use-slideshow.d.ts +19 -0
  39. package/hooks/use-slideshow.d.ts.map +1 -0
  40. package/hooks/use-slideshow.js +103 -0
  41. package/hooks.d.ts +2 -1
  42. package/hooks.d.ts.map +1 -1
  43. package/hooks.js +2 -1
  44. package/index.d.ts +2 -2
  45. package/index.d.ts.map +1 -1
  46. package/index.js +2 -2
  47. package/package.json +3 -4
  48. package/store/cookies.d.ts +3 -0
  49. package/store/cookies.d.ts.map +1 -1
  50. package/store/cookies.js +8 -3
  51. package/store/modal.d.ts +11 -0
  52. package/store/modal.d.ts.map +1 -0
  53. package/store/modal.js +10 -0
  54. package/store/nav.d.ts +9 -0
  55. package/store/nav.d.ts.map +1 -0
  56. package/store/nav.js +8 -0
  57. package/store.d.ts +3 -1
  58. package/store.d.ts.map +1 -1
  59. package/store.js +3 -1
  60. package/tsconfig.tsbuildinfo +1 -1
  61. package/utils/animate.d.ts.map +1 -1
  62. package/utils.d.ts +2 -1
  63. package/utils.d.ts.map +1 -1
  64. package/utils.js +2 -1
package/actions.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare class RecaptchaError extends Error {
2
+ message: string;
3
+ }
4
+ export type RecaptchaifiedAction<T> = (data: T, token: string) => void;
5
+ export declare const recaptchaify: <T>(callback: (data: T) => void) => RecaptchaifiedAction<T>;
6
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["src/actions.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAe,SAAQ,KAAK;IACvC,OAAO,SAAkC;CAC1C;AAED,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;AAEtE,eAAO,MAAM,YAAY,gBAA0B,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,4BAcnE,CAAA"}
package/actions.js ADDED
@@ -0,0 +1,18 @@
1
+ import { GoogleReCaptcha } from '@superrb/netlify-function-helpers';
2
+ export class RecaptchaError extends Error {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.message = 'Recaptcha verification failed';
6
+ }
7
+ }
8
+ export const recaptchaify = function (callback) {
9
+ return (async (data, token) => {
10
+ try {
11
+ await GoogleReCaptcha.verify(token, process.env.RECAPTCHA_SECRET_KEY, process.env.RECAPTCHA_MINSCORE);
12
+ }
13
+ catch (error) {
14
+ throw new RecaptchaError();
15
+ }
16
+ callback(data);
17
+ });
18
+ };
@@ -6,7 +6,7 @@ type Props = (PropsWithChildren<HTMLAttributes<HTMLButtonElement | HTMLAnchorEle
6
6
  className?: string;
7
7
  href?: string;
8
8
  };
9
- declare const _default: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<Props & import("react").RefAttributes<HTMLAnchorElement | HTMLButtonElement>>>;
9
+ declare const _default: import("react").MemoExoticComponent<import("react").ForwardRefExoticComponent<Props & import("react").RefAttributes<HTMLButtonElement | HTMLAnchorElement>>>;
10
10
  export default _default;
11
11
  export type { Props as ButtonProps };
12
12
  //# sourceMappingURL=button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-wrapper.d.ts","sourceRoot":"","sources":["../src/components/context-wrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAIzC,QAAA,MAAM,cAAc,iBAAkB,kBAAkB,EAAE,CAAC,4CAQ1D,CAAA;AAED,eAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"context-wrapper.d.ts","sourceRoot":"","sources":["../src/components/context-wrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAGzC,QAAA,MAAM,cAAc,iBAAkB,kBAAkB,EAAE,CAAC,4CAM1D,CAAA;AAED,eAAe,cAAc,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { ModalContextProvider, NavContextProvider } from '../context';
3
2
  import { GoogleReCaptchaProvider } from 'react-google-recaptcha-v3';
4
- const ContextWrapper = ({ children }) => (_jsx(GoogleReCaptchaProvider, { reCaptchaKey: process.env.NEXT_PUBLIC_RECAPTCHA_KEY, children: _jsx(ModalContextProvider, { children: _jsx(NavContextProvider, { children: children }) }) }));
3
+ const ContextWrapper = ({ children }) => (_jsx(GoogleReCaptchaProvider, { reCaptchaKey: process.env.NEXT_PUBLIC_RECAPTCHA_KEY, children: children }));
5
4
  export default ContextWrapper;
@@ -1,16 +1,20 @@
1
1
  import { ReactNode } from 'react';
2
- declare const CookieBanner: ({ allowCustomisation, allowReject, title, text, formText, policyLink, policyLabel, renderAcceptButton, renderCustomiseButton, renderRejectButton, renderSubmitButton, }: {
3
- allowCustomisation?: boolean | undefined;
4
- allowReject?: boolean | undefined;
5
- title?: string | undefined;
6
- text?: string | undefined;
7
- formText?: string | undefined;
8
- policyLink?: string | undefined;
9
- policyLabel?: string | undefined;
10
- renderAcceptButton?: ((props: {}) => ReactNode) | undefined;
11
- renderCustomiseButton?: ((props: {}) => ReactNode) | undefined;
12
- renderRejectButton?: ((props: {}) => ReactNode) | undefined;
13
- renderSubmitButton?: (() => ReactNode) | undefined;
2
+ declare const CookieBanner: ({ allowCustomisation, allowReject, title, text, formText, policyLink, policyLabel, acceptLabel, acceptAllLabel, rejectLabel, customiseLabel, renderAcceptButton, renderCustomiseButton, renderRejectButton, renderSubmitButton, }: {
3
+ allowCustomisation?: boolean;
4
+ allowReject?: boolean;
5
+ title?: string;
6
+ text?: string;
7
+ formText?: string;
8
+ policyLink?: string;
9
+ policyLabel?: string;
10
+ acceptLabel?: string;
11
+ acceptAllLabel?: string;
12
+ rejectLabel?: string;
13
+ customiseLabel?: string;
14
+ renderAcceptButton?: (props: {}) => ReactNode;
15
+ renderCustomiseButton?: (props: {}) => ReactNode;
16
+ renderRejectButton?: (props: {}) => ReactNode;
17
+ renderSubmitButton?: () => ReactNode;
14
18
  }) => import("react/jsx-runtime").JSX.Element;
15
19
  export default CookieBanner;
16
20
  //# sourceMappingURL=cookie-banner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookie-banner.d.ts","sourceRoot":"","sources":["../src/components/cookie-banner.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAA;AA6B3C,QAAA,MAAM,YAAY;;;;;;;;kCAoBa,EAAE,KAAK,SAAS;qCACb,EAAE,KAAK,SAAS;kCACnB,EAAE,KAAK,SAAS;gCAClB,SAAS;6CAiJrC,CAAA;AAED,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"cookie-banner.d.ts","sourceRoot":"","sources":["../src/components/cookie-banner.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAA;AA6BtD,QAAA,MAAM,YAAY,sOAgBf;IACD,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,SAAS,CAAA;IAC7C,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,SAAS,CAAA;IAChD,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,SAAS,CAAA;IAC7C,kBAAkB,CAAC,EAAE,MAAM,SAAS,CAAA;CACrC,4CA4JA,CAAA;AAED,eAAe,YAAY,CAAA"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useState } from 'react';
3
+ import { useEffect, useState } from 'react';
4
4
  import { Button, Form } from '../components';
5
5
  import * as Yup from 'yup';
6
6
  import SubmitButton from './form/submit-button';
@@ -25,11 +25,12 @@ const content = {
25
25
  description: 'These cookies are necessary for the website to function and cannot be switched off.',
26
26
  },
27
27
  };
28
- const CookieBanner = ({ allowCustomisation = true, allowReject = false, title = content.title, text = content.text, formText = content.form_text, policyLink = content.policyLink, policyLabel = content.policyLabel, renderAcceptButton, renderCustomiseButton, renderRejectButton, renderSubmitButton, }) => {
29
- const { cookiesAccepted, setCookiesAccepted, setTrackingCookiesAccepted } = useCookieStore();
28
+ const CookieBanner = ({ allowCustomisation = true, allowReject = false, title = content.title, text = content.text, formText = content.form_text, policyLink = content.policyLink, policyLabel = content.policyLabel, acceptLabel = content.acceptLabel, acceptAllLabel = content.acceptAllLabel, rejectLabel = content.rejectLabel, customiseLabel = content.customiseLabel, renderAcceptButton, renderCustomiseButton, renderRejectButton, renderSubmitButton, }) => {
29
+ const { cookiesAccepted, setCookiesAccepted, trackingCookiesAccepted, setTrackingCookiesAccepted, popupOpen, closePopup, } = useCookieStore();
30
30
  const [animate, setAnimate] = useState(false);
31
31
  const [formOpen, setFormOpen] = useState(false);
32
32
  const [rejected, setRejected] = useState(!!session.getItem('cookies-rejected'));
33
+ const [ready, setReady] = useState(false);
33
34
  const openForm = () => {
34
35
  setFormOpen(true);
35
36
  };
@@ -38,6 +39,7 @@ const CookieBanner = ({ allowCustomisation = true, allowReject = false, title =
38
39
  session.setItem('cookies-rejected', 'true');
39
40
  };
40
41
  const accept = (necessary, tracking) => {
42
+ closePopup();
41
43
  setAnimate(true);
42
44
  setTimeout(() => {
43
45
  setCookiesAccepted(necessary);
@@ -45,16 +47,16 @@ const CookieBanner = ({ allowCustomisation = true, allowReject = false, title =
45
47
  }, 800);
46
48
  };
47
49
  const acceptAll = () => {
50
+ closePopup();
48
51
  accept(true, true);
49
52
  };
50
53
  const submit = (data) => {
54
+ closePopup();
51
55
  accept(true, !!data.tracking);
52
56
  };
53
- const acceptLabel = !allowCustomisation || formOpen
54
- ? content.acceptLabel
55
- : content.acceptAllLabel;
57
+ const trueAcceptLabel = !allowCustomisation || formOpen ? acceptLabel : acceptAllLabel;
56
58
  const schema = Yup.object().shape({
57
- tracking: Yup.boolean().required().default(true).label(`
59
+ tracking: Yup.boolean().required().default(trackingCookiesAccepted).label(`
58
60
  <strong>${content.tracking?.title}</strong>
59
61
  <p>${content.tracking?.description}</p>
60
62
  `),
@@ -67,6 +69,9 @@ const CookieBanner = ({ allowCustomisation = true, allowReject = false, title =
67
69
  `)
68
70
  .meta({ disabled: true }),
69
71
  });
70
- return (_jsx(_Fragment, { children: !rejected && !cookiesAccepted ? (_jsx("div", { className: `cookie-banner ${animate ? ' cookie-banner--hide' : ''} `, children: _jsx("div", { className: "cookie-banner__container container", children: _jsxs("div", { className: "cookie-banner__inner", children: [allowCustomisation && (_jsxs("div", { className: "cookie-banner__form", "aria-hidden": !formOpen, children: [formText && (_jsx("p", { className: "cookie-banner__form-text", children: formText })), _jsx(Form, { useRecaptcha: false, className: "cookie-banner__form", schema: schema, onSubmit: submit, renderSubmit: () => renderSubmitButton ? (renderSubmitButton()) : (_jsx(SubmitButton, { label: acceptLabel })), renderSuccessMessage: false })] })), _jsxs("div", { className: "cookie-banner__main", children: [_jsxs("div", { className: "cookie-banner__message", "aria-hidden": formOpen, children: [title && _jsx("h2", { className: "cookie-banner__title", children: title }), text && (_jsxs("p", { className: "cookie-banner__text", children: [text, " ", _jsx("a", { href: policyLink, children: policyLabel })] }))] }), _jsxs("div", { className: "cookie-banner__buttons", children: [allowReject && !allowCustomisation && !formOpen && (_jsx(_Fragment, { children: renderRejectButton ? (renderRejectButton({ onClick: reject })) : (_jsx(Button, { onClick: reject, className: "cookie-banner__reject", label: content.rejectLabel })) })), allowCustomisation && !formOpen && (_jsx(_Fragment, { children: renderCustomiseButton ? (renderCustomiseButton({ onClick: openForm })) : (_jsx(Button, { onClick: openForm, className: "cookie-banner__customise", label: content.customiseLabel })) })), !formOpen && (_jsx(_Fragment, { children: renderAcceptButton ? (renderAcceptButton({ onClick: acceptAll })) : (_jsx(Button, { onClick: acceptAll, className: "cookie-banner__accept", label: acceptLabel })) }))] })] })] }) }) })) : ('') }));
72
+ useEffect(() => {
73
+ setReady(true);
74
+ }, []);
75
+ return (_jsx(_Fragment, { children: ready && ((!rejected && !cookiesAccepted) || popupOpen) ? (_jsx("div", { className: `cookie-banner ${animate ? ' cookie-banner--hide' : ''} `, children: _jsx("div", { className: "cookie-banner__container container", children: _jsxs("div", { className: "cookie-banner__inner", children: [allowCustomisation && (_jsxs("div", { className: "cookie-banner__form", "aria-hidden": !formOpen, children: [formText && (_jsx("p", { className: "cookie-banner__form-text", children: formText })), _jsx(Form, { useRecaptcha: false, className: "cookie-banner__form", schema: schema, onSubmit: submit, renderSubmit: () => renderSubmitButton ? (renderSubmitButton()) : (_jsx(SubmitButton, { label: acceptLabel })), renderSuccessMessage: false })] })), _jsxs("div", { className: "cookie-banner__main", children: [_jsxs("div", { className: "cookie-banner__message", "aria-hidden": formOpen, children: [title && _jsx("h2", { className: "cookie-banner__title", children: title }), text && (_jsxs("p", { className: "cookie-banner__text", children: [text, " ", _jsx("a", { href: policyLink, children: policyLabel })] }))] }), _jsxs("div", { className: "cookie-banner__buttons", children: [allowCustomisation && !formOpen && (_jsx(_Fragment, { children: renderCustomiseButton ? (renderCustomiseButton({ onClick: openForm })) : (_jsx(Button, { onClick: openForm, className: "cookie-banner__customise", label: customiseLabel })) })), allowReject && !formOpen && (_jsx(_Fragment, { children: renderRejectButton ? (renderRejectButton({ onClick: reject })) : (_jsx(Button, { onClick: reject, className: "cookie-banner__reject", label: rejectLabel })) })), !formOpen && (_jsx(_Fragment, { children: renderAcceptButton ? (renderAcceptButton({ onClick: acceptAll })) : (_jsx(Button, { onClick: acceptAll, className: "cookie-banner__accept", label: trueAcceptLabel })) }))] })] })] }) }) })) : ('') }));
71
76
  };
72
77
  export default CookieBanner;
@@ -1 +1 @@
1
- {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/components/form/field.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAa,gBAAgB,EAAuB,MAAM,OAAO,CAAA;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,UAAU,KAAK;IACb,QAAQ,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;IACtB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAA;CACxC;AAED,QAAA,MAAM,SAAS,sCAAuC,KAAK,4CAuE1D,CAAA;AAED,eAAe,SAAS,CAAA"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/components/form/field.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAa,gBAAgB,EAAuB,MAAM,OAAO,CAAA;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,UAAU,KAAK;IACb,QAAQ,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;IACtB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAA;CACxC;AAED,QAAA,MAAM,SAAS,sCAAuC,KAAK,4CA0E1D,CAAA;AAED,eAAe,SAAS,CAAA"}
@@ -14,6 +14,9 @@ const FormField = ({ register, schema, id, onInput }) => {
14
14
  ...(schema?.spec?.meta?.placeholder
15
15
  ? { placeholder: schema?.spec?.meta?.placeholder }
16
16
  : {}),
17
+ ...(schema?.spec?.meta?.autocomplete
18
+ ? { autocomplete: schema?.spec?.meta?.autocomplete }
19
+ : {}),
17
20
  onInput: (event) => {
18
21
  setTouched(true);
19
22
  if (onInput) {
@@ -1,5 +1,5 @@
1
1
  declare const SubmitButton: ({ label }: {
2
- label?: string | undefined;
2
+ label?: string;
3
3
  }) => import("react/jsx-runtime").JSX.Element;
4
4
  export default SubmitButton;
5
5
  //# sourceMappingURL=submit-button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"submit-button.d.ts","sourceRoot":"","sources":["../../src/components/form/submit-button.tsx"],"names":[],"mappings":"AAEA,QAAA,MAAM,YAAY;;6CAIjB,CAAA;AAED,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"submit-button.d.ts","sourceRoot":"","sources":["../../src/components/form/submit-button.tsx"],"names":[],"mappings":"AAEA,QAAA,MAAM,YAAY,cAAe;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,4CAIlD,CAAA;AAED,eAAe,YAAY,CAAA"}
@@ -6,7 +6,7 @@ import { FieldRenderer } from './form/types';
6
6
  export interface FormProps<T extends ObjectSchema<any>> {
7
7
  schema: T;
8
8
  name?: string;
9
- action?: string | ((formData: FormData) => any);
9
+ action?: string | ((data: InferType<T>, token: string) => any);
10
10
  className?: string;
11
11
  method?: string;
12
12
  initialData?: {
@@ -1 +1 @@
1
- {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/components/form.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,SAAS,EAQV,MAAM,OAAO,CAAA;AACd,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAExD,OAAO,EAAE,UAAU,EAAW,MAAM,iBAAiB,CAAA;AAErD,OAAiB,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAS5C,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,YAAY,CAAC,GAAG,CAAC;IACpD,MAAM,EAAE,CAAC,CAAA;IACT,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAA;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE;SAAG,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,GAAG;KAAE,CAAA;IACzC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IACvC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,oBAAoB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,GAAG,KAAK,CAAA;IAClE,kBAAkB,CAAC,EAAE,CACnB,KAAK,CAAC,EAAE,UAAU,EAClB,WAAW,CAAC,EAAE,SAAS,KACpB,SAAS,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,SAAS,CAAA;IAC9B,SAAS,CAAC,EAAE;SAAG,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,aAAa;KAAE,CAAA;IACjD,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;;AA6PD,wBAA+B"}
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/components/form.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,SAAS,EAQV,MAAM,OAAO,CAAA;AACd,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAExD,OAAO,EAAE,UAAU,EAAW,MAAM,iBAAiB,CAAA;AAErD,OAAiB,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAa5C,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,YAAY,CAAC,GAAG,CAAC;IACpD,MAAM,EAAE,CAAC,CAAA;IACT,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC,CAAA;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE;SAAG,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,GAAG;KAAE,CAAA;IACzC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IACvC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,oBAAoB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,GAAG,KAAK,CAAA;IAClE,kBAAkB,CAAC,EAAE,CACnB,KAAK,CAAC,EAAE,UAAU,EAClB,WAAW,CAAC,EAAE,SAAS,KACpB,SAAS,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,SAAS,CAAA;IAC9B,SAAS,CAAC,EAAE;SAAG,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,aAAa;KAAE,CAAA;IACjD,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;;AA8QD,wBAA+B"}
@@ -10,6 +10,7 @@ import ErrorMessage from './form/error-message';
10
10
  import FormField from './form/field';
11
11
  import SubmitButton from './form/submit-button';
12
12
  import messages from './form/messages.json';
13
+ import { GoogleReCaptchaProvider, useGoogleReCaptcha, } from 'react-google-recaptcha-v3';
13
14
  const toBase64 = (file) => new Promise((resolve, reject) => {
14
15
  const reader = new FileReader();
15
16
  reader.onloadend = () => {
@@ -23,11 +24,10 @@ const toBase64 = (file) => new Promise((resolve, reject) => {
23
24
  reader.readAsDataURL(file);
24
25
  reader.onerror = reject;
25
26
  });
26
- function Form({ schema, name, action, className, initialData, onSubmit, method = 'post', onStatusChange = () => { }, renderSuccessMessage = (data) => _jsx(SuccessMessage, {}), renderErrorMessage = (error, fieldSchema) => (_jsx(ErrorMessage, { error: error, fieldSchema: fieldSchema })), renderSubmit = () => _jsx(SubmitButton, {}), renderers = {}, useRecaptcha = true, ...props }, ref) {
27
+ const FormInner = forwardRef(function FormInner({ schema, name, action, className, initialData, onSubmit, method = 'POST', onStatusChange = () => { }, renderSuccessMessage = (data) => _jsx(SuccessMessage, {}), renderErrorMessage = (error, fieldSchema) => (_jsx(ErrorMessage, { error: error, fieldSchema: fieldSchema })), renderSubmit = () => _jsx(SubmitButton, {}), renderers = {}, useRecaptcha = true, ...props }, ref) {
27
28
  const [data, setData] = useState({});
28
29
  const fieldRefs = useRef({});
29
- // const { executeRecaptcha } = useGoogleReCaptcha()
30
- let executeRecaptcha;
30
+ const { executeRecaptcha } = useGoogleReCaptcha();
31
31
  for (const name of Object.keys(schema.fields)) {
32
32
  const field = schema.fields[name];
33
33
  if (field.spec?.meta?.options?.length > 1) {
@@ -42,12 +42,15 @@ function Form({ schema, name, action, className, initialData, onSubmit, method =
42
42
  if (onSubmit) {
43
43
  return onSubmit(data);
44
44
  }
45
+ // if recaptcha is enabled generate a token and add to the data
46
+ if (useRecaptcha && executeRecaptcha) {
47
+ const token = await executeRecaptcha();
48
+ data['recaptchaToken'] = token;
49
+ }
50
+ // Intercept submissions for Next server actions
45
51
  if (typeof action === 'function') {
46
- const formData = new FormData();
47
- for (const [key, value] of Object.entries(data)) {
48
- formData.append(key, value);
49
- }
50
- return action(formData);
52
+ const { recaptchaToken, ...formData } = data;
53
+ return action(formData, recaptchaToken);
51
54
  }
52
55
  for (const [key, value] of Object.entries(data)) {
53
56
  if (value instanceof FileList) {
@@ -65,11 +68,6 @@ function Form({ schema, name, action, className, initialData, onSubmit, method =
65
68
  }
66
69
  }
67
70
  }
68
- // if recaptcha is enabled generate a token and add to the data
69
- if (useRecaptcha && executeRecaptcha) {
70
- const token = await executeRecaptcha();
71
- data['recaptchaToken'] = token;
72
- }
73
71
  const response = await fetch(action, {
74
72
  method: 'post',
75
73
  headers: {
@@ -86,7 +84,7 @@ function Form({ schema, name, action, className, initialData, onSubmit, method =
86
84
  }
87
85
  setData(responseData);
88
86
  return responseData;
89
- }, [action, onSubmit, useRecaptcha]);
87
+ }, [action, onSubmit, useRecaptcha, executeRecaptcha]);
90
88
  const { execute, status, error } = useAsync(onSubmitHandler, false, [
91
89
  onSubmitHandler,
92
90
  ]);
@@ -94,24 +92,35 @@ function Form({ schema, name, action, className, initialData, onSubmit, method =
94
92
  if (onStatusChange) {
95
93
  onStatusChange(status);
96
94
  }
97
- }, [status]);
95
+ }, [status, onStatusChange]);
98
96
  Object.keys(schema.fields).map((fieldName) => {
99
97
  const field = schema.fields[fieldName];
100
98
  if (!field?.spec?.label) {
101
99
  field.spec.label = sentenceCase(fieldName);
102
100
  }
103
101
  });
104
- console.log(status);
105
102
  return (_jsx(_Fragment, { children: status === 'success' && renderSuccessMessage !== false ? (_jsx(_Fragment, { children: renderSuccessMessage(data) })) : (_jsxs("form", { className: `form ${className}`, action: action, method: method, onSubmit: handleSubmit(execute), noValidate: true, ref: ref, ...props, children: [error && renderErrorMessage({ message: error }), Object.keys(schema.fields).map((fieldName, key) => {
106
103
  const field = schema.fields[fieldName];
107
104
  return (_jsx(Fragment, { children: field?.spec?.meta?.hidden === true ? (_jsx(FormField, { register: register(fieldName), schema: field })) : (_jsx("div", { className: `form__group form__group--${paramCase(fieldName)} ${fieldName in errors ? 'form__group--error' : ''} ${field?.type === 'boolean' ? 'form__group--checkbox' : ''}`, ref: (ref) => {
108
105
  fieldRefs.current[fieldName] = ref;
109
106
  }, children: _jsxs("label", { className: "form__label", htmlFor: `${name}__${paramCase(fieldName)}`, children: [_jsx("span", { className: "form__label-text", dangerouslySetInnerHTML: {
110
- __html: `${field?.spec?.label} ${!field?.spec?.optional ? '*' : ''}`,
107
+ __html: `${field?.spec?.label} ${!field?.spec?.optional
108
+ ? '<span class="form__required-indicator">*</span>'
109
+ : ''}`,
111
110
  } }), fieldName in renderers ? (renderers[fieldName](register(fieldName), errors[fieldName], field)) : (_jsxs(_Fragment, { children: [_jsx(FormField, { register: register(fieldName), id: `${name}__${paramCase(fieldName)}`, schema: field, onInput: (event) => {
112
111
  fieldRefs.current[fieldName]?.classList.add('form__group--filled');
113
112
  } }), fieldName in errors &&
114
113
  renderErrorMessage(errors[fieldName], field)] }))] }) })) }, key));
115
114
  }), renderSubmit(), useRecaptcha && (_jsxs("p", { className: "form__recaptcha-message", children: ["This site is protected by reCAPTCHA and the Google", ' ', _jsx("a", { href: "https://policies.google.com/privacy", target: "_blank", rel: "noopener", children: "Privacy Policy" }), ' ', "and", ' ', _jsx("a", { href: "https://policies.google.com/terms", target: "_blank", rel: "noopener", children: "Terms of Service" }), ' ', "apply."] }))] })) }));
116
- }
115
+ });
116
+ const Form = (props, ref) => {
117
+ if (props.useRecaptcha === false) {
118
+ return _jsx(FormInner, { ...props, ref: ref });
119
+ }
120
+ const key = process.env.NEXT_PUBLIC_RECAPTCHA_KEY;
121
+ if (!key) {
122
+ throw new Error('Env var NEXT_PUBLIC_RECAPTCHA_KEY is not set');
123
+ }
124
+ return (_jsx(GoogleReCaptchaProvider, { reCaptchaKey: process.env.NEXT_PUBLIC_RECAPTCHA_KEY, children: _jsx(FormInner, { ...props, ref: ref }) }));
125
+ };
117
126
  export default forwardRef(Form);
@@ -1 +1 @@
1
- {"version":3,"file":"menu-toggle.d.ts","sourceRoot":"","sources":["../src/components/menu-toggle.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EAKb,MAAM,OAAO,CAAA;AAKd,UAAU,KACR,SAAQ,iBAAiB,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAClE,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,YAAY,CAAA;CAChD;AAED,QAAA,MAAM,UAAU,0FAOb,KAAK,4CAwCP,CAAA;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"menu-toggle.d.ts","sourceRoot":"","sources":["../src/components/menu-toggle.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EAIb,MAAM,OAAO,CAAA;AAKd,UAAU,KACR,SAAQ,iBAAiB,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAClE,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,YAAY,CAAA;CAChD;AAED,QAAA,MAAM,UAAU,0FAOb,KAAK,4CAwCP,CAAA;AAED,eAAe,UAAU,CAAA"}
@@ -1,11 +1,11 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useCallback, useContext, useEffect, useState, } from 'react';
4
- import { NavContext } from '../context';
3
+ import { useCallback, useEffect, useState, } from 'react';
5
4
  import { Button } from '../components';
6
5
  import { extendClass } from '../utils';
6
+ import useNavStore from '../store/nav';
7
7
  const MenuToggle = ({ 'aria-controls': ariaControls, className = '', label = 'Open Nav', closeLabel = 'Close Nav', renderIcon = undefined, ...props }) => {
8
- const { navOpen, toggleNav } = useContext(NavContext);
8
+ const { navOpen, toggleNav } = useNavStore();
9
9
  const [icon, setIcon] = useState(navOpen ? '×' : '꠵');
10
10
  useEffect(() => {
11
11
  if (renderIcon) {
@@ -12,7 +12,7 @@ const Modal = ({ name, className, openAfter, dismissable = false, children, }) =
12
12
  if (dismissable) {
13
13
  setDismissed(local.getItem(`${name}-popup-dismissed`) === 'true');
14
14
  }
15
- }, []);
15
+ }, [dismissable, name]);
16
16
  useEffect(() => {
17
17
  clearTimeout(openTimer.current);
18
18
  if (!dismissed && openAfter) {
@@ -27,7 +27,7 @@ const Modal = ({ name, className, openAfter, dismissable = false, children, }) =
27
27
  local.setItem(`${name}-popup-dismissed`, 'true');
28
28
  setDismissed(true);
29
29
  }
30
- }, [name, closeModal]);
31
- return (_jsxs("aside", { id: name, className: `modal ${className}`, "aria-hidden": !isOpen, children: [_jsxs("button", { className: `modal__close`, onClick: close, children: [_jsx("span", { className: "screenreader-text", children: "Close Modal" }), "\u00D7"] }), _jsx("div", { className: `modal__inner`, children: children })] }));
30
+ }, [dismissable, name, closeModal]);
31
+ return (_jsxs("aside", { id: name, className: `modal ${className}`, "aria-hidden": !isOpen, children: [_jsxs("button", { className: 'modal__close', onClick: close, children: [_jsx("span", { className: "screenreader-text", children: "Close Modal" }), "\u00D7"] }), _jsx("div", { className: 'modal__inner', children: children })] }));
32
32
  };
33
33
  export default Modal;
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+ import { ButtonProps } from './button';
3
+ import { Slideshow } from '@/hooks/use-slideshow';
4
+ declare const SlideshowButtons: ({ slideshow: { currentSlide, goTo, slideshowRef, atStart, atEnd }, ButtonComponent, }: {
5
+ slideshow: Slideshow;
6
+ ButtonComponent?: FC<ButtonProps>;
7
+ }) => JSX.Element;
8
+ export default SlideshowButtons;
9
+ //# sourceMappingURL=slideshow-buttons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slideshow-buttons.d.ts","sourceRoot":"","sources":["../src/components/slideshow-buttons.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAC1B,OAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEjD,QAAA,MAAM,gBAAgB,0FAGnB;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,eAAe,CAAC,EAAE,GAAG,WAAW,CAAC,CAAA;CAClC,KAAG,WAqBH,CAAA;AAED,eAAe,gBAAgB,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import Button from './button';
3
+ const SlideshowButtons = ({ slideshow: { currentSlide, goTo, slideshowRef, atStart, atEnd }, ButtonComponent = Button, }) => {
4
+ return (_jsxs("nav", { className: "slideshow-buttons", children: [_jsx(ButtonComponent, { label: "Previous slide", onClick: () => goTo(currentSlide - 1), disabled: atStart, "aria-controls": slideshowRef.current?.getAttribute('id') }), _jsx(ButtonComponent, { label: "Next slide", onClick: () => goTo(currentSlide + 1), disabled: atEnd, "aria-controls": slideshowRef.current?.getAttribute('id') })] }));
5
+ };
6
+ export default SlideshowButtons;
package/components.d.ts CHANGED
@@ -8,5 +8,6 @@ import Form from './components/form';
8
8
  import MenuToggle from './components/menu-toggle';
9
9
  import Modal from './components/modal';
10
10
  import SkipTo from './components/skip-to';
11
- export { BackToTop, Button, CookieBanner, Form, MenuToggle, Modal, SkipTo, };
11
+ import SlideshowButtons from './components/slideshow-buttons';
12
+ export { BackToTop, Button, CookieBanner, Form, MenuToggle, Modal, SkipTo, SlideshowButtons, };
12
13
  //# sourceMappingURL=components.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["src/components.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,SAAS,MAAM,0BAA0B,CAAA;AAChD,OAAO,MAAM,MAAM,qBAAqB,CAAA;AACxC,OAAO,YAAY,MAAM,4BAA4B,CAAA;AACrD,OAAO,IAAI,MAAM,mBAAmB,CAAA;AACpC,OAAO,UAAU,MAAM,0BAA0B,CAAA;AACjD,OAAO,KAAK,MAAM,oBAAoB,CAAA;AACtC,OAAO,MAAM,MAAM,sBAAsB,CAAA;AAEzC,OAAO,EACL,SAAS,EACT,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,KAAK,EACL,MAAM,GACP,CAAA"}
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["src/components.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,SAAS,MAAM,0BAA0B,CAAA;AAChD,OAAO,MAAM,MAAM,qBAAqB,CAAA;AACxC,OAAO,YAAY,MAAM,4BAA4B,CAAA;AACrD,OAAO,IAAI,MAAM,mBAAmB,CAAA;AACpC,OAAO,UAAU,MAAM,0BAA0B,CAAA;AACjD,OAAO,KAAK,MAAM,oBAAoB,CAAA;AACtC,OAAO,MAAM,MAAM,sBAAsB,CAAA;AACzC,OAAO,gBAAgB,MAAM,gCAAgC,CAAA;AAE7D,OAAO,EACL,SAAS,EACT,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,KAAK,EACL,MAAM,EACN,gBAAgB,GACjB,CAAA"}
package/components.js CHANGED
@@ -8,4 +8,5 @@ import Form from './components/form';
8
8
  import MenuToggle from './components/menu-toggle';
9
9
  import Modal from './components/modal';
10
10
  import SkipTo from './components/skip-to';
11
- export { BackToTop, Button, CookieBanner, Form, MenuToggle, Modal, SkipTo, };
11
+ import SlideshowButtons from './components/slideshow-buttons';
12
+ export { BackToTop, Button, CookieBanner, Form, MenuToggle, Modal, SkipTo, SlideshowButtons, };
@@ -4,6 +4,9 @@ export declare const CookiesContext: import("react").Context<{
4
4
  setCookiesAccepted: (accepted: boolean) => void;
5
5
  trackingCookiesAccepted: boolean;
6
6
  setTrackingCookiesAccepted: (accepted: boolean) => void;
7
+ popupOpen: boolean;
8
+ openPopup: () => void;
9
+ closePopup: () => void;
7
10
  }>;
8
11
  export declare const CookiesContextProvider: ({ children }: PropsWithChildren<{}>) => import("react/jsx-runtime").JSX.Element;
9
12
  export default CookiesContextProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"cookies-context-provider.d.ts","sourceRoot":"","sources":["../src/context/cookies-context-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EAKlB,MAAM,OAAO,CAAA;AAGd,eAAO,MAAM,cAAc;;mCAEM,OAAO;;2CAEC,OAAO;EAC9C,CAAA;AAEF,eAAO,MAAM,sBAAsB,iBAAkB,kBAAkB,EAAE,CAAC,4CA+CzE,CAAA;AAED,eAAe,sBAAsB,CAAA"}
1
+ {"version":3,"file":"cookies-context-provider.d.ts","sourceRoot":"","sources":["../src/context/cookies-context-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EAKlB,MAAM,OAAO,CAAA;AAGd,eAAO,MAAM,cAAc;;mCAEM,OAAO;;2CAEC,OAAO;;;;EAI9C,CAAA;AAEF,eAAO,MAAM,sBAAsB,iBAAkB,kBAAkB,EAAE,CAAC,4CA2DzE,CAAA;AAED,eAAe,sBAAsB,CAAA"}
@@ -7,9 +7,13 @@ export const CookiesContext = createContext({
7
7
  setCookiesAccepted: (accepted) => { },
8
8
  trackingCookiesAccepted: false,
9
9
  setTrackingCookiesAccepted: (accepted) => { },
10
+ popupOpen: false,
11
+ openPopup: () => { },
12
+ closePopup: () => { },
10
13
  });
11
14
  export const CookiesContextProvider = ({ children }) => {
12
15
  const [cookiesAccepted, setCookiesAcceptedStorage] = useState(false);
16
+ const [popupOpen, setPopupOpenStorage] = useState(false);
13
17
  const [trackingCookiesAccepted, setTrackingCookiesAcceptedStorage] = useState(false);
14
18
  useEffect(() => {
15
19
  const accepted = Cookies.get('accepted-cookies') || false;
@@ -31,11 +35,20 @@ export const CookiesContextProvider = ({ children }) => {
31
35
  });
32
36
  setTrackingCookiesAcceptedStorage(accepted);
33
37
  }, [setTrackingCookiesAcceptedStorage]);
38
+ const openPopup = useCallback(() => {
39
+ setPopupOpenStorage(true);
40
+ }, [setPopupOpenStorage]);
41
+ const closePopup = useCallback(() => {
42
+ setPopupOpenStorage(false);
43
+ }, [setPopupOpenStorage]);
34
44
  return (_jsx(CookiesContext.Provider, { value: {
35
45
  cookiesAccepted,
36
46
  setCookiesAccepted,
37
47
  trackingCookiesAccepted,
38
48
  setTrackingCookiesAccepted,
49
+ popupOpen,
50
+ openPopup,
51
+ closePopup,
39
52
  }, children: children }));
40
53
  };
41
54
  export default CookiesContextProvider;
package/context.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Context
3
3
  */
4
+ import { CookiesContext, CookiesContextProvider } from './context/cookies-context-provider';
4
5
  import { ModalContext, ModalContextProvider } from './context/modal-context-provider';
5
6
  import { NavContext, NavContextProvider } from './context/nav-context-provider';
6
- export { ModalContext, ModalContextProvider, NavContext, NavContextProvider, };
7
+ export { CookiesContext, CookiesContextProvider, ModalContext, ModalContextProvider, NavContext, NavContextProvider, };
7
8
  //# sourceMappingURL=context.d.ts.map
package/context.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,YAAY,EACZ,oBAAoB,EACrB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAE/E,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,kBAAkB,GACnB,CAAA"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,cAAc,EACd,sBAAsB,EACvB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,YAAY,EACZ,oBAAoB,EACrB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAE/E,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,kBAAkB,GACnB,CAAA"}
package/context.js CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Context
3
3
  */
4
+ import { CookiesContext, CookiesContextProvider, } from './context/cookies-context-provider';
4
5
  import { ModalContext, ModalContextProvider, } from './context/modal-context-provider';
5
6
  import { NavContext, NavContextProvider } from './context/nav-context-provider';
6
- export { ModalContext, ModalContextProvider, NavContext, NavContextProvider, };
7
+ export { CookiesContext, CookiesContextProvider, ModalContext, ModalContextProvider, NavContext, NavContextProvider, };
@@ -1 +1 @@
1
- {"version":3,"file":"use-async.d.ts","sourceRoot":"","sources":["../src/hooks/use-async.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;AAE7D,UAAU,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM;IAChC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IACf,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;CAChB;AAGD,QAAA,MAAM,QAAQ,2CACa,GAAG,EAAE,qDAEhB,GAAG,EAAE,qBA4CpB,CAAA;AAED,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"use-async.d.ts","sourceRoot":"","sources":["../src/hooks/use-async.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;AAE7D,UAAU,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM;IAChC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IACf,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;CAChB;AAGD,QAAA,MAAM,QAAQ,iCACG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,QAAQ,CAAC,CAAC,sCAE/B,GAAG,EAAE,KAClB,WAAW,CAAC,EAAE,CAAC,CA2CjB,CAAA;AAED,eAAe,QAAQ,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-draggable-scroll.d.ts","sourceRoot":"","sources":["../src/hooks/use-draggable-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,gBAAgB,EAIjB,MAAM,OAAO,CAAA;AAId,UAAU,MAAM;IACd,WAAW,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;CAC5C;AAED,QAAA,MAAM,kBAAkB,QACjB,iBAAiB,WAAW,CAAC;eACG,MAAM;;;CA8E5C,CAAA;AAED,eAAe,kBAAkB,CAAA"}
1
+ {"version":3,"file":"use-draggable-scroll.d.ts","sourceRoot":"","sources":["../src/hooks/use-draggable-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,gBAAgB,EAIjB,MAAM,OAAO,CAAA;AAId,UAAU,MAAM;IACd,WAAW,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;CAC5C;AAED,QAAA,MAAM,kBAAkB,QACjB,iBAAiB,WAAW,CAAC,0BACV;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE;;CA8E9C,CAAA;AAED,eAAe,kBAAkB,CAAA"}
@@ -2,6 +2,6 @@ type Target = Document | Window | Element;
2
2
  type EventMap<T extends Target> = T extends Window ? WindowEventHandlersEventMap & GlobalEventHandlersEventMap : T extends Document ? DocumentEventMap : GlobalEventHandlersEventMap;
3
3
  type EventName<T extends Target> = keyof EventMap<T>;
4
4
  type EventListener<T extends Target, E extends EventName<T>> = (event: EventMap<T>[E]) => void | boolean;
5
- declare const useEventListener: <T extends Target, E extends keyof EventMap<T>>(eventName: E, handler: EventListener<T, E>, options?: boolean | AddEventListenerOptions, element?: T | undefined, flag?: boolean) => void;
5
+ declare const useEventListener: <T extends Target, E extends keyof EventMap<T>>(eventName: E, handler: EventListener<T, E>, options?: boolean | AddEventListenerOptions, element?: T, flag?: boolean) => void;
6
6
  export default useEventListener;
7
7
  //# sourceMappingURL=use-event-listener.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-event-listener.d.ts","sourceRoot":"","sources":["../src/hooks/use-event-listener.ts"],"names":[],"mappings":"AAEA,KAAK,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAEzC,KAAK,QAAQ,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,MAAM,GAC9C,2BAA2B,GAAG,2BAA2B,GACzD,CAAC,SAAS,QAAQ,GAClB,gBAAgB,GAChB,2BAA2B,CAAA;AAE/B,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAA;AAEpD,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,IAAI,CAC7D,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAClB,IAAI,GAAG,OAAO,CAAA;AAGnB,QAAA,MAAM,gBAAgB,wGAGX,OAAO,GAAG,uBAAuB,kCAEpC,OAAO,SA+Dd,CAAA;AAED,eAAe,gBAAgB,CAAA"}
1
+ {"version":3,"file":"use-event-listener.d.ts","sourceRoot":"","sources":["../src/hooks/use-event-listener.ts"],"names":[],"mappings":"AAEA,KAAK,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAEzC,KAAK,QAAQ,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,MAAM,GAC9C,2BAA2B,GAAG,2BAA2B,GACzD,CAAC,SAAS,QAAQ,GAClB,gBAAgB,GAChB,2BAA2B,CAAA;AAE/B,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAA;AAEpD,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,IAAI,CAC7D,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAClB,IAAI,GAAG,OAAO,CAAA;AAGnB,QAAA,MAAM,gBAAgB,6DACT,CAAC,WACH,cAAc,CAAC,EAAE,CAAC,CAAC,YACnB,OAAO,GAAG,uBAAuB,YAChC,CAAC,SACL,OAAO,SA+Dd,CAAA;AAED,eAAe,gBAAgB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-modal.d.ts","sourceRoot":"","sources":["../src/hooks/use-modal.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,QAAQ,SAAU,MAAM;;;;CAa7B,CAAA;AAED,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"use-modal.d.ts","sourceRoot":"","sources":["../src/hooks/use-modal.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,QAAQ,SAAU,MAAM;;;;CAU7B,CAAA;AAED,eAAe,QAAQ,CAAA"}
@@ -1,13 +1,10 @@
1
- import { useContext, useEffect, useState } from 'react';
2
- import { ModalContext } from '../context';
1
+ import useModalStore from '../store/modal';
3
2
  const useModal = (name) => {
4
- const [open, setOpen] = useState(false);
5
- const { openState, openModal, closeModal } = useContext(ModalContext);
6
- useEffect(() => {
7
- setOpen(openState[name]);
8
- }, [openState[name]]);
3
+ const isOpen = useModalStore((state) => state.openState[name]);
4
+ const openModal = useModalStore((state) => state.openModal);
5
+ const closeModal = useModalStore((state) => state.closeModal);
9
6
  return {
10
- isOpen: open,
7
+ isOpen,
11
8
  openModal: () => openModal(name),
12
9
  closeModal: () => closeModal(name),
13
10
  };
@@ -0,0 +1,19 @@
1
+ import { MutableRefObject } from 'react';
2
+ export type SlideshowElement = HTMLElement & {
3
+ previousScroll?: number;
4
+ };
5
+ export type Slideshow = {
6
+ slideshowRef: MutableRefObject<SlideshowElement>;
7
+ currentSlide: number;
8
+ slideCount: number;
9
+ goTo: (index: number) => void;
10
+ atStart: boolean;
11
+ atEnd: boolean;
12
+ };
13
+ export declare const isHorizontal: (element: SlideshowElement) => boolean;
14
+ export declare const isCentered: (element: SlideshowElement) => boolean;
15
+ export declare const getScrollProgress: (target: SlideshowElement) => number;
16
+ export declare const getCurrentSlideIndex: (element: SlideshowElement, currentIndex: number) => number;
17
+ declare const useSlideshow: (slideshow: MutableRefObject<SlideshowElement>) => Slideshow;
18
+ export default useSlideshow;
19
+ //# sourceMappingURL=use-slideshow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-slideshow.d.ts","sourceRoot":"","sources":["../src/hooks/use-slideshow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAuB,MAAM,OAAO,CAAA;AAE7D,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAA;IAChD,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,eAAO,MAAM,YAAY,YAAa,gBAAgB,KAAG,OAExD,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,gBAAgB,KAAG,OAKtD,CAAA;AAED,eAAO,MAAM,iBAAiB,WAAY,gBAAgB,WAMzD,CAAA;AAED,eAAO,MAAM,oBAAoB,YACtB,gBAAgB,gBACX,MAAM,KACnB,MAqDF,CAAA;AAED,QAAA,MAAM,YAAY,cACL,iBAAiB,gBAAgB,CAAC,KAC5C,SA4DF,CAAA;AAED,eAAe,YAAY,CAAA"}