@uva-glass/component-library 3.45.7 → 3.46.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.
@@ -0,0 +1 @@
1
+ ._copyable-text-container_1uv3h_1{cursor:pointer;display:flex;position:relative;width:fit-content}._copyable-text-copy-button_1uv3h_8{align-items:center;background-color:var(--new-color-grey-300);border:none;border-radius:.25rem;display:flex;font-family:inherit;font-size:inherit;font-weight:inherit;gap:.25rem;inset:calc(-.25rem + 1px) auto auto -.5rem;justify-content:center;padding:.25rem .5rem;position:absolute;transition:opacity .15s ease;white-space:nowrap;z-index:10}._copyable-text-container_1uv3h_1:focus-within{outline:none}._copyable-text-copy-visually-hidden_1uv3h_31{border-width:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}
@@ -0,0 +1,11 @@
1
+ export interface CopyableTextProps {
2
+ /** The text to be copied */
3
+ text: string;
4
+ /** Additional class name to style the text so it suits the design */
5
+ additionalClassName?: string;
6
+ /** ARIA label for the copy button */
7
+ ariaLabelCopy?: string;
8
+ /** ARIA label for the copied state */
9
+ ariaLabelHasBeenCopied?: string;
10
+ }
11
+ export declare const CopyableText: ({ text, additionalClassName, ariaLabelCopy, ariaLabelHasBeenCopied, }: CopyableTextProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,63 @@
1
+ import { jsxs as i, jsx as y } from "react/jsx-runtime";
2
+ import { c as b } from "../../clsx-OuTLNxxd.js";
3
+ import { useState as f, useRef as m, useEffect as h } from "react";
4
+ import { Icon as v } from "../Icon/Icon.js";
5
+ import '../../assets/CopyableText.css';const a = {
6
+ "copyable-text-container": "_copyable-text-container_1uv3h_1",
7
+ "copyable-text-copy-button": "_copyable-text-copy-button_1uv3h_8",
8
+ "copyable-text-copy-visually-hidden": "_copyable-text-copy-visually-hidden_1uv3h_31"
9
+ }, C = 2e3, T = ({
10
+ text: o,
11
+ additionalClassName: r = "",
12
+ ariaLabelCopy: s,
13
+ ariaLabelHasBeenCopied: u
14
+ }) => {
15
+ const [t, n] = f(!1), c = m(null), x = m(null), [d, e] = f(!1);
16
+ h(() => () => {
17
+ c.current && clearTimeout(c.current);
18
+ }, []);
19
+ const p = () => {
20
+ n(!0), c.current = setTimeout(() => {
21
+ n(!1), e(!1);
22
+ }, C), navigator.clipboard.writeText(o).catch(() => n(!1));
23
+ };
24
+ return /* @__PURE__ */ i(
25
+ "span",
26
+ {
27
+ className: b(a["copyable-text-container"], r),
28
+ role: "button",
29
+ tabIndex: 0,
30
+ onFocus: () => e(!0),
31
+ onBlur: () => !t && e(!1),
32
+ onKeyDown: (l) => {
33
+ e(!0), (l.key === "Enter" || l.key === " ") && (l.preventDefault(), p());
34
+ },
35
+ onMouseEnter: () => e(!0),
36
+ onMouseLeave: () => !t && e(!1),
37
+ children: [
38
+ o,
39
+ d && /* @__PURE__ */ i(
40
+ "button",
41
+ {
42
+ ref: x,
43
+ className: b(a["copyable-text-copy-button"], r),
44
+ onClick: p,
45
+ type: "button",
46
+ "aria-keyshortcuts": "Enter Space",
47
+ "aria-label": t ? u ?? "Copied" : s ?? "Copy to clipboard",
48
+ tabIndex: -1,
49
+ children: [
50
+ o,
51
+ /* @__PURE__ */ y(v, { name: t ? "CheckSmall" : "Copy", size: 20 }),
52
+ /* @__PURE__ */ y("span", { className: a["copyable-text-copy-visually-hidden"], "aria-live": "polite", children: t ? u ?? "Copied" : s ?? "Copy to clipboard" })
53
+ ]
54
+ }
55
+ )
56
+ ]
57
+ }
58
+ );
59
+ };
60
+ export {
61
+ T as CopyableText
62
+ };
63
+ //# sourceMappingURL=CopyableText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyableText.js","sources":["../../../src/components/CopyableText/CopyableText.tsx"],"sourcesContent":["import { clsx } from 'clsx';\r\nimport { useState, useRef, useEffect } from 'react';\r\n\r\nimport styles from './CopyableText.module.css';\r\n\r\nimport { Icon } from 'components/Icon';\r\n\r\nexport interface CopyableTextProps {\r\n /** The text to be copied */\r\n text: string;\r\n /** Additional class name to style the text so it suits the design */\r\n additionalClassName?: string;\r\n /** ARIA label for the copy button */\r\n ariaLabelCopy?: string;\r\n /** ARIA label for the copied state */\r\n ariaLabelHasBeenCopied?: string;\r\n}\r\n\r\nconst COPYTIME = 2000;\r\n\r\nexport const CopyableText = ({\r\n text,\r\n additionalClassName = '',\r\n ariaLabelCopy,\r\n ariaLabelHasBeenCopied,\r\n}: CopyableTextProps) => {\r\n const [isCopying, setIsCopying] = useState(false);\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const buttonRef = useRef<HTMLButtonElement | null>(null);\r\n const [buttonActive, setButtonActive] = useState(false);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\r\n };\r\n }, []);\r\n\r\n const handleCopy = () => {\r\n setIsCopying(true);\r\n timeoutRef.current = setTimeout(() => {\r\n setIsCopying(false);\r\n setButtonActive(false);\r\n }, COPYTIME);\r\n navigator.clipboard.writeText(text).catch(() => setIsCopying(false));\r\n };\r\n\r\n return (\r\n <span\r\n className={clsx(styles['copyable-text-container'], additionalClassName)}\r\n role=\"button\"\r\n tabIndex={0}\r\n onFocus={() => setButtonActive(true)}\r\n onBlur={() => !isCopying && setButtonActive(false)}\r\n onKeyDown={(event) => {\r\n setButtonActive(true);\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n handleCopy();\r\n }\r\n }}\r\n onMouseEnter={() => setButtonActive(true)}\r\n onMouseLeave={() => !isCopying && setButtonActive(false)}\r\n >\r\n {text}\r\n {buttonActive && (\r\n <button\r\n ref={buttonRef}\r\n className={clsx(styles['copyable-text-copy-button'], additionalClassName)}\r\n onClick={handleCopy}\r\n type=\"button\"\r\n aria-keyshortcuts=\"Enter Space\"\r\n aria-label={isCopying ? (ariaLabelHasBeenCopied ?? 'Copied') : (ariaLabelCopy ?? 'Copy to clipboard')}\r\n tabIndex={-1}\r\n >\r\n {text}\r\n <Icon name={isCopying ? 'CheckSmall' : 'Copy'} size={20} />\r\n <span className={styles['copyable-text-copy-visually-hidden']} aria-live=\"polite\">\r\n {isCopying ? (ariaLabelHasBeenCopied ?? 'Copied') : (ariaLabelCopy ?? 'Copy to clipboard')}\r\n </span>\r\n </button>\r\n )}\r\n </span>\r\n );\r\n};\r\n"],"names":["COPYTIME","CopyableText","text","additionalClassName","ariaLabelCopy","ariaLabelHasBeenCopied","isCopying","setIsCopying","useState","timeoutRef","useRef","buttonRef","buttonActive","setButtonActive","useEffect","handleCopy","jsxs","clsx","styles","event","Icon","jsx"],"mappings":";;;;;;;;GAkBMA,IAAW,KAEJC,IAAe,CAAC;AAAA,EAC3B,MAAAC;AAAA,EACA,qBAAAC,IAAsB;AAAA,EACtB,eAAAC;AAAA,EACA,wBAAAC;AACF,MAAyB;AACvB,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1CC,IAAaC,EAA6C,IAAI,GAC9DC,IAAYD,EAAiC,IAAI,GACjD,CAACE,GAAcC,CAAe,IAAIL,EAAS,EAAK;AAEtD,EAAAM,EAAU,MACD,MAAM;AACX,IAAIL,EAAW,WAAS,aAAaA,EAAW,OAAO;AAAA,EACzD,GACC,CAAA,CAAE;AAEL,QAAMM,IAAa,MAAM;AACvB,IAAAR,EAAa,EAAI,GACjBE,EAAW,UAAU,WAAW,MAAM;AACpC,MAAAF,EAAa,EAAK,GAClBM,EAAgB,EAAK;AAAA,IACvB,GAAGb,CAAQ,GACX,UAAU,UAAU,UAAUE,CAAI,EAAE,MAAM,MAAMK,EAAa,EAAK,CAAC;AAAA,EACrE;AAEA,SACE,gBAAAS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAKC,EAAO,yBAAyB,GAAGf,CAAmB;AAAA,MACtE,MAAK;AAAA,MACL,UAAU;AAAA,MACV,SAAS,MAAMU,EAAgB,EAAI;AAAA,MACnC,QAAQ,MAAM,CAACP,KAAaO,EAAgB,EAAK;AAAA,MACjD,WAAW,CAACM,MAAU;AACpB,QAAAN,EAAgB,EAAI,IAChBM,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SACzCA,EAAM,eAAA,GACNJ,EAAA;AAAA,MAEJ;AAAA,MACA,cAAc,MAAMF,EAAgB,EAAI;AAAA,MACxC,cAAc,MAAM,CAACP,KAAaO,EAAgB,EAAK;AAAA,MAEtD,UAAA;AAAA,QAAAX;AAAA,QACAU,KACC,gBAAAI;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKL;AAAA,YACL,WAAWM,EAAKC,EAAO,2BAA2B,GAAGf,CAAmB;AAAA,YACxE,SAASY;AAAA,YACT,MAAK;AAAA,YACL,qBAAkB;AAAA,YAClB,cAAYT,IAAaD,KAA0B,WAAaD,KAAiB;AAAA,YACjF,UAAU;AAAA,YAET,UAAA;AAAA,cAAAF;AAAA,gCACAkB,GAAA,EAAK,MAAMd,IAAY,eAAe,QAAQ,MAAM,IAAI;AAAA,cACzD,gBAAAe,EAAC,QAAA,EAAK,WAAWH,EAAO,oCAAoC,GAAG,aAAU,UACtE,UAAAZ,IAAaD,KAA0B,WAAaD,KAAiB,oBAAA,CACxE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAIR;"}
@@ -0,0 +1,5 @@
1
+ import { Meta } from '@storybook/react';
2
+ import { CopyableTextProps } from './CopyableText';
3
+ declare const _default: Meta<CopyableTextProps>;
4
+ export default _default;
5
+ export declare const CopyableTextExample: import('storybook/internal/csf').AnnotatedStoryFn<import('@storybook/react').ReactRenderer, CopyableTextProps>;
@@ -0,0 +1,36 @@
1
+ import { jsxs as n, jsx as e } from "react/jsx-runtime";
2
+ import { CopyableText as a } from "./CopyableText.js";
3
+ const s = "<CopyableText text={string} additionalClassName={string} ariaLabelCopy={string} ariaLabelHasBeenCopied={string} />", t = document.createElement("style");
4
+ t.type = "text/css";
5
+ t.innerHTML = ".customClass { font-weight: bold; color: #333; }";
6
+ document.head.appendChild(t);
7
+ const p = {
8
+ title: "Atoms/CopyableText",
9
+ component: a,
10
+ argTypes: {
11
+ additionalClassName: {
12
+ table: {
13
+ disable: !0
14
+ }
15
+ }
16
+ },
17
+ parameters: {
18
+ inspectComponent: a,
19
+ codeString: s
20
+ }
21
+ }, i = (o) => /* @__PURE__ */ n("div", { style: { padding: "1rem", backgroundColor: "#FFF", display: "flex", gap: "1rem", alignItems: "center" }, children: [
22
+ /* @__PURE__ */ e(a, { ...o }),
23
+ /* @__PURE__ */ e("span", { children: "EC" }),
24
+ /* @__PURE__ */ e("span", { children: "Tutoring and Study Guidance Advanced Professional Programme in Conservation and Restoration" })
25
+ ] }), r = i.bind({});
26
+ r.args = {
27
+ text: "3154CAR1VY",
28
+ additionalClassName: "customClass",
29
+ ariaLabelCopy: "Copy to clipboard",
30
+ ariaLabelHasBeenCopied: "Copied to clipboard"
31
+ };
32
+ export {
33
+ r as CopyableTextExample,
34
+ p as default
35
+ };
36
+ //# sourceMappingURL=CopyableText.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyableText.stories.js","sources":["../../../src/components/CopyableText/CopyableText.stories.tsx"],"sourcesContent":["import type { Meta, StoryFn } from '@storybook/react';\r\nimport type { CopyableTextProps } from './CopyableText';\r\n\r\nimport { CopyableText } from './CopyableText';\r\n\r\nconst codeString =\r\n '<CopyableText text={string} additionalClassName={string} ariaLabelCopy={string} ariaLabelHasBeenCopied={string} />';\r\n\r\n// Adding custom styles for the story\r\nconst customStyle = document.createElement('style');\r\ncustomStyle.type = 'text/css';\r\ncustomStyle.innerHTML = '.customClass { font-weight: bold; color: #333; }';\r\ndocument.head.appendChild(customStyle);\r\n\r\n// eslint-disable-next-line import/no-default-export\r\nexport default {\r\n title: 'Atoms/CopyableText',\r\n component: CopyableText,\r\n argTypes: {\r\n additionalClassName: {\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n },\r\n parameters: {\r\n inspectComponent: CopyableText,\r\n codeString,\r\n },\r\n} as Meta<CopyableTextProps>;\r\n\r\nconst Template: StoryFn<CopyableTextProps> = (args) => {\r\n return (\r\n <div style={{ padding: '1rem', backgroundColor: '#FFF', display: 'flex', gap: '1rem', alignItems: 'center' }}>\r\n <CopyableText {...args} />\r\n <span>EC</span>\r\n <span>Tutoring and Study Guidance Advanced Professional Programme in Conservation and Restoration</span>\r\n </div>\r\n );\r\n};\r\n\r\nexport const CopyableTextExample = Template.bind({});\r\nCopyableTextExample.args = {\r\n text: '3154CAR1VY',\r\n additionalClassName: 'customClass',\r\n ariaLabelCopy: 'Copy to clipboard',\r\n ariaLabelHasBeenCopied: 'Copied to clipboard',\r\n};\r\n"],"names":["codeString","customStyle","CopyableText_stories","CopyableText","Template","args","jsxs","jsx","CopyableTextExample"],"mappings":";;AAKA,MAAMA,IACJ,sHAGIC,IAAc,SAAS,cAAc,OAAO;AAClDA,EAAY,OAAO;AACnBA,EAAY,YAAY;AACxB,SAAS,KAAK,YAAYA,CAAW;AAGrC,MAAAC,IAAe;AAAA,EACb,OAAO;AAAA,EACP,WAAWC;AAAA,EACX,UAAU;AAAA,IACR,qBAAqB;AAAA,MACnB,OAAO;AAAA,QACL,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,EACF;AAAA,EAEF,YAAY;AAAA,IACV,kBAAkBA;AAAA,IAClB,YAAAH;AAAA,EAAA;AAEJ,GAEMI,IAAuC,CAACC,MAE1C,gBAAAC,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,iBAAiB,QAAQ,SAAS,QAAQ,KAAK,QAAQ,YAAY,YAChG,UAAA;AAAA,EAAA,gBAAAC,EAACJ,GAAA,EAAc,GAAGE,GAAM;AAAA,EACxB,gBAAAE,EAAC,UAAK,UAAA,KAAA,CAAE;AAAA,EACR,gBAAAA,EAAC,UAAK,UAAA,8FAAA,CAA2F;AAAA,GACnG,GAISC,IAAsBJ,EAAS,KAAK,CAAA,CAAE;AACnDI,EAAoB,OAAO;AAAA,EACzB,MAAM;AAAA,EACN,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,wBAAwB;AAC1B;"}
@@ -0,0 +1 @@
1
+ export * from './CopyableText';
@@ -0,0 +1,5 @@
1
+ import { CopyableText as p } from "./CopyableText.js";
2
+ export {
3
+ p as CopyableText
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -263,6 +263,12 @@ export declare const Icons: {
263
263
  desc?: string;
264
264
  descId?: string;
265
265
  }>;
266
+ Copy: import('react').FunctionComponent<import('react').SVGProps<SVGSVGElement> & {
267
+ title?: string;
268
+ titleId?: string;
269
+ desc?: string;
270
+ descId?: string;
271
+ }>;
266
272
  Cross: import('react').FunctionComponent<import('react').SVGProps<SVGSVGElement> & {
267
273
  title?: string;
268
274
  titleId?: string;