@stack-spot/portal-components 1.0.0 → 1.1.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/CHANGELOG.md +11 -0
- package/dist/components/Breadcrumb/styled.d.ts +1 -1
- package/dist/components/Breadcrumb/styled.d.ts.map +1 -1
- package/dist/components/Breadcrumb/styled.js +1 -0
- package/dist/components/Breadcrumb/styled.js.map +1 -1
- package/dist/components/SelectionList.d.ts +8 -0
- package/dist/components/SelectionList.d.ts.map +1 -1
- package/dist/components/SelectionList.js +8 -7
- package/dist/components/SelectionList.js.map +1 -1
- package/dist/components/Tour/utils.d.ts +1 -0
- package/dist/components/Tour/utils.d.ts.map +1 -1
- package/dist/components/Tour/utils.js +8 -2
- package/dist/components/Tour/utils.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/cookie.d.ts +2 -1
- package/dist/utils/cookie.d.ts.map +1 -1
- package/dist/utils/cookie.js +7 -5
- package/dist/utils/cookie.js.map +1 -1
- package/package.json +10 -7
- package/src/components/Breadcrumb/styled.ts +2 -1
- package/src/components/SelectionList.tsx +18 -6
- package/src/components/Tour/utils.tsx +9 -2
- package/src/index.ts +1 -3
- package/src/utils/cookie.ts +8 -5
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [1.1.0](https://github.com/stack-spot/portal-commons/compare/portal-components-v1.0.1...portal-components@v1.1.0) (2024-06-05)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* Add singleton for handling user menu outside of the component ([6720095](https://github.com/stack-spot/portal-commons/commit/67200959d763eaa6f73fc2eb40b84949dd1194eb))
|
|
9
|
+
* update component and layout ([0d72e00](https://github.com/stack-spot/portal-commons/commit/0d72e00968cf3b3cbb196dec66eedc42c75aacbf))
|
|
10
|
+
* update components and layout ([b82260f](https://github.com/stack-spot/portal-commons/commit/b82260f701d7f0115d9fcda8fec4e310cbc42998))
|
|
11
|
+
* update components and layout ([c1ba398](https://github.com/stack-spot/portal-commons/commit/c1ba398fdfc51aac0b0d8b1b7d5258c6ae857e51))
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
export declare const Box:
|
|
2
|
+
export declare const Box: React.FC<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>>;
|
|
3
3
|
//# sourceMappingURL=styled.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styled.d.ts","sourceRoot":"","sources":["../../../src/components/Breadcrumb/styled.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"styled.d.ts","sourceRoot":"","sources":["../../../src/components/Breadcrumb/styled.ts"],"names":[],"mappings":";AAKA,eAAO,MAAM,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CA+BjG,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getFontAppearance } from '@citric/core/dist/utils/theme.js';
|
|
2
2
|
import { theme } from '@stack-spot/portal-theme';
|
|
3
3
|
import { styled } from 'styled-components';
|
|
4
|
+
// the type below should be inferred, but a bug in TS+PNPM prevents it: https://github.com/microsoft/TypeScript/issues/42873
|
|
4
5
|
export const Box = styled.nav `
|
|
5
6
|
margin-bottom: 24px;
|
|
6
7
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styled.js","sourceRoot":"","sources":["../../../src/components/Breadcrumb/styled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,MAAM,CAAC,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"styled.js","sourceRoot":"","sources":["../../../src/components/Breadcrumb/styled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,4HAA4H;AAC5H,MAAM,CAAC,MAAM,GAAG,GAAsF,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;cAclG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAY,EAAE,YAAY,CAAQ;;eAElE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;;;;;;;;;aAS1B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;;;eAGtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY;;;CAG5C,CAAA"}
|
|
@@ -47,6 +47,10 @@ export interface ListAction extends ItemWithIcon, Action {
|
|
|
47
47
|
* Icon to render when this option is active.
|
|
48
48
|
*/
|
|
49
49
|
iconActive?: React.ReactElement;
|
|
50
|
+
/**
|
|
51
|
+
* A class to be added to this item.
|
|
52
|
+
*/
|
|
53
|
+
className?: string;
|
|
50
54
|
}
|
|
51
55
|
interface ListGroup {
|
|
52
56
|
/**
|
|
@@ -57,6 +61,10 @@ interface ListGroup {
|
|
|
57
61
|
* The items of this group.
|
|
58
62
|
*/
|
|
59
63
|
children: ListItem[];
|
|
64
|
+
/**
|
|
65
|
+
* A class to be added to this item.
|
|
66
|
+
*/
|
|
67
|
+
className?: string;
|
|
60
68
|
}
|
|
61
69
|
interface ListSection extends ListGroup {
|
|
62
70
|
type: 'section';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionList.d.ts","sourceRoot":"","sources":["../../src/components/SelectionList.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAsB,MAAM,0BAA0B,CAAA;AAExE,OAAO,EAAE,YAAY,EAA6C,MAAM,OAAO,CAAA;AAK/E,UAAU,WAAW;IACnB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC;CAClE;AAED,UAAU,YAAY;IACpB;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAC1B;;OAEG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;CAChC;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY,EAAE,MAAM;IACtD;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectionList.d.ts","sourceRoot":"","sources":["../../src/components/SelectionList.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAsB,MAAM,0BAA0B,CAAA;AAExE,OAAO,EAAE,YAAY,EAA6C,MAAM,OAAO,CAAA;AAK/E,UAAU,WAAW;IACnB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC;CAClE;AAED,UAAU,YAAY;IACpB;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAC1B;;OAEG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;CAChC;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY,EAAE,MAAM;IACtD;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAChC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,SAAS;IACjB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;IACjC;;OAEG;IACH,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACpB;;MAEE;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,WAAY,SAAQ,SAAS;IACrC,IAAI,EAAE,SAAS,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAgB,SAAQ,SAAS,EAAE,YAAY;IACvD,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED,KAAK,QAAQ,GAAG,WAAW,GAAG,eAAe,GAAG,UAAU,CAAA;AAW1D,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA2HD;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,wFAEvB,kBAAkB,4CAsFpB,CAAA"}
|
|
@@ -64,24 +64,24 @@ const SelectionBox = styled.div `
|
|
|
64
64
|
transition: ${MAX_HEIGHT_TRANSITION};
|
|
65
65
|
}
|
|
66
66
|
`;
|
|
67
|
-
function renderAction({ label, href, onClick, icon, iconRight, active, target, iconActive = _jsx(Check, {}), }, { onClose, Link }) {
|
|
67
|
+
function renderAction({ label, href, onClick, icon, iconRight, active, target, iconActive = _jsx(Check, {}), className = '', }, { onClose, Link }) {
|
|
68
68
|
function handleClick() {
|
|
69
69
|
onClick?.();
|
|
70
70
|
onClose?.();
|
|
71
71
|
}
|
|
72
72
|
const isTextLabel = typeof label === 'string';
|
|
73
|
-
return (_jsx("li", { className: "action", children: _jsxs(Link, { href: href, onClick: handleClick, target: target, tabIndex: 0, "aria-selected": active, children: [icon && _jsx(IconBox, { children: icon }), isTextLabel ? _jsx(Text, { appearance: "body2", className: "label", children: label }) : label.element, iconRight && _jsx(IconBox, { children: iconRight }), active && _jsx(IconBox, { children: iconActive })] }) }, isTextLabel ? label : label.id));
|
|
73
|
+
return (_jsx("li", { className: "action", children: _jsxs(Link, { href: href, onClick: handleClick, target: target, tabIndex: 0, "aria-selected": active, className: className, children: [icon && _jsx(IconBox, { children: icon }), isTextLabel ? _jsx(Text, { appearance: "body2", className: "label", children: label }) : label.element, iconRight && _jsx(IconBox, { children: iconRight }), active && _jsx(IconBox, { children: iconActive })] }) }, isTextLabel ? label : label.id));
|
|
74
74
|
}
|
|
75
|
-
function renderCollapsible({ label, icon, iconRight, children }, { setCurrent, controllerId, Link }) {
|
|
75
|
+
function renderCollapsible({ label, icon, iconRight, className = '', children }, { setCurrent, controllerId, Link }) {
|
|
76
76
|
function handleClick(ev) {
|
|
77
77
|
// accessibility: this will tell the screen reader the section was expanded before this link is removed from the DOM.
|
|
78
78
|
ev.target?.setAttribute?.('aria-expanded', 'true');
|
|
79
79
|
setCurrent({ items: children, label });
|
|
80
80
|
}
|
|
81
|
-
return (_jsx("li", { className: "collapsible", children: _jsxs(Link, { onClick: handleClick, tabIndex: 0, "aria-expanded": false, "aria-controls": controllerId, children: [icon && _jsx(IconBox, { children: icon }), _jsx(Text, { appearance: "body2", className: "label", children: label }), iconRight && _jsx(IconBox, { children: iconRight }), _jsx(IconBox, { children: _jsx(ChevronRight, {}) })] }) }, label));
|
|
81
|
+
return (_jsx("li", { className: "collapsible", children: _jsxs(Link, { onClick: handleClick, tabIndex: 0, className: className, "aria-expanded": false, "aria-controls": controllerId, children: [icon && _jsx(IconBox, { children: icon }), _jsx(Text, { appearance: "body2", className: "label", children: label }), iconRight && _jsx(IconBox, { children: iconRight }), _jsx(IconBox, { children: _jsx(ChevronRight, {}) })] }) }, label));
|
|
82
82
|
}
|
|
83
|
-
function renderSection({ label, children }, options) {
|
|
84
|
-
return (_jsxs("li", { className:
|
|
83
|
+
function renderSection({ label, className = '', children }, options) {
|
|
84
|
+
return (_jsxs("li", { className: `${className} section`, children: [label && _jsx(Text, { appearance: "overheader2", colorScheme: "primary", className: "section-title", children: label }), _jsx("ul", { children: children.map(i => renderItem(i, options)) })] }, label ?? children.map(c => c.label).join('-')));
|
|
85
85
|
}
|
|
86
86
|
function renderItem(item, options) {
|
|
87
87
|
if ('children' in item) {
|
|
@@ -114,7 +114,8 @@ export const SelectionList = ({ id, items, className, style, visible = true, max
|
|
|
114
114
|
// if the element is not in the DOM anymore, we'll consider the click was inside the selection list
|
|
115
115
|
const isClickInsideSelectionList = !target?.isConnected || wrapper.current?.contains(target);
|
|
116
116
|
const isAction = target?.classList?.contains('action') || !!target?.closest('.action');
|
|
117
|
-
|
|
117
|
+
const isInsideTour = !!target?.closest('#___reactour');
|
|
118
|
+
if (!isInsideTour && (!isClickInsideSelectionList || isAction))
|
|
118
119
|
onHide?.();
|
|
119
120
|
}, []);
|
|
120
121
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionList.js","sourceRoot":"","sources":["../../src/components/SelectionList.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAa,WAAW,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AACxE,OAAO,EAAc,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAgB,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAmB,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"SelectionList.js","sourceRoot":"","sources":["../../src/components/SelectionList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ export declare const isNewTourStep: (step: ReactourStep) => boolean;
|
|
|
18
18
|
* Tutorial: verifies if the key passed as parameter refers to a React Tour step that has already finished.
|
|
19
19
|
*
|
|
20
20
|
* The key refers to a finished step if the array stored as a cookie includes it.
|
|
21
|
+
* If the cookie is set to 'disabled', then the step will be considered finished.Particularly useful in scenarios like e2e tests.
|
|
21
22
|
* @param key the step's identifier to check.
|
|
22
23
|
* @returns true if the key refers to a finished step. False otherwise.
|
|
23
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/Tour/utils.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/Tour/utils.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAYlD;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAS,MAAM,SAIzC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,SAAU,YAAY,YAA6C,CAAA;AAE7F;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,QAAS,MAAM,YAG9C,CAAA;AAED,UAAU,iBAAkB,SAAQ,YAAY;IAC9C;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,OAAO,EAAE,SAAS,CAAC;IACnB;;OAEG;IACH,gBAAgB,CAAC,EAAE,eAAe,CAAC;CACpC;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,6EAQzB,iBAAiB,KAAG,YAkBrB,CAAA"}
|
|
@@ -3,6 +3,8 @@ import { theme } from '@stack-spot/portal-theme';
|
|
|
3
3
|
import { getCookie, setCookie } from '../../utils/cookie.js';
|
|
4
4
|
import { StepContainer } from './StepContainer.js';
|
|
5
5
|
const TOUR_COOKIE = 'guided-tour-global';
|
|
6
|
+
const defaultExpires = new Date();
|
|
7
|
+
defaultExpires.setFullYear(new Date().getFullYear() + 1);
|
|
6
8
|
const getTourCookie = () => {
|
|
7
9
|
const currentTourObject = getCookie(TOUR_COOKIE);
|
|
8
10
|
return currentTourObject ? currentTourObject.split(',') : [];
|
|
@@ -15,7 +17,7 @@ export const finishTourStep = (key) => {
|
|
|
15
17
|
const finishedTours = getTourCookie();
|
|
16
18
|
if (!finishedTours.includes(key))
|
|
17
19
|
finishedTours.push(key);
|
|
18
|
-
setCookie(TOUR_COOKIE, finishedTours.toString());
|
|
20
|
+
setCookie(TOUR_COOKIE, finishedTours.toString(), { expires: defaultExpires.toUTCString() });
|
|
19
21
|
};
|
|
20
22
|
/**
|
|
21
23
|
* Tutorial: verifies if the React Tour step has not finished yet.
|
|
@@ -29,10 +31,14 @@ export const isNewTourStep = (step) => !hasFinishedTourStep(`${step.selector}`);
|
|
|
29
31
|
* Tutorial: verifies if the key passed as parameter refers to a React Tour step that has already finished.
|
|
30
32
|
*
|
|
31
33
|
* The key refers to a finished step if the array stored as a cookie includes it.
|
|
34
|
+
* If the cookie is set to 'disabled', then the step will be considered finished.Particularly useful in scenarios like e2e tests.
|
|
32
35
|
* @param key the step's identifier to check.
|
|
33
36
|
* @returns true if the key refers to a finished step. False otherwise.
|
|
34
37
|
*/
|
|
35
|
-
export const hasFinishedTourStep = (key) =>
|
|
38
|
+
export const hasFinishedTourStep = (key) => {
|
|
39
|
+
const tourCookie = getTourCookie();
|
|
40
|
+
return tourCookie.includes(key) || tourCookie[0] === 'disabled';
|
|
41
|
+
};
|
|
36
42
|
/**
|
|
37
43
|
* Tutorial: utility for building a React Tour step. This already includes some default configuration for tours in Stackspot.
|
|
38
44
|
* @param options the options for building the step: {@link StackspotTourStep}.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/components/Tour/utils.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAGhD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAyB,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAGtE,MAAM,WAAW,GAAG,oBAAoB,CAAA;AAExC,MAAM,aAAa,GAAG,GAAG,EAAE;IACzB,MAAM,iBAAiB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAA;IAChD,OAAO,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9D,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5C,MAAM,aAAa,GAAa,aAAa,EAAE,CAAA;IAC/C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACzD,SAAS,CAAC,WAAW,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/components/Tour/utils.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAGhD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAyB,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAGtE,MAAM,WAAW,GAAG,oBAAoB,CAAA;AAExC,MAAM,cAAc,GAAG,IAAI,IAAI,EAAE,CAAA;AACjC,cAAc,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAA;AAExD,MAAM,aAAa,GAAG,GAAG,EAAE;IACzB,MAAM,iBAAiB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAA;IAChD,OAAO,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9D,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5C,MAAM,aAAa,GAAa,aAAa,EAAE,CAAA;IAC/C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACzD,SAAS,CAAC,WAAW,EAAE,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;AAC7F,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAkB,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;AAE7F;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,EAAE;IACjD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;IAClC,OAAO,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAA;AACjE,CAAC,CAAA;AAqBD;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAC9B,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,OAAO,EACP,KAAK,EACL,gBAAgB,EAChB,GAAG,IAAI,EACW,EAAgB,EAAE,CAAC,CAAC;IACtC,QAAQ;IACR,OAAO,EAAE,CAAC,KAAC,aAAa,IACtB,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,QAAiC,EAC3C,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,gBAAgB,YACjC,OAAO,GACM,CAAC;IACjB,QAAQ;IACR,KAAK,EAAE;QACL,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QACzC,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,CAAC;QACV,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAiC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;QACjF,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;KACjB;IACD,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;CAChB,CAAC,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { BannerWarning } from './components/BannerWarning.js';
|
|
2
2
|
export { ChatBot } from './components/ChatBot.js';
|
|
3
3
|
export { useKeyboardControls } from './hooks/keyboard.js';
|
|
4
|
-
export { openServiceNowChat, dictionary as serviceNowDictionary, useServiceNowChatButtonVisibility, useServiceNowEffect
|
|
4
|
+
export { openServiceNowChat, dictionary as serviceNowDictionary, useServiceNowChatButtonVisibility, useServiceNowEffect } from './hooks/service-now.js';
|
|
5
5
|
export { useCheckTextOverflow } from './hooks/text.js';
|
|
6
6
|
export { titleEffect, useTitleEffect } from './hooks/title.js';
|
|
7
7
|
export { useEffectOnce } from './hooks/use-effect-once.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,UAAU,IAAI,oBAAoB,EAAE,iCAAiC,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACpJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,cAAc,uBAAuB,CAAA;AACrC,cAAc,gBAAgB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { BannerWarning } from './components/BannerWarning.js';
|
|
2
2
|
export { ChatBot } from './components/ChatBot.js';
|
|
3
3
|
export { useKeyboardControls } from './hooks/keyboard.js';
|
|
4
|
-
export { openServiceNowChat, dictionary as serviceNowDictionary, useServiceNowChatButtonVisibility, useServiceNowEffect
|
|
4
|
+
export { openServiceNowChat, dictionary as serviceNowDictionary, useServiceNowChatButtonVisibility, useServiceNowEffect } from './hooks/service-now.js';
|
|
5
5
|
export { useCheckTextOverflow } from './hooks/text.js';
|
|
6
6
|
export { titleEffect, useTitleEffect } from './hooks/title.js';
|
|
7
7
|
export { useEffectOnce } from './hooks/use-effect-once.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,UAAU,IAAI,oBAAoB,EAAE,iCAAiC,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACpJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,cAAc,uBAAuB,CAAA;AACrC,cAAc,gBAAgB,CAAA"}
|
package/dist/utils/cookie.d.ts
CHANGED
|
@@ -17,8 +17,9 @@ export declare function getCookies(): Record<string, string | undefined>;
|
|
|
17
17
|
* Sets the value of a cookie.
|
|
18
18
|
* @param key the cookie name (identifier).
|
|
19
19
|
* @param value the cookie value.
|
|
20
|
+
* @param customAttributes Accepted values: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes.
|
|
20
21
|
*/
|
|
21
|
-
export declare function setCookie(key: string, value: string): void;
|
|
22
|
+
export declare function setCookie(key: string, value: string, customAttributes?: Record<string, string>): void;
|
|
22
23
|
/**
|
|
23
24
|
* Removes a cookie.
|
|
24
25
|
* @param key the cookie name (identifier).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../../src/utils/cookie.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,QAI/C;AAED;;;GAGG;AACH,wBAAgB,eAAe,WAG9B;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAO/D;AAED
|
|
1
|
+
{"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../../src/utils/cookie.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,QAI/C;AAED;;;GAGG;AACH,wBAAgB,eAAe,WAG9B;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAO/D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,QAGlG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,QAGvC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,sBAEpC"}
|
package/dist/utils/cookie.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const DEFAULT_DOMAIN_REGEX = new RegExp(/(\.*(prd|stg|dev)*.stackspot.com)|localhost/);
|
|
2
2
|
let cookieDomain = '';
|
|
3
|
-
let cookieAttributes =
|
|
3
|
+
let cookieAttributes = {};
|
|
4
4
|
/**
|
|
5
5
|
* Setup the cookie utilities to use a another domain. By default, it's based on *.stackspot.com.
|
|
6
6
|
* @param domainRegex the regex to identify the domain. Example: {@link DEFAULT_DOMAIN_REGEX}.
|
|
@@ -8,7 +8,7 @@ let cookieAttributes = '';
|
|
|
8
8
|
export function setupCookies(domainRegex) {
|
|
9
9
|
const portalUrl = new URL(location.href);
|
|
10
10
|
cookieDomain = domainRegex.exec(portalUrl.host)?.[0] ?? '';
|
|
11
|
-
cookieAttributes =
|
|
11
|
+
cookieAttributes = { domain: cookieDomain, SameSite: 'Strict' };
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* Retrieves the current domain used for cookies. To change the domain, use `setupCookies(domainRegex)`.
|
|
@@ -36,11 +36,12 @@ export function getCookies() {
|
|
|
36
36
|
* Sets the value of a cookie.
|
|
37
37
|
* @param key the cookie name (identifier).
|
|
38
38
|
* @param value the cookie value.
|
|
39
|
+
* @param customAttributes Accepted values: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes.
|
|
39
40
|
*/
|
|
40
|
-
export function setCookie(key, value) {
|
|
41
|
+
export function setCookie(key, value, customAttributes = {}) {
|
|
41
42
|
if (!cookieAttributes)
|
|
42
43
|
setupCookies(DEFAULT_DOMAIN_REGEX);
|
|
43
|
-
document.cookie = `${key}=${value}; ${cookieAttributes}`;
|
|
44
|
+
document.cookie = `${key}=${value}; ${objectToCookieString({ ...cookieAttributes, ...customAttributes })}`;
|
|
44
45
|
}
|
|
45
46
|
/**
|
|
46
47
|
* Removes a cookie.
|
|
@@ -49,7 +50,7 @@ export function setCookie(key, value) {
|
|
|
49
50
|
export function removeCookie(key) {
|
|
50
51
|
if (!cookieAttributes)
|
|
51
52
|
setupCookies(DEFAULT_DOMAIN_REGEX);
|
|
52
|
-
document.cookie = `${key}= ; ${cookieAttributes
|
|
53
|
+
document.cookie = `${key}= ; ${objectToCookieString({ ...cookieAttributes, expires: 'Thu, 01 Jan 1970 00:00:00 GMT' })}`;
|
|
53
54
|
}
|
|
54
55
|
/**
|
|
55
56
|
* Retrieves the value of a cookie given its key/name.
|
|
@@ -59,4 +60,5 @@ export function removeCookie(key) {
|
|
|
59
60
|
export function getCookie(key) {
|
|
60
61
|
return getCookies()[key];
|
|
61
62
|
}
|
|
63
|
+
const objectToCookieString = (object) => Object.entries(object).reduce((prev, current) => `${prev} ${current[0]}=${current[1]};`, '');
|
|
62
64
|
//# sourceMappingURL=cookie.js.map
|
package/dist/utils/cookie.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../src/utils/cookie.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,IAAI,MAAM,CAAC,6CAA6C,CAAC,CAAA;AACtF,IAAI,YAAY,GAAG,EAAE,CAAA;AACrB,IAAI,gBAAgB,GAAG,EAAE,CAAA;AAEzB;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACxC,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1D,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../src/utils/cookie.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,IAAI,MAAM,CAAC,6CAA6C,CAAC,CAAA;AACtF,IAAI,YAAY,GAAG,EAAE,CAAA;AACrB,IAAI,gBAAgB,GAAG,EAAE,CAAA;AAEzB;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACxC,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1D,gBAAgB,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,gBAAgB;QAAE,YAAY,CAAC,oBAAoB,CAAC,CAAA;IACzD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,gBAAgB;QAAE,YAAY,CAAC,oBAAoB,CAAC,CAAA;IACzD,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAC5D,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9B,OAAO,MAAM,CAAA;IACf,CAAC,EAAE,EAA4B,CAAC,CAAA;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa,EAAE,mBAA2C,EAAE;IACjG,IAAI,CAAC,gBAAgB;QAAE,YAAY,CAAC,oBAAoB,CAAC,CAAA;IACzD,QAAQ,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,KAAK,oBAAoB,CAAC,EAAE,GAAG,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC,EAAE,CAAA;AAC5G,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,CAAC,gBAAgB;QAAE,YAAY,CAAC,oBAAoB,CAAC,CAAA;IACzD,QAAQ,CAAC,MAAM,GAAG,GAAG,GAAG,OAAO,oBAAoB,CAAC,EAAE,GAAG,gBAAgB,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,EAAE,CAAA;AAC1H,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,UAAU,EAAE,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAC,MAA8B,EAAU,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stack-spot/portal-components",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,6 +13,11 @@
|
|
|
13
13
|
"./svg": "./dist/svg/index.js",
|
|
14
14
|
"./anchor": "./dist/context/anchor.js"
|
|
15
15
|
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "rimraf dist && tsc && tsc-esm-fix --target='dist'",
|
|
18
|
+
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
|
19
|
+
"check-tree-shaking": "agadoo"
|
|
20
|
+
},
|
|
16
21
|
"peerDependencies": {
|
|
17
22
|
"@citric/core": "^6.0.0",
|
|
18
23
|
"@citric/icons": "^5.4.0 || ^6.0.0",
|
|
@@ -38,17 +43,15 @@
|
|
|
38
43
|
"eslint-plugin-react": "^7.33.2",
|
|
39
44
|
"eslint-plugin-react-hooks": "^4.6.0",
|
|
40
45
|
"eslint-plugin-react-refresh": "^0.4.4",
|
|
46
|
+
"rimraf": "^5.0.7",
|
|
47
|
+
"styled-components": "6.1.10",
|
|
41
48
|
"tsc-esm-fix": "^2.20.26",
|
|
42
49
|
"typescript": "^5.2.2",
|
|
43
|
-
"
|
|
50
|
+
"react": "18.2.0",
|
|
51
|
+
"react-dom": "18.2.0"
|
|
44
52
|
},
|
|
45
53
|
"dependencies": {
|
|
46
54
|
"lodash": "^4.17.21",
|
|
47
55
|
"reactour": "^1.19.3"
|
|
48
|
-
},
|
|
49
|
-
"scripts": {
|
|
50
|
-
"build": "tsc && tsc-esm-fix --target='dist'",
|
|
51
|
-
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
|
52
|
-
"check-tree-shaking": "agadoo"
|
|
53
56
|
}
|
|
54
57
|
}
|
|
@@ -2,7 +2,8 @@ import { getFontAppearance } from '@citric/core/dist/utils/theme'
|
|
|
2
2
|
import { theme } from '@stack-spot/portal-theme'
|
|
3
3
|
import { styled } from 'styled-components'
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
// the type below should be inferred, but a bug in TS+PNPM prevents it: https://github.com/microsoft/TypeScript/issues/42873
|
|
6
|
+
export const Box: React.FC<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>> = styled.nav`
|
|
6
7
|
margin-bottom: 24px;
|
|
7
8
|
|
|
8
9
|
ul {
|
|
@@ -58,6 +58,10 @@ export interface ListAction extends ItemWithIcon, Action {
|
|
|
58
58
|
* Icon to render when this option is active.
|
|
59
59
|
*/
|
|
60
60
|
iconActive?: React.ReactElement,
|
|
61
|
+
/**
|
|
62
|
+
* A class to be added to this item.
|
|
63
|
+
*/
|
|
64
|
+
className?: string,
|
|
61
65
|
}
|
|
62
66
|
|
|
63
67
|
interface ListGroup {
|
|
@@ -69,6 +73,10 @@ interface ListGroup {
|
|
|
69
73
|
* The items of this group.
|
|
70
74
|
*/
|
|
71
75
|
children: ListItem[],
|
|
76
|
+
/**
|
|
77
|
+
* A class to be added to this item.
|
|
78
|
+
*/
|
|
79
|
+
className?: string,
|
|
72
80
|
}
|
|
73
81
|
|
|
74
82
|
interface ListSection extends ListGroup {
|
|
@@ -199,6 +207,7 @@ const SelectionBox = styled.div<{ $maxHeight: string, $scroll?: boolean }>`
|
|
|
199
207
|
|
|
200
208
|
function renderAction({
|
|
201
209
|
label, href, onClick, icon, iconRight, active, target, iconActive = <Check />,
|
|
210
|
+
className='',
|
|
202
211
|
}: ListAction, { onClose, Link }: RenderOptions) {
|
|
203
212
|
function handleClick() {
|
|
204
213
|
onClick?.()
|
|
@@ -209,7 +218,8 @@ function renderAction({
|
|
|
209
218
|
|
|
210
219
|
return (
|
|
211
220
|
<li key={isTextLabel ? label : label.id} className="action">
|
|
212
|
-
<Link href={href} onClick={handleClick} target={target} tabIndex={0} aria-selected={active}
|
|
221
|
+
<Link href={href} onClick={handleClick} target={target} tabIndex={0} aria-selected={active}
|
|
222
|
+
className={className}>
|
|
213
223
|
{icon && <IconBox>{icon}</IconBox>}
|
|
214
224
|
{isTextLabel ? <Text appearance="body2" className="label">{label}</Text> : label.element}
|
|
215
225
|
{iconRight && <IconBox>{iconRight}</IconBox>}
|
|
@@ -219,7 +229,8 @@ function renderAction({
|
|
|
219
229
|
)
|
|
220
230
|
}
|
|
221
231
|
|
|
222
|
-
function renderCollapsible({ label, icon, iconRight,
|
|
232
|
+
function renderCollapsible({ label, icon, iconRight, className='', children }:
|
|
233
|
+
ListCollapsible, { setCurrent, controllerId, Link }: RenderOptions) {
|
|
223
234
|
function handleClick(ev: React.MouseEvent) {
|
|
224
235
|
// accessibility: this will tell the screen reader the section was expanded before this link is removed from the DOM.
|
|
225
236
|
(ev.target as HTMLElement)?.setAttribute?.('aria-expanded', 'true')
|
|
@@ -227,7 +238,7 @@ function renderCollapsible({ label, icon, iconRight, children }: ListCollapsible
|
|
|
227
238
|
}
|
|
228
239
|
return (
|
|
229
240
|
<li key={label} className="collapsible">
|
|
230
|
-
<Link onClick={handleClick} tabIndex={0} aria-expanded={false} aria-controls={controllerId}>
|
|
241
|
+
<Link onClick={handleClick} tabIndex={0} className={className} aria-expanded={false} aria-controls={controllerId}>
|
|
231
242
|
{icon && <IconBox>{icon}</IconBox>}
|
|
232
243
|
<Text appearance="body2" className="label">{label}</Text>
|
|
233
244
|
{iconRight && <IconBox>{iconRight}</IconBox>}
|
|
@@ -237,9 +248,9 @@ function renderCollapsible({ label, icon, iconRight, children }: ListCollapsible
|
|
|
237
248
|
)
|
|
238
249
|
}
|
|
239
250
|
|
|
240
|
-
function renderSection({ label, children }: ListSection, options: RenderOptions) {
|
|
251
|
+
function renderSection({ label, className = '', children }: ListSection, options: RenderOptions) {
|
|
241
252
|
return (
|
|
242
|
-
<li key={label ?? children.map(c => c.label).join('-')} className=
|
|
253
|
+
<li key={label ?? children.map(c => c.label).join('-')} className={`${className} section`}>
|
|
243
254
|
{label && <Text appearance="overheader2" colorScheme="primary" className="section-title">{label}</Text>}
|
|
244
255
|
<ul>{children.map(i => renderItem(i, options))}</ul>
|
|
245
256
|
</li>
|
|
@@ -290,7 +301,8 @@ export const SelectionList = ({
|
|
|
290
301
|
// if the element is not in the DOM anymore, we'll consider the click was inside the selection list
|
|
291
302
|
const isClickInsideSelectionList = !target?.isConnected || wrapper.current?.contains(target)
|
|
292
303
|
const isAction = target?.classList?.contains('action') || !!target?.closest('.action')
|
|
293
|
-
|
|
304
|
+
const isInsideTour = !!target?.closest('#___reactour')
|
|
305
|
+
if (!isInsideTour && (!isClickInsideSelectionList || isAction)) onHide?.()
|
|
294
306
|
}, [])
|
|
295
307
|
|
|
296
308
|
useEffect(() => {
|
|
@@ -7,6 +7,9 @@ import { NavigationProps } from './StepNavigation'
|
|
|
7
7
|
|
|
8
8
|
const TOUR_COOKIE = 'guided-tour-global'
|
|
9
9
|
|
|
10
|
+
const defaultExpires = new Date()
|
|
11
|
+
defaultExpires.setFullYear(new Date().getFullYear() + 1)
|
|
12
|
+
|
|
10
13
|
const getTourCookie = () => {
|
|
11
14
|
const currentTourObject = getCookie(TOUR_COOKIE)
|
|
12
15
|
return currentTourObject ? currentTourObject.split(',') : []
|
|
@@ -19,7 +22,7 @@ const getTourCookie = () => {
|
|
|
19
22
|
export const finishTourStep = (key: string) => {
|
|
20
23
|
const finishedTours: string[] = getTourCookie()
|
|
21
24
|
if (!finishedTours.includes(key)) finishedTours.push(key)
|
|
22
|
-
setCookie(TOUR_COOKIE, finishedTours.toString())
|
|
25
|
+
setCookie(TOUR_COOKIE, finishedTours.toString(), { expires: defaultExpires.toUTCString() })
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
/**
|
|
@@ -35,10 +38,14 @@ export const isNewTourStep = (step: ReactourStep) => !hasFinishedTourStep(`${ste
|
|
|
35
38
|
* Tutorial: verifies if the key passed as parameter refers to a React Tour step that has already finished.
|
|
36
39
|
*
|
|
37
40
|
* The key refers to a finished step if the array stored as a cookie includes it.
|
|
41
|
+
* If the cookie is set to 'disabled', then the step will be considered finished.Particularly useful in scenarios like e2e tests.
|
|
38
42
|
* @param key the step's identifier to check.
|
|
39
43
|
* @returns true if the key refers to a finished step. False otherwise.
|
|
40
44
|
*/
|
|
41
|
-
export const hasFinishedTourStep = (key: string) =>
|
|
45
|
+
export const hasFinishedTourStep = (key: string) => {
|
|
46
|
+
const tourCookie = getTourCookie()
|
|
47
|
+
return tourCookie.includes(key) || tourCookie[0] === 'disabled'
|
|
48
|
+
}
|
|
42
49
|
|
|
43
50
|
interface StackspotTourStep extends ReactourStep {
|
|
44
51
|
/**
|
package/src/index.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
export { BannerWarning } from './components/BannerWarning'
|
|
2
2
|
export { ChatBot } from './components/ChatBot'
|
|
3
3
|
export { useKeyboardControls } from './hooks/keyboard'
|
|
4
|
-
export {
|
|
5
|
-
openServiceNowChat, dictionary as serviceNowDictionary, useServiceNowChatButtonVisibility, useServiceNowEffect,
|
|
6
|
-
} from './hooks/service-now'
|
|
4
|
+
export { openServiceNowChat, dictionary as serviceNowDictionary, useServiceNowChatButtonVisibility, useServiceNowEffect } from './hooks/service-now'
|
|
7
5
|
export { useCheckTextOverflow } from './hooks/text'
|
|
8
6
|
export { titleEffect, useTitleEffect } from './hooks/title'
|
|
9
7
|
export { useEffectOnce } from './hooks/use-effect-once'
|
package/src/utils/cookie.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const DEFAULT_DOMAIN_REGEX = new RegExp(/(\.*(prd|stg|dev)*.stackspot.com)|localhost/)
|
|
2
2
|
let cookieDomain = ''
|
|
3
|
-
let cookieAttributes =
|
|
3
|
+
let cookieAttributes = {}
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Setup the cookie utilities to use a another domain. By default, it's based on *.stackspot.com.
|
|
@@ -9,7 +9,7 @@ let cookieAttributes = ''
|
|
|
9
9
|
export function setupCookies(domainRegex: RegExp) {
|
|
10
10
|
const portalUrl = new URL(location.href)
|
|
11
11
|
cookieDomain = domainRegex.exec(portalUrl.host)?.[0] ?? ''
|
|
12
|
-
cookieAttributes =
|
|
12
|
+
cookieAttributes = { domain: cookieDomain, SameSite: 'Strict' }
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
/**
|
|
@@ -38,10 +38,11 @@ export function getCookies(): Record<string, string | undefined> {
|
|
|
38
38
|
* Sets the value of a cookie.
|
|
39
39
|
* @param key the cookie name (identifier).
|
|
40
40
|
* @param value the cookie value.
|
|
41
|
+
* @param customAttributes Accepted values: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes.
|
|
41
42
|
*/
|
|
42
|
-
export function setCookie(key: string, value: string) {
|
|
43
|
+
export function setCookie(key: string, value: string, customAttributes: Record<string, string> = {}) {
|
|
43
44
|
if (!cookieAttributes) setupCookies(DEFAULT_DOMAIN_REGEX)
|
|
44
|
-
document.cookie = `${key}=${value}; ${cookieAttributes}`
|
|
45
|
+
document.cookie = `${key}=${value}; ${objectToCookieString({ ...cookieAttributes, ...customAttributes })}`
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
/**
|
|
@@ -50,7 +51,7 @@ export function setCookie(key: string, value: string) {
|
|
|
50
51
|
*/
|
|
51
52
|
export function removeCookie(key: string) {
|
|
52
53
|
if (!cookieAttributes) setupCookies(DEFAULT_DOMAIN_REGEX)
|
|
53
|
-
document.cookie = `${key}= ; ${cookieAttributes
|
|
54
|
+
document.cookie = `${key}= ; ${objectToCookieString({ ...cookieAttributes, expires: 'Thu, 01 Jan 1970 00:00:00 GMT' })}`
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
/**
|
|
@@ -61,3 +62,5 @@ export function removeCookie(key: string) {
|
|
|
61
62
|
export function getCookie(key: string) {
|
|
62
63
|
return getCookies()[key]
|
|
63
64
|
}
|
|
65
|
+
|
|
66
|
+
const objectToCookieString = (object: Record<string, string>): string => Object.entries(object).reduce((prev, current) => `${prev} ${current[0]}=${current[1]};`, '')
|