@jobber/components 4.85.3 → 4.85.4-CJS-to-ESM.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 (139) hide show
  1. package/dist/index.cjs.js +6721 -0
  2. package/dist/index.d.ts +73 -0
  3. package/dist/index.esm.js +6603 -0
  4. package/package.json +371 -3
  5. package/rollup.config.js +21 -77
  6. package/.eslintrc.js +0 -10
  7. package/dist/AnimatedPresence/index.js +0 -12
  8. package/dist/AnimatedPresence-20a02aaa.js +0 -104
  9. package/dist/AnimatedSwitcher/index.js +0 -13
  10. package/dist/AnimatedSwitcher-3d45ec5d.js +0 -96
  11. package/dist/Autocomplete/index.js +0 -209
  12. package/dist/Avatar/index.js +0 -15
  13. package/dist/Avatar-76a799fa.js +0 -78
  14. package/dist/Banner/index.js +0 -110
  15. package/dist/Button/index.js +0 -16
  16. package/dist/Button-b73a5e01.js +0 -57
  17. package/dist/ButtonDismiss/index.js +0 -17
  18. package/dist/ButtonDismiss-350af163.js +0 -14
  19. package/dist/Card/colors.css.d.ts +0 -89
  20. package/dist/Card/index.js +0 -24
  21. package/dist/Card-e3144022.js +0 -93
  22. package/dist/Checkbox/index.js +0 -18
  23. package/dist/Checkbox-787e2e47.js +0 -63
  24. package/dist/Chip/index.js +0 -41
  25. package/dist/Chip-3d1bfddc.js +0 -89
  26. package/dist/Chips/index.js +0 -524
  27. package/dist/Combobox/index.js +0 -40
  28. package/dist/Combobox-a24c8241.js +0 -479
  29. package/dist/ConfirmationModal/index.js +0 -31
  30. package/dist/ConfirmationModal-52e16873.js +0 -100
  31. package/dist/Content/Spacing.css.d.ts +0 -13
  32. package/dist/Content/index.js +0 -12
  33. package/dist/Content-e3f7b6fc.js +0 -24
  34. package/dist/Countdown/index.js +0 -72
  35. package/dist/DataDump/index.js +0 -37
  36. package/dist/DataList/index.js +0 -1335
  37. package/dist/DataTable/index.js +0 -301
  38. package/dist/DatePicker/index.js +0 -20
  39. package/dist/DatePicker-64c5ab1a.js +0 -134
  40. package/dist/DescriptionList/index.js +0 -24
  41. package/dist/Disclosure/index.js +0 -46
  42. package/dist/Divider/index.js +0 -29
  43. package/dist/Drawer/index.js +0 -49
  44. package/dist/Emphasis/index.js +0 -13
  45. package/dist/Emphasis-bda56d3b.js +0 -19
  46. package/dist/FeatureSwitch/index.js +0 -70
  47. package/dist/Flex/index.js +0 -12
  48. package/dist/Flex-d490c4db.js +0 -38
  49. package/dist/Form/index.js +0 -56
  50. package/dist/FormField/index.js +0 -24
  51. package/dist/FormField-6ff183f8.js +0 -253
  52. package/dist/FormatDate/index.js +0 -11
  53. package/dist/FormatDate-70ea5b43.js +0 -34
  54. package/dist/FormatEmail/index.js +0 -23
  55. package/dist/FormatFile/index.js +0 -36
  56. package/dist/FormatFile-f036902d.js +0 -162
  57. package/dist/FormatRelativeDateTime/index.js +0 -72
  58. package/dist/FormatTime/index.js +0 -36
  59. package/dist/Gallery/Gallery.css.d.ts +0 -9
  60. package/dist/Gallery/index.js +0 -99
  61. package/dist/Glimmer/index.js +0 -15
  62. package/dist/Glimmer/style/Shape.css.d.ts +0 -9
  63. package/dist/Glimmer/style/Sizes.css.d.ts +0 -10
  64. package/dist/Glimmer/style/Timing.css.d.ts +0 -6
  65. package/dist/Glimmer-84dee1ed.js +0 -77
  66. package/dist/Grid/GridAlign.css.d.ts +0 -8
  67. package/dist/Grid/index.js +0 -76
  68. package/dist/Heading/index.js +0 -14
  69. package/dist/Heading-1e8e4bd3.js +0 -55
  70. package/dist/Icon/index.js +0 -11
  71. package/dist/Icon-405a216c.js +0 -40
  72. package/dist/InlineLabel/index.js +0 -13
  73. package/dist/InlineLabel-a6557829.js +0 -28
  74. package/dist/InputAvatar/index.js +0 -70
  75. package/dist/InputDate/index.js +0 -57
  76. package/dist/InputEmail/index.js +0 -43
  77. package/dist/InputFile/index.js +0 -25
  78. package/dist/InputFile-bb945071.js +0 -190
  79. package/dist/InputGroup/index.js +0 -12
  80. package/dist/InputGroup-8d4fd4eb.js +0 -33
  81. package/dist/InputNumber/index.js +0 -25
  82. package/dist/InputNumber-d451b52e.js +0 -62
  83. package/dist/InputPassword/index.js +0 -41
  84. package/dist/InputPhoneNumber/index.js +0 -116
  85. package/dist/InputText/index.js +0 -26
  86. package/dist/InputText-55b6cb65.js +0 -102
  87. package/dist/InputTime/index.js +0 -209
  88. package/dist/InputValidation/index.js +0 -17
  89. package/dist/InputValidation-05e839fa.js +0 -29
  90. package/dist/LightBox/index.js +0 -24
  91. package/dist/LightBox-a89d8863.js +0 -117
  92. package/dist/Link/index.js +0 -15
  93. package/dist/List/index.js +0 -93
  94. package/dist/Markdown/index.js +0 -19
  95. package/dist/Markdown-f7c55304.js +0 -62
  96. package/dist/Menu/index.js +0 -21
  97. package/dist/Menu-083fc4c4.js +0 -139
  98. package/dist/Modal/Sizes.css.d.ts +0 -6
  99. package/dist/Modal/index.js +0 -25
  100. package/dist/Modal-c336cac6.js +0 -71
  101. package/dist/MultiSelect/index.js +0 -182
  102. package/dist/Option-3c4d377e.js +0 -19
  103. package/dist/Page/index.js +0 -78
  104. package/dist/Popover/index.js +0 -61
  105. package/dist/ProgressBar/Sizes.css.d.ts +0 -7
  106. package/dist/ProgressBar/index.js +0 -12
  107. package/dist/ProgressBar-b68edc8f.js +0 -43
  108. package/dist/RadioGroup/index.js +0 -15
  109. package/dist/RadioGroup-17b67ade.js +0 -46
  110. package/dist/RecurringSelect/index.js +0 -227
  111. package/dist/Select/index.js +0 -26
  112. package/dist/Spinner/index.js +0 -12
  113. package/dist/Spinner-9d8fc7ff.js +0 -24
  114. package/dist/StatusIndicator/index.js +0 -11
  115. package/dist/StatusIndicator-b179d06e.js +0 -18
  116. package/dist/StatusLabel/index.js +0 -29
  117. package/dist/Switch/index.js +0 -13
  118. package/dist/Switch-7d4aa7c3.js +0 -56
  119. package/dist/Table/index.js +0 -66
  120. package/dist/Tabs/index.js +0 -80
  121. package/dist/Text/index.js +0 -13
  122. package/dist/Text-259af966.js +0 -31
  123. package/dist/Toast/index.js +0 -111
  124. package/dist/Tooltip/index.js +0 -16
  125. package/dist/Tooltip-ef3d6ef4.js +0 -112
  126. package/dist/Typography/css/Emphasis.css.d.ts +0 -6
  127. package/dist/Typography/css/FontFamilies.css.d.ts +0 -6
  128. package/dist/Typography/css/FontSizes.css.d.ts +0 -12
  129. package/dist/Typography/css/FontWeights.css.d.ts +0 -10
  130. package/dist/Typography/css/TextAlignment.css.d.ts +0 -7
  131. package/dist/Typography/css/TextCases.css.d.ts +0 -7
  132. package/dist/Typography/css/TextColors.css.d.ts +0 -22
  133. package/dist/Typography/css/Truncate.css.d.ts +0 -5
  134. package/dist/Typography/css/Typography.css.d.ts +0 -5
  135. package/dist/Typography/index.js +0 -12
  136. package/dist/Typography-c45bf216.js +0 -62
  137. package/dist/getAtlantisConfig-0f3e8af2.js +0 -13
  138. package/dist/style-inject.es-9d2f5f4e.js +0 -30
  139. package/dist/tslib.es6-754e2961.js +0 -46
