@assembly-js/design-system 3.1.1 → 3.1.3
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/dist/esm/components/Icon.js +38 -0
- package/dist/esm/components/IconPicker/IconGrid.js +201 -0
- package/dist/esm/components/IconPicker/IconPicker.js +254 -0
- package/dist/esm/components/IconPicker/__tests__/searchIcons.test.js +55 -0
- package/dist/esm/components/IconPicker/dsPickerIcons.js +18 -0
- package/dist/esm/components/IconPicker/icons.generated.js +3 -0
- package/dist/esm/components/IconPicker/index.js +3 -0
- package/dist/esm/components/IconPicker/pickerIcons.js +20 -0
- package/dist/esm/components/IconPicker/searchIcons.js +122 -0
- package/dist/esm/icons/ChevronLeft.js +2 -2
- package/dist/esm/icons/Details.js +20 -0
- package/dist/esm/icons/iconToFaMap.js +309 -0
- package/dist/esm/icons/index.js +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/types/components/Avatar/Avatar.d.ts +4 -4
- package/dist/esm/types/components/Icon.d.ts +10 -1
- package/dist/esm/types/components/IconPicker/IconGrid.d.ts +13 -0
- package/dist/esm/types/components/IconPicker/IconPicker.d.ts +15 -0
- package/dist/esm/types/components/IconPicker/IconPicker.stories.d.ts +8 -0
- package/dist/esm/types/components/IconPicker/__tests__/searchIcons.test.d.ts +1 -0
- package/dist/esm/types/components/IconPicker/dsPickerIcons.d.ts +7 -0
- package/dist/esm/types/components/IconPicker/icons.generated.d.ts +9 -0
- package/dist/esm/types/components/IconPicker/index.d.ts +3 -0
- package/dist/esm/types/components/IconPicker/pickerIcons.d.ts +8 -0
- package/dist/esm/types/components/IconPicker/searchIcons.d.ts +2 -0
- package/dist/esm/types/components/Toast/Toast.d.ts +1 -1
- package/dist/esm/types/icons/Details.d.ts +3 -0
- package/dist/esm/types/icons/iconToFaMap.d.ts +8 -0
- package/dist/esm/types/icons/index.d.ts +1 -0
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/tsconfig.tsbuildinfo +1 -1
- package/dist/styles/main.css +1 -1
- package/dist/types/components/Avatar/Avatar.d.ts +4 -4
- package/dist/types/components/Icon.d.ts +10 -1
- package/dist/types/components/IconPicker/IconGrid.d.ts +13 -0
- package/dist/types/components/IconPicker/IconPicker.d.ts +15 -0
- package/dist/types/components/IconPicker/IconPicker.stories.d.ts +8 -0
- package/dist/types/components/IconPicker/__tests__/searchIcons.test.d.ts +1 -0
- package/dist/types/components/IconPicker/dsPickerIcons.d.ts +7 -0
- package/dist/types/components/IconPicker/icons.generated.d.ts +9 -0
- package/dist/types/components/IconPicker/index.d.ts +3 -0
- package/dist/types/components/IconPicker/pickerIcons.d.ts +8 -0
- package/dist/types/components/IconPicker/searchIcons.d.ts +2 -0
- package/dist/types/components/Toast/Toast.d.ts +1 -1
- package/dist/types/icons/Details.d.ts +3 -0
- package/dist/types/icons/iconToFaMap.d.ts +8 -0
- package/dist/types/icons/index.d.ts +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/umd/components/Icon.js +40 -4
- package/dist/umd/components/IconPicker/IconGrid.js +222 -0
- package/dist/umd/components/IconPicker/IconPicker.js +269 -0
- package/dist/umd/components/IconPicker/__tests__/searchIcons.test.js +70 -0
- package/dist/umd/components/IconPicker/dsPickerIcons.js +41 -0
- package/dist/umd/components/IconPicker/icons.generated.js +3 -0
- package/dist/umd/components/IconPicker/index.js +28 -0
- package/dist/umd/components/IconPicker/pickerIcons.js +38 -0
- package/dist/umd/components/IconPicker/searchIcons.js +141 -0
- package/dist/umd/icons/ChevronLeft.js +2 -2
- package/dist/umd/icons/Details.js +43 -0
- package/dist/umd/icons/iconToFaMap.js +329 -0
- package/dist/umd/icons/index.js +14 -4
- package/dist/umd/index.js +14 -4
- package/dist/umd/types/components/Avatar/Avatar.d.ts +4 -4
- package/dist/umd/types/components/Icon.d.ts +10 -1
- package/dist/umd/types/components/IconPicker/IconGrid.d.ts +13 -0
- package/dist/umd/types/components/IconPicker/IconPicker.d.ts +15 -0
- package/dist/umd/types/components/IconPicker/IconPicker.stories.d.ts +8 -0
- package/dist/umd/types/components/IconPicker/__tests__/searchIcons.test.d.ts +1 -0
- package/dist/umd/types/components/IconPicker/dsPickerIcons.d.ts +7 -0
- package/dist/umd/types/components/IconPicker/icons.generated.d.ts +9 -0
- package/dist/umd/types/components/IconPicker/index.d.ts +3 -0
- package/dist/umd/types/components/IconPicker/pickerIcons.d.ts +8 -0
- package/dist/umd/types/components/IconPicker/searchIcons.d.ts +2 -0
- package/dist/umd/types/components/Toast/Toast.d.ts +1 -1
- package/dist/umd/types/icons/Details.d.ts +3 -0
- package/dist/umd/types/icons/iconToFaMap.d.ts +8 -0
- package/dist/umd/types/icons/index.d.ts +1 -0
- package/dist/umd/types/index.d.ts +1 -0
- package/dist/umd/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -2
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
3
3
|
(function (global, factory) {
|
|
4
4
|
if (typeof define === "function" && define.amd) {
|
|
5
|
-
define(["exports", "react", "../icons"], factory);
|
|
5
|
+
define(["exports", "react", "../icons", "./IconPicker/icons.generated", "../icons/iconToFaMap"], factory);
|
|
6
6
|
} else if (typeof exports !== "undefined") {
|
|
7
|
-
factory(exports, require("react"), require("../icons"));
|
|
7
|
+
factory(exports, require("react"), require("../icons"), require("./IconPicker/icons.generated"), require("../icons/iconToFaMap"));
|
|
8
8
|
} else {
|
|
9
9
|
var mod = {
|
|
10
10
|
exports: {}
|
|
11
11
|
};
|
|
12
|
-
factory(mod.exports, global.react, global.icons);
|
|
12
|
+
factory(mod.exports, global.react, global.icons, global.icons, global.iconToFaMap);
|
|
13
13
|
global.Icon = mod.exports;
|
|
14
14
|
}
|
|
15
|
-
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _react, icons) {
|
|
15
|
+
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _react, icons, _icons2, _iconToFaMap) {
|
|
16
16
|
"use strict";
|
|
17
17
|
|
|
18
18
|
Object.defineProperty(_exports, "__esModule", {
|
|
@@ -25,11 +25,47 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
|
|
|
25
25
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
26
26
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
27
27
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
28
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
28
29
|
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], t.indexOf(o) >= 0 || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
29
30
|
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.indexOf(n) >= 0) continue; t[n] = r[n]; } return t; }
|
|
31
|
+
var faIconMap;
|
|
32
|
+
function getFAIconMap() {
|
|
33
|
+
if (!faIconMap) {
|
|
34
|
+
faIconMap = new Map(_icons2.icons.map(function (i) {
|
|
35
|
+
return [i.name, i];
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
return faIconMap;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Icon component that renders either a Font Awesome icon or a Design System icon.
|
|
43
|
+
* it checks if the icon name is in the Font Awesome icon set and renders the corresponding icon.
|
|
44
|
+
* if not, it falls back to the Design System icon set and renders the corresponding icon.
|
|
45
|
+
* @param icon - The name of the icon to render.
|
|
46
|
+
* @param props - The props to pass to the icon component.
|
|
47
|
+
* @returns The icon component.
|
|
48
|
+
*/
|
|
30
49
|
var Icon = _exports.Icon = function Icon(_ref) {
|
|
31
50
|
var icon = _ref.icon,
|
|
32
51
|
props = _objectWithoutProperties(_ref, _excluded);
|
|
52
|
+
var mappedFaIcon = _iconToFaMap.iconToFaMap[icon];
|
|
53
|
+
|
|
54
|
+
// if the icon name has a mapped fa icon, render the mapped fa icon, otherwise render the fa icon
|
|
55
|
+
var faIcon = mappedFaIcon ? getFAIconMap().get(mappedFaIcon) : getFAIconMap().get(icon);
|
|
56
|
+
if (faIcon) {
|
|
57
|
+
return /*#__PURE__*/_react["default"].createElement("svg", _extends({
|
|
58
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
59
|
+
viewBox: faIcon.viewBox,
|
|
60
|
+
fill: "currentColor",
|
|
61
|
+
overflow: "visible",
|
|
62
|
+
"aria-hidden": "true"
|
|
63
|
+
}, props), /*#__PURE__*/_react["default"].createElement("path", {
|
|
64
|
+
d: faIcon.path
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Fall back to DS icon
|
|
33
69
|
var IconComponent = icons[icon];
|
|
34
70
|
if (!IconComponent) return null;
|
|
35
71
|
return /*#__PURE__*/_react["default"].createElement(IconComponent, props);
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
// This file is generated by a script. Do not edit this file directly.
|
|
2
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
3
|
+
(function (global, factory) {
|
|
4
|
+
if (typeof define === "function" && define.amd) {
|
|
5
|
+
define(["exports", "react", "../../common/utils", "../Button/Base"], factory);
|
|
6
|
+
} else if (typeof exports !== "undefined") {
|
|
7
|
+
factory(exports, require("react"), require("../../common/utils"), require("../Button/Base"));
|
|
8
|
+
} else {
|
|
9
|
+
var mod = {
|
|
10
|
+
exports: {}
|
|
11
|
+
};
|
|
12
|
+
factory(mod.exports, global.react, global.utils, global.Base);
|
|
13
|
+
global.IconGrid = mod.exports;
|
|
14
|
+
}
|
|
15
|
+
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _react, _utils, _Base) {
|
|
16
|
+
"use strict";
|
|
17
|
+
|
|
18
|
+
Object.defineProperty(_exports, "__esModule", {
|
|
19
|
+
value: true
|
|
20
|
+
});
|
|
21
|
+
_exports.IconGrid = void 0;
|
|
22
|
+
_react = _interopRequireWildcard(_react);
|
|
23
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
24
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
25
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
26
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
27
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
28
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
29
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
30
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
31
|
+
function renderIcon(icon) {
|
|
32
|
+
if (icon.source === 'ds') {
|
|
33
|
+
return /*#__PURE__*/_react["default"].createElement(icon.Component, {
|
|
34
|
+
className: "cop-h-[19px] cop-w-[19px]",
|
|
35
|
+
"aria-hidden": "true"
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return /*#__PURE__*/_react["default"].createElement("svg", {
|
|
39
|
+
viewBox: icon.viewBox,
|
|
40
|
+
fill: "currentColor",
|
|
41
|
+
className: "cop-h-[19px] cop-w-[19px]",
|
|
42
|
+
overflow: "visible",
|
|
43
|
+
"aria-hidden": "true"
|
|
44
|
+
}, /*#__PURE__*/_react["default"].createElement("path", {
|
|
45
|
+
d: icon.path
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
var COLUMNS = 8;
|
|
49
|
+
var IconGrid = _exports.IconGrid = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
50
|
+
var icons = _ref.icons,
|
|
51
|
+
onSelect = _ref.onSelect,
|
|
52
|
+
selectedIcon = _ref.selectedIcon,
|
|
53
|
+
onEscapeFromGrid = _ref.onEscapeFromGrid;
|
|
54
|
+
var _useState = (0, _react.useState)(-1),
|
|
55
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
56
|
+
focusedIndex = _useState2[0],
|
|
57
|
+
setFocusedIndex = _useState2[1];
|
|
58
|
+
var itemRefs = (0, _react.useRef)([]);
|
|
59
|
+
var hasScrolledToSelected = (0, _react.useRef)(false);
|
|
60
|
+
|
|
61
|
+
// Expose focusFirst so the parent can transfer focus into the grid
|
|
62
|
+
(0, _react.useImperativeHandle)(ref, function () {
|
|
63
|
+
return {
|
|
64
|
+
focusFirst: function focusFirst() {
|
|
65
|
+
var selectedIdx = icons.findIndex(function (icon) {
|
|
66
|
+
return icon.name === selectedIcon;
|
|
67
|
+
});
|
|
68
|
+
setFocusedIndex(selectedIdx >= 0 ? selectedIdx : 0);
|
|
69
|
+
},
|
|
70
|
+
resetFocus: function resetFocus() {
|
|
71
|
+
setFocusedIndex(-1);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Reset focused index and trim stale refs when the icon list changes
|
|
77
|
+
(0, _react.useEffect)(function () {
|
|
78
|
+
setFocusedIndex(-1);
|
|
79
|
+
itemRefs.current.length = icons.length;
|
|
80
|
+
}, [icons]);
|
|
81
|
+
|
|
82
|
+
// Focus the item at focusedIndex when it changes
|
|
83
|
+
(0, _react.useEffect)(function () {
|
|
84
|
+
if (focusedIndex >= 0 && focusedIndex < icons.length) {
|
|
85
|
+
var el = itemRefs.current[focusedIndex];
|
|
86
|
+
var btn = el === null || el === void 0 ? void 0 : el.querySelector('button');
|
|
87
|
+
btn === null || btn === void 0 || btn.focus();
|
|
88
|
+
el === null || el === void 0 || el.scrollIntoView({
|
|
89
|
+
block: 'nearest'
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}, [focusedIndex, icons.length]);
|
|
93
|
+
var handleKeyDown = (0, _react.useCallback)(function (e) {
|
|
94
|
+
var len = icons.length;
|
|
95
|
+
if (len === 0) return;
|
|
96
|
+
var nextIndex = focusedIndex;
|
|
97
|
+
var col = focusedIndex % COLUMNS;
|
|
98
|
+
switch (e.key) {
|
|
99
|
+
case 'ArrowRight':
|
|
100
|
+
// Stop at end of row
|
|
101
|
+
if (col < COLUMNS - 1 && focusedIndex + 1 < len) {
|
|
102
|
+
nextIndex = focusedIndex + 1;
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
case 'ArrowLeft':
|
|
106
|
+
// Stop at start of row
|
|
107
|
+
if (col > 0) {
|
|
108
|
+
nextIndex = focusedIndex - 1;
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
case 'ArrowDown':
|
|
112
|
+
nextIndex = focusedIndex + COLUMNS;
|
|
113
|
+
break;
|
|
114
|
+
case 'ArrowUp':
|
|
115
|
+
// If in the top row, escape back to search
|
|
116
|
+
if (focusedIndex < COLUMNS) {
|
|
117
|
+
onEscapeFromGrid === null || onEscapeFromGrid === void 0 || onEscapeFromGrid();
|
|
118
|
+
setFocusedIndex(-1);
|
|
119
|
+
e.preventDefault();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
nextIndex = focusedIndex - COLUMNS;
|
|
123
|
+
break;
|
|
124
|
+
case 'Home':
|
|
125
|
+
nextIndex = 0;
|
|
126
|
+
break;
|
|
127
|
+
case 'End':
|
|
128
|
+
nextIndex = len - 1;
|
|
129
|
+
break;
|
|
130
|
+
case 'Enter':
|
|
131
|
+
{
|
|
132
|
+
var icon = icons[focusedIndex];
|
|
133
|
+
if (focusedIndex >= 0 && icon) {
|
|
134
|
+
onSelect(icon);
|
|
135
|
+
}
|
|
136
|
+
e.preventDefault();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
default:
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
e.preventDefault();
|
|
143
|
+
// Clamp within bounds
|
|
144
|
+
nextIndex = Math.max(0, Math.min(nextIndex, len - 1));
|
|
145
|
+
setFocusedIndex(nextIndex);
|
|
146
|
+
}, [focusedIndex, icons, onSelect, onEscapeFromGrid]);
|
|
147
|
+
|
|
148
|
+
// Find the boundary between DS and FA icons (for the divider)
|
|
149
|
+
var dividerIndex = (0, _react.useMemo)(function () {
|
|
150
|
+
var firstFaIdx = icons.findIndex(function (icon) {
|
|
151
|
+
return icon.source === 'fa';
|
|
152
|
+
});
|
|
153
|
+
// Show divider only when both DS and FA icons are present
|
|
154
|
+
if (firstFaIdx > 0 && icons.some(function (icon) {
|
|
155
|
+
return icon.source === 'ds';
|
|
156
|
+
})) {
|
|
157
|
+
return firstFaIdx;
|
|
158
|
+
}
|
|
159
|
+
return -1;
|
|
160
|
+
}, [icons]);
|
|
161
|
+
|
|
162
|
+
// Row index where the divider appears (between DS and FA sections)
|
|
163
|
+
var dividerRowIndex = dividerIndex > 0 ? Math.ceil(dividerIndex / COLUMNS) : -1;
|
|
164
|
+
|
|
165
|
+
// Chunk icons into rows for proper ARIA grid hierarchy
|
|
166
|
+
var rows = (0, _react.useMemo)(function () {
|
|
167
|
+
var result = [];
|
|
168
|
+
for (var i = 0; i < icons.length; i += COLUMNS) {
|
|
169
|
+
result.push(icons.slice(i, i + COLUMNS));
|
|
170
|
+
}
|
|
171
|
+
return result;
|
|
172
|
+
}, [icons]);
|
|
173
|
+
if (icons.length === 0) {
|
|
174
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
175
|
+
className: "cop-flex cop-h-[262px] cop-items-center cop-justify-center"
|
|
176
|
+
}, /*#__PURE__*/_react["default"].createElement("p", {
|
|
177
|
+
className: "cop-text-sm cop-text-[#6b6f76]"
|
|
178
|
+
}, "No icons found"));
|
|
179
|
+
}
|
|
180
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
181
|
+
role: "grid",
|
|
182
|
+
"aria-label": "Icon grid",
|
|
183
|
+
onKeyDown: handleKeyDown,
|
|
184
|
+
className: "cop--m-[3px] cop-grid cop-h-[262px] cop-content-start cop-overflow-y-auto cop-p-[3px] [scrollbar-color:rgba(0,0,0,0.2)_transparent] [scrollbar-width:thin]"
|
|
185
|
+
}, rows.map(function (row, rowIndex) {
|
|
186
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, {
|
|
187
|
+
key: rowIndex
|
|
188
|
+
}, rowIndex === dividerRowIndex && /*#__PURE__*/_react["default"].createElement("div", {
|
|
189
|
+
role: "separator",
|
|
190
|
+
className: "cop-my-2 cop-h-px cop-bg-[#eff1f4]"
|
|
191
|
+
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
192
|
+
role: "row",
|
|
193
|
+
className: "cop-grid cop-grid-cols-[repeat(8,1fr)] cop-gap-x-[6px] cop-gap-y-[8px]"
|
|
194
|
+
}, row.map(function (icon, colIndex) {
|
|
195
|
+
var flatIndex = rowIndex * COLUMNS + colIndex;
|
|
196
|
+
var isSelected = selectedIcon === icon.name;
|
|
197
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
198
|
+
key: icon.name,
|
|
199
|
+
role: "gridcell",
|
|
200
|
+
ref: function ref(el) {
|
|
201
|
+
itemRefs.current[flatIndex] = el;
|
|
202
|
+
if (isSelected && el && !hasScrolledToSelected.current) {
|
|
203
|
+
hasScrolledToSelected.current = true;
|
|
204
|
+
el.scrollIntoView({
|
|
205
|
+
block: 'nearest'
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}, /*#__PURE__*/_react["default"].createElement(_Base.BaseButton, {
|
|
210
|
+
variant: "minimal",
|
|
211
|
+
tabIndex: flatIndex === focusedIndex ? 0 : -1,
|
|
212
|
+
onClick: function onClick() {
|
|
213
|
+
return onSelect(icon);
|
|
214
|
+
},
|
|
215
|
+
"aria-label": icon.name,
|
|
216
|
+
className: (0, _utils.cn)('cop-p-[5px]', isSelected && 'cop-bg-secondary cop-text-gray-700 hover:cop-border-secondary hover:cop-bg-secondary')
|
|
217
|
+
}, renderIcon(icon)));
|
|
218
|
+
})));
|
|
219
|
+
}));
|
|
220
|
+
});
|
|
221
|
+
IconGrid.displayName = 'IconGrid';
|
|
222
|
+
});
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// This file is generated by a script. Do not edit this file directly.
|
|
2
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
3
|
+
(function (global, factory) {
|
|
4
|
+
if (typeof define === "function" && define.amd) {
|
|
5
|
+
define(["exports", "react", "react-dom", "../../common/utils", "../Button/Base", "../Input", "./IconGrid", "./searchIcons", "./pickerIcons", "../../icons/iconToFaMap"], factory);
|
|
6
|
+
} else if (typeof exports !== "undefined") {
|
|
7
|
+
factory(exports, require("react"), require("react-dom"), require("../../common/utils"), require("../Button/Base"), require("../Input"), require("./IconGrid"), require("./searchIcons"), require("./pickerIcons"), require("../../icons/iconToFaMap"));
|
|
8
|
+
} else {
|
|
9
|
+
var mod = {
|
|
10
|
+
exports: {}
|
|
11
|
+
};
|
|
12
|
+
factory(mod.exports, global.react, global.reactDom, global.utils, global.Base, global.Input, global.IconGrid, global.searchIcons, global.pickerIcons, global.iconToFaMap);
|
|
13
|
+
global.IconPicker = mod.exports;
|
|
14
|
+
}
|
|
15
|
+
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, React, _reactDom, _utils, _Base, _Input, _IconGrid, _searchIcons, _pickerIcons, _iconToFaMap) {
|
|
16
|
+
"use strict";
|
|
17
|
+
'use client';
|
|
18
|
+
|
|
19
|
+
Object.defineProperty(_exports, "__esModule", {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
_exports.IconPicker = void 0;
|
|
23
|
+
React = _interopRequireWildcard(React);
|
|
24
|
+
_reactDom = _interopRequireDefault(_reactDom);
|
|
25
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
26
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
27
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
28
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
29
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
30
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
31
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
32
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
33
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
34
|
+
var IconPicker = _exports.IconPicker = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
35
|
+
var value = _ref.value,
|
|
36
|
+
onChange = _ref.onChange,
|
|
37
|
+
defaultValue = _ref.defaultValue,
|
|
38
|
+
_ref$placeholder = _ref.placeholder,
|
|
39
|
+
placeholder = _ref$placeholder === void 0 ? 'Select an icon' : _ref$placeholder,
|
|
40
|
+
className = _ref.className,
|
|
41
|
+
_ref$disabled = _ref.disabled,
|
|
42
|
+
disabled = _ref$disabled === void 0 ? false : _ref$disabled;
|
|
43
|
+
var isControlled = value !== undefined;
|
|
44
|
+
var _React$useState = React.useState(defaultValue),
|
|
45
|
+
_React$useState2 = _slicedToArray(_React$useState, 2),
|
|
46
|
+
internalValue = _React$useState2[0],
|
|
47
|
+
setInternalValue = _React$useState2[1];
|
|
48
|
+
var selectedIcon = React.useMemo(function () {
|
|
49
|
+
if (isControlled) {
|
|
50
|
+
// if the icon value is a legacy icon picker value
|
|
51
|
+
if (_iconToFaMap.iconToFaMap[value]) {
|
|
52
|
+
return _iconToFaMap.iconToFaMap[value];
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
} else {
|
|
56
|
+
return internalValue;
|
|
57
|
+
}
|
|
58
|
+
}, [isControlled, value, internalValue]);
|
|
59
|
+
var selectedIconData = React.useMemo(function () {
|
|
60
|
+
return _pickerIcons.pickerIcons.find(function (icon) {
|
|
61
|
+
return icon.name === selectedIcon;
|
|
62
|
+
});
|
|
63
|
+
}, [selectedIcon]);
|
|
64
|
+
var _React$useState3 = React.useState(false),
|
|
65
|
+
_React$useState4 = _slicedToArray(_React$useState3, 2),
|
|
66
|
+
open = _React$useState4[0],
|
|
67
|
+
setOpen = _React$useState4[1];
|
|
68
|
+
var _React$useState5 = React.useState(''),
|
|
69
|
+
_React$useState6 = _slicedToArray(_React$useState5, 2),
|
|
70
|
+
search = _React$useState6[0],
|
|
71
|
+
setSearch = _React$useState6[1];
|
|
72
|
+
var _React$useState7 = React.useState(''),
|
|
73
|
+
_React$useState8 = _slicedToArray(_React$useState7, 2),
|
|
74
|
+
debouncedSearch = _React$useState8[0],
|
|
75
|
+
setDebouncedSearch = _React$useState8[1];
|
|
76
|
+
var triggerRef = React.useRef(null);
|
|
77
|
+
var popoverRef = React.useRef(null);
|
|
78
|
+
var searchInputRef = React.useRef(null);
|
|
79
|
+
var gridRef = React.useRef(null);
|
|
80
|
+
var _React$useState9 = React.useState({
|
|
81
|
+
top: 0,
|
|
82
|
+
left: 0
|
|
83
|
+
}),
|
|
84
|
+
_React$useState10 = _slicedToArray(_React$useState9, 2),
|
|
85
|
+
coords = _React$useState10[0],
|
|
86
|
+
setCoords = _React$useState10[1];
|
|
87
|
+
|
|
88
|
+
// Merge forwarded ref with internal ref
|
|
89
|
+
React.useImperativeHandle(ref, function () {
|
|
90
|
+
return triggerRef.current;
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Debounce search input
|
|
94
|
+
React.useEffect(function () {
|
|
95
|
+
var timeout = setTimeout(function () {
|
|
96
|
+
return setDebouncedSearch(search);
|
|
97
|
+
}, 200);
|
|
98
|
+
return function () {
|
|
99
|
+
return clearTimeout(timeout);
|
|
100
|
+
};
|
|
101
|
+
}, [search]);
|
|
102
|
+
|
|
103
|
+
// Filter icons by search
|
|
104
|
+
var filteredIcons = React.useMemo(function () {
|
|
105
|
+
return (0, _searchIcons.searchIcons)(debouncedSearch, _pickerIcons.pickerIcons);
|
|
106
|
+
}, [debouncedSearch]);
|
|
107
|
+
|
|
108
|
+
// Position popover below trigger with viewport boundary checks
|
|
109
|
+
var updatePosition = React.useCallback(function () {
|
|
110
|
+
var _popoverRef$current$o, _popoverRef$current;
|
|
111
|
+
if (!triggerRef.current) return;
|
|
112
|
+
var rect = triggerRef.current.getBoundingClientRect();
|
|
113
|
+
var popoverWidth = 330;
|
|
114
|
+
var popoverHeight = (_popoverRef$current$o = (_popoverRef$current = popoverRef.current) === null || _popoverRef$current === void 0 ? void 0 : _popoverRef$current.offsetHeight) !== null && _popoverRef$current$o !== void 0 ? _popoverRef$current$o : 300;
|
|
115
|
+
var gap = 4;
|
|
116
|
+
var top = rect.bottom + gap;
|
|
117
|
+
var left = rect.left;
|
|
118
|
+
|
|
119
|
+
// If popover overflows bottom, position above trigger
|
|
120
|
+
if (top + popoverHeight > window.innerHeight) {
|
|
121
|
+
top = rect.top - gap - popoverHeight;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Clamp horizontal position within viewport
|
|
125
|
+
if (left + popoverWidth > window.innerWidth) {
|
|
126
|
+
left = window.innerWidth - popoverWidth - gap;
|
|
127
|
+
}
|
|
128
|
+
if (left < gap) {
|
|
129
|
+
left = gap;
|
|
130
|
+
}
|
|
131
|
+
setCoords({
|
|
132
|
+
top: top,
|
|
133
|
+
left: left
|
|
134
|
+
});
|
|
135
|
+
}, []);
|
|
136
|
+
|
|
137
|
+
// Update position when opened
|
|
138
|
+
React.useLayoutEffect(function () {
|
|
139
|
+
if (open) {
|
|
140
|
+
updatePosition();
|
|
141
|
+
// Focus search input after positioning
|
|
142
|
+
requestAnimationFrame(function () {
|
|
143
|
+
var _searchInputRef$curre;
|
|
144
|
+
return (_searchInputRef$curre = searchInputRef.current) === null || _searchInputRef$curre === void 0 ? void 0 : _searchInputRef$curre.focus();
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}, [open, updatePosition]);
|
|
148
|
+
|
|
149
|
+
// Lock body scroll while open and reposition on resize
|
|
150
|
+
React.useEffect(function () {
|
|
151
|
+
if (!open) return;
|
|
152
|
+
var prevOverflow = document.body.style.overflow;
|
|
153
|
+
document.body.style.overflow = 'hidden';
|
|
154
|
+
window.addEventListener('resize', updatePosition);
|
|
155
|
+
return function () {
|
|
156
|
+
document.body.style.overflow = prevOverflow;
|
|
157
|
+
window.removeEventListener('resize', updatePosition);
|
|
158
|
+
};
|
|
159
|
+
}, [open, updatePosition]);
|
|
160
|
+
|
|
161
|
+
// Close on outside click
|
|
162
|
+
React.useEffect(function () {
|
|
163
|
+
if (!open) return;
|
|
164
|
+
var handleMouseDown = function handleMouseDown(e) {
|
|
165
|
+
var _triggerRef$current, _popoverRef$current2;
|
|
166
|
+
var target = e.target;
|
|
167
|
+
if ((_triggerRef$current = triggerRef.current) !== null && _triggerRef$current !== void 0 && _triggerRef$current.contains(target) || (_popoverRef$current2 = popoverRef.current) !== null && _popoverRef$current2 !== void 0 && _popoverRef$current2.contains(target)) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
setOpen(false);
|
|
171
|
+
setSearch('');
|
|
172
|
+
};
|
|
173
|
+
document.addEventListener('mousedown', handleMouseDown);
|
|
174
|
+
return function () {
|
|
175
|
+
return document.removeEventListener('mousedown', handleMouseDown);
|
|
176
|
+
};
|
|
177
|
+
}, [open]);
|
|
178
|
+
|
|
179
|
+
// Close on Escape
|
|
180
|
+
React.useEffect(function () {
|
|
181
|
+
if (!open) return;
|
|
182
|
+
var handleKeyDown = function handleKeyDown(e) {
|
|
183
|
+
if (e.key === 'Escape') {
|
|
184
|
+
setOpen(false);
|
|
185
|
+
setSearch('');
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
189
|
+
return function () {
|
|
190
|
+
return document.removeEventListener('keydown', handleKeyDown);
|
|
191
|
+
};
|
|
192
|
+
}, [open]);
|
|
193
|
+
var handleSelect = React.useCallback(function (icon) {
|
|
194
|
+
if (!isControlled) setInternalValue(icon.name);
|
|
195
|
+
onChange === null || onChange === void 0 || onChange(icon.name);
|
|
196
|
+
setOpen(false);
|
|
197
|
+
setSearch('');
|
|
198
|
+
}, [isControlled, onChange]);
|
|
199
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
200
|
+
ref: triggerRef,
|
|
201
|
+
className: "cop-inline-flex"
|
|
202
|
+
}, /*#__PURE__*/React.createElement(_Base.BaseButton, {
|
|
203
|
+
variant: "minimal",
|
|
204
|
+
disabled: disabled,
|
|
205
|
+
onClick: function onClick() {
|
|
206
|
+
return setOpen(function (prev) {
|
|
207
|
+
return !prev;
|
|
208
|
+
});
|
|
209
|
+
},
|
|
210
|
+
"aria-label": selectedIcon !== null && selectedIcon !== void 0 ? selectedIcon : placeholder,
|
|
211
|
+
"aria-haspopup": "dialog",
|
|
212
|
+
"aria-expanded": open,
|
|
213
|
+
className: (0, _utils.cn)('cop-p-[7px]', className)
|
|
214
|
+
}, selectedIconData ? selectedIconData.source === 'ds' ? /*#__PURE__*/React.createElement(selectedIconData.Component, {
|
|
215
|
+
className: "cop-h-4 cop-w-4",
|
|
216
|
+
"aria-hidden": "true"
|
|
217
|
+
}) : /*#__PURE__*/React.createElement("svg", {
|
|
218
|
+
viewBox: selectedIconData.viewBox,
|
|
219
|
+
fill: "currentColor",
|
|
220
|
+
className: "cop-h-4 cop-w-4",
|
|
221
|
+
overflow: "visible",
|
|
222
|
+
"aria-hidden": "true"
|
|
223
|
+
}, /*#__PURE__*/React.createElement("path", {
|
|
224
|
+
d: selectedIconData.path
|
|
225
|
+
})) : /*#__PURE__*/React.createElement("span", {
|
|
226
|
+
className: "cop-text-muted-foreground cop-text-sm"
|
|
227
|
+
}, placeholder))), open && /*#__PURE__*/_reactDom["default"].createPortal( /*#__PURE__*/React.createElement("div", {
|
|
228
|
+
ref: popoverRef,
|
|
229
|
+
style: {
|
|
230
|
+
top: coords.top,
|
|
231
|
+
left: coords.left
|
|
232
|
+
},
|
|
233
|
+
className: "cop-fixed cop-z-1500 cop-w-[330px] cop-overflow-clip cop-rounded cop-border cop-border-solid cop-border-[#eff1f4] cop-bg-white cop-shadow-[0px_6px_20px_0px_rgba(0,0,0,0.07)]"
|
|
234
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
235
|
+
className: "cop-px-3 cop-pt-3"
|
|
236
|
+
}, /*#__PURE__*/React.createElement(_Input.Input, {
|
|
237
|
+
ref: searchInputRef,
|
|
238
|
+
placeholder: "Search icons",
|
|
239
|
+
value: search,
|
|
240
|
+
onChange: function onChange(e) {
|
|
241
|
+
return setSearch(e.target.value);
|
|
242
|
+
},
|
|
243
|
+
onFocus: function onFocus() {
|
|
244
|
+
var _gridRef$current, _gridRef$current$rese;
|
|
245
|
+
return (_gridRef$current = gridRef.current) === null || _gridRef$current === void 0 || (_gridRef$current$rese = _gridRef$current.resetFocus) === null || _gridRef$current$rese === void 0 ? void 0 : _gridRef$current$rese.call(_gridRef$current);
|
|
246
|
+
},
|
|
247
|
+
onKeyDown: function onKeyDown(e) {
|
|
248
|
+
if ((e.key === 'ArrowDown' || e.key === 'Enter') && filteredIcons.length > 0) {
|
|
249
|
+
var _gridRef$current2;
|
|
250
|
+
e.preventDefault();
|
|
251
|
+
(_gridRef$current2 = gridRef.current) === null || _gridRef$current2 === void 0 || _gridRef$current2.focusFirst();
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
className: "focus-visible:cop-border-[#1a1a1a] focus-visible:cop-ring-0 focus-visible:cop-ring-offset-0"
|
|
255
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
256
|
+
className: "cop-py-3 cop-pl-3 cop-pr-0"
|
|
257
|
+
}, /*#__PURE__*/React.createElement(_IconGrid.IconGrid, {
|
|
258
|
+
ref: gridRef,
|
|
259
|
+
icons: filteredIcons,
|
|
260
|
+
onSelect: handleSelect,
|
|
261
|
+
selectedIcon: selectedIcon,
|
|
262
|
+
onEscapeFromGrid: function onEscapeFromGrid() {
|
|
263
|
+
var _searchInputRef$curre2;
|
|
264
|
+
return (_searchInputRef$curre2 = searchInputRef.current) === null || _searchInputRef$curre2 === void 0 ? void 0 : _searchInputRef$curre2.focus();
|
|
265
|
+
}
|
|
266
|
+
}))), document.body));
|
|
267
|
+
});
|
|
268
|
+
IconPicker.displayName = 'IconPicker';
|
|
269
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// This file is generated by a script. Do not edit this file directly.
|
|
2
|
+
(function (global, factory) {
|
|
3
|
+
if (typeof define === "function" && define.amd) {
|
|
4
|
+
define(["../searchIcons"], factory);
|
|
5
|
+
} else if (typeof exports !== "undefined") {
|
|
6
|
+
factory(require("../searchIcons"));
|
|
7
|
+
} else {
|
|
8
|
+
var mod = {
|
|
9
|
+
exports: {}
|
|
10
|
+
};
|
|
11
|
+
factory(global.searchIcons);
|
|
12
|
+
global.searchIconsTest = mod.exports;
|
|
13
|
+
}
|
|
14
|
+
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_searchIcons) {
|
|
15
|
+
"use strict";
|
|
16
|
+
|
|
17
|
+
jest.mock("../icons.generated", function () {
|
|
18
|
+
return {
|
|
19
|
+
searchTermsMap: {
|
|
20
|
+
heart: ['love', 'like', 'favorite'],
|
|
21
|
+
'heart-crack': ['break', 'love', 'sad'],
|
|
22
|
+
star: ['favorite', 'rating'],
|
|
23
|
+
house: ['home', 'building'],
|
|
24
|
+
'magnifying-glass': ['search', 'find', 'look'],
|
|
25
|
+
gear: ['settings', 'configure']
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
var faIcon = function faIcon(name) {
|
|
30
|
+
return {
|
|
31
|
+
source: 'fa',
|
|
32
|
+
name: name,
|
|
33
|
+
viewBox: '0 0 512 512',
|
|
34
|
+
path: 'M0 0'
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
var fixture = [faIcon('heart'), faIcon('heart-crack'), faIcon('star'), faIcon('house'), faIcon('magnifying-glass'), faIcon('filter'), faIcon('gear')];
|
|
38
|
+
describe('searchIcons', function () {
|
|
39
|
+
it('returns all icons for an empty query', function () {
|
|
40
|
+
expect((0, _searchIcons.searchIcons)('', fixture)).toEqual(fixture);
|
|
41
|
+
expect((0, _searchIcons.searchIcons)(' ', fixture)).toEqual(fixture);
|
|
42
|
+
});
|
|
43
|
+
it('matches icons by name', function () {
|
|
44
|
+
var results = (0, _searchIcons.searchIcons)('heart', fixture);
|
|
45
|
+
expect(results).toHaveLength(2);
|
|
46
|
+
expect(results.map(function (i) {
|
|
47
|
+
return i.name;
|
|
48
|
+
})).toEqual(['heart', 'heart-crack']);
|
|
49
|
+
});
|
|
50
|
+
it('matches icons by searchTerms', function () {
|
|
51
|
+
var results = (0, _searchIcons.searchIcons)('love', fixture);
|
|
52
|
+
expect(results).toHaveLength(2);
|
|
53
|
+
expect(results.map(function (i) {
|
|
54
|
+
return i.name;
|
|
55
|
+
})).toEqual(['heart', 'heart-crack']);
|
|
56
|
+
});
|
|
57
|
+
it('matches icons by partial prefix', function () {
|
|
58
|
+
var _results$;
|
|
59
|
+
var results = (0, _searchIcons.searchIcons)('mag', fixture);
|
|
60
|
+
expect(results).toHaveLength(1);
|
|
61
|
+
expect((_results$ = results[0]) === null || _results$ === void 0 ? void 0 : _results$.name).toBe('magnifying-glass');
|
|
62
|
+
});
|
|
63
|
+
it('matches icons by search term prefix', function () {
|
|
64
|
+
var _results$2;
|
|
65
|
+
var results = (0, _searchIcons.searchIcons)('set', fixture);
|
|
66
|
+
expect(results).toHaveLength(1);
|
|
67
|
+
expect((_results$2 = results[0]) === null || _results$2 === void 0 ? void 0 : _results$2.name).toBe('gear');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|