@drivy/cobalt 0.16.0 → 0.16.1
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/_virtual/_tslib.js +1 -1
- package/cjs/tokens/icons.js +3 -0
- package/cjs/tokens/icons.js.map +1 -1
- package/components/Helper/index.js.map +1 -1
- package/components/Icon/__generated__/CableIcon.js +23 -0
- package/components/Icon/__generated__/CableIcon.js.map +1 -0
- package/components/Icon/__generated__/EvBatteryIcon.js +23 -0
- package/components/Icon/__generated__/EvBatteryIcon.js.map +1 -0
- package/components/Icon/__generated__/ShareAndroidIcon.js +23 -0
- package/components/Icon/__generated__/ShareAndroidIcon.js.map +1 -0
- package/components/Rating/RatingIcons.js +98 -0
- package/components/Rating/RatingIcons.js.map +1 -0
- package/icons/cable.js +4 -0
- package/icons/cable.js.map +1 -0
- package/icons/cable.svg +1 -0
- package/icons/ev-battery.js +4 -0
- package/icons/ev-battery.js.map +1 -0
- package/icons/ev-battery.svg +1 -0
- package/icons/index.js +3 -0
- package/icons/index.js.map +1 -1
- package/icons/share-android.js +4 -0
- package/icons/share-android.js.map +1 -0
- package/icons/share-android.svg +1 -0
- package/index.js +5 -1
- package/index.js.map +1 -1
- package/package.json +5 -5
- package/styles/components/Rating/index.scss +134 -0
- package/styles/components.scss +1 -0
- package/tokens/icons.js +3 -0
- package/tokens/icons.js.map +1 -1
- package/types/components/Button/index.d.ts +8 -8
- package/types/components/Buttons/BrandButton/index.d.ts +2 -2
- package/types/components/Buttons/DefaultButton/index.d.ts +2 -2
- package/types/components/Buttons/GhostButton/index.d.ts +2 -2
- package/types/components/Form/Autocomplete/index.d.ts +2 -2
- package/types/components/Form/TextInput.d.ts +3 -3
- package/types/components/Helper/index.d.ts +1 -1
- package/types/components/Icon/__generated__/CableIcon.d.ts +10 -0
- package/types/components/Icon/__generated__/EvBatteryIcon.d.ts +10 -0
- package/types/components/Icon/__generated__/ShareAndroidIcon.d.ts +10 -0
- package/types/components/Icon/__generated__/index.d.ts +3 -0
- package/types/components/Icon/index.d.ts +1 -1
- package/types/components/Rating/RatingCompact.d.ts +7 -0
- package/types/components/Rating/RatingIcons.d.ts +22 -0
- package/types/components/Rating/RatingInput.d.ts +5 -0
- package/types/components/Rating/index.d.ts +11 -0
- package/types/icons/index.d.ts +3 -0
- package/types/index.d.ts +2 -1
- package/types/tokens/index.d.ts +3 -0
package/_virtual/_tslib.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/******************************************************************************
|
|
2
2
|
Copyright (c) Microsoft Corporation.
|
|
3
3
|
|
|
4
4
|
Permission to use, copy, modify, and/or distribute this software for any
|
package/cjs/tokens/icons.js
CHANGED
|
@@ -23,6 +23,7 @@ const icons = {
|
|
|
23
23
|
bluetooth: "bluetooth.svg",
|
|
24
24
|
briefcase: "briefcase.svg",
|
|
25
25
|
bulb: "bulb.svg",
|
|
26
|
+
cable: "cable.svg",
|
|
26
27
|
cabriolet: "cabriolet.svg",
|
|
27
28
|
calendarCheck: "calendar-check.svg",
|
|
28
29
|
calendarClock: "calendar-clock.svg",
|
|
@@ -100,6 +101,7 @@ const icons = {
|
|
|
100
101
|
earth: "earth.svg",
|
|
101
102
|
edit: "edit.svg",
|
|
102
103
|
electric: "electric.svg",
|
|
104
|
+
evBattery: "ev-battery.svg",
|
|
103
105
|
externalLink: "external-link.svg",
|
|
104
106
|
eyeClosed: "eye-closed.svg",
|
|
105
107
|
eyeOpened: "eye-opened.svg",
|
|
@@ -227,6 +229,7 @@ const icons = {
|
|
|
227
229
|
serviceTolls: "service-tolls.svg",
|
|
228
230
|
serviceUnlocked: "service-unlocked.svg",
|
|
229
231
|
settings: "settings.svg",
|
|
232
|
+
shareAndroid: "share-android.svg",
|
|
230
233
|
shareIos: "share-ios.svg",
|
|
231
234
|
share: "share.svg",
|
|
232
235
|
shieldCheck: "shield-check.svg",
|
package/cjs/tokens/icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"icons.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Helper/index.tsx"],"sourcesContent":["import React, { PropsWithChildren } from \"react\"\nimport cx from \"classnames\"\n\nimport DefaultButton from \"../Buttons/DefaultButton\"\n\ntype HelperPropsType = PropsWithChildren<{\n className?: string\n title: string\n titleClassName?: string\n contentClassName?: string\n cta
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Helper/index.tsx"],"sourcesContent":["import React, { PropsWithChildren } from \"react\"\nimport cx from \"classnames\"\n\nimport DefaultButton from \"../Buttons/DefaultButton\"\n\ntype HelperPropsType = PropsWithChildren<{\n className?: string\n title: string\n titleClassName?: string\n contentClassName?: string\n cta?: ReturnType<typeof DefaultButton | typeof DefaultButton.Link>\n}>\n\nconst Helper = ({\n className,\n titleClassName,\n contentClassName,\n title,\n children,\n cta,\n}: HelperPropsType) => (\n <div className={cx(\"cobalt-helper\", className)}>\n <strong className={cx(\"cobalt-helper__title\", titleClassName)}>\n {title}\n </strong>\n <div className={cx(\"cobalt-helper__content\", contentClassName)}>\n {children}\n </div>\n {cta}\n </div>\n)\n\nexport default Helper\n"],"names":[],"mappings":";;;AAaM,IAAA,MAAM,GAAG,UAAC,EAOE,EAAA;AANhB,IAAA,IAAA,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,cAAc,GAAA,EAAA,CAAA,cAAA,EACd,gBAAgB,GAAA,EAAA,CAAA,gBAAA,EAChB,KAAK,WAAA,EACL,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,GAAG,GAAA,EAAA,CAAA,GAAA,CAAA;IACkB,QACrB,6BAAK,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,EAAA;QAC5C,KAAQ,CAAA,aAAA,CAAA,QAAA,EAAA,EAAA,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,cAAc,CAAC,EAC1D,EAAA,KAAK,CACC;QACT,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,EAAE,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,EAC3D,EAAA,QAAQ,CACL;AACL,QAAA,GAAG,CACA,EACP;AAVsB;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import capitalize from '../../utils/capitalize.js';
|
|
3
|
+
import 'lodash.throttle';
|
|
4
|
+
import cx from 'classnames';
|
|
5
|
+
|
|
6
|
+
var iconSource = "cable";
|
|
7
|
+
var CableIcon = function (_a) {
|
|
8
|
+
var _b;
|
|
9
|
+
var color = _a.color, _c = _a.size, size = _c === void 0 ? 24 : _c, _d = _a.contained, contained = _d === void 0 ? false : _d, className = _a.className;
|
|
10
|
+
var computedClassName = cx(className, "cobalt-Icon cobalt-Icon--".concat(iconSource), (_b = {},
|
|
11
|
+
_b["cobalt-Icon--color".concat(capitalize(color))] = color,
|
|
12
|
+
_b["cobalt-Icon--size16"] = size === 16,
|
|
13
|
+
_b["cobalt-Icon--size20"] = size === 20,
|
|
14
|
+
_b["cobalt-Icon--size32"] = size === 32,
|
|
15
|
+
_b["cobalt-Icon--contained"] = contained,
|
|
16
|
+
_b));
|
|
17
|
+
var wrap = function (content) { return (React.createElement("span", { className: computedClassName }, content)); };
|
|
18
|
+
return wrap(React.createElement("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg" },
|
|
19
|
+
React.createElement("path", { d: "M20 5V4c0-.55-.45-1-1-1h-2c-.55 0-1 .45-1 1v1h-1v4c0 .55.45 1 1 1h1v7c0 1.1-.9 2-2 2s-2-.9-2-2V7c0-2.21-1.79-4-4-4S5 4.79 5 7v7H4c-.55 0-1 .45-1 1v4h1v1c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-1h1v-4c0-.55-.45-1-1-1H7V7c0-1.1.9-2 2-2s2 .9 2 2v10c0 2.21 1.79 4 4 4s4-1.79 4-4v-7h1c.55 0 1-.45 1-1V5h-1Z" })));
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { CableIcon as default };
|
|
23
|
+
//# sourceMappingURL=CableIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CableIcon.js","sources":["../../../../src/components/Icon/__generated__/CableIcon.tsx"],"sourcesContent":["import React from \"react\"\nimport { IconColors } from \"../\"\nimport { capitalize } from \"../../utils\"\nimport cx from \"classnames\"\nexport type IconProps = {\n color?: IconColors\n size?: 16 | 20 | 24 | 32\n contained?: boolean\n className?: string\n}\nconst iconSource = \"cable\"\n\nconst CableIcon = ({\n color,\n size = 24,\n contained = false,\n className,\n}: IconProps) => {\n const computedClassName = cx(\n className,\n `cobalt-Icon cobalt-Icon--${iconSource}`,\n {\n [`cobalt-Icon--color${capitalize(color)}`]: color,\n \"cobalt-Icon--size16\": size === 16,\n \"cobalt-Icon--size20\": size === 20,\n \"cobalt-Icon--size32\": size === 32,\n \"cobalt-Icon--contained\": contained,\n }\n )\n\n const wrap = (content: React.ReactNode) => (\n <span className={computedClassName}>{content}</span>\n )\n\n return wrap(\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20 5V4c0-.55-.45-1-1-1h-2c-.55 0-1 .45-1 1v1h-1v4c0 .55.45 1 1 1h1v7c0 1.1-.9 2-2 2s-2-.9-2-2V7c0-2.21-1.79-4-4-4S5 4.79 5 7v7H4c-.55 0-1 .45-1 1v4h1v1c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-1h1v-4c0-.55-.45-1-1-1H7V7c0-1.1.9-2 2-2s2 .9 2 2v10c0 2.21 1.79 4 4 4s4-1.79 4-4v-7h1c.55 0 1-.45 1-1V5h-1Z\" />\n </svg>\n )\n}\n\nexport default CableIcon\n"],"names":[],"mappings":";;;;;AAUA,IAAM,UAAU,GAAG,OAAO,CAAA;AAEpB,IAAA,SAAS,GAAG,UAAC,EAKP,EAAA;;AAJV,IAAA,IAAA,KAAK,WAAA,EACL,EAAA,GAAA,EAAA,CAAA,IAAS,EAAT,IAAI,mBAAG,EAAE,GAAA,EAAA,EACT,EAAA,GAAA,EAAA,CAAA,SAAiB,EAAjB,SAAS,GAAA,EAAA,KAAA,KAAA,CAAA,GAAG,KAAK,GAAA,EAAA,EACjB,SAAS,GAAA,EAAA,CAAA,SAAA,CAAA;IAET,IAAM,iBAAiB,GAAG,EAAE,CAC1B,SAAS,EACT,2BAAA,CAAA,MAAA,CAA4B,UAAU,CAAE,GAAA,EAAA,GAAA,EAAA;AAEtC,QAAA,EAAA,CAAC,4BAAqB,UAAU,CAAC,KAAK,CAAC,CAAE,IAAG,KAAK;QACjD,EAAqB,CAAA,qBAAA,CAAA,GAAE,IAAI,KAAK,EAAE;QAClC,EAAqB,CAAA,qBAAA,CAAA,GAAE,IAAI,KAAK,EAAE;QAClC,EAAqB,CAAA,qBAAA,CAAA,GAAE,IAAI,KAAK,EAAE;AAClC,QAAA,EAAA,CAAA,wBAAA,CAAwB,GAAE,SAAS;YAEtC,CAAA;AAED,IAAA,IAAM,IAAI,GAAG,UAAC,OAAwB,EAAA,EAAK,QACzC,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,iBAAiB,EAAG,EAAA,OAAO,CAAQ,EACrD,EAAA,CAAA;IAED,OAAO,IAAI,CACT,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,4BAA4B,EAAA;AACzD,QAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,ySAAyS,EAAG,CAAA,CAChT,CACP,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import capitalize from '../../utils/capitalize.js';
|
|
3
|
+
import 'lodash.throttle';
|
|
4
|
+
import cx from 'classnames';
|
|
5
|
+
|
|
6
|
+
var iconSource = "evBattery";
|
|
7
|
+
var EvBatteryIcon = function (_a) {
|
|
8
|
+
var _b;
|
|
9
|
+
var color = _a.color, _c = _a.size, size = _c === void 0 ? 24 : _c, _d = _a.contained, contained = _d === void 0 ? false : _d, className = _a.className;
|
|
10
|
+
var computedClassName = cx(className, "cobalt-Icon cobalt-Icon--".concat(iconSource), (_b = {},
|
|
11
|
+
_b["cobalt-Icon--color".concat(capitalize(color))] = color,
|
|
12
|
+
_b["cobalt-Icon--size16"] = size === 16,
|
|
13
|
+
_b["cobalt-Icon--size20"] = size === 20,
|
|
14
|
+
_b["cobalt-Icon--size32"] = size === 32,
|
|
15
|
+
_b["cobalt-Icon--contained"] = contained,
|
|
16
|
+
_b));
|
|
17
|
+
var wrap = function (content) { return (React.createElement("span", { className: computedClassName }, content)); };
|
|
18
|
+
return wrap(React.createElement("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg" },
|
|
19
|
+
React.createElement("path", { d: "M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4ZM11 20v-5.5H9L13 7v5.5h2L11 20Z" })));
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { EvBatteryIcon as default };
|
|
23
|
+
//# sourceMappingURL=EvBatteryIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EvBatteryIcon.js","sources":["../../../../src/components/Icon/__generated__/EvBatteryIcon.tsx"],"sourcesContent":["import React from \"react\"\nimport { IconColors } from \"../\"\nimport { capitalize } from \"../../utils\"\nimport cx from \"classnames\"\nexport type IconProps = {\n color?: IconColors\n size?: 16 | 20 | 24 | 32\n contained?: boolean\n className?: string\n}\nconst iconSource = \"evBattery\"\n\nconst EvBatteryIcon = ({\n color,\n size = 24,\n contained = false,\n className,\n}: IconProps) => {\n const computedClassName = cx(\n className,\n `cobalt-Icon cobalt-Icon--${iconSource}`,\n {\n [`cobalt-Icon--color${capitalize(color)}`]: color,\n \"cobalt-Icon--size16\": size === 16,\n \"cobalt-Icon--size20\": size === 20,\n \"cobalt-Icon--size32\": size === 32,\n \"cobalt-Icon--contained\": contained,\n }\n )\n\n const wrap = (content: React.ReactNode) => (\n <span className={computedClassName}>{content}</span>\n )\n\n return wrap(\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4ZM11 20v-5.5H9L13 7v5.5h2L11 20Z\" />\n </svg>\n )\n}\n\nexport default EvBatteryIcon\n"],"names":[],"mappings":";;;;;AAUA,IAAM,UAAU,GAAG,WAAW,CAAA;AAExB,IAAA,aAAa,GAAG,UAAC,EAKX,EAAA;;AAJV,IAAA,IAAA,KAAK,WAAA,EACL,EAAA,GAAA,EAAA,CAAA,IAAS,EAAT,IAAI,mBAAG,EAAE,GAAA,EAAA,EACT,EAAA,GAAA,EAAA,CAAA,SAAiB,EAAjB,SAAS,GAAA,EAAA,KAAA,KAAA,CAAA,GAAG,KAAK,GAAA,EAAA,EACjB,SAAS,GAAA,EAAA,CAAA,SAAA,CAAA;IAET,IAAM,iBAAiB,GAAG,EAAE,CAC1B,SAAS,EACT,2BAAA,CAAA,MAAA,CAA4B,UAAU,CAAE,GAAA,EAAA,GAAA,EAAA;AAEtC,QAAA,EAAA,CAAC,4BAAqB,UAAU,CAAC,KAAK,CAAC,CAAE,IAAG,KAAK;QACjD,EAAqB,CAAA,qBAAA,CAAA,GAAE,IAAI,KAAK,EAAE;QAClC,EAAqB,CAAA,qBAAA,CAAA,GAAE,IAAI,KAAK,EAAE;QAClC,EAAqB,CAAA,qBAAA,CAAA,GAAE,IAAI,KAAK,EAAE;AAClC,QAAA,EAAA,CAAA,wBAAA,CAAwB,GAAE,SAAS;YAEtC,CAAA;AAED,IAAA,IAAM,IAAI,GAAG,UAAC,OAAwB,EAAA,EAAK,QACzC,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,iBAAiB,EAAG,EAAA,OAAO,CAAQ,EACrD,EAAA,CAAA;IAED,OAAO,IAAI,CACT,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,4BAA4B,EAAA;AACzD,QAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,gKAAgK,EAAG,CAAA,CACvK,CACP,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import capitalize from '../../utils/capitalize.js';
|
|
3
|
+
import 'lodash.throttle';
|
|
4
|
+
import cx from 'classnames';
|
|
5
|
+
|
|
6
|
+
var iconSource = "shareAndroid";
|
|
7
|
+
var ShareAndroidIcon = function (_a) {
|
|
8
|
+
var _b;
|
|
9
|
+
var color = _a.color, _c = _a.size, size = _c === void 0 ? 24 : _c, _d = _a.contained, contained = _d === void 0 ? false : _d, className = _a.className;
|
|
10
|
+
var computedClassName = cx(className, "cobalt-Icon cobalt-Icon--".concat(iconSource), (_b = {},
|
|
11
|
+
_b["cobalt-Icon--color".concat(capitalize(color))] = color,
|
|
12
|
+
_b["cobalt-Icon--size16"] = size === 16,
|
|
13
|
+
_b["cobalt-Icon--size20"] = size === 20,
|
|
14
|
+
_b["cobalt-Icon--size32"] = size === 32,
|
|
15
|
+
_b["cobalt-Icon--contained"] = contained,
|
|
16
|
+
_b));
|
|
17
|
+
var wrap = function (content) { return (React.createElement("span", { className: computedClassName }, content)); };
|
|
18
|
+
return wrap(React.createElement("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg" },
|
|
19
|
+
React.createElement("path", { d: "M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92 0-1.61-1.31-2.92-2.92-2.92Z" })));
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { ShareAndroidIcon as default };
|
|
23
|
+
//# sourceMappingURL=ShareAndroidIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShareAndroidIcon.js","sources":["../../../../src/components/Icon/__generated__/ShareAndroidIcon.tsx"],"sourcesContent":["import React from \"react\"\nimport { IconColors } from \"../\"\nimport { capitalize } from \"../../utils\"\nimport cx from \"classnames\"\nexport type IconProps = {\n color?: IconColors\n size?: 16 | 20 | 24 | 32\n contained?: boolean\n className?: string\n}\nconst iconSource = \"shareAndroid\"\n\nconst ShareAndroidIcon = ({\n color,\n size = 24,\n contained = false,\n className,\n}: IconProps) => {\n const computedClassName = cx(\n className,\n `cobalt-Icon cobalt-Icon--${iconSource}`,\n {\n [`cobalt-Icon--color${capitalize(color)}`]: color,\n \"cobalt-Icon--size16\": size === 16,\n \"cobalt-Icon--size20\": size === 20,\n \"cobalt-Icon--size32\": size === 32,\n \"cobalt-Icon--contained\": contained,\n }\n )\n\n const wrap = (content: React.ReactNode) => (\n <span className={computedClassName}>{content}</span>\n )\n\n return wrap(\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92 0-1.61-1.31-2.92-2.92-2.92Z\" />\n </svg>\n )\n}\n\nexport default ShareAndroidIcon\n"],"names":[],"mappings":";;;;;AAUA,IAAM,UAAU,GAAG,cAAc,CAAA;AAE3B,IAAA,gBAAgB,GAAG,UAAC,EAKd,EAAA;;AAJV,IAAA,IAAA,KAAK,WAAA,EACL,EAAA,GAAA,EAAA,CAAA,IAAS,EAAT,IAAI,mBAAG,EAAE,GAAA,EAAA,EACT,EAAA,GAAA,EAAA,CAAA,SAAiB,EAAjB,SAAS,GAAA,EAAA,KAAA,KAAA,CAAA,GAAG,KAAK,GAAA,EAAA,EACjB,SAAS,GAAA,EAAA,CAAA,SAAA,CAAA;IAET,IAAM,iBAAiB,GAAG,EAAE,CAC1B,SAAS,EACT,2BAAA,CAAA,MAAA,CAA4B,UAAU,CAAE,GAAA,EAAA,GAAA,EAAA;AAEtC,QAAA,EAAA,CAAC,4BAAqB,UAAU,CAAC,KAAK,CAAC,CAAE,IAAG,KAAK;QACjD,EAAqB,CAAA,qBAAA,CAAA,GAAE,IAAI,KAAK,EAAE;QAClC,EAAqB,CAAA,qBAAA,CAAA,GAAE,IAAI,KAAK,EAAE;QAClC,EAAqB,CAAA,qBAAA,CAAA,GAAE,IAAI,KAAK,EAAE;AAClC,QAAA,EAAA,CAAA,wBAAA,CAAwB,GAAE,SAAS;YAEtC,CAAA;AAED,IAAA,IAAM,IAAI,GAAG,UAAC,OAAwB,EAAA,EAAK,QACzC,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,iBAAiB,EAAG,EAAA,OAAO,CAAQ,EACrD,EAAA,CAAA;IAED,OAAO,IAAI,CACT,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,4BAA4B,EAAA;AACzD,QAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,oXAAoX,EAAG,CAAA,CAC3X,CACP,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { __read } from '../../_virtual/_tslib.js';
|
|
2
|
+
import React, { useRef, useState, useCallback } from 'react';
|
|
3
|
+
import { nanoid } from 'nanoid';
|
|
4
|
+
import cx from 'classnames';
|
|
5
|
+
import '../Icon/index.js';
|
|
6
|
+
import StarIcon from '../Icon/__generated__/StarIcon.js';
|
|
7
|
+
|
|
8
|
+
var defaultRatingIcon = React.createElement(StarIcon, { color: "turquoise" });
|
|
9
|
+
var itemEmptyColor = "grey";
|
|
10
|
+
function roundHalf(num) {
|
|
11
|
+
var temp = num * 2;
|
|
12
|
+
return temp % 1 === 0.5 ? Math.floor(temp) / 2 : Math.round(temp) / 2;
|
|
13
|
+
}
|
|
14
|
+
function computeItemStatus(ratingValue, itemValue, icon) {
|
|
15
|
+
var itemStatus = "empty";
|
|
16
|
+
if (!Array.isArray(icon)) {
|
|
17
|
+
// gauge
|
|
18
|
+
var isHalfItem = itemValue > ratingValue && ratingValue > itemValue - 1;
|
|
19
|
+
if (isHalfItem) {
|
|
20
|
+
itemStatus = "half";
|
|
21
|
+
}
|
|
22
|
+
else if (itemValue <= ratingValue) {
|
|
23
|
+
itemStatus = "full";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (itemValue === ratingValue) {
|
|
27
|
+
// radio
|
|
28
|
+
itemStatus = "full";
|
|
29
|
+
}
|
|
30
|
+
return itemStatus;
|
|
31
|
+
}
|
|
32
|
+
var RatingIcon = function (_a) {
|
|
33
|
+
var icon = _a.icon, _b = _a.status, status = _b === void 0 ? "full" : _b, _c = _a.size, size = _c === void 0 ? 24 : _c;
|
|
34
|
+
if (status === "half") {
|
|
35
|
+
return (React.createElement(React.Fragment, null,
|
|
36
|
+
React.cloneElement(icon, {
|
|
37
|
+
color: itemEmptyColor,
|
|
38
|
+
size: size,
|
|
39
|
+
}),
|
|
40
|
+
React.createElement("div", { className: "cobalt-rating-icons__icon-half-container" }, React.cloneElement(icon, { size: size }))));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
var iconColor = status === "empty" ? itemEmptyColor : icon.props.color;
|
|
44
|
+
return React.cloneElement(icon, {
|
|
45
|
+
color: iconColor,
|
|
46
|
+
size: size,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var RatingIcons = function (_a) {
|
|
51
|
+
var className = _a.className, _b = _a.max, max = _b === void 0 ? 5 : _b, value = _a.value, _c = _a.size, size = _c === void 0 ? 24 : _c, _d = _a.editable, editable = _d === void 0 ? false : _d, onChange = _a.onChange, _e = _a.icon, icon = _e === void 0 ? defaultRatingIcon : _e;
|
|
52
|
+
var name = useRef(nanoid());
|
|
53
|
+
var items = useRef(Array.from(new Array(Array.isArray(icon) ? icon.length : max)));
|
|
54
|
+
var _f = __read(useState(function () {
|
|
55
|
+
return editable ? Math.floor(value) : roundHalf(value);
|
|
56
|
+
}), 2), ratingValue = _f[0], setRatingValue = _f[1];
|
|
57
|
+
var _g = __read(useState(-1), 2), selectedIndex = _g[0], setSelectedIndex = _g[1]; // used to enforce selection effect (icon scale reset)
|
|
58
|
+
var resetSelection = useCallback(function () {
|
|
59
|
+
setSelectedIndex(-1);
|
|
60
|
+
}, []);
|
|
61
|
+
var itemSize = size === 48 ? 16 : size;
|
|
62
|
+
// input element is used for a11y purpose ( focus feedback and keyboard selection )
|
|
63
|
+
return (React.createElement("div", { className: cx("cobalt-rating-icons", className, {
|
|
64
|
+
"cobalt-rating-icons--input": !editable,
|
|
65
|
+
"cobalt-rating-icons--icon-size-48": size === 48,
|
|
66
|
+
}), onPointerLeave: function () {
|
|
67
|
+
if (editable) {
|
|
68
|
+
document.activeElement.blur();
|
|
69
|
+
}
|
|
70
|
+
} }, items.current.map(function (_value, idx) {
|
|
71
|
+
var itemValue = idx + 1;
|
|
72
|
+
var itemStatus = computeItemStatus(ratingValue, itemValue, icon);
|
|
73
|
+
return (React.createElement("label", { className: cx("cobalt-rating-icons__icon-wrapper", {
|
|
74
|
+
"cobalt-rating-icons__icon-wrapper--selected": selectedIndex === idx,
|
|
75
|
+
}), key: idx, onClick: function () {
|
|
76
|
+
if (editable) {
|
|
77
|
+
setRatingValue(itemValue);
|
|
78
|
+
setSelectedIndex(idx);
|
|
79
|
+
}
|
|
80
|
+
}, onMouseEnter: function (e) {
|
|
81
|
+
if (editable) {
|
|
82
|
+
e.target.focus();
|
|
83
|
+
resetSelection();
|
|
84
|
+
}
|
|
85
|
+
} },
|
|
86
|
+
React.createElement("input", { tabIndex: editable &&
|
|
87
|
+
(ratingValue === itemValue ||
|
|
88
|
+
(ratingValue === 0 && itemValue === 1))
|
|
89
|
+
? 0
|
|
90
|
+
: -1, name: name.current, type: "radio", value: itemValue, onChange: function () {
|
|
91
|
+
onChange && onChange(itemValue);
|
|
92
|
+
}, disabled: !editable }),
|
|
93
|
+
React.createElement(RatingIcon, { icon: Array.isArray(icon) ? icon[idx] : icon, status: itemStatus, size: itemSize })));
|
|
94
|
+
})));
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export { RatingIcon, RatingIcons, computeItemStatus, defaultRatingIcon, roundHalf };
|
|
98
|
+
//# sourceMappingURL=RatingIcons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RatingIcons.js","sources":["../../../src/components/Rating/RatingIcons.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback } from \"react\"\nimport { nanoid } from \"nanoid\"\nimport cx from \"classnames\"\nimport { IconProps, StarIcon } from \"../Icon\"\n\nexport type RatingIconsPropsType = {\n className?: string\n max?: 5 | 10\n value: number\n size?: IconProps[\"size\"] | 48\n editable?: boolean\n disabled?: boolean\n onChange?: (newValue: number) => void\n icon?: JSX.Element | JSX.Element[]\n}\n\nexport type RatingIconPropsType = {\n icon: JSX.Element\n status?: \"full\" | \"half\" | \"empty\"\n size?: RatingIconsPropsType[\"size\"]\n}\n\nexport const defaultRatingIcon = <StarIcon color={\"turquoise\"} />\nconst itemEmptyColor: IconProps[\"color\"] = \"grey\"\n\nexport function roundHalf(num: number) {\n const temp = num * 2\n return temp % 1 === 0.5 ? Math.floor(temp) / 2 : Math.round(temp) / 2\n}\n\nexport function computeItemStatus(\n ratingValue: number,\n itemValue: number,\n icon: RatingIconsPropsType[\"icon\"]\n): RatingIconPropsType[\"status\"] {\n let itemStatus: RatingIconPropsType[\"status\"] = \"empty\"\n if (!Array.isArray(icon)) {\n // gauge\n const isHalfItem = itemValue > ratingValue && ratingValue > itemValue - 1\n if (isHalfItem) {\n itemStatus = \"half\"\n } else if (itemValue <= ratingValue) {\n itemStatus = \"full\"\n }\n } else if (itemValue === ratingValue) {\n // radio\n itemStatus = \"full\"\n }\n\n return itemStatus\n}\n\nexport const RatingIcon = ({\n icon,\n status = \"full\",\n size = 24,\n}: RatingIconPropsType) => {\n if (status === \"half\") {\n return (\n <>\n {React.cloneElement(icon, {\n color: itemEmptyColor,\n size,\n })}\n <div className=\"cobalt-rating-icons__icon-half-container\">\n {React.cloneElement(icon, { size })}\n </div>\n </>\n )\n } else {\n const iconColor: IconProps[\"color\"] =\n status === \"empty\" ? itemEmptyColor : icon.props.color\n\n return React.cloneElement(icon, {\n color: iconColor,\n size,\n })\n }\n}\n\nexport const RatingIcons = ({\n className,\n max = 5,\n value,\n size = 24,\n editable = false,\n onChange,\n icon = defaultRatingIcon,\n}: RatingIconsPropsType) => {\n const name = useRef(nanoid())\n\n const items = useRef(\n Array.from(new Array(Array.isArray(icon) ? icon.length : max))\n )\n\n const [ratingValue, setRatingValue] = useState(() =>\n editable ? Math.floor(value) : roundHalf(value)\n )\n const [selectedIndex, setSelectedIndex] = useState(-1) // used to enforce selection effect (icon scale reset)\n\n const resetSelection = useCallback(() => {\n setSelectedIndex(-1)\n }, [])\n\n const itemSize = size === 48 ? 16 : size\n\n // input element is used for a11y purpose ( focus feedback and keyboard selection )\n return (\n <div\n className={cx(\"cobalt-rating-icons\", className, {\n \"cobalt-rating-icons--input\": !editable,\n \"cobalt-rating-icons--icon-size-48\": size === 48,\n })}\n onPointerLeave={() => {\n if (editable) {\n ;(document.activeElement as HTMLInputElement).blur()\n }\n }}\n >\n {items.current.map((_value, idx) => {\n const itemValue = idx + 1\n\n const itemStatus = computeItemStatus(ratingValue, itemValue, icon)\n\n return (\n <label\n className={cx(\"cobalt-rating-icons__icon-wrapper\", {\n \"cobalt-rating-icons__icon-wrapper--selected\":\n selectedIndex === idx,\n })}\n key={idx}\n onClick={() => {\n if (editable) {\n setRatingValue(itemValue)\n setSelectedIndex(idx)\n }\n }}\n onMouseEnter={(e) => {\n if (editable) {\n ;(e.target as HTMLElement).focus()\n\n resetSelection()\n }\n }}\n >\n <input\n tabIndex={\n editable &&\n (ratingValue === itemValue ||\n (ratingValue === 0 && itemValue === 1))\n ? 0\n : -1\n }\n name={name.current}\n type=\"radio\"\n value={itemValue}\n onChange={() => {\n onChange && onChange(itemValue)\n }}\n disabled={!editable}\n />\n {\n <RatingIcon\n icon={Array.isArray(icon) ? icon[idx] : icon}\n status={itemStatus}\n size={itemSize}\n />\n }\n </label>\n )\n })}\n </div>\n )\n}\n"],"names":[],"mappings":"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"}
|
package/icons/cable.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var cable = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M20 5V4c0-.55-.45-1-1-1h-2c-.55 0-1 .45-1 1v1h-1v4c0 .55.45 1 1 1h1v7c0 1.1-.9 2-2 2s-2-.9-2-2V7c0-2.21-1.79-4-4-4S5 4.79 5 7v7H4c-.55 0-1 .45-1 1v4h1v1c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-1h1v-4c0-.55-.45-1-1-1H7V7c0-1.1.9-2 2-2s2 .9 2 2v10c0 2.21 1.79 4 4 4s4-1.79 4-4v-7h1c.55 0 1-.45 1-1V5h-1z\"/></svg>";
|
|
2
|
+
|
|
3
|
+
export { cable as default };
|
|
4
|
+
//# sourceMappingURL=cable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cable.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/icons/cable.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20 5V4c0-.55-.45-1-1-1h-2c-.55 0-1 .45-1 1v1h-1v4c0 .55.45 1 1 1h1v7c0 1.1-.9 2-2 2s-2-.9-2-2V7c0-2.21-1.79-4-4-4S5 4.79 5 7v7H4c-.55 0-1 .45-1 1v4h1v1c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-1h1v-4c0-.55-.45-1-1-1H7V7c0-1.1.9-2 2-2s2 .9 2 2v10c0 2.21 1.79 4 4 4s4-1.79 4-4v-7h1c.55 0 1-.45 1-1V5h-1Z"/></svg>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var evBattery = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zM11 20v-5.5H9L13 7v5.5h2L11 20z\"/></svg>";
|
|
2
|
+
|
|
3
|
+
export { evBattery as default };
|
|
4
|
+
//# sourceMappingURL=ev-battery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ev-battery.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4ZM11 20v-5.5H9L13 7v5.5h2L11 20Z"/></svg>
|
package/icons/index.js
CHANGED
|
@@ -18,6 +18,7 @@ export { default as bin } from './bin.js';
|
|
|
18
18
|
export { default as bluetooth } from './bluetooth.js';
|
|
19
19
|
export { default as briefcase } from './briefcase.js';
|
|
20
20
|
export { default as bulb } from './bulb.js';
|
|
21
|
+
export { default as cable } from './cable.js';
|
|
21
22
|
export { default as cabriolet } from './cabriolet.js';
|
|
22
23
|
export { default as calendarCheck } from './calendar-check.js';
|
|
23
24
|
export { default as calendarClock } from './calendar-clock.js';
|
|
@@ -95,6 +96,7 @@ export { default as earning } from './earning.js';
|
|
|
95
96
|
export { default as earth } from './earth.js';
|
|
96
97
|
export { default as edit } from './edit.js';
|
|
97
98
|
export { default as electric } from './electric.js';
|
|
99
|
+
export { default as evBattery } from './ev-battery.js';
|
|
98
100
|
export { default as externalLink } from './external-link.js';
|
|
99
101
|
export { default as eyeClosed } from './eye-closed.js';
|
|
100
102
|
export { default as eyeOpened } from './eye-opened.js';
|
|
@@ -222,6 +224,7 @@ export { default as serviceLocked } from './service-locked.js';
|
|
|
222
224
|
export { default as serviceTolls } from './service-tolls.js';
|
|
223
225
|
export { default as serviceUnlocked } from './service-unlocked.js';
|
|
224
226
|
export { default as settings } from './settings.js';
|
|
227
|
+
export { default as shareAndroid } from './share-android.js';
|
|
225
228
|
export { default as shareIos } from './share-ios.js';
|
|
226
229
|
export { default as share } from './share.js';
|
|
227
230
|
export { default as shieldCheck } from './shield-check.js';
|
package/icons/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var shareAndroid = "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92 0-1.61-1.31-2.92-2.92-2.92z\"/></svg>";
|
|
2
|
+
|
|
3
|
+
export { shareAndroid as default };
|
|
4
|
+
//# sourceMappingURL=share-android.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-android.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92 0-1.61-1.31-2.92-2.92-2.92Z"/></svg>
|
package/index.js
CHANGED
|
@@ -36,6 +36,7 @@ export { ComposedField } from './components/Form/ComposedField.js';
|
|
|
36
36
|
export { withFieldLabelAndHint } from './components/Form/field.js';
|
|
37
37
|
export { Fieldset } from './components/Form/Fieldset.js';
|
|
38
38
|
export { Hint } from './components/Form/Hint.js';
|
|
39
|
+
export { RatingIcons } from './components/Rating/RatingIcons.js';
|
|
39
40
|
export { Select } from './components/Form/Select.js';
|
|
40
41
|
export { default as Slider, SliderValueMeta } from './components/Form/Slider.js';
|
|
41
42
|
export { Stepper, StepperMeta } from './components/Form/Stepper.js';
|
|
@@ -66,6 +67,7 @@ export { default as BinIcon } from './components/Icon/__generated__/BinIcon.js';
|
|
|
66
67
|
export { default as BluetoothIcon } from './components/Icon/__generated__/BluetoothIcon.js';
|
|
67
68
|
export { default as BriefcaseIcon } from './components/Icon/__generated__/BriefcaseIcon.js';
|
|
68
69
|
export { default as BulbIcon } from './components/Icon/__generated__/BulbIcon.js';
|
|
70
|
+
export { default as CableIcon } from './components/Icon/__generated__/CableIcon.js';
|
|
69
71
|
export { default as CabrioletIcon } from './components/Icon/__generated__/CabrioletIcon.js';
|
|
70
72
|
export { default as CalendarCheckIcon } from './components/Icon/__generated__/CalendarCheckIcon.js';
|
|
71
73
|
export { default as CalendarClockIcon } from './components/Icon/__generated__/CalendarClockIcon.js';
|
|
@@ -143,6 +145,7 @@ export { default as EarningIcon } from './components/Icon/__generated__/EarningI
|
|
|
143
145
|
export { default as EarthIcon } from './components/Icon/__generated__/EarthIcon.js';
|
|
144
146
|
export { default as EditIcon } from './components/Icon/__generated__/EditIcon.js';
|
|
145
147
|
export { default as ElectricIcon } from './components/Icon/__generated__/ElectricIcon.js';
|
|
148
|
+
export { default as EvBatteryIcon } from './components/Icon/__generated__/EvBatteryIcon.js';
|
|
146
149
|
export { default as ExternalLinkIcon } from './components/Icon/__generated__/ExternalLinkIcon.js';
|
|
147
150
|
export { default as EyeClosedIcon } from './components/Icon/__generated__/EyeClosedIcon.js';
|
|
148
151
|
export { default as EyeIcon } from './components/Icon/__generated__/EyeIcon.js';
|
|
@@ -269,6 +272,7 @@ export { default as ServiceLockedIcon } from './components/Icon/__generated__/Se
|
|
|
269
272
|
export { default as ServiceTollsIcon } from './components/Icon/__generated__/ServiceTollsIcon.js';
|
|
270
273
|
export { default as ServiceUnlockedIcon } from './components/Icon/__generated__/ServiceUnlockedIcon.js';
|
|
271
274
|
export { default as SettingsIcon } from './components/Icon/__generated__/SettingsIcon.js';
|
|
275
|
+
export { default as ShareAndroidIcon } from './components/Icon/__generated__/ShareAndroidIcon.js';
|
|
272
276
|
export { default as ShareIcon } from './components/Icon/__generated__/ShareIcon.js';
|
|
273
277
|
export { default as ShareIosIcon } from './components/Icon/__generated__/ShareIosIcon.js';
|
|
274
278
|
export { default as ShieldCheckIcon } from './components/Icon/__generated__/ShieldCheckIcon.js';
|
|
@@ -283,7 +287,6 @@ export { default as SocialLinkedinIcon } from './components/Icon/__generated__/S
|
|
|
283
287
|
export { default as SocialTwitterIcon } from './components/Icon/__generated__/SocialTwitterIcon.js';
|
|
284
288
|
export { default as SocialWhatsappIcon } from './components/Icon/__generated__/SocialWhatsappIcon.js';
|
|
285
289
|
export { default as StarHalfIcon } from './components/Icon/__generated__/StarHalfIcon.js';
|
|
286
|
-
export { default as StarIcon } from './components/Icon/__generated__/StarIcon.js';
|
|
287
290
|
export { default as StarsIcon } from './components/Icon/__generated__/StarsIcon.js';
|
|
288
291
|
export { default as SubwayIcon } from './components/Icon/__generated__/SubwayIcon.js';
|
|
289
292
|
export { default as SuitcaseIcon } from './components/Icon/__generated__/SuitcaseIcon.js';
|
|
@@ -325,4 +328,5 @@ export { default as WrenchIcon } from './components/Icon/__generated__/WrenchIco
|
|
|
325
328
|
export { default as YingyangIcon } from './components/Icon/__generated__/YingyangIcon.js';
|
|
326
329
|
export { useAccordionItemContext } from '@reach/accordion';
|
|
327
330
|
export { default as LoadingIcon } from './components/Icon/__generated__/LoadingIcon.js';
|
|
331
|
+
export { default as StarIcon } from './components/Icon/__generated__/StarIcon.js';
|
|
328
332
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@drivy/cobalt",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.1",
|
|
4
4
|
"description": "Opinionated design system for Drivy's projects.",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"types": "types/index.d.ts",
|
|
@@ -57,16 +57,16 @@
|
|
|
57
57
|
"@svgr/cli": "6.2.1",
|
|
58
58
|
"@testing-library/jest-dom": "5.16.4",
|
|
59
59
|
"@testing-library/react": "12.1.5",
|
|
60
|
-
"@testing-library/react-hooks": "
|
|
60
|
+
"@testing-library/react-hooks": "8.0.0",
|
|
61
61
|
"@types/classnames": "2.3.0",
|
|
62
62
|
"@types/jest": "27.4.1",
|
|
63
63
|
"@types/lodash.throttle": "4.1.7",
|
|
64
64
|
"@types/media-typer": "1.1.1",
|
|
65
65
|
"@types/react": "17.0.44",
|
|
66
|
-
"autoprefixer": "10.4.
|
|
67
|
-
"core-js": "3.22.
|
|
66
|
+
"autoprefixer": "10.4.7",
|
|
67
|
+
"core-js": "3.22.2",
|
|
68
68
|
"css-loader": "6.7.1",
|
|
69
|
-
"eslint": "8.
|
|
69
|
+
"eslint": "8.14.0",
|
|
70
70
|
"jest": "27.5.1",
|
|
71
71
|
"np": "7.6.1",
|
|
72
72
|
"postcss-flexbugs-fixes": "5.0.2",
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
.cobalt-rating,
|
|
2
|
+
.cobalt-rating-input {
|
|
3
|
+
display: flex;
|
|
4
|
+
|
|
5
|
+
align-items: center;
|
|
6
|
+
|
|
7
|
+
pointer-events: none;
|
|
8
|
+
|
|
9
|
+
gap: 4px;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.cobalt-rating__label {
|
|
13
|
+
line-height: 14px;
|
|
14
|
+
font-size: 14px;
|
|
15
|
+
color: color(graphite, light);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.cobalt-rating-input {
|
|
19
|
+
&--disabled {
|
|
20
|
+
opacity: 0.5;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&:not(.cobalt-rating-input--disabled) .cobalt-rating-icons {
|
|
24
|
+
pointer-events: initial;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.cobalt-rating-icons {
|
|
29
|
+
display: flex;
|
|
30
|
+
justify-content: flex-start;
|
|
31
|
+
align-items: center;
|
|
32
|
+
pointer-events: none;
|
|
33
|
+
|
|
34
|
+
* {
|
|
35
|
+
-webkit-tap-highlight-color: transparent;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
&--icon-size-48 .cobalt-Icon {
|
|
39
|
+
height: spacing(xl);
|
|
40
|
+
width: spacing(xl);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
&__icon-wrapper {
|
|
44
|
+
position: relative;
|
|
45
|
+
|
|
46
|
+
display: inline-block;
|
|
47
|
+
|
|
48
|
+
line-height: 0;
|
|
49
|
+
|
|
50
|
+
cursor: pointer;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
&__icon-wrapper input {
|
|
54
|
+
width: 0;
|
|
55
|
+
height: 0;
|
|
56
|
+
margin: 0;
|
|
57
|
+
padding: 0;
|
|
58
|
+
|
|
59
|
+
opacity: 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&__icon-wrapper * {
|
|
63
|
+
pointer-events: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&__icon-half-container {
|
|
67
|
+
position: absolute;
|
|
68
|
+
|
|
69
|
+
top: 0;
|
|
70
|
+
left: 0;
|
|
71
|
+
|
|
72
|
+
width: calc(50%);
|
|
73
|
+
|
|
74
|
+
overflow: hidden;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
&__icon-half-container .cobalt-Icon {
|
|
78
|
+
max-width: none;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
&:not(:hover):not(:focus-visible) input:focus {
|
|
82
|
+
// focus feedback with keyboard navigation only
|
|
83
|
+
& + .cobalt-Icon {
|
|
84
|
+
border-radius: spacing(unit);
|
|
85
|
+
box-shadow: 0 0 0 1px color(turquoise);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* stylelint-disable order/order */
|
|
90
|
+
@media (hover: hover) {
|
|
91
|
+
// desktop animation only
|
|
92
|
+
&__icon-wrapper--selected {
|
|
93
|
+
input:checked:focus + .cobalt-Icon {
|
|
94
|
+
transform: scale(1) !important;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
&__icon-wrapper:hover {
|
|
99
|
+
.cobalt-Icon {
|
|
100
|
+
transform: scale(1.2);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
&:not(:hover)
|
|
105
|
+
&__icon-wrapper:not(:hover):not(:focus-visible)
|
|
106
|
+
input:focus:checked {
|
|
107
|
+
// focus feedback with keyboard navigation only
|
|
108
|
+
& + .cobalt-Icon {
|
|
109
|
+
animation: rating-pop--keyboard 0.3s ease 1;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@media (hover: none) {
|
|
115
|
+
// mobile selection feedback
|
|
116
|
+
&__icon-wrapper input:checked {
|
|
117
|
+
& + .cobalt-Icon {
|
|
118
|
+
animation: rating-pop--mobile 0.3s ease 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
@keyframes rating-pop--keyboard {
|
|
125
|
+
0% {
|
|
126
|
+
transform: scale(1.2);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@keyframes rating-pop--mobile {
|
|
131
|
+
0% {
|
|
132
|
+
transform: scale(1.5);
|
|
133
|
+
}
|
|
134
|
+
}
|
package/styles/components.scss
CHANGED
package/tokens/icons.js
CHANGED
|
@@ -19,6 +19,7 @@ const icons = {
|
|
|
19
19
|
bluetooth: "bluetooth.svg",
|
|
20
20
|
briefcase: "briefcase.svg",
|
|
21
21
|
bulb: "bulb.svg",
|
|
22
|
+
cable: "cable.svg",
|
|
22
23
|
cabriolet: "cabriolet.svg",
|
|
23
24
|
calendarCheck: "calendar-check.svg",
|
|
24
25
|
calendarClock: "calendar-clock.svg",
|
|
@@ -96,6 +97,7 @@ const icons = {
|
|
|
96
97
|
earth: "earth.svg",
|
|
97
98
|
edit: "edit.svg",
|
|
98
99
|
electric: "electric.svg",
|
|
100
|
+
evBattery: "ev-battery.svg",
|
|
99
101
|
externalLink: "external-link.svg",
|
|
100
102
|
eyeClosed: "eye-closed.svg",
|
|
101
103
|
eyeOpened: "eye-opened.svg",
|
|
@@ -223,6 +225,7 @@ const icons = {
|
|
|
223
225
|
serviceTolls: "service-tolls.svg",
|
|
224
226
|
serviceUnlocked: "service-unlocked.svg",
|
|
225
227
|
settings: "settings.svg",
|
|
228
|
+
shareAndroid: "share-android.svg",
|
|
226
229
|
shareIos: "share-ios.svg",
|
|
227
230
|
share: "share.svg",
|
|
228
231
|
shieldCheck: "shield-check.svg",
|
package/tokens/icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"icons.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|