@teambit/lanes.ui.inputs.lane-selector 0.0.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.
Files changed (41) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.js +10 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/lane-grouped-menu-item.d.ts +8 -0
  5. package/dist/lane-grouped-menu-item.js +36 -0
  6. package/dist/lane-grouped-menu-item.js.map +1 -0
  7. package/dist/lane-grouped-menu-item.module.scss +10 -0
  8. package/dist/lane-menu-item.d.ts +7 -0
  9. package/dist/lane-menu-item.js +60 -0
  10. package/dist/lane-menu-item.js.map +1 -0
  11. package/dist/lane-menu-item.module.scss +14 -0
  12. package/dist/lane-placeholder.d.ts +8 -0
  13. package/dist/lane-placeholder.js +35 -0
  14. package/dist/lane-placeholder.js.map +1 -0
  15. package/dist/lane-placeholder.module.scss +23 -0
  16. package/dist/lane-search.d.ts +6 -0
  17. package/dist/lane-search.js +43 -0
  18. package/dist/lane-search.js.map +1 -0
  19. package/dist/lane-search.module.scss +8 -0
  20. package/dist/lane-selector.d.ts +8 -0
  21. package/dist/lane-selector.js +84 -0
  22. package/dist/lane-selector.js.map +1 -0
  23. package/dist/lane-selector.module.scss +26 -0
  24. package/dist/tsconfig.json +32 -0
  25. package/index.ts +3 -0
  26. package/lane-grouped-menu-item.module.scss +10 -0
  27. package/lane-grouped-menu-item.tsx +34 -0
  28. package/lane-menu-item.module.scss +14 -0
  29. package/lane-menu-item.tsx +38 -0
  30. package/lane-placeholder.module.scss +23 -0
  31. package/lane-placeholder.tsx +34 -0
  32. package/lane-search.module.scss +8 -0
  33. package/lane-search.tsx +31 -0
  34. package/lane-selector.module.scss +26 -0
  35. package/lane-selector.tsx +79 -0
  36. package/package-tar/teambit-lanes.ui.inputs.lane-selector-0.0.1.tgz +0 -0
  37. package/package.json +56 -0
  38. package/preview-1664735485436.js +7 -0
  39. package/tsconfig.json +32 -0
  40. package/types/asset.d.ts +29 -0
  41. package/types/style.d.ts +42 -0
