@elliemae/ds-breadcrumb 2.3.0-alpha.9 → 2.3.0-next.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.
Files changed (44) hide show
  1. package/cjs/DSBreadcrumb.js +102 -0
  2. package/cjs/DSBreadcrumbItem.js +98 -0
  3. package/cjs/hooks/useKeyboardNavigation.js +30 -0
  4. package/cjs/index.d.js +2 -0
  5. package/cjs/index.js +15 -0
  6. package/cjs/styles.js +68 -0
  7. package/esm/DSBreadcrumb.js +88 -0
  8. package/esm/DSBreadcrumbItem.js +87 -0
  9. package/{dist/esm → esm}/hooks/useKeyboardNavigation.js +9 -11
  10. package/esm/index.d.js +1 -0
  11. package/esm/index.js +2 -0
  12. package/esm/styles.js +57 -0
  13. package/package.json +27 -29
  14. package/{dist/types → types}/DSBreadcrumb.d.ts +0 -0
  15. package/{dist/types → types}/DSBreadcrumbItem.d.ts +0 -0
  16. package/{dist/types → types}/hooks/useKeyboardNavigation.d.ts +0 -0
  17. package/{dist/types → types}/index.d.d.ts +0 -0
  18. package/{dist/types → types}/index.d.ts +0 -0
  19. package/{dist/types → types}/styles.d.ts +0 -0
  20. package/{dist/types → types}/tests/DSBreadcrumb.test.d.ts +0 -0
  21. package/{dist/types → types}/tests/DSBreadcrumbItem.test.d.ts +0 -0
  22. package/dist/cjs/DSBreadcrumb.js +0 -86
  23. package/dist/cjs/DSBreadcrumb.js.map +0 -7
  24. package/dist/cjs/DSBreadcrumbItem.js +0 -86
  25. package/dist/cjs/DSBreadcrumbItem.js.map +0 -7
  26. package/dist/cjs/hooks/useKeyboardNavigation.js +0 -57
  27. package/dist/cjs/hooks/useKeyboardNavigation.js.map +0 -7
  28. package/dist/cjs/index.d.js +0 -27
  29. package/dist/cjs/index.d.js.map +0 -7
  30. package/dist/cjs/index.js +0 -37
  31. package/dist/cjs/index.js.map +0 -7
  32. package/dist/cjs/styles.js +0 -107
  33. package/dist/cjs/styles.js.map +0 -7
  34. package/dist/esm/DSBreadcrumb.js +0 -57
  35. package/dist/esm/DSBreadcrumb.js.map +0 -7
  36. package/dist/esm/DSBreadcrumbItem.js +0 -57
  37. package/dist/esm/DSBreadcrumbItem.js.map +0 -7
  38. package/dist/esm/hooks/useKeyboardNavigation.js.map +0 -7
  39. package/dist/esm/index.d.js +0 -2
  40. package/dist/esm/index.d.js.map +0 -7
  41. package/dist/esm/index.js +0 -8
  42. package/dist/esm/index.js.map +0 -7
  43. package/dist/esm/styles.js +0 -78
  44. package/dist/esm/styles.js.map +0 -7