@@ -1,524 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var React = require('react');
6
- var classnames = require('classnames');
7
- var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
8
- var useAssert = require('@jobber/hooks/useAssert');
9
- var Icon = require('../Icon-405a216c.js');
10
- var Avatar = require('../Avatar-76a799fa.js');
11
- var Typography = require('../Typography-c45bf216.js');
12
- var Tooltip = require('../Tooltip-ef3d6ef4.js');
13
- var sortBy = require('lodash/sortBy');
14
- var useLiveAnnounce = require('@jobber/hooks/useLiveAnnounce');
15
- var debounce = require('lodash/debounce');
16
- require('@jobber/design');
17
- var reactPopper = require('react-popper');
18
- var Text = require('../Text-259af966.js');
19
- var Button = require('../Button-b73a5e01.js');
20
- var Spinner = require('../Spinner-9d8fc7ff.js');
21
- require('color');
22
- require('react-dom');
23
- require('framer-motion');
24
- require('@jobber/hooks/useSafeLayoutEffect');
25
- require('react-router-dom');
26
-
27
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
28
-
29
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
30
- var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
31
- var sortBy__default = /*#__PURE__*/_interopDefaultLegacy(sortBy);
32
- var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
33
-
34
- var css_248z$1 = "/**\n * Used in the wrapping chips component:\n * - InternalChipSingleSelect\n * - InternalChipMultiSelect\n */\n\n.zn6onyiQVmA- {\n display: -ms-flexbox;\n display: flex;\n gap: calc(16px / 2);\n gap: var(--space-small);\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.PEnZzMEgbhU- {\n display: inline-grid;\n position: relative;\n max-width: 100%;\n box-sizing: border-box;\n padding: calc(16px / 2);\n padding: var(--space-small);\n border: calc(16px / 16) solid rgb(217, 223, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc(16px / 2);\n border-radius: var(--radius-larger);\n color: rgb(77, 105, 116);\n color: var(--color-text--secondary);\n text-align: left;\n vertical-align: middle;\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n transition: 200ms ease-in-out;\n transition: var(--timing-base) ease-in-out;\n transition-property: background-color, box-shadow, color;\n grid-template-columns: -webkit-max-content;\n grid-template-columns: max-content;\n -ms-flex-align: center;\n align-items: center;\n gap: calc(16px / 2);\n gap: var(--space-small);\n}\n\n.dtysUhwYdG4-,\n.xGaMCAYsdwA- {\n padding: calc((16px / 4) + (16px / 8)) calc(16px / 2);\n padding: calc(calc(16px / 4) + calc(16px / 8)) calc(16px / 2);\n padding: calc(var(--space-smaller) + var(--space-smallest)) var(--space-small);\n}\n\n.dtysUhwYdG4- {\n grid-template-columns: -webkit-min-content 1fr;\n grid-template-columns: min-content 1fr;\n}\n\n.xGaMCAYsdwA- {\n grid-template-columns: 1fr -webkit-min-content;\n grid-template-columns: 1fr min-content;\n}\n\n.dtysUhwYdG4-.xGaMCAYsdwA- {\n grid-template-columns: -webkit-min-content 1fr -webkit-min-content;\n grid-template-columns: min-content 1fr min-content;\n}\n\n.SNT7gGV-h-o-,\n.W4D98cvEth4- ~ .PEnZzMEgbhU- {\n box-shadow: 0px calc(16px / 16) calc(16px / 4) 0px\n rgba(0, 0, 0, 0.1),\n 0px calc(16px / 4) 12px 0px rgba(0, 0, 0, 0.05);\n box-shadow: var(--shadow-base);\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n}\n\n/**\n * Interaction\n */\n\n.PEnZzMEgbhU-:focus,\n.W4D98cvEth4-:focus ~ .PEnZzMEgbhU- {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n outline: none;\n}\n\n.SNT7gGV-h-o-:hover,\n.W4D98cvEth4- ~ .PEnZzMEgbhU-:not(._0hEzaTXK9M0-):hover,\n.W4D98cvEth4-:focus ~ .PEnZzMEgbhU-:not(._0hEzaTXK9M0-) {\n background-color: rgb(244, 246, 250);\n background-color: var(--color-surface--hover);\n}\n\n/**\n * States\n */\n\n.PEnZzMEgbhU-._0hEzaTXK9M0- {\n border-color: rgb(1, 41, 57);\n border-color: var(--color-surface--reverse);\n color: rgba(255, 255, 255, 1);\n color: var(--color-text--reverse);\n background-color: rgb(1, 41, 57);\n background-color: var(--color-surface--reverse);\n}\n\n.PEnZzMEgbhU-.JApS2787BU8- {\n border-color: rgb(128, 25, 0);\n border-color: var(--color-critical--onSurface);\n color: rgb(128, 25, 0);\n color: var(--color-critical--onSurface);\n background-color: rgb(255, 226, 219);\n background-color: var(--color-critical--surface);\n}\n\n.PEnZzMEgbhU-.Kg0c8WVgMpg- {\n border-color: rgb(225, 225, 225);\n border-color: var(--color-disabled--secondary);\n color: rgb(181, 181, 181);\n color: var(--color-disabled);\n background-color: rgb(225, 225, 225);\n background-color: var(--color-disabled--secondary);\n}\n\n._0hEzaTXK9M0-.Kg0c8WVgMpg- {\n border-color: rgb(181, 181, 181);\n border-color: var(--color-disabled);\n color: rgba(255, 255, 255, 1);\n color: var(--color-white);\n background-color: rgb(181, 181, 181);\n background-color: var(--color-disabled);\n}\n\n.JApS2787BU8-.Kg0c8WVgMpg- {\n border-color: rgb(201, 66, 33);\n border-color: var(--color-critical);\n}\n\n/**\n * Input checkbox/radio\n *\n * Hide checkbox on UI but not screen readers and still allow focus state\n */\n\n.W4D98cvEth4- {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n -webkit-clip-path: inset(100%);\n clip-path: inset(100%);\n white-space: nowrap;\n}\n\n/**\n * Button\n */\n\n._0-ZWexS4Gfg- {\n display: -ms-flexbox;\n display: flex;\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n cursor: pointer;\n transition: background-color 200ms ease;\n}\n\n._0-ZWexS4Gfg-:hover,\n._0-ZWexS4Gfg-:focus {\n background-color: rgb(244, 246, 250);\n background-color: var(--color-surface--hover);\n}\n\n._0-ZWexS4Gfg-:focus,\n.SNT7gGV-h-o- ._0-ZWexS4Gfg-:hover {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n outline: none;\n}\n\n/**\n * Override icon default colors.\n *\n * NOTE: This is a workaround since some icons have default colors that we don't\n * want to override until the component color prop overrides it.\n * DO NOT COPY!\n */\n\n.DQPnZP4UZpw- > svg {\n fill: rgba(101, 120, 132, 1);\n fill: var(--color-interactive--subtle);\n}\n\n.DQPnZP4UZpw- {\n display: -ms-flexbox;\n display: flex;\n}\n";
35
- var styles$1 = {"wrapper":"zn6onyiQVmA-","chip":"PEnZzMEgbhU-","hasPrefix":"dtysUhwYdG4-","hasSuffix":"xGaMCAYsdwA-","clickable":"SNT7gGV-h-o-","input":"W4D98cvEth4-","active":"_0hEzaTXK9M0-","invalid":"JApS2787BU8-","disabled":"Kg0c8WVgMpg-","button":"_0-ZWexS4Gfg-","icon":"DQPnZP4UZpw-"};
36
- styleInject_es.styleInject(css_248z$1);
37
-
38
- function InternalChipButton({ icon, invalid, disabled, label, onClick, }) {
39
- const buttonRef = React.useRef();
40
- return (React__default["default"].createElement("div", { ref: buttonRef, className: styles$1.button, tabIndex: 0, onKeyUp: handleKeyUp, onKeyDown: handleKeyDown, onClick: handleClick, role: "button", "aria-label": `Remove ${label}`, "aria-hidden": true, "aria-disabled": disabled, "data-testid": "remove-chip-button" },
41
- React__default["default"].createElement(Icon.Icon, { name: icon, color: getColor() })));
42
- function handleKeyUp(event) {
43
- if (document.activeElement === buttonRef.current &&
44
- (event.key === " " || event.key === "Enter")) {
45
- event.stopPropagation();
46
- buttonRef.current.click();
47
- }
48
- }
49
- function handleKeyDown(event) {
50
- if (document.activeElement === buttonRef.current && event.key === " ") {
51
- // Don't scroll down
52
- event.preventDefault();
53
- }
54
- }
55
- function getColor() {
56
- if (disabled)
57
- return "disabled";
58
- if (invalid)
59
- return "critical";
60
- return "greyBlue";
61
- }
62
- function handleClick(event) {
63
- event.stopPropagation();
64
- onClick === null || onClick === void 0 ? void 0 : onClick(event);
65
- }
66
- }
67
-
68
- function InternalChipAffix({ affix, active, invalid, disabled, }) {
69
- assertProps();
70
- if ((affix === null || affix === void 0 ? void 0 : affix.type) === Avatar.Avatar) {
71
- return React__default["default"].createElement(Avatar.Avatar, Object.assign({}, affix.props, { size: "small" }));
72
- }
73
- if ((affix === null || affix === void 0 ? void 0 : affix.type) === Icon.Icon) {
74
- return renderChipIcon(affix);
75
- }
76
- if ((affix === null || affix === void 0 ? void 0 : affix.type) === InternalChipButton) {
77
- return React__default["default"].createElement(InternalChipButton, Object.assign({}, affix.props));
78
- }
79
- return React__default["default"].createElement(React__default["default"].Fragment, null);
80
- function renderChipIcon(icon) {
81
- const color = getIconColor();
82
- return (React__default["default"].createElement("div", { className: styles$1.icon }, React__default["default"].cloneElement(icon, Object.assign({ size: "base" }, (color && { color: color })))));
83
- }
84
- function getIconColor() {
85
- if (disabled && !active)
86
- return "disabled";
87
- if (invalid && !disabled)
88
- return "critical";
89
- if (active)
90
- return "white";
91
- return;
92
- }
93
- function assertProps() {
94
- const isAvatar = (affix === null || affix === void 0 ? void 0 : affix.type) === Avatar.Avatar || false;
95
- const isIcon = (affix === null || affix === void 0 ? void 0 : affix.type) === Icon.Icon || false;
96
- const isChipButton = (affix === null || affix === void 0 ? void 0 : affix.type) === InternalChipButton || false;
97
- useAssert.useAssert(!!affix && !(isAvatar || isIcon || isChipButton), `Prefix prop only accepts "<Avatar />" or "<Icon />" component. You have "${affix === null || affix === void 0 ? void 0 : affix.type}".`);
98
- }
99
- }
100
-
101
- function InternalChip({ label, active = false, disabled = false, invalid = false, prefix, suffix, tabIndex, ariaLabel, onClick, onKeyDown, }) {
102
- const [truncateRef, setTruncateRef] = React.useState();
103
- const isClickable = onClick && !disabled;
104
- const classNames = classnames__default["default"](styles$1.chip, {
105
- [styles$1.clickable]: isClickable,
106
- [styles$1.active]: active,
107
- [styles$1.disabled]: disabled,
108
- [styles$1.invalid]: invalid,
109
- [styles$1.hasPrefix]: prefix,
110
- [styles$1.hasSuffix]: suffix,
111
- });
112
- const affixProps = { active, invalid, disabled };
113
- const Tag = onClick ? "button" : "div";
114
- const chip = (React__default["default"].createElement(Tag, Object.assign({ className: classNames }, (isClickable && { onClick, disabled }), { onKeyDown: onKeyDown, "data-testid": "chip-wrapper", "aria-label": ariaLabel, tabIndex: tabIndex, role: tabIndex !== undefined ? "option" : undefined }),
115
- React__default["default"].createElement(InternalChipAffix, Object.assign({ affix: prefix }, affixProps)),
116
- React__default["default"].createElement(Typography.Typography, { element: "span", numberOfLines: 1, size: "base" },
117
- React__default["default"].createElement("span", { ref: setTruncateRef }, label)),
118
- React__default["default"].createElement(InternalChipAffix, Object.assign({ affix: suffix }, affixProps))));
119
- return isTruncated() ? React__default["default"].createElement(Tooltip.Tooltip, { message: label }, chip) : chip;
120
- function isTruncated() {
121
- var _a;
122
- const truncateParentHeight = ((_a = truncateRef === null || truncateRef === void 0 ? void 0 : truncateRef.parentElement) === null || _a === void 0 ? void 0 : _a.offsetHeight) || 0;
123
- const truncateChildHeight = (truncateRef === null || truncateRef === void 0 ? void 0 : truncateRef.offsetHeight) || 0;
124
- return truncateChildHeight >= truncateParentHeight * 2;
125
- }
126
- }
127
-
128
- function ChipDismissible({ label, disabled, invalid, prefix, onClick, onRequestRemove, }) {
129
- return (React__default["default"].createElement(InternalChip, { label: label, disabled: disabled, invalid: invalid, prefix: prefix, onClick: onClick, suffix: React__default["default"].createElement(InternalChipButton, { icon: "remove", label: label, invalid: invalid, disabled: disabled, onClick: onRequestRemove }) }));
130
- }
131
-
132
- function InternalChipSingleSelect({ children, selected, name = React.useId(), onChange, onClick, }) {
133
- return (React__default["default"].createElement("div", { className: styles$1.wrapper, "data-testid": "singleselect-chips" }, React__default["default"].Children.map(children, child => {
134
- const isSelected = child.props.value === selected;
135
- return (React__default["default"].createElement("label", null,
136
- React__default["default"].createElement("input", { type: "radio", checked: isSelected, className: styles$1.input, name: name, onClick: handleClick(child.props.value), onKeyUp: handleKeyUp(isSelected, child.props.value), onChange: () => {
137
- /* No op. onClick handles the change to allow deselecting. */
138
- }, disabled: child.props.disabled }),
139
- React__default["default"].createElement(InternalChip, Object.assign({}, child.props, { active: isSelected }))));
140
- })));
141
- function handleKeyUp(active, value) {
142
- if (!active)
143
- return;
144
- return (event) => {
145
- if (event.key === " ") {
146
- // Wait for DOM changes before applying the new change.
147
- setTimeout(() => handleChange(value), 0);
148
- }
149
- };
150
- }
151
- function handleClick(value) {
152
- return (event) => {
153
- onClick === null || onClick === void 0 ? void 0 : onClick(event, value);
154
- handleChange(value);
155
- };
156
- }
157
- function handleChange(value) {
158
- const newValue = value !== selected ? value : undefined;
159
- onChange(newValue);
160
- }
161
- }
162
-
163
- function InternalChipMultiSelect({ children, selected, onChange, onClick, }) {
164
- return (React__default["default"].createElement("div", { className: styles$1.wrapper, "data-testid": "multiselect-chips" }, React__default["default"].Children.map(children, chip => {
165
- const isChipActive = isChipSelected(chip.props.value);
166
- return (React__default["default"].createElement("label", null,
167
- React__default["default"].createElement("input", { type: "checkbox", checked: isChipActive, className: styles$1.input, onClick: handleClick(chip.props.value), onChange: handleChange(chip.props.value), disabled: chip.props.disabled }),
168
- React__default["default"].createElement(InternalChip, Object.assign({}, chip.props, { active: isChipActive, suffix: checkmarkIcon(isChipActive) }))));
169
- })));
170
- function isChipSelected(value) {
171
- return selected.includes(value);
172
- }
173
- function handleClick(value) {
174
- return (event) => onClick === null || onClick === void 0 ? void 0 : onClick(event, value);
175
- }
176
- function handleChange(value) {
177
- return () => {
178
- if (isChipSelected(value)) {
179
- handleDeselect(value);
180
- }
181
- else {
182
- handleSelect(value);
183
- }
184
- };
185
- }
186
- function handleSelect(value) {
187
- const newVal = [...selected, value];
188
- onChange(newVal);
189
- }
190
- function handleDeselect(value) {
191
- const values = selected;
192
- const newVal = values.filter(val => val !== value);
193
- onChange(newVal);
194
- }
195
- function checkmarkIcon(show) {
196
- // Ideally, we should be returning a fragment `<></>` when a function
197
- // returns a component / element. However, this one needs to return nothing
198
- // to prevent it from randomly rendering a suffix.
199
- //
200
- // DO NOT COPY!
201
- if (!show)
202
- return;
203
- return React__default["default"].createElement(Icon.Icon, { name: "checkmark" });
204
- }
205
- }
206
-
207
- var css_248z = ".sCNIjluCskc- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n box-sizing: border-box;\n border: calc(16px / 16) solid transparent;\n border: var(--border-base) solid transparent;\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n transition: all 200ms;\n transition: all var(--timing-base);\n gap: calc(16px / 2);\n gap: var(--space-small);\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.MFUlz1WQLdk- {\n -ms-flex: 1;\n flex: 1;\n min-width: 120px;\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n border: none;\n border-radius: 0;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n font-size: calc(calc(16px * 1) * 0.875);\n font-size: var(--typography--fontSize-base);\n line-height: 1.25;\n line-height: var(--typography--lineHeight-base);\n background: transparent;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.MFUlz1WQLdk-:focus {\n outline: none;\n}\n\n.V9eYJdjPAeY- {\n position: relative;\n z-index: 6;\n z-index: var(--elevation-menu);\n width: 100%;\n}\n\n.LdytkOeCU9c- {\n max-height: 320px;\n box-shadow: 0px calc(16px / 16) calc(16px / 4) 0px\n rgba(0, 0, 0, 0.1),\n 0px calc(16px / 4) 12px 0px rgba(0, 0, 0, 0.05);\n box-shadow: var(--shadow-base);\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n overflow-y: scroll;\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n.y7Cz2u8BuNE-,\n._-7bmao8Q9As- {\n display: -ms-flexbox;\n display: flex;\n width: 100%;\n padding: calc(16px / 2);\n padding: var(--space-small);\n border: none;\n background-color: transparent;\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n -ms-flex-align: center;\n align-items: center;\n gap: calc(16px / 2);\n gap: var(--space-small);\n}\n\n.y7Cz2u8BuNE-:focus {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n\n.y7Cz2u8BuNE-:focus,\n.iCwWdcmtInc- {\n outline: none;\n background-color: rgb(244, 246, 250);\n background-color: var(--color-surface--hover);\n}\n\n._-7bmao8Q9As- {\n -ms-flex-pack: center;\n justify-content: center;\n}\n";
208
- var styles = {"wrapper":"sCNIjluCskc-","input":"MFUlz1WQLdk-","menu":"V9eYJdjPAeY-","menuList":"LdytkOeCU9c-","menuListOption":"y7Cz2u8BuNE-","loadingIndicator":"_-7bmao8Q9As-","activeOption":"iCwWdcmtInc-"};
209
- styleInject_es.styleInject(css_248z);
210
-
211
- function useInternalChipDismissible({ children, selected, onChange, onClick, onCustomAdd, }) {
212
- const ref = React.useRef(null);
213
- const chipOptions = children.map(chip => chip.props);
214
- const visibleChipOptions = chipOptions.filter(chip => selected.includes(chip.value));
215
- const sortedVisibleChipOptions = sortBy__default["default"](visibleChipOptions, chip => selected.indexOf(chip.value));
216
- const availableChipOptions = chipOptions.filter(chip => !selected.includes(chip.value));
217
- const { liveAnnounce } = useLiveAnnounce.useLiveAnnounce();
218
- const actions = {
219
- handleChipRemove: (value) => {
220
- return () => {
221
- liveAnnounce(`${value} Removed`);
222
- onChange(selected.filter(val => val !== value));
223
- };
224
- },
225
- handleChipAdd: (value) => onChange([...selected, value]),
226
- handleCustomAdd: onCustomAdd,
227
- handleChipClick: (value) => {
228
- if (onClick === undefined)
229
- return;
230
- return (event) => onClick(event, value);
231
- },
232
- handleWrapperKeyDown: (event) => {
233
- const target = event.target;
234
- const isInputAndHasValue = target instanceof HTMLInputElement && target.value;
235
- if (isInputAndHasValue)
236
- return;
237
- const nextElementToFocus = target.nextElementSibling;
238
- const prevElementToFocus = target.previousElementSibling;
239
- if (event.key === "ArrowLeft" &&
240
- prevElementToFocus instanceof HTMLElement) {
241
- prevElementToFocus.focus();
242
- }
243
- if (event.key === "ArrowRight" &&
244
- nextElementToFocus instanceof HTMLElement) {
245
- nextElementToFocus.focus();
246
- }
247
- },
248
- handleChipKeyDown: (value) => {
249
- return (event) => {
250
- if (event.key === "Backspace" || event.key === "Delete") {
251
- const target = event.target;
252
- if (target instanceof HTMLElement) {
253
- const prevElement = target.previousElementSibling;
254
- const nextElement = target.nextElementSibling;
255
- if (prevElement instanceof HTMLElement) {
256
- prevElement.focus();
257
- }
258
- else if (nextElement instanceof HTMLElement) {
259
- nextElement.focus();
260
- }
261
- }
262
- actions.handleChipRemove(value)();
263
- }
264
- };
265
- },
266
- };
267
- return Object.assign(Object.assign({}, actions), { ref,
268
- sortedVisibleChipOptions,
269
- availableChipOptions });
270
- }
271
-
272
- // eslint-disable-next-line max-statements
273
- function useInternalChipDismissibleInput({ options, isLoadingMore = false, onCustomOptionSelect, onOptionSelect, onSearch, }) {
274
- const menuId = React.useId();
275
- const [allOptions, setAllOptions] = React.useState([]);
276
- const [searchValue, setSearchValue] = React.useState("");
277
- const [menuOpen, setMenuOpen] = React.useState(false);
278
- const [activeIndex, setActiveIndex] = React.useState(0);
279
- const [shouldCancelBlur, setShouldCancelBlur] = React.useState(false);
280
- const [shouldCancelEnter, setShouldCancelEnter] = React.useState(false);
281
- const canAddCustomOption = onCustomOptionSelect !== undefined && !isLoadingMore;
282
- const maxOptionIndex = allOptions.length - 1;
283
- const { liveAnnounce } = useLiveAnnounce.useLiveAnnounce();
284
- React.useEffect(() => {
285
- setAllOptions(generateOptions(options, searchValue, canAddCustomOption));
286
- }, [options]);
287
- const computed = {
288
- menuId,
289
- inputRef: React.useRef(null),
290
- activeOption: allOptions[activeIndex],
291
- hasAvailableOptions: allOptions.length > 0,
292
- nextOptionIndex: activeIndex < maxOptionIndex ? activeIndex + 1 : 0,
293
- previousOptionIndex: activeIndex > 0 ? activeIndex - 1 : maxOptionIndex,
294
- };
295
- const actions = {
296
- generateDescendantId: (index) => `${computed.menuId}-${index}`,
297
- handleReset: () => {
298
- setActiveIndex(activeIndex === 0 ? activeIndex : activeIndex - 1);
299
- setSearchValue("");
300
- },
301
- handleOpenMenu: () => setMenuOpen(true),
302
- handleCloseMenu: () => {
303
- setMenuOpen(false);
304
- setActiveIndex(0);
305
- },
306
- handleCancelBlur: () => setShouldCancelBlur(true),
307
- handleEnableBlur: () => setShouldCancelBlur(false),
308
- handleBlur: () => {
309
- if (shouldCancelBlur)
310
- return;
311
- actions.handleReset();
312
- actions.handleCloseMenu();
313
- },
314
- handleSearchChange: (event) => {
315
- setActiveIndex(0);
316
- setSearchValue(event.currentTarget.value);
317
- setShouldCancelEnter(true);
318
- },
319
- handleSetActiveOnMouseOver: (index) => {
320
- return () => setActiveIndex(index);
321
- },
322
- handleSelectOption: (selected) => {
323
- var _a;
324
- if (allOptions.length === 0)
325
- return;
326
- const setValue = selected.custom ? onCustomOptionSelect : onOptionSelect;
327
- if (setValue) {
328
- setValue(selected.value);
329
- liveAnnounce(`${selected.label} Added`);
330
- actions.handleReset();
331
- (_a = computed.inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
332
- }
333
- },
334
- handleKeyDown: (event) => {
335
- const callbacks = {
336
- Enter: () => {
337
- if (shouldCancelEnter)
338
- return;
339
- actions.handleSelectOption(computed.activeOption);
340
- },
341
- Tab: () => actions.handleSelectOption(computed.activeOption),
342
- ",": () => {
343
- if (searchValue.length === 0)
344
- return;
345
- actions.handleSelectOption(generateCustomOptionObject(searchValue));
346
- },
347
- ArrowDown: () => {
348
- if (isLoadingMore && activeIndex === maxOptionIndex)
349
- return;
350
- setActiveIndex(computed.nextOptionIndex);
351
- },
352
- ArrowUp: () => setActiveIndex(computed.previousOptionIndex),
353
- };
354
- if (searchValue.length === 0) {
355
- callbacks.Backspace = () => {
356
- var _a;
357
- // If there's no text left to delete,
358
- // and delete is pressed again, focus on a chip instead.
359
- const target = (_a = computed.inputRef.current) === null || _a === void 0 ? void 0 : _a.previousElementSibling;
360
- if (target instanceof HTMLElement) {
361
- target.focus();
362
- }
363
- };
364
- }
365
- handleKeydownEvents(callbacks, event);
366
- },
367
- handleDebouncedSearch: debounce__default["default"](() => {
368
- onSearch && onSearch(searchValue);
369
- setAllOptions(generateOptions(options, searchValue, canAddCustomOption));
370
- setShouldCancelEnter(false);
371
- }, 300),
372
- };
373
- return Object.assign(Object.assign(Object.assign(Object.assign({}, actions), { activeIndex,
374
- allOptions }), computed), { menuOpen,
375
- searchValue,
376
- shouldCancelBlur });
377
- }
378
- function generateOptions(options, searchValue, canAddCustomOption) {
379
- const allOptions = options
380
- .filter(option => option.label.toLowerCase().match(searchValue.trim().toLowerCase()))
381
- .map(opt => (Object.assign(Object.assign({}, opt), { custom: false })));
382
- const { shouldAddCustomOption, customOption } = generateCustomOption(allOptions, searchValue, canAddCustomOption);
383
- shouldAddCustomOption && allOptions.push(customOption);
384
- return allOptions;
385
- }
386
- function generateCustomOption(options, searchValue, canAddCustomOption) {
387
- function shouldAddCustomOption() {
388
- const isMatchingOption = options.some(option => option.label.toLowerCase() === searchValue.trim().toLowerCase());
389
- return !!searchValue && !isMatchingOption;
390
- }
391
- return {
392
- shouldAddCustomOption: canAddCustomOption && shouldAddCustomOption(),
393
- customOption: generateCustomOptionObject(searchValue),
394
- };
395
- }
396
- function generateCustomOptionObject(searchValue) {
397
- return {
398
- value: searchValue,
399
- label: searchValue,
400
- prefix: React__default["default"].createElement(Icon.Icon, { name: "add" }),
401
- custom: true,
402
- };
403
- }
404
- function handleKeydownEvents(callbacks, event) {
405
- if (event.shiftKey)
406
- return;
407
- Object.entries(callbacks).forEach(([key, callback]) => {
408
- if (event.key === key) {
409
- event.preventDefault();
410
- callback(event);
411
- }
412
- });
413
- }
414
-
415
- function useInView() {
416
- const ref = React.useRef(null);
417
- const [isInView, setIsInView] = React.useState(false);
418
- if (window.IntersectionObserver) {
419
- const observer = new IntersectionObserver(entries => {
420
- setIsInView(entries[0].isIntersecting);
421
- });
422
- React.useEffect(() => {
423
- ref.current && observer.observe(ref.current);
424
- return () => {
425
- if (!ref.current)
426
- return;
427
- observer.unobserve(ref.current);
428
- };
429
- });
430
- }
431
- return { ref, isInView };
432
- }
433
-
434
- function useRepositionMenu(attachTo) {
435
- var _a;
436
- const [positionElement, setPositionedElementRef] = React.useState();
437
- const popper = reactPopper.usePopper(attachTo.current, positionElement, {
438
- modifiers: [
439
- { name: "offset", options: { offset: [0, 8] } },
440
- { name: "flip", options: { fallbackPlacements: ["top"] } },
441
- ],
442
- });
443
- const targetWidth = (_a = attachTo.current) === null || _a === void 0 ? void 0 : _a.clientWidth;
444
- return Object.assign(Object.assign({}, popper), { setPositionedElementRef, targetWidth });
445
- }
446
-
447
- function useScrollToActive(index) {
448
- const ref = React.useRef(null);
449
- React.useEffect(() => {
450
- var _a, _b;
451
- if (!window.HTMLElement.prototype.scrollIntoView)
452
- return;
453
- (_b = (_a = ref.current) === null || _a === void 0 ? void 0 : _a.children[index]) === null || _b === void 0 ? void 0 : _b.scrollIntoView({
454
- behavior: "smooth",
455
- block: "nearest",
456
- inline: "start",
457
- });
458
- }, [index]);
459
- return ref;
460
- }
461
-
462
- function InternalChipDismissibleInput(props) {
463
- const { activator = React__default["default"].createElement(Button.Button, { icon: "add", type: "secondary", ariaLabel: "Add" }), attachTo, isLoadingMore = false, onLoadMore, } = props;
464
- const { activeIndex, allOptions, hasAvailableOptions, inputRef, menuId, menuOpen, searchValue, generateDescendantId, handleBlur, handleOpenMenu, handleSearchChange, handleCancelBlur, handleEnableBlur, handleSetActiveOnMouseOver, handleKeyDown, handleSelectOption, handleDebouncedSearch, } = useInternalChipDismissibleInput(props);
465
- const menuRef = useScrollToActive(activeIndex);
466
- const { ref: visibleChildRef, isInView } = useInView();
467
- const { styles: popperStyles, attributes, update, setPositionedElementRef, } = useRepositionMenu(attachTo);
468
- React.useEffect(() => {
469
- if (menuOpen && update)
470
- update();
471
- }, [allOptions]);
472
- React.useEffect(() => {
473
- handleDebouncedSearch();
474
- return handleDebouncedSearch.cancel;
475
- }, [searchValue]);
476
- React.useEffect(() => {
477
- isInView && onLoadMore && onLoadMore(searchValue);
478
- }, [isInView]);
479
- if (!menuOpen) {
480
- return React__default["default"].cloneElement(activator, { onClick: handleOpenMenu });
481
- }
482
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
483
- React__default["default"].createElement("input", { ref: inputRef, className: styles.input, type: "text", role: "combobox", "aria-label": "Press up and down arrow to cycle through the options or type to narrow down the results", "aria-autocomplete": "list", "aria-owns": menuId, "aria-expanded": hasAvailableOptions, "aria-activedescendant": generateDescendantId(activeIndex), value: searchValue, onChange: handleSearchChange, onKeyDown: handleKeyDown, onBlur: debounce__default["default"](handleBlur, 200), onFocus: handleOpenMenu, autoFocus: true }),
484
- (hasAvailableOptions || isLoadingMore) && (React__default["default"].createElement("div", Object.assign({ ref: setPositionedElementRef, className: styles.menu, style: popperStyles.popper }, attributes.popper),
485
- React__default["default"].createElement("div", { ref: menuRef, role: "listbox", id: menuId, className: styles.menuList, "data-testid": "chip-menu" },
486
- allOptions.map((option, i) => (React__default["default"].createElement("button", { key: option.value, role: "option", type: "button", id: generateDescendantId(i), className: classnames__default["default"](styles.menuListOption, {
487
- [styles.activeOption]: activeIndex === i,
488
- }), onClick: () => handleSelectOption(option), onMouseEnter: handleSetActiveOnMouseOver(i), onMouseDown: handleCancelBlur, onMouseUp: handleEnableBlur },
489
- React__default["default"].createElement("span", { "aria-hidden": true }, option.prefix),
490
- React__default["default"].createElement(Text.Text, null, option.label)))),
491
- React__default["default"].createElement("div", { ref: visibleChildRef }),
492
- isLoadingMore && (React__default["default"].createElement("div", { className: styles.loadingIndicator },
493
- React__default["default"].createElement(Spinner.Spinner, { size: "small", inline: true }))))))));
494
- }
495
-
496
- function InternalChipDismissible(props) {
497
- const { availableChipOptions, ref: wrapperRef, sortedVisibleChipOptions, handleChipAdd, handleChipClick, handleChipKeyDown, handleChipRemove, handleCustomAdd, handleWrapperKeyDown, } = useInternalChipDismissible(props);
498
- return (React__default["default"].createElement("div", { ref: wrapperRef, className: styles.wrapper, "data-testid": "dismissible-chips", onKeyDown: handleWrapperKeyDown, role: "listbox" },
499
- sortedVisibleChipOptions.map(chip => (React__default["default"].createElement(InternalChip, Object.assign({ key: chip.value }, chip, { onKeyDown: handleChipKeyDown(chip.value), onClick: handleChipClick(chip.value), ariaLabel: `${chip.label}. Press delete or backspace to remove ${chip.label}`, tabIndex: 0, suffix: React__default["default"].createElement(InternalChipButton, { icon: "remove", invalid: chip.invalid, disabled: chip.disabled, label: chip.label, onClick: handleChipRemove(chip.value) }) })))),
500
- React__default["default"].createElement(InternalChipDismissibleInput, { activator: props.activator, attachTo: wrapperRef, isLoadingMore: props.isLoadingMore, options: availableChipOptions, onOptionSelect: handleChipAdd, onCustomOptionSelect: handleCustomAdd, onSearch: props.onSearch, onLoadMore: props.onLoadMore })));
501
- }
502
-
503
- function Chips(props) {
504
- switch (props.type) {
505
- case "dismissible":
506
- return React__default["default"].createElement(InternalChipDismissible, Object.assign({}, props));
507
- case "multiselect":
508
- return React__default["default"].createElement(InternalChipMultiSelect, Object.assign({}, props));
509
- default:
510
- return React__default["default"].createElement(InternalChipSingleSelect, Object.assign({}, props));
511
- }
512
- }
513
-
514
- // Only need the component to pass in the data as a react children
515
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
516
- function Chip(props) {
517
- // Throw error when <Chip /> gets used outside of the <Chips />
518
- useAssert.useAssert(true, "`<Chip>` component can only be used inside `<Chips>`");
519
- return React__default["default"].createElement(React__default["default"].Fragment, null);
520
- }
521
-
522
- exports.Chip = Chip;
523
- exports.ChipDismissible = ChipDismissible;
524
- exports.Chips = Chips;
@@ -1,40 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var Combobox = require('../Combobox-a24c8241.js');
6
- require('react');
7
- require('classnames');
8
- require('react-dom');
9
- require('../style-inject.es-9d2f5f4e.js');
10
- require('../Icon-405a216c.js');
11
- require('@jobber/design');
12
- require('../Text-259af966.js');
13
- require('../Typography-c45bf216.js');
14
- require('../Glimmer-84dee1ed.js');
15
- require('../tslib.es6-754e2961.js');
16
- require('../Content-e3f7b6fc.js');
17
- require('../Spinner-9d8fc7ff.js');
18
- require('../AnimatedPresence-20a02aaa.js');
19
- require('framer-motion');
20
- require('../Flex-d490c4db.js');
21
- require('@jobber/hooks/useInView');
22
- require('../Button-b73a5e01.js');
23
- require('react-router-dom');
24
- require('@jobber/hooks/useRefocusOnActivator');
25
- require('@jobber/hooks/useFocusTrap');
26
- require('react-popper');
27
- require('@jobber/hooks/useOnKeyDown');
28
- require('../Chip-3d1bfddc.js');
29
- require('../Avatar-76a799fa.js');
30
- require('color');
31
- require('../Tooltip-ef3d6ef4.js');
32
- require('@jobber/hooks/useSafeLayoutEffect');
33
- require('lodash/debounce');
34
- require('lodash/noop');
35
- require('@jobber/hooks/useAssert');
36
-
37
-
38
-
39
- exports.Combobox = Combobox.Combobox;
40
- exports.ComboboxContextProvider = Combobox.ComboboxContextProvider;