@@ -0,0 +1,3 @@
1
+ export { LaneSelector, LaneSelectorProps } from './lane-selector';
2
+ export { LaneMenuItem, LaneMenuItemProps } from './lane-menu-item';
3
+ export { LanePlaceholder, LanePlaceholderProps } from './lane-placeholder';
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LanePlaceholder = exports.LaneMenuItem = exports.LaneSelector = void 0;
4
+ var lane_selector_1 = require("./lane-selector");
5
+ Object.defineProperty(exports, "LaneSelector", { enumerable: true, get: function () { return lane_selector_1.LaneSelector; } });
6
+ var lane_menu_item_1 = require("./lane-menu-item");
7
+ Object.defineProperty(exports, "LaneMenuItem", { enumerable: true, get: function () { return lane_menu_item_1.LaneMenuItem; } });
8
+ var lane_placeholder_1 = require("./lane-placeholder");
9
+ Object.defineProperty(exports, "LanePlaceholder", { enumerable: true, get: function () { return lane_placeholder_1.LanePlaceholder; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;AAAA,iDAAkE;AAAzD,6GAAA,YAAY,OAAA;AACrB,mDAAmE;AAA1D,8GAAA,YAAY,OAAA;AACrB,uDAA2E;AAAlE,mHAAA,eAAe,OAAA"}
@@ -0,0 +1,8 @@
1
+ import { HTMLAttributes } from 'react';
2
+ import { LaneId } from '@teambit/lane-id';
3
+ export declare type LaneGroupedMenuItemProps = {
4
+ selected?: LaneId;
5
+ current: LaneId[];
6
+ scope: string;
7
+ } & HTMLAttributes<HTMLDivElement>;
8
+ export declare function LaneGroupedMenuItem({ selected, current, className, scope, ...rest }: LaneGroupedMenuItemProps): JSX.Element;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.LaneGroupedMenuItem = void 0;
18
+ const react_1 = __importDefault(require("react"));
19
+ const classnames_1 = __importDefault(require("classnames"));
20
+ const lane_menu_item_1 = require("./lane-menu-item");
21
+ const lane_grouped_menu_item_module_scss_1 = __importDefault(require("./lane-grouped-menu-item.module.scss"));
22
+ function LaneGroupedMenuItem(_a) {
23
+ var { selected, current, className, scope } = _a, rest = __rest(_a, ["selected", "current", "className", "scope"]);
24
+ if (current.length === 0)
25
+ return null;
26
+ if (current[0].isDefault()) {
27
+ const defaultLane = current[0];
28
+ return react_1.default.createElement(lane_menu_item_1.LaneMenuItem, { key: defaultLane.toString(), selected: selected, current: defaultLane });
29
+ }
30
+ const onClickStopPropagation = (e) => e.stopPropagation();
31
+ return (react_1.default.createElement("div", Object.assign({ className: (0, classnames_1.default)(lane_grouped_menu_item_module_scss_1.default.groupedMenuItem, className) }, rest),
32
+ react_1.default.createElement("div", { onClick: onClickStopPropagation, className: lane_grouped_menu_item_module_scss_1.default.scope }, scope),
33
+ current.map((lane) => (react_1.default.createElement(lane_menu_item_1.LaneMenuItem, { key: lane.toString(), selected: selected, current: lane })))));
34
+ }
35
+ exports.LaneGroupedMenuItem = LaneGroupedMenuItem;
36
+ //# sourceMappingURL=lane-grouped-menu-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lane-grouped-menu-item.js","sourceRoot":"","sources":["../lane-grouped-menu-item.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,kDAA8C;AAE9C,4DAAoC;AACpC,qDAAgD;AAEhD,8GAA0D;AAQ1D,SAAgB,mBAAmB,CAAC,EAA0E;QAA1E,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,OAAqC,EAAhC,IAAI,cAA9C,6CAAgD,CAAF;IAChF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE;QAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAW,CAAC;QACzC,OAAO,8BAAC,6BAAY,IAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAI,CAAC;KAChG;IAED,MAAM,sBAAsB,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IAE1D,OAAO,CACL,qDAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,4CAAM,CAAC,eAAe,EAAE,SAAS,CAAC,IAAM,IAAI;QACrE,uCAAK,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,4CAAM,CAAC,KAAK,IAC1D,KAAK,CACF;QACL,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACrB,8BAAC,6BAAY,IAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAI,CAC1E,CAAC,CACE,CACP,CAAC;AACJ,CAAC;AApBD,kDAoBC"}
@@ -0,0 +1,10 @@
1
+ .groupedMenuItem {
2
+ display: flex;
3
+ flex-direction: column;
4
+ min-width: 120px;
5
+ }
6
+
7
+ .scope {
8
+ padding: 8px 16px;
9
+ font-weight: 700;
10
+ }
@@ -0,0 +1,7 @@
1
+ import { HTMLAttributes } from 'react';
2
+ import { LaneId } from '@teambit/lane-id';
3
+ export declare type LaneMenuItemProps = {
4
+ selected?: LaneId;
5
+ current: LaneId;
6
+ } & HTMLAttributes<HTMLDivElement>;
7
+ export declare function LaneMenuItem({ selected, current, className, ...rest }: LaneMenuItemProps): JSX.Element;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __rest = (this && this.__rest) || function (s, e) {
22
+ var t = {};
23
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
24
+ t[p] = s[p];
25
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
26
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
27
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
28
+ t[p[i]] = s[p[i]];
29
+ }
30
+ return t;
31
+ };
32
+ var __importDefault = (this && this.__importDefault) || function (mod) {
33
+ return (mod && mod.__esModule) ? mod : { "default": mod };
34
+ };
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.LaneMenuItem = void 0;
37
+ const react_1 = __importStar(require("react"));
38
+ const lanes_ui_models_lanes_model_1 = require("@teambit/lanes.ui.models.lanes-model");
39
+ const design_ui_pill_label_1 = require("@teambit/design.ui.pill-label");
40
+ const design_ui_surfaces_menu_link_item_1 = require("@teambit/design.ui.surfaces.menu.link-item");
41
+ const lane_menu_item_module_scss_1 = __importDefault(require("./lane-menu-item.module.scss"));
42
+ function LaneMenuItem(_a) {
43
+ var { selected, current, className } = _a, rest = __rest(_a, ["selected", "current", "className"]);
44
+ const isCurrent = (selected === null || selected === void 0 ? void 0 : selected.toString()) === current.toString();
45
+ const currentVersionRef = (0, react_1.useRef)(null);
46
+ (0, react_1.useEffect)(() => {
47
+ var _a;
48
+ if (isCurrent) {
49
+ (_a = currentVersionRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
50
+ }
51
+ }, [isCurrent]);
52
+ const href = lanes_ui_models_lanes_model_1.LanesModel.getLaneUrl(current);
53
+ return (react_1.default.createElement("div", Object.assign({}, rest, { className: className, ref: currentVersionRef }),
54
+ react_1.default.createElement(design_ui_surfaces_menu_link_item_1.MenuLinkItem, { active: isCurrent, href: href, className: lane_menu_item_module_scss_1.default.menuItem },
55
+ react_1.default.createElement("div", { className: lane_menu_item_module_scss_1.default.laneName }, current.name),
56
+ current.isDefault() && (react_1.default.createElement(design_ui_pill_label_1.PillLabel, { className: lane_menu_item_module_scss_1.default.defaultLanePill },
57
+ react_1.default.createElement("span", null, "default"))))));
58
+ }
59
+ exports.LaneMenuItem = LaneMenuItem;
60
+ //# sourceMappingURL=lane-menu-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lane-menu-item.js","sourceRoot":"","sources":["../lane-menu-item.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiE;AAEjE,sFAAkE;AAClE,wEAA0D;AAC1D,kGAA0E;AAE1E,8FAAkD;AAOlD,SAAgB,YAAY,CAAC,EAA4D;QAA5D,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,OAA8B,EAAzB,IAAI,cAAvC,oCAAyC,CAAF;IAClE,MAAM,SAAS,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,EAAE,MAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;IAE9D,MAAM,iBAAiB,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IACvD,IAAA,iBAAS,EAAC,GAAG,EAAE;;QACb,IAAI,SAAS,EAAE;YACb,MAAA,iBAAiB,CAAC,OAAO,0CAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;SACrF;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,IAAI,GAAG,wCAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE5C,OAAO,CACL,uDAAS,IAAI,IAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,iBAAiB;QACzD,8BAAC,gDAAY,IAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,oCAAM,CAAC,QAAQ;YACrE,uCAAK,SAAS,EAAE,oCAAM,CAAC,QAAQ,IAAG,OAAO,CAAC,IAAI,CAAO;YACpD,OAAO,CAAC,SAAS,EAAE,IAAI,CACtB,8BAAC,gCAAS,IAAC,SAAS,EAAE,oCAAM,CAAC,eAAe;gBAC1C,sDAAoB,CACV,CACb,CACY,CACX,CACP,CAAC;AACJ,CAAC;AAxBD,oCAwBC"}
@@ -0,0 +1,14 @@
1
+ .menuItem {
2
+ display: flex;
3
+ flex-direction: row;
4
+ padding: 8px 16px;
5
+ min-width: 120px;
6
+ cursor: pointer;
7
+ justify-content: space-between;
8
+ border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
9
+ }
10
+
11
+ .defaultLanePill {
12
+ font-size: var(--bit-p-xxs, 12px);
13
+ text-transform: lowercase;
14
+ }
@@ -0,0 +1,8 @@
1
+ import { HTMLAttributes } from 'react';
2
+ import { LaneId } from '@teambit/lane-id';
3
+ export declare type LanePlaceholderProps = {
4
+ selectedLaneId?: LaneId;
5
+ disabled?: boolean;
6
+ showScope?: boolean;
7
+ } & HTMLAttributes<HTMLDivElement>;
8
+ export declare function LanePlaceholder({ selectedLaneId, disabled, className, showScope, ...rest }: LanePlaceholderProps): JSX.Element;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.LanePlaceholder = void 0;
18
+ const react_1 = __importDefault(require("react"));
19
+ const evangelist_elements_icon_1 = require("@teambit/evangelist.elements.icon");
20
+ const lanes_ui_icons_lane_icon_1 = require("@teambit/lanes.ui.icons.lane-icon");
21
+ const classnames_1 = __importDefault(require("classnames"));
22
+ const design_ui_styles_ellipsis_1 = require("@teambit/design.ui.styles.ellipsis");
23
+ const lane_placeholder_module_scss_1 = __importDefault(require("./lane-placeholder.module.scss"));
24
+ function LanePlaceholder(_a) {
25
+ var { selectedLaneId, disabled, className, showScope = true } = _a, rest = __rest(_a, ["selectedLaneId", "disabled", "className", "showScope"]);
26
+ const laneIdStr = (selectedLaneId === null || selectedLaneId === void 0 ? void 0 : selectedLaneId.isDefault())
27
+ ? selectedLaneId.name
28
+ : (showScope && (selectedLaneId === null || selectedLaneId === void 0 ? void 0 : selectedLaneId.toString())) || (selectedLaneId === null || selectedLaneId === void 0 ? void 0 : selectedLaneId.name);
29
+ return (react_1.default.createElement("div", Object.assign({}, rest, { className: (0, classnames_1.default)(lane_placeholder_module_scss_1.default.placeholder, className, disabled && lane_placeholder_module_scss_1.default.disabled) }),
30
+ react_1.default.createElement(lanes_ui_icons_lane_icon_1.LaneIcon, { className: lane_placeholder_module_scss_1.default.icon }),
31
+ react_1.default.createElement(design_ui_styles_ellipsis_1.Ellipsis, { className: lane_placeholder_module_scss_1.default.placeholderText }, laneIdStr),
32
+ !disabled && react_1.default.createElement(evangelist_elements_icon_1.Icon, { of: "fat-arrow-down" })));
33
+ }
34
+ exports.LanePlaceholder = LanePlaceholder;
35
+ //# sourceMappingURL=lane-placeholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lane-placeholder.js","sourceRoot":"","sources":["../lane-placeholder.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,kDAA8C;AAC9C,gFAAyD;AACzD,gFAA6D;AAE7D,4DAAoC;AACpC,kFAA8D;AAE9D,kGAAoD;AAQpD,SAAgB,eAAe,CAAC,EAMT;QANS,EAC9B,cAAc,EACd,QAAQ,EACR,SAAS,EACT,SAAS,GAAG,IAAI,OAEK,EADlB,IAAI,cALuB,wDAM/B,CADQ;IAEP,MAAM,SAAS,GAAG,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,SAAS,EAAE;QAC3C,CAAC,CAAC,cAAc,CAAC,IAAI;QACrB,CAAC,CAAC,CAAC,SAAS,KAAI,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,QAAQ,EAAE,CAAA,CAAC,KAAI,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAA,CAAC;IAEtE,OAAO,CACL,uDAAS,IAAI,IAAE,SAAS,EAAE,IAAA,oBAAU,EAAC,sCAAM,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,IAAI,sCAAM,CAAC,QAAQ,CAAC;QAC9F,8BAAC,mCAAQ,IAAC,SAAS,EAAE,sCAAM,CAAC,IAAI,GAAI;QACpC,8BAAC,oCAAQ,IAAC,SAAS,EAAE,sCAAM,CAAC,eAAe,IAAG,SAAS,CAAY;QAClE,CAAC,QAAQ,IAAI,8BAAC,+BAAI,IAAC,EAAE,EAAC,gBAAgB,GAAG,CACtC,CACP,CAAC;AACJ,CAAC;AAlBD,0CAkBC"}
@@ -0,0 +1,23 @@
1
+ .placeholder {
2
+ display: flex;
3
+ align-items: center;
4
+ padding: 4px 8px 4px 4px;
5
+ line-height: var(--bit-p-md, 16px);
6
+ font-size: var(--bit-p-md, 16px);
7
+ border-radius: 6px;
8
+ border: 1px solid var(--bit-border-color-light, #cccfd4);
9
+ background-color: var(--bit-border-color-lightest, #ededed);
10
+ &.disabled {
11
+ border: unset;
12
+ }
13
+ }
14
+
15
+ .placeholderText {
16
+ padding: 4px 12px;
17
+ font-size: var(--bit-p-xs, 14px);
18
+ flex: 1;
19
+ }
20
+
21
+ .icon {
22
+ padding-left: 8px;
23
+ }
@@ -0,0 +1,6 @@
1
+ import { ChangeEventHandler } from 'react';
2
+ export declare type LaneSearchProps = {
3
+ onChange: ChangeEventHandler<HTMLInputElement>;
4
+ focus: boolean;
5
+ };
6
+ export declare function LaneSearch({ onChange, focus }: LaneSearchProps): JSX.Element;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.LaneSearch = void 0;
26
+ const react_1 = __importStar(require("react"));
27
+ const lane_search_module_scss_1 = __importDefault(require("./lane-search.module.scss"));
28
+ function LaneSearch({ onChange, focus }) {
29
+ const inputRef = (0, react_1.createRef)();
30
+ (0, react_1.useEffect)(() => {
31
+ var _a;
32
+ if (focus)
33
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
34
+ }, [focus]);
35
+ const handleOnClicked = (e) => {
36
+ var _a;
37
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
38
+ e.stopPropagation();
39
+ };
40
+ return (react_1.default.createElement("input", { className: lane_search_module_scss_1.default.search, placeholder: 'Search', onClick: handleOnClicked, ref: inputRef, onChange: onChange }));
41
+ }
42
+ exports.LaneSearch = LaneSearch;
43
+ //# sourceMappingURL=lane-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lane-search.js","sourceRoot":"","sources":["../lane-search.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAwE;AAExE,wFAA+C;AAO/C,SAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAmB;IAC7D,MAAM,QAAQ,GAAG,IAAA,iBAAS,GAAoB,CAAC;IAE/C,IAAA,iBAAS,EAAC,GAAG,EAAE;;QACb,IAAI,KAAK;YAAE,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;IACvC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,EAAE;;QAC5B,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC,eAAe,EAAE,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,CACL,yCACE,SAAS,EAAE,iCAAM,CAAC,MAAM,EACxB,WAAW,EAAE,QAAQ,EACrB,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,QAAQ,GACX,CACV,CAAC;AACJ,CAAC;AArBD,gCAqBC"}
@@ -0,0 +1,8 @@
1
+ .search {
2
+ margin-bottom: 8px;
3
+ padding: 8px;
4
+ border: 1px solid var(--bit-border-color-lightest, #ededed);
5
+ border-radius: 6px;
6
+ width: calc(100% - 16px);
7
+ background: var(--bit-bg-color, #ffffff);
8
+ }
@@ -0,0 +1,8 @@
1
+ import { HTMLAttributes } from 'react';
2
+ import { LaneId } from '@teambit/lane-id';
3
+ export declare type LaneSelectorProps = {
4
+ lanes: Array<LaneId>;
5
+ selectedLaneId?: LaneId;
6
+ groupByScope?: boolean;
7
+ } & HTMLAttributes<HTMLDivElement>;
8
+ export declare function LaneSelector({ className, lanes, selectedLaneId, groupByScope, ...rest }: LaneSelectorProps): JSX.Element;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __rest = (this && this.__rest) || function (s, e) {
22
+ var t = {};
23
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
24
+ t[p] = s[p];
25
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
26
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
27
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
28
+ t[p[i]] = s[p[i]];
29
+ }
30
+ return t;
31
+ };
32
+ var __importDefault = (this && this.__importDefault) || function (mod) {
33
+ return (mod && mod.__esModule) ? mod : { "default": mod };
34
+ };
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.LaneSelector = void 0;
37
+ const react_1 = __importStar(require("react"));
38
+ const classnames_1 = __importDefault(require("classnames"));
39
+ const evangelist_surfaces_dropdown_1 = require("@teambit/evangelist.surfaces.dropdown");
40
+ const lanes_ui_models_lanes_model_1 = require("@teambit/lanes.ui.models.lanes-model");
41
+ const lane_menu_item_1 = require("./lane-menu-item");
42
+ const lane_placeholder_1 = require("./lane-placeholder");
43
+ const lane_grouped_menu_item_1 = require("./lane-grouped-menu-item");
44
+ const lane_search_1 = require("./lane-search");
45
+ const lane_selector_module_scss_1 = __importDefault(require("./lane-selector.module.scss"));
46
+ function LaneSelector(_a) {
47
+ var { className, lanes, selectedLaneId, groupByScope = true } = _a, rest = __rest(_a, ["className", "lanes", "selectedLaneId", "groupByScope"]);
48
+ const [filteredLanes, setFilteredLanes] = (0, react_1.useState)(lanes);
49
+ const [focus, setFocus] = (0, react_1.useState)(false);
50
+ (0, react_1.useEffect)(() => {
51
+ setFilteredLanes(lanes);
52
+ }, [lanes]);
53
+ const multipleLanes = lanes.length > 1;
54
+ const laneDropdownItems = groupByScope
55
+ ? Array.from(lanes_ui_models_lanes_model_1.LanesModel.groupByScope(filteredLanes).entries())
56
+ : filteredLanes;
57
+ const handleOnChange = (e) => {
58
+ e.stopPropagation();
59
+ const searchTerm = e.target.value;
60
+ if (!searchTerm || searchTerm === '') {
61
+ setFilteredLanes(lanes);
62
+ }
63
+ else {
64
+ setFilteredLanes((value) => value.filter((laneId) => laneId.name.includes(searchTerm)));
65
+ }
66
+ };
67
+ const onDropdownToggled = (_, open) => {
68
+ setFocus(open);
69
+ };
70
+ return (react_1.default.createElement(evangelist_surfaces_dropdown_1.Dropdown, Object.assign({}, rest, { open: !multipleLanes ? false : undefined, dropClass: lane_selector_module_scss_1.default.menu, onChange: multipleLanes ? onDropdownToggled : undefined,
71
+ // @ts-ignore - mismatch between @types/react
72
+ placeholder: react_1.default.createElement(lane_placeholder_1.LanePlaceholder, { disabled: !multipleLanes, selectedLaneId: selectedLaneId, showScope: groupByScope }), className: (0, classnames_1.default)(className, lane_selector_module_scss_1.default.dropdown, !multipleLanes && lane_selector_module_scss_1.default.disabled) }),
73
+ multipleLanes && react_1.default.createElement("div", { className: lane_selector_module_scss_1.default.header }, "Switch lane"),
74
+ multipleLanes && (react_1.default.createElement("div", { className: lane_selector_module_scss_1.default.search },
75
+ react_1.default.createElement(lane_search_1.LaneSearch, { focus: focus, onChange: handleOnChange }))),
76
+ multipleLanes &&
77
+ groupByScope &&
78
+ laneDropdownItems.map(([scope, lanesByScope]) => (react_1.default.createElement(lane_grouped_menu_item_1.LaneGroupedMenuItem, { key: scope, scope: scope, selected: selectedLaneId, current: lanesByScope }))),
79
+ multipleLanes &&
80
+ !groupByScope &&
81
+ laneDropdownItems.map((lane) => (react_1.default.createElement(lane_menu_item_1.LaneMenuItem, { key: lane.toString(), selected: selectedLaneId, current: lane })))));
82
+ }
83
+ exports.LaneSelector = LaneSelector;
84
+ //# sourceMappingURL=lane-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lane-selector.js","sourceRoot":"","sources":["../lane-selector.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ @import '~@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
+
3
+ .dropdown {
4
+ // otherwise when the dropdown is open it clashes with the content of the tree
5
+ // (this is bizarre, the tree has no position absolute)
6
+ z-index: $nav-z-index;
7
+ &.disabled {
8
+ > div {
9
+ cursor: unset;
10
+ }
11
+ }
12
+ }
13
+
14
+ .header {
15
+ padding: 8px 16px;
16
+ border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
17
+ }
18
+
19
+ .search {
20
+ margin: 8px 0px 0px 0px;
21
+ border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
22
+ }
23
+
24
+ .menu {
25
+ width: calc(100% - 24px);
26
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "compilerOptions": {
3
+ "lib": [
4
+ "es2019",
5
+ "DOM",
6
+ "ES6",
7
+ "DOM.Iterable"
8
+ ],
9
+ "target": "es2015",
10
+ "module": "CommonJS",
11
+ "jsx": "react",
12
+ "allowJs": true,
13
+ "composite": true,
14
+ "declaration": true,
15
+ "sourceMap": true,
16
+ "skipLibCheck": true,
17
+ "experimentalDecorators": true,
18
+ "outDir": "dist",
19
+ "moduleResolution": "node",
20
+ "esModuleInterop": true,
21
+ "rootDir": ".",
22
+ "resolveJsonModule": true
23
+ },
24
+ "exclude": [
25
+ "dist",
26
+ "package.json"
27
+ ],
28
+ "include": [
29
+ "**/*",
30
+ "**/*.json"
31
+ ]
32
+ }
package/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { LaneSelector, LaneSelectorProps } from './lane-selector';
2
+ export { LaneMenuItem, LaneMenuItemProps } from './lane-menu-item';
3
+ export { LanePlaceholder, LanePlaceholderProps } from './lane-placeholder';
@@ -0,0 +1,10 @@
1
+ .groupedMenuItem {
2
+ display: flex;
3
+ flex-direction: column;
4
+ min-width: 120px;
5
+ }
6
+
7
+ .scope {
8
+ padding: 8px 16px;
9
+ font-weight: 700;
10
+ }
@@ -0,0 +1,34 @@
1
+ import React, { HTMLAttributes } from 'react';
2
+ import { LaneId } from '@teambit/lane-id';
3
+ import classnames from 'classnames';
4
+ import { LaneMenuItem } from './lane-menu-item';
5
+
6
+ import styles from './lane-grouped-menu-item.module.scss';
7
+
8
+ export type LaneGroupedMenuItemProps = {
9
+ selected?: LaneId;
10
+ current: LaneId[];
11
+ scope: string;
12
+ } & HTMLAttributes<HTMLDivElement>;
13
+
14
+ export function LaneGroupedMenuItem({ selected, current, className, scope, ...rest }: LaneGroupedMenuItemProps) {
15
+ if (current.length === 0) return null;
16
+
17
+ if (current[0].isDefault()) {
18
+ const defaultLane = current[0] as LaneId;
19
+ return <LaneMenuItem key={defaultLane.toString()} selected={selected} current={defaultLane} />;
20
+ }
21
+
22
+ const onClickStopPropagation = (e) => e.stopPropagation();
23
+
24
+ return (
25
+ <div className={classnames(styles.groupedMenuItem, className)} {...rest}>
26
+ <div onClick={onClickStopPropagation} className={styles.scope}>
27
+ {scope}
28
+ </div>
29
+ {current.map((lane) => (
30
+ <LaneMenuItem key={lane.toString()} selected={selected} current={lane} />
31
+ ))}
32
+ </div>
33
+ );
34
+ }
@@ -0,0 +1,14 @@
1
+ .menuItem {
2
+ display: flex;
3
+ flex-direction: row;
4
+ padding: 8px 16px;
5
+ min-width: 120px;
6
+ cursor: pointer;
7
+ justify-content: space-between;
8
+ border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
9
+ }
10
+
11
+ .defaultLanePill {
12
+ font-size: var(--bit-p-xxs, 12px);
13
+ text-transform: lowercase;
14
+ }
@@ -0,0 +1,38 @@
1
+ import React, { HTMLAttributes, useRef, useEffect } from 'react';
2
+ import { LaneId } from '@teambit/lane-id';
3
+ import { LanesModel } from '@teambit/lanes.ui.models.lanes-model';
4
+ import { PillLabel } from '@teambit/design.ui.pill-label';
5
+ import { MenuLinkItem } from '@teambit/design.ui.surfaces.menu.link-item';
6
+
7
+ import styles from './lane-menu-item.module.scss';
8
+
9
+ export type LaneMenuItemProps = {
10
+ selected?: LaneId;
11
+ current: LaneId;
12
+ } & HTMLAttributes<HTMLDivElement>;
13
+
14
+ export function LaneMenuItem({ selected, current, className, ...rest }: LaneMenuItemProps) {
15
+ const isCurrent = selected?.toString() === current.toString();
16
+
17
+ const currentVersionRef = useRef<HTMLDivElement>(null);
18
+ useEffect(() => {
19
+ if (isCurrent) {
20
+ currentVersionRef.current?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
21
+ }
22
+ }, [isCurrent]);
23
+
24
+ const href = LanesModel.getLaneUrl(current);
25
+
26
+ return (
27
+ <div {...rest} className={className} ref={currentVersionRef}>
28
+ <MenuLinkItem active={isCurrent} href={href} className={styles.menuItem}>
29
+ <div className={styles.laneName}>{current.name}</div>
30
+ {current.isDefault() && (
31
+ <PillLabel className={styles.defaultLanePill}>
32
+ <span>default</span>
33
+ </PillLabel>
34
+ )}
35
+ </MenuLinkItem>
36
+ </div>
37
+ );
38
+ }
@@ -0,0 +1,23 @@
1
+ .placeholder {
2
+ display: flex;
3
+ align-items: center;
4
+ padding: 4px 8px 4px 4px;
5
+ line-height: var(--bit-p-md, 16px);
6
+ font-size: var(--bit-p-md, 16px);
7
+ border-radius: 6px;
8
+ border: 1px solid var(--bit-border-color-light, #cccfd4);
9
+ background-color: var(--bit-border-color-lightest, #ededed);
10
+ &.disabled {
11
+ border: unset;
12
+ }
13
+ }
14
+
15
+ .placeholderText {
16
+ padding: 4px 12px;
17
+ font-size: var(--bit-p-xs, 14px);
18
+ flex: 1;
19
+ }
20
+
21
+ .icon {
22
+ padding-left: 8px;
23
+ }
@@ -0,0 +1,34 @@
1
+ import React, { HTMLAttributes } from 'react';
2
+ import { Icon } from '@teambit/evangelist.elements.icon';
3
+ import { LaneIcon } from '@teambit/lanes.ui.icons.lane-icon';
4
+ import { LaneId } from '@teambit/lane-id';
5
+ import classnames from 'classnames';
6
+ import { Ellipsis } from '@teambit/design.ui.styles.ellipsis';
7
+
8
+ import styles from './lane-placeholder.module.scss';
9
+
10
+ export type LanePlaceholderProps = {
11
+ selectedLaneId?: LaneId;
12
+ disabled?: boolean;
13
+ showScope?: boolean;
14
+ } & HTMLAttributes<HTMLDivElement>;
15
+
16
+ export function LanePlaceholder({
17
+ selectedLaneId,
18
+ disabled,
19
+ className,
20
+ showScope = true,
21
+ ...rest
22
+ }: LanePlaceholderProps) {
23
+ const laneIdStr = selectedLaneId?.isDefault()
24
+ ? selectedLaneId.name
25
+ : (showScope && selectedLaneId?.toString()) || selectedLaneId?.name;
26
+
27
+ return (
28
+ <div {...rest} className={classnames(styles.placeholder, className, disabled && styles.disabled)}>
29
+ <LaneIcon className={styles.icon} />
30
+ <Ellipsis className={styles.placeholderText}>{laneIdStr}</Ellipsis>
31
+ {!disabled && <Icon of="fat-arrow-down" />}
32
+ </div>
33
+ );
34
+ }
@@ -0,0 +1,8 @@
1
+ .search {
2
+ margin-bottom: 8px;
3
+ padding: 8px;
4
+ border: 1px solid var(--bit-border-color-lightest, #ededed);
5
+ border-radius: 6px;
6
+ width: calc(100% - 16px);
7
+ background: var(--bit-bg-color, #ffffff);
8
+ }
@@ -0,0 +1,31 @@
1
+ import React, { createRef, useEffect, ChangeEventHandler } from 'react';
2
+
3
+ import styles from './lane-search.module.scss';
4
+
5
+ export type LaneSearchProps = {
6
+ onChange: ChangeEventHandler<HTMLInputElement>;
7
+ focus: boolean;
8
+ };
9
+
10
+ export function LaneSearch({ onChange, focus }: LaneSearchProps) {
11
+ const inputRef = createRef<HTMLInputElement>();
12
+
13
+ useEffect(() => {
14
+ if (focus) inputRef.current?.focus();
15
+ }, [focus]);
16
+
17
+ const handleOnClicked = (e) => {
18
+ inputRef.current?.focus();
19
+ e.stopPropagation();
20
+ };
21
+
22
+ return (
23
+ <input
24
+ className={styles.search}
25
+ placeholder={'Search'}
26
+ onClick={handleOnClicked}
27
+ ref={inputRef}
28
+ onChange={onChange}
29
+ ></input>
30
+ );
31
+ }
@@ -0,0 +1,26 @@
1
+ @import '~@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
+
3
+ .dropdown {
4
+ // otherwise when the dropdown is open it clashes with the content of the tree
5
+ // (this is bizarre, the tree has no position absolute)
6
+ z-index: $nav-z-index;
7
+ &.disabled {
8
+ > div {
9
+ cursor: unset;
10
+ }
11
+ }
12
+ }
13
+
14
+ .header {
15
+ padding: 8px 16px;
16
+ border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
17
+ }
18
+
19
+ .search {
20
+ margin: 8px 0px 0px 0px;
21
+ border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
22
+ }
23
+
24
+ .menu {
25
+ width: calc(100% - 24px);
26
+ }
@@ -0,0 +1,79 @@
1
+ import React, { HTMLAttributes, useState, ChangeEventHandler, useEffect } from 'react';
2
+ import classnames from 'classnames';
3
+ import { LaneId } from '@teambit/lane-id';
4
+ import { Dropdown } from '@teambit/evangelist.surfaces.dropdown';
5
+
6
+ import { LanesModel } from '@teambit/lanes.ui.models.lanes-model';
7
+ import { LaneMenuItem } from './lane-menu-item';
8
+ import { LanePlaceholder } from './lane-placeholder';
9
+ import { LaneGroupedMenuItem } from './lane-grouped-menu-item';
10
+ import { LaneSearch } from './lane-search';
11
+
12
+ import styles from './lane-selector.module.scss';
13
+
14
+ export type LaneSelectorProps = {
15
+ lanes: Array<LaneId>;
16
+ selectedLaneId?: LaneId;
17
+ groupByScope?: boolean;
18
+ } & HTMLAttributes<HTMLDivElement>;
19
+
20
+ type LaneDropdownItems = Array<LaneId> | Array<[scope: string, lanes: LaneId[]]>;
21
+
22
+ export function LaneSelector({ className, lanes, selectedLaneId, groupByScope = true, ...rest }: LaneSelectorProps) {
23
+ const [filteredLanes, setFilteredLanes] = useState<LaneId[]>(lanes);
24
+ const [focus, setFocus] = useState<boolean>(false);
25
+
26
+ useEffect(() => {
27
+ setFilteredLanes(lanes);
28
+ }, [lanes]);
29
+
30
+ const multipleLanes = lanes.length > 1;
31
+ const laneDropdownItems: LaneDropdownItems = groupByScope
32
+ ? Array.from(LanesModel.groupByScope(filteredLanes).entries())
33
+ : filteredLanes;
34
+
35
+ const handleOnChange: ChangeEventHandler<HTMLInputElement> = (e) => {
36
+ e.stopPropagation();
37
+ const searchTerm = e.target.value;
38
+ if (!searchTerm || searchTerm === '') {
39
+ setFilteredLanes(lanes);
40
+ } else {
41
+ setFilteredLanes((value) => value.filter((laneId) => laneId.name.includes(searchTerm)));
42
+ }
43
+ };
44
+
45
+ const onDropdownToggled = (_, open) => {
46
+ setFocus(open);
47
+ };
48
+
49
+ return (
50
+ <Dropdown
51
+ {...rest}
52
+ open={!multipleLanes ? false : undefined}
53
+ dropClass={styles.menu}
54
+ onChange={multipleLanes ? onDropdownToggled : undefined}
55
+ // @ts-ignore - mismatch between @types/react
56
+ placeholder={
57
+ <LanePlaceholder disabled={!multipleLanes} selectedLaneId={selectedLaneId} showScope={groupByScope} />
58
+ }
59
+ className={classnames(className, styles.dropdown, !multipleLanes && styles.disabled)}
60
+ >
61
+ {multipleLanes && <div className={styles.header}>Switch lane</div>}
62
+ {multipleLanes && (
63
+ <div className={styles.search}>
64
+ <LaneSearch focus={focus} onChange={handleOnChange} />
65
+ </div>
66
+ )}
67
+ {multipleLanes &&
68
+ groupByScope &&
69
+ (laneDropdownItems as Array<[scope: string, lanes: LaneId[]]>).map(([scope, lanesByScope]) => (
70
+ <LaneGroupedMenuItem key={scope} scope={scope} selected={selectedLaneId} current={lanesByScope} />
71
+ ))}
72
+ {multipleLanes &&
73
+ !groupByScope &&
74
+ (laneDropdownItems as LaneId[]).map((lane) => (
75
+ <LaneMenuItem key={lane.toString()} selected={selectedLaneId} current={lane}></LaneMenuItem>
76
+ ))}
77
+ </Dropdown>
78
+ );
79
+ }
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@teambit/lanes.ui.inputs.lane-selector",
3
+ "version": "0.0.1",
4
+ "main": "dist/index.js",
5
+ "componentId": {
6
+ "scope": "teambit.lanes",
7
+ "name": "ui/inputs/lane-selector",
8
+ "version": "0.0.1"
9
+ },
10
+ "dependencies": {
11
+ "classnames": "2.2.6",
12
+ "core-js": "^3.0.0",
13
+ "@teambit/design.ui.surfaces.menu.link-item": "1.0.0",
14
+ "@teambit/evangelist.elements.icon": "1.0.2",
15
+ "@teambit/evangelist.surfaces.dropdown": "1.0.2",
16
+ "@teambit/lane-id": "0.0.97",
17
+ "@teambit/design.ui.pill-label": "0.0.356",
18
+ "@teambit/lanes.ui.models.lanes-model": "0.0.1",
19
+ "@teambit/design.ui.styles.ellipsis": "0.0.353",
20
+ "@teambit/lanes.ui.icons.lane-icon": "0.0.1",
21
+ "@teambit/ui-foundation.ui.constants.z-indexes": "0.0.494"
22
+ },
23
+ "devDependencies": {
24
+ "@types/classnames": "2.2.11",
25
+ "@types/react": "^17.0.8",
26
+ "@types/mocha": "9.1.0",
27
+ "@types/testing-library__jest-dom": "5.9.5",
28
+ "@babel/runtime": "7.12.18",
29
+ "@types/jest": "^26.0.0",
30
+ "@types/react-dom": "^17.0.5",
31
+ "@types/node": "12.20.4"
32
+ },
33
+ "peerDependencies": {
34
+ "react-dom": "^16.8.0 || ^17.0.0",
35
+ "react": "^16.8.0 || ^17.0.0"
36
+ },
37
+ "license": "Apache-2.0",
38
+ "private": false,
39
+ "engines": {
40
+ "node": ">=12.22.0"
41
+ },
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/teambit/bit"
45
+ },
46
+ "keywords": [
47
+ "bit",
48
+ "components",
49
+ "collaboration",
50
+ "web",
51
+ "react",
52
+ "react-components",
53
+ "angular",
54
+ "angular-components"
55
+ ]
56
+ }
@@ -0,0 +1,7 @@
1
+ ;
2
+ ;
3
+
4
+ export const compositions = [];
5
+ export const overview = [];
6
+
7
+ export const compositions_metadata = {"compositions":[]};
package/tsconfig.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "compilerOptions": {
3
+ "lib": [
4
+ "es2019",
5
+ "DOM",
6
+ "ES6",
7
+ "DOM.Iterable"
8
+ ],
9
+ "target": "es2015",
10
+ "module": "CommonJS",
11
+ "jsx": "react",
12
+ "allowJs": true,
13
+ "composite": true,
14
+ "declaration": true,
15
+ "sourceMap": true,
16
+ "skipLibCheck": true,
17
+ "experimentalDecorators": true,
18
+ "outDir": "dist",
19
+ "moduleResolution": "node",
20
+ "esModuleInterop": true,
21
+ "rootDir": ".",
22
+ "resolveJsonModule": true
23
+ },
24
+ "exclude": [
25
+ "dist",
26
+ "package.json"
27
+ ],
28
+ "include": [
29
+ "**/*",
30
+ "**/*.json"
31
+ ]
32
+ }
@@ -0,0 +1,29 @@
1
+ declare module '*.png' {
2
+ const value: any;
3
+ export = value;
4
+ }
5
+ declare module '*.svg' {
6
+ import type { FunctionComponent, SVGProps } from 'react';
7
+
8
+ export const ReactComponent: FunctionComponent<SVGProps<SVGSVGElement> & { title?: string }>;
9
+ const src: string;
10
+ export default src;
11
+ }
12
+
13
+ // @TODO Gilad
14
+ declare module '*.jpg' {
15
+ const value: any;
16
+ export = value;
17
+ }
18
+ declare module '*.jpeg' {
19
+ const value: any;
20
+ export = value;
21
+ }
22
+ declare module '*.gif' {
23
+ const value: any;
24
+ export = value;
25
+ }
26
+ declare module '*.bmp' {
27
+ const value: any;
28
+ export = value;
29
+ }
@@ -0,0 +1,42 @@
1
+ declare module '*.module.css' {
2
+ const classes: { readonly [key: string]: string };
3
+ export default classes;
4
+ }
5
+ declare module '*.module.scss' {
6
+ const classes: { readonly [key: string]: string };
7
+ export default classes;
8
+ }
9
+ declare module '*.module.sass' {
10
+ const classes: { readonly [key: string]: string };
11
+ export default classes;
12
+ }
13
+
14
+ declare module '*.module.less' {
15
+ const classes: { readonly [key: string]: string };
16
+ export default classes;
17
+ }
18
+
19
+ declare module '*.less' {
20
+ const classes: { readonly [key: string]: string };
21
+ export default classes;
22
+ }
23
+
24
+ declare module '*.css' {
25
+ const classes: { readonly [key: string]: string };
26
+ export default classes;
27
+ }
28
+
29
+ declare module '*.sass' {
30
+ const classes: { readonly [key: string]: string };
31
+ export default classes;
32
+ }
33
+
34
+ declare module '*.scss' {
35
+ const classes: { readonly [key: string]: string };
36
+ export default classes;
37
+ }
38
+
39
+ declare module '*.mdx' {
40
+ const component: any;
41
+ export default component;
42
+ }