@@ -0,0 +1,102 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
6
+ var _jsx = require('@babel/runtime/helpers/jsx');
7
+ var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
8
+ require('core-js/modules/web.dom-collections.iterator.js');
9
+ require('core-js/modules/esnext.async-iterator.map.js');
10
+ require('core-js/modules/esnext.iterator.map.js');
11
+ require('core-js/modules/esnext.async-iterator.filter.js');
12
+ require('core-js/modules/esnext.iterator.constructor.js');
13
+ require('core-js/modules/esnext.iterator.filter.js');
14
+ require('core-js/modules/esnext.async-iterator.for-each.js');
15
+ require('core-js/modules/esnext.iterator.for-each.js');
16
+ var React = require('react');
17
+ var reactDesc = require('react-desc');
18
+ var DSBreadcrumbItem = require('./DSBreadcrumbItem.js');
19
+ var useKeyboardNavigation = require('./hooks/useKeyboardNavigation.js');
20
+ var styles = require('./styles.js');
21
+ var jsxRuntime = require('react/jsx-runtime');
22
+
23
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
24
+
25
+ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
26
+ var _jsx__default = /*#__PURE__*/_interopDefaultLegacy(_jsx);
27
+ var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties);
28
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
29
+
30
+ const _excluded = ["containerProps", "as", "label", "isTitle", "children", "trailingSlash"];
31
+
32
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
33
+
34
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
35
+ const htmlElements = ['nav', 'div', 'header', 'footer', 'main'];
36
+
37
+ const DSBreadcrumb = _ref => {
38
+ let {
39
+ containerProps = {},
40
+ as = 'nav',
41
+ label = 'Breadcrumb',
42
+ isTitle = false,
43
+ children,
44
+ trailingSlash = true
45
+ } = _ref,
46
+ rest = _objectWithoutProperties__default["default"](_ref, _excluded);
47
+
48
+ const [addRef, onKeyDown] = useKeyboardNavigation.useKeyboardNavigation();
49
+ const safeElement = React.useMemo(() => htmlElements.indexOf(as) > -1 ? as : 'nav', [as]);
50
+ return /*#__PURE__*/jsxRuntime.jsx(styles.StyledContainer, _objectSpread(_objectSpread(_objectSpread({
51
+ "aria-label": label,
52
+ "data-testid": "breadcrumb-nav-container"
53
+ }, rest), containerProps), {}, {
54
+ as: safeElement,
55
+ children: /*#__PURE__*/_jsx__default["default"](styles.StyledList, {
56
+ "data-testid": "list-container"
57
+ }, void 0, React__default["default"].Children.map(children, (child, childIndex) => childIndex < children.length - 1 ? /*#__PURE__*/React.cloneElement(child, {
58
+ childIndex,
59
+ addRef,
60
+ onKeyDown
61
+ }) : /*#__PURE__*/React.cloneElement(child, {
62
+ childIndex,
63
+ addRef,
64
+ onKeyDown,
65
+ trailingSlash,
66
+ isTitle
67
+ })))
68
+ }));
69
+ };
70
+
71
+ DSBreadcrumb.Item = DSBreadcrumbItem.DSBreadcrumbItem;
72
+ const props = {
73
+ /** props injected to breadcrumb wrapper */
74
+ containerProps: reactDesc.PropTypes.object.description('props injected to breadcrumb wrapper'),
75
+
76
+ /**
77
+ * Type of element you want the main container to be:
78
+ * 'nav', 'div', 'header', 'footer', 'main'
79
+ */
80
+ as: reactDesc.PropTypes.string.description("Type of element you want the main container to be: 'nav', 'div', 'header', 'footer', 'main'"),
81
+
82
+ /**
83
+ * Whether to show the last element of the breadcrumb as a title
84
+ * Also removes trailing slash to show last element as title
85
+ */
86
+ isTitle: reactDesc.PropTypes.bool.description('Whether to show the last element of the breadcrumb as a title. Also removes trailing slash to show last element as title'),
87
+
88
+ /** breadcrumb label */
89
+ label: reactDesc.PropTypes.string.description('breadcrumb label'),
90
+
91
+ /**
92
+ * Container items to wrap
93
+ */
94
+ children: reactDesc.PropTypes.arrayOf(DSBreadcrumbItem.DSBreadcrumbItem).isRequired.description('Container items to wrap')
95
+ };
96
+ const DSBreadcrumbWithSchema = reactDesc.describe(DSBreadcrumb);
97
+ DSBreadcrumbWithSchema.propTypes = props;
98
+
99
+ exports.DSBreadcrumb = DSBreadcrumb;
100
+ exports.DSBreadcrumbWithSchema = DSBreadcrumbWithSchema;
101
+ exports["default"] = DSBreadcrumb;
102
+ exports.htmlElements = htmlElements;
@@ -0,0 +1,98 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ require('core-js/modules/esnext.async-iterator.filter.js');
6
+ require('core-js/modules/esnext.iterator.constructor.js');
7
+ require('core-js/modules/esnext.iterator.filter.js');
8
+ require('core-js/modules/esnext.async-iterator.for-each.js');
9
+ require('core-js/modules/esnext.iterator.for-each.js');
10
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
11
+ var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
12
+ require('react');
13
+ var reactDesc = require('react-desc');
14
+ var styles = require('./styles.js');
15
+ var jsxRuntime = require('react/jsx-runtime');
16
+
17
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
18
+
19
+ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
20
+ var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties);
21
+
22
+ const _excluded = ["active", "as", "href", "isTitle", "onClick", "label", "color", "addRef", "childIndex", "trailingSlash", "onKeyDown"];
23
+
24
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
25
+
26
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
27
+
28
+ function DSBreadcrumbItem(_ref) {
29
+ let {
30
+ active = false,
31
+ as = 'a',
32
+ href = undefined,
33
+ isTitle,
34
+ onClick = () => null,
35
+ label = '',
36
+ color = null,
37
+ addRef,
38
+ childIndex,
39
+ trailingSlash,
40
+ onKeyDown = () => null
41
+ } = _ref,
42
+ rest = _objectWithoutProperties__default["default"](_ref, _excluded);
43
+
44
+ return /*#__PURE__*/jsxRuntime.jsx(styles.StyledCrumbWrapper, _objectSpread(_objectSpread({
45
+ "aria-current": active ? 'page' : undefined,
46
+ "data-testid": "breadcrumb-item-container",
47
+ isTitle: isTitle,
48
+ trailingSlash: trailingSlash
49
+ }, rest), {}, {
50
+ children: /*#__PURE__*/jsxRuntime.jsx(styles.StyledLink, {
51
+ as: as,
52
+ href: href,
53
+ onClick: onClick,
54
+ ref: addRef,
55
+ tabIndex: 0,
56
+ isActive: active,
57
+ onKeyDown: e => onKeyDown(e, childIndex, onClick),
58
+ isTitle: isTitle,
59
+ color: color,
60
+ children: label
61
+ })
62
+ }));
63
+ }
64
+
65
+ const props = {
66
+ /** inject props to wrapper */
67
+ containerComponent: reactDesc.PropTypes.string.description('inject props to wrapper'),
68
+
69
+ /** render as any html node */
70
+ as: reactDesc.PropTypes.string.description('render as any html node'),
71
+
72
+ /** active item */
73
+ active: reactDesc.PropTypes.bool.description('active item'),
74
+
75
+ /** href link */
76
+ href: reactDesc.PropTypes.string.description('href link'),
77
+
78
+ /** on click handler */
79
+ onClick: reactDesc.PropTypes.func.description('on click handler'),
80
+
81
+ /** style item as title */
82
+ isTitle: reactDesc.PropTypes.bool.description('style item as title'),
83
+
84
+ /** add trailing slash */
85
+ trailingSlash: reactDesc.PropTypes.bool.description('add trailing slash'),
86
+
87
+ /** item label */
88
+ label: reactDesc.PropTypes.string.description('item label'),
89
+
90
+ /** link color */
91
+ color: reactDesc.PropTypes.string.description('link color')
92
+ };
93
+ const DSBreadcrumbItemWithSchema = reactDesc.describe(DSBreadcrumbItem);
94
+ DSBreadcrumbItemWithSchema.propTypes = props;
95
+
96
+ exports.DSBreadcrumbItem = DSBreadcrumbItem;
97
+ exports.DSBreadcrumbItemWithSchema = DSBreadcrumbItemWithSchema;
98
+ exports["default"] = DSBreadcrumbItem;
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+
7
+ const useKeyboardNavigation = () => {
8
+ const componentsRef = React.useRef([]);
9
+ const addRef = React.useCallback(ref => {
10
+ if (ref && !componentsRef.current.includes(ref)) {
11
+ componentsRef.current.push(ref);
12
+ }
13
+ }, []);
14
+ const onKeyDown = React.useCallback((e, componentRefIndex, callback) => {
15
+ if (e.key === 'ArrowDown' && componentsRef.current[componentRefIndex + 1]) {
16
+ componentsRef.current[componentRefIndex + 1].focus();
17
+ e.preventDefault();
18
+ } else if (e.key === 'ArrowUp' && componentRefIndex !== 0) {
19
+ componentsRef.current[componentRefIndex - 1].focus();
20
+ e.preventDefault();
21
+ } else if (e.key === 'Enter') {
22
+ callback();
23
+ } else if (e.ctrlKey && e.altKey && e.key === ' ') {
24
+ componentsRef.current[componentRefIndex].click();
25
+ }
26
+ }, []);
27
+ return [addRef, onKeyDown];
28
+ };
29
+
30
+ exports.useKeyboardNavigation = useKeyboardNavigation;
package/cjs/index.d.js ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';
2
+
package/cjs/index.js ADDED
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var DSBreadcrumb = require('./DSBreadcrumb.js');
6
+ var DSBreadcrumbItem = require('./DSBreadcrumbItem.js');
7
+
8
+
9
+
10
+ exports.DSBreadcrumb = DSBreadcrumb.DSBreadcrumb;
11
+ exports.DSBreadcrumbWithSchema = DSBreadcrumb.DSBreadcrumbWithSchema;
12
+ exports["default"] = DSBreadcrumb.DSBreadcrumb;
13
+ exports.htmlElements = DSBreadcrumb.htmlElements;
14
+ exports.DSBreadcrumbItem = DSBreadcrumbItem.DSBreadcrumbItem;
15
+ exports.DSBreadcrumbItemWithSchema = DSBreadcrumbItem.DSBreadcrumbItemWithSchema;
package/cjs/styles.js ADDED
@@ -0,0 +1,68 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var styled = require('styled-components');
6
+
7
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
+
9
+ var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
10
+
11
+ const handleColor = (theme, isActive, color, isTitle) => {
12
+ if (isActive) return theme.colors.neutral[800];else if (color) return color;else if (isTitle) return theme.colors.neutral[700];else return theme.colors.brand[600];
13
+ };
14
+
15
+ const StyledList = /*#__PURE__*/styled__default["default"].ol.withConfig({
16
+ componentId: "sc-12gvmg4-0"
17
+ })(["width:100%;list-style:none;display:flex;padding:0;margin:0;li:first-child *{margin-left:0;}"]);
18
+ const StyledCrumbWrapper = /*#__PURE__*/styled__default["default"].li.withConfig({
19
+ componentId: "sc-12gvmg4-1"
20
+ })(["display:inline-flex;align-items:center;flex-shrink:20;transition:flex-shrink 0.1s cubic-bezier(0.64,0,0.35,1);height:16px;min-width:10px;&:hover{flex-shrink:0;}", ""], _ref => {
21
+ let {
22
+ theme,
23
+ isTitle,
24
+ trailingSlash
25
+ } = _ref;
26
+ return isTitle || !trailingSlash ? "&:not(:last-child):after {\n display: inline-block;\n content: '/';\n color: ".concat(theme.colors.neutral[700], ";\n }\n ") : "&:after {\n display: inline-block;\n content: '/';\n color: ".concat(theme.colors.neutral[700], ";\n }\n ");
27
+ });
28
+ const StyledContainer = /*#__PURE__*/styled__default["default"].nav.withConfig({
29
+ componentId: "sc-12gvmg4-2"
30
+ })(["display:flex;align-items:center;padding:0;"]);
31
+ const StyledLink = /*#__PURE__*/styled__default["default"].a.withConfig({
32
+ componentId: "sc-12gvmg4-3"
33
+ })(["white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;font-size:12px;outline:none;margin:0 2px;border:2px solid transparent;-webkit-text-stroke:0.4px transparent;font-weight:", ";color:", ";&:hover{color:", ";cursor:pointer;", ";}&:focus{", " border-radius:2px;}"], _ref2 => {
34
+ let {
35
+ theme
36
+ } = _ref2;
37
+ return theme.fontWeights.regular;
38
+ }, _ref3 => {
39
+ let {
40
+ theme,
41
+ isActive,
42
+ color,
43
+ isTitle
44
+ } = _ref3;
45
+ return handleColor(theme, isActive, color, isTitle);
46
+ }, _ref4 => {
47
+ let {
48
+ theme,
49
+ color
50
+ } = _ref4;
51
+ return color ? color : theme.colors.brand[800];
52
+ }, _ref5 => {
53
+ let {
54
+ theme,
55
+ color
56
+ } = _ref5;
57
+ return "-webkit-text-stroke: 0.4px ".concat(color ? color : theme.colors.brand[800]);
58
+ }, _ref6 => {
59
+ let {
60
+ theme
61
+ } = _ref6;
62
+ return "border: 2px solid ".concat(theme.colors.brand[700], ";");
63
+ });
64
+
65
+ exports.StyledContainer = StyledContainer;
66
+ exports.StyledCrumbWrapper = StyledCrumbWrapper;
67
+ exports.StyledLink = StyledLink;
68
+ exports.StyledList = StyledList;
@@ -0,0 +1,88 @@
1
+ import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
2
+ import _jsx from '@babel/runtime/helpers/esm/jsx';
3
+ import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';
4
+ import 'core-js/modules/web.dom-collections.iterator.js';
5
+ import 'core-js/modules/esnext.async-iterator.map.js';
6
+ import 'core-js/modules/esnext.iterator.map.js';
7
+ import 'core-js/modules/esnext.async-iterator.filter.js';
8
+ import 'core-js/modules/esnext.iterator.constructor.js';
9
+ import 'core-js/modules/esnext.iterator.filter.js';
10
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
11
+ import 'core-js/modules/esnext.iterator.for-each.js';
12
+ import React, { useMemo, cloneElement } from 'react';
13
+ import { PropTypes, describe } from 'react-desc';
14
+ import { DSBreadcrumbItem } from './DSBreadcrumbItem.js';
15
+ import { useKeyboardNavigation } from './hooks/useKeyboardNavigation.js';
16
+ import { StyledContainer, StyledList } from './styles.js';
17
+ import { jsx } from 'react/jsx-runtime';
18
+
19
+ const _excluded = ["containerProps", "as", "label", "isTitle", "children", "trailingSlash"];
20
+
21
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
22
+
23
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
24
+ const htmlElements = ['nav', 'div', 'header', 'footer', 'main'];
25
+
26
+ const DSBreadcrumb = _ref => {
27
+ let {
28
+ containerProps = {},
29
+ as = 'nav',
30
+ label = 'Breadcrumb',
31
+ isTitle = false,
32
+ children,
33
+ trailingSlash = true
34
+ } = _ref,
35
+ rest = _objectWithoutProperties(_ref, _excluded);
36
+
37
+ const [addRef, onKeyDown] = useKeyboardNavigation();
38
+ const safeElement = useMemo(() => htmlElements.indexOf(as) > -1 ? as : 'nav', [as]);
39
+ return /*#__PURE__*/jsx(StyledContainer, _objectSpread(_objectSpread(_objectSpread({
40
+ "aria-label": label,
41
+ "data-testid": "breadcrumb-nav-container"
42
+ }, rest), containerProps), {}, {
43
+ as: safeElement,
44
+ children: /*#__PURE__*/_jsx(StyledList, {
45
+ "data-testid": "list-container"
46
+ }, void 0, React.Children.map(children, (child, childIndex) => childIndex < children.length - 1 ? /*#__PURE__*/cloneElement(child, {
47
+ childIndex,
48
+ addRef,
49
+ onKeyDown
50
+ }) : /*#__PURE__*/cloneElement(child, {
51
+ childIndex,
52
+ addRef,
53
+ onKeyDown,
54
+ trailingSlash,
55
+ isTitle
56
+ })))
57
+ }));
58
+ };
59
+
60
+ DSBreadcrumb.Item = DSBreadcrumbItem;
61
+ const props = {
62
+ /** props injected to breadcrumb wrapper */
63
+ containerProps: PropTypes.object.description('props injected to breadcrumb wrapper'),
64
+
65
+ /**
66
+ * Type of element you want the main container to be:
67
+ * 'nav', 'div', 'header', 'footer', 'main'
68
+ */
69
+ as: PropTypes.string.description("Type of element you want the main container to be: 'nav', 'div', 'header', 'footer', 'main'"),
70
+
71
+ /**
72
+ * Whether to show the last element of the breadcrumb as a title
73
+ * Also removes trailing slash to show last element as title
74
+ */
75
+ isTitle: PropTypes.bool.description('Whether to show the last element of the breadcrumb as a title. Also removes trailing slash to show last element as title'),
76
+
77
+ /** breadcrumb label */
78
+ label: PropTypes.string.description('breadcrumb label'),
79
+
80
+ /**
81
+ * Container items to wrap
82
+ */
83
+ children: PropTypes.arrayOf(DSBreadcrumbItem).isRequired.description('Container items to wrap')
84
+ };
85
+ const DSBreadcrumbWithSchema = describe(DSBreadcrumb);
86
+ DSBreadcrumbWithSchema.propTypes = props;
87
+
88
+ export { DSBreadcrumb, DSBreadcrumbWithSchema, DSBreadcrumb as default, htmlElements };
@@ -0,0 +1,87 @@
1
+ import 'core-js/modules/esnext.async-iterator.filter.js';
2
+ import 'core-js/modules/esnext.iterator.constructor.js';
3
+ import 'core-js/modules/esnext.iterator.filter.js';
4
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
+ import 'core-js/modules/esnext.iterator.for-each.js';
6
+ import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
7
+ import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';
8
+ import 'react';
9
+ import { PropTypes, describe } from 'react-desc';
10
+ import { StyledCrumbWrapper, StyledLink } from './styles.js';
11
+ import { jsx } from 'react/jsx-runtime';
12
+
13
+ const _excluded = ["active", "as", "href", "isTitle", "onClick", "label", "color", "addRef", "childIndex", "trailingSlash", "onKeyDown"];
14
+
15
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
16
+
17
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
18
+
19
+ function DSBreadcrumbItem(_ref) {
20
+ let {
21
+ active = false,
22
+ as = 'a',
23
+ href = undefined,
24
+ isTitle,
25
+ onClick = () => null,
26
+ label = '',
27
+ color = null,
28
+ addRef,
29
+ childIndex,
30
+ trailingSlash,
31
+ onKeyDown = () => null
32
+ } = _ref,
33
+ rest = _objectWithoutProperties(_ref, _excluded);
34
+
35
+ return /*#__PURE__*/jsx(StyledCrumbWrapper, _objectSpread(_objectSpread({
36
+ "aria-current": active ? 'page' : undefined,
37
+ "data-testid": "breadcrumb-item-container",
38
+ isTitle: isTitle,
39
+ trailingSlash: trailingSlash
40
+ }, rest), {}, {
41
+ children: /*#__PURE__*/jsx(StyledLink, {
42
+ as: as,
43
+ href: href,
44
+ onClick: onClick,
45
+ ref: addRef,
46
+ tabIndex: 0,
47
+ isActive: active,
48
+ onKeyDown: e => onKeyDown(e, childIndex, onClick),
49
+ isTitle: isTitle,
50
+ color: color,
51
+ children: label
52
+ })
53
+ }));
54
+ }
55
+
56
+ const props = {
57
+ /** inject props to wrapper */
58
+ containerComponent: PropTypes.string.description('inject props to wrapper'),
59
+
60
+ /** render as any html node */
61
+ as: PropTypes.string.description('render as any html node'),
62
+
63
+ /** active item */
64
+ active: PropTypes.bool.description('active item'),
65
+
66
+ /** href link */
67
+ href: PropTypes.string.description('href link'),
68
+
69
+ /** on click handler */
70
+ onClick: PropTypes.func.description('on click handler'),
71
+
72
+ /** style item as title */
73
+ isTitle: PropTypes.bool.description('style item as title'),
74
+
75
+ /** add trailing slash */
76
+ trailingSlash: PropTypes.bool.description('add trailing slash'),
77
+
78
+ /** item label */
79
+ label: PropTypes.string.description('item label'),
80
+
81
+ /** link color */
82
+ color: PropTypes.string.description('link color')
83
+ };
84
+ const DSBreadcrumbItemWithSchema = describe(DSBreadcrumbItem);
85
+ DSBreadcrumbItemWithSchema.propTypes = props;
86
+
87
+ export { DSBreadcrumbItem, DSBreadcrumbItemWithSchema, DSBreadcrumbItem as default };
@@ -1,28 +1,26 @@
1
- import * as React from "react";
2
- import { useRef, useCallback } from "react";
1
+ import { useRef, useCallback } from 'react';
2
+
3
3
  const useKeyboardNavigation = () => {
4
4
  const componentsRef = useRef([]);
5
- const addRef = useCallback((ref) => {
5
+ const addRef = useCallback(ref => {
6
6
  if (ref && !componentsRef.current.includes(ref)) {
7
7
  componentsRef.current.push(ref);
8
8
  }
9
9
  }, []);
10
10
  const onKeyDown = useCallback((e, componentRefIndex, callback) => {
11
- if (e.key === "ArrowDown" && componentsRef.current[componentRefIndex + 1]) {
11
+ if (e.key === 'ArrowDown' && componentsRef.current[componentRefIndex + 1]) {
12
12
  componentsRef.current[componentRefIndex + 1].focus();
13
13
  e.preventDefault();
14
- } else if (e.key === "ArrowUp" && componentRefIndex !== 0) {
14
+ } else if (e.key === 'ArrowUp' && componentRefIndex !== 0) {
15
15
  componentsRef.current[componentRefIndex - 1].focus();
16
16
  e.preventDefault();
17
- } else if (e.key === "Enter") {
17
+ } else if (e.key === 'Enter') {
18
18
  callback();
19
- } else if (e.ctrlKey && e.altKey && e.key === " ") {
19
+ } else if (e.ctrlKey && e.altKey && e.key === ' ') {
20
20
  componentsRef.current[componentRefIndex].click();
21
21
  }
22
22
  }, []);
23
23
  return [addRef, onKeyDown];
24
24
  };
25
- export {
26
- useKeyboardNavigation
27
- };
28
- //# sourceMappingURL=useKeyboardNavigation.js.map
25
+
26
+ export { useKeyboardNavigation };
package/esm/index.d.js ADDED
@@ -0,0 +1 @@
1
+
package/esm/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { DSBreadcrumb, DSBreadcrumbWithSchema, DSBreadcrumb as default, htmlElements } from './DSBreadcrumb.js';
2
+ export { DSBreadcrumbItem, DSBreadcrumbItemWithSchema } from './DSBreadcrumbItem.js';
package/esm/styles.js ADDED
@@ -0,0 +1,57 @@
1
+ import styled from 'styled-components';
2
+
3
+ const handleColor = (theme, isActive, color, isTitle) => {
4
+ if (isActive) return theme.colors.neutral[800];else if (color) return color;else if (isTitle) return theme.colors.neutral[700];else return theme.colors.brand[600];
5
+ };
6
+
7
+ const StyledList = /*#__PURE__*/styled.ol.withConfig({
8
+ componentId: "sc-12gvmg4-0"
9
+ })(["width:100%;list-style:none;display:flex;padding:0;margin:0;li:first-child *{margin-left:0;}"]);
10
+ const StyledCrumbWrapper = /*#__PURE__*/styled.li.withConfig({
11
+ componentId: "sc-12gvmg4-1"
12
+ })(["display:inline-flex;align-items:center;flex-shrink:20;transition:flex-shrink 0.1s cubic-bezier(0.64,0,0.35,1);height:16px;min-width:10px;&:hover{flex-shrink:0;}", ""], _ref => {
13
+ let {
14
+ theme,
15
+ isTitle,
16
+ trailingSlash
17
+ } = _ref;
18
+ return isTitle || !trailingSlash ? "&:not(:last-child):after {\n display: inline-block;\n content: '/';\n color: ".concat(theme.colors.neutral[700], ";\n }\n ") : "&:after {\n display: inline-block;\n content: '/';\n color: ".concat(theme.colors.neutral[700], ";\n }\n ");
19
+ });
20
+ const StyledContainer = /*#__PURE__*/styled.nav.withConfig({
21
+ componentId: "sc-12gvmg4-2"
22
+ })(["display:flex;align-items:center;padding:0;"]);
23
+ const StyledLink = /*#__PURE__*/styled.a.withConfig({
24
+ componentId: "sc-12gvmg4-3"
25
+ })(["white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;font-size:12px;outline:none;margin:0 2px;border:2px solid transparent;-webkit-text-stroke:0.4px transparent;font-weight:", ";color:", ";&:hover{color:", ";cursor:pointer;", ";}&:focus{", " border-radius:2px;}"], _ref2 => {
26
+ let {
27
+ theme
28
+ } = _ref2;
29
+ return theme.fontWeights.regular;
30
+ }, _ref3 => {
31
+ let {
32
+ theme,
33
+ isActive,
34
+ color,
35
+ isTitle
36
+ } = _ref3;
37
+ return handleColor(theme, isActive, color, isTitle);
38
+ }, _ref4 => {
39
+ let {
40
+ theme,
41
+ color
42
+ } = _ref4;
43
+ return color ? color : theme.colors.brand[800];
44
+ }, _ref5 => {
45
+ let {
46
+ theme,
47
+ color
48
+ } = _ref5;
49
+ return "-webkit-text-stroke: 0.4px ".concat(color ? color : theme.colors.brand[800]);
50
+ }, _ref6 => {
51
+ let {
52
+ theme
53
+ } = _ref6;
54
+ return "border: 2px solid ".concat(theme.colors.brand[700], ";");
55
+ });
56
+
57
+ export { StyledContainer, StyledCrumbWrapper, StyledLink, StyledList };