@teambit/workspace 1.0.982 → 1.0.984

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/{preview-1778613913688.js → preview-1778681054666.js} +2 -2
  2. package/dist/ui/workspace/workspace-overview/card-overlays.d.ts +4 -0
  3. package/dist/ui/workspace/workspace-overview/card-overlays.js +133 -0
  4. package/dist/ui/workspace/workspace-overview/card-overlays.js.map +1 -0
  5. package/dist/ui/workspace/workspace-overview/card-overlays.module.scss +72 -0
  6. package/dist/ui/workspace/workspace-overview/filter-utils.d.ts +4 -1
  7. package/dist/ui/workspace/workspace-overview/filter-utils.js +17 -1
  8. package/dist/ui/workspace/workspace-overview/filter-utils.js.map +1 -1
  9. package/dist/ui/workspace/workspace-overview/hope-component-card.d.ts +14 -0
  10. package/dist/ui/workspace/workspace-overview/hope-component-card.js +186 -0
  11. package/dist/ui/workspace/workspace-overview/hope-component-card.js.map +1 -0
  12. package/dist/ui/workspace/workspace-overview/hope-component-card.module.scss +162 -0
  13. package/dist/ui/workspace/workspace-overview/namespace-header.d.ts +8 -0
  14. package/dist/ui/workspace/workspace-overview/namespace-header.js +107 -0
  15. package/dist/ui/workspace/workspace-overview/namespace-header.js.map +1 -0
  16. package/dist/ui/workspace/workspace-overview/namespace-header.module.scss +88 -0
  17. package/dist/ui/workspace/workspace-overview/use-workspace-aggregation.js +11 -5
  18. package/dist/ui/workspace/workspace-overview/use-workspace-aggregation.js.map +1 -1
  19. package/dist/ui/workspace/workspace-overview/workspace-filter-panel.js +8 -6
  20. package/dist/ui/workspace/workspace-overview/workspace-filter-panel.js.map +1 -1
  21. package/dist/ui/workspace/workspace-overview/workspace-overview.d.ts +0 -6
  22. package/dist/ui/workspace/workspace-overview/workspace-overview.js +38 -105
  23. package/dist/ui/workspace/workspace-overview/workspace-overview.js.map +1 -1
  24. package/dist/ui/workspace/workspace-overview/workspace-overview.module.scss +38 -158
  25. package/dist/ui/workspace/workspace-overview/workspace-overview.types.d.ts +6 -0
  26. package/dist/ui/workspace/workspace-overview/workspace-overview.types.js.map +1 -1
  27. package/dist/ui/workspace/workspace.js +22 -5
  28. package/dist/ui/workspace/workspace.js.map +1 -1
  29. package/dist/ui/workspace/workspace.module.scss +38 -30
  30. package/package.json +43 -44
  31. package/ui/workspace/workspace-overview/card-overlays.module.scss +72 -0
  32. package/ui/workspace/workspace-overview/card-overlays.tsx +66 -0
  33. package/ui/workspace/workspace-overview/filter-utils.ts +18 -1
  34. package/ui/workspace/workspace-overview/hope-component-card.module.scss +162 -0
  35. package/ui/workspace/workspace-overview/hope-component-card.tsx +152 -0
  36. package/ui/workspace/workspace-overview/namespace-header.module.scss +88 -0
  37. package/ui/workspace/workspace-overview/namespace-header.tsx +72 -0
  38. package/ui/workspace/workspace-overview/use-workspace-aggregation.ts +11 -5
  39. package/ui/workspace/workspace-overview/workspace-filter-panel.tsx +10 -9
  40. package/ui/workspace/workspace-overview/workspace-overview.module.scss +38 -158
  41. package/ui/workspace/workspace-overview/workspace-overview.tsx +40 -88
  42. package/ui/workspace/workspace-overview/workspace-overview.types.ts +7 -1
  43. package/ui/workspace/workspace.module.scss +38 -30
  44. package/ui/workspace/workspace.tsx +24 -7
@@ -1,211 +1,91 @@
1
1
  @import '@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
2
 
3
3
  .container {
4
- padding: 24px 5% 150px 5%;
5
4
  overflow-y: auto;
6
5
  height: 100%;
7
6
  box-sizing: border-box;
8
7
  z-index: 1;
9
8
  }
10
9
 
11
- .rightPreviewPlugins {
12
- display: flex;
13
- align-items: flex-end;
14
- justify-content: flex-end;
15
- width: 100%;
16
- height: 100%;
17
- }
18
-
19
- .envIcon {
20
- height: 14px;
10
+ .content {
11
+ padding: 20px 40px 80px;
21
12
  }
22
13
 
23
- .badge {
24
- background-color: var(--surface-color);
25
- padding: 4px;
26
- height: 15px;
27
- margin-right: 4px;
28
- z-index: $nav-z-index;
29
- border-radius: 8px;
30
- margin-bottom: 4px;
31
- box-shadow: 0px 2px 18px rgb(0 0 0 / 10%);
32
- }
33
-
34
- .cardGrid {
35
- display: grid;
36
- gap: 32px 24px;
37
- grid-template-columns: repeat(auto-fill, minmax(270px, 1fr));
38
- max-width: 1280px;
39
- grid-column-gap: 28px;
40
- grid-row-gap: 32px;
41
- }
14
+ /* ---- Command bar ---- */
42
15
 
43
- .filterPanel {
16
+ .commandBar {
44
17
  display: flex;
45
18
  align-items: center;
46
19
  justify-content: space-between;
47
- margin-bottom: 24px;
48
- position: relative;
20
+ gap: 12px;
21
+ flex-wrap: wrap;
22
+ padding: 12px 40px;
23
+ background: color-mix(in srgb, var(--bit-accent-color, #6c5ce7) 3%, var(--background-color, #fff));
24
+ border-bottom: 1px solid var(--border-medium-color);
25
+ position: sticky;
26
+ top: 0;
49
27
  z-index: $modal-z-index - 1;
50
28
  }
51
29
 
52
- .aggButtons {
53
- display: inline-flex;
54
- background: var(--surface-1-color);
55
- border: 1px solid var(--border-medium-color);
56
- border-radius: 8px;
57
- padding: 2px;
58
- height: 34px;
59
- }
60
-
61
- .aggButton,
62
- .aggActive {
63
- padding: 4px 12px;
64
- font-size: 14px;
65
- border-radius: 6px;
66
- background: transparent;
67
- cursor: pointer;
68
- border: none;
30
+ .leftCluster {
69
31
  display: flex;
70
32
  align-items: center;
71
- }
72
-
73
- .aggButton:hover {
74
- background: var(--surface-hover-color);
75
- }
76
-
77
- .aggActive {
78
- background: var(--brand-primary-color);
79
- color: white;
80
- }
81
-
82
- .dropdownList {
83
- max-height: 260px;
84
- overflow-y: auto;
85
- padding: 0 12px;
86
- display: flex;
87
- flex-direction: column;
88
33
  gap: 8px;
34
+ flex-wrap: wrap;
89
35
  }
90
36
 
91
- .dropdownItem {
37
+ .rightCluster {
92
38
  display: flex;
93
39
  align-items: center;
94
40
  gap: 8px;
95
- font-size: 14px;
96
- cursor: pointer;
97
- }
98
-
99
- .dropdownItem input {
100
- width: 16px;
101
- height: 16px;
102
- }
103
-
104
- .count {
105
- opacity: 0.55;
106
- }
107
-
108
- .agg {
109
- margin-bottom: 28px;
41
+ margin-left: auto;
110
42
  }
111
43
 
112
- .aggregationTitle {
113
- margin-top: 0;
114
- margin-bottom: 15px;
44
+ .aggToggle {
45
+ height: 32px !important;
46
+ font-size: 12.5px;
47
+ --surface02-color: color-mix(in srgb, var(--bit-accent-color, #6c5ce7) 20%, var(--surface-color, #f5f5f5));
115
48
  }
116
49
 
117
- :global(.componentGrid) {
118
- grid-row-gap: 24px !important;
119
- grid-column-gap: 16px !important;
120
- }
50
+ /* ---- Base filter overrides ---- */
121
51
 
122
- .filterPanel :global(.baseFilter) {
52
+ .commandBar :global(.baseFilter) {
123
53
  max-width: 220px;
124
54
  height: 32px;
125
55
  }
126
56
 
127
- .filterPanel :global(.control) {
57
+ .commandBar :global(.control) {
128
58
  border-radius: 8px !important;
129
59
  height: 32px;
130
60
  padding: 0 10px !important;
131
61
  }
132
62
 
133
- .filterPanel :global(.menu) {
63
+ .commandBar :global(.menu) {
134
64
  z-index: $modal-z-index - 1 !important;
135
- border-radius: 8px !important;
65
+ border-radius: 14px !important;
136
66
  padding: 8px 0 !important;
67
+ width: 260px;
68
+ box-shadow: 0 24px 60px -12px rgba(20, 0, 104, 0.2);
137
69
  }
138
70
 
139
- .filterDropdown :global(.baseFilter) {
140
- height: 32px;
141
- max-width: 240px;
142
- font-size: 14px;
143
- }
144
-
145
- .filterDropdown :global(.baseFilter .control) {
146
- padding: 8px 12px;
147
- border-radius: 8px;
148
- }
149
-
150
- .filterDropdown :global(.menu) {
151
- margin-top: 10px;
152
- padding: 12px 0;
153
- min-width: 260px;
154
- border-radius: 12px;
155
-
156
- box-shadow: var(--bit-shadow-hover-low, 0 2px 8px rgba(0, 0, 0, 0.1));
157
- border: 1px solid var(--border-medium-color, #ededed);
158
- }
159
-
160
- .filterDropdown :global(.checkboxContainer) {
161
- padding-left: 14px;
162
- }
163
-
164
- .filterDropdown :global(.checkbox) {
165
- margin-right: 12px;
166
- accent-color: var(--bit-accent-color, #6c5ce7);
167
- }
168
-
169
- .filterDropdown :global(.buttonsSection) {
170
- padding: 12px 16px;
171
- border-top: 1px solid var(--border-medium-color, #ededed);
172
- }
173
-
174
- .filterDropdown :global(.placeholder > span:not(:first-child)) {
175
- margin-left: 8px;
176
- }
71
+ /* ---- Section ---- */
177
72
 
178
- .filterPanel {
179
- display: flex;
180
- align-items: center;
181
- justify-content: space-between;
182
- margin-bottom: 24px;
183
- gap: 16px;
184
- }
185
-
186
- .leftFilters {
187
- display: flex;
188
- gap: 12px;
189
- align-items: center;
73
+ .section {
74
+ margin-bottom: 40px;
190
75
  }
191
76
 
192
- .rightAggToggle {
193
- display: flex;
194
- align-items: center;
195
- margin-left: auto;
196
- height: 32px;
197
- font-size: 14px;
77
+ .sectionHeader {
78
+ position: sticky;
79
+ top: 57px;
80
+ z-index: $nav-z-index;
81
+ background: var(--background-color);
82
+ padding: 12px 0 18px;
198
83
  }
199
84
 
200
- .toggleBtn {
201
- height: 32px !important;
202
- font-size: 14px;
203
- }
85
+ /* ---- Card grid ---- */
204
86
 
205
87
  .cardGrid {
206
88
  display: grid;
207
- grid-template-columns: repeat(auto-fill, minmax(270px, 1fr));
208
- grid-row-gap: 32px;
209
- grid-column-gap: 24px;
210
- max-width: 1280px;
89
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
90
+ gap: 14px;
211
91
  }
@@ -1,21 +1,15 @@
1
1
  import React, { useContext, useMemo } from 'react';
2
2
  import { ComponentGrid } from '@teambit/explorer.ui.gallery.component-grid';
3
3
  import { EmptyWorkspace } from '@teambit/workspace.ui.empty-workspace';
4
- import { PreviewPlaceholder } from '@teambit/preview.ui.preview-placeholder';
5
- import { Tooltip } from '@teambit/design.ui.tooltip';
6
- import { ComponentID } from '@teambit/component-id';
7
- import type { ComponentModel } from '@teambit/component';
8
4
  import compact from 'lodash.compact';
9
5
  import { ScopeID } from '@teambit/scopes.scope-id';
10
6
  import { useCloudScopes } from '@teambit/cloud.hooks.use-cloud-scopes';
11
- import { WorkspaceComponentCard } from '@teambit/workspace.ui.workspace-component-card';
12
- import type { ComponentCardPluginType, PluginProps } from '@teambit/explorer.ui.component-card';
13
7
  import { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';
14
- import { H3 } from '@teambit/design.ui.heading';
15
8
  import { WorkspaceContext } from '../workspace-context';
16
- import { LinkPlugin } from './link-plugin';
17
9
  import { useWorkspaceAggregation } from './use-workspace-aggregation';
18
10
  import { useQueryParamWithDefault, useListParamWithDefault } from './use-query-param-with-default';
11
+ import { NamespaceHeader } from './namespace-header';
12
+ import { HopeComponentCard } from './hope-component-card';
19
13
  import type { AggregationType } from './workspace-overview.types';
20
14
  import { WorkspaceFilterPanel } from './workspace-filter-panel';
21
15
  import styles from './workspace-overview.module.scss';
@@ -27,8 +21,6 @@ export function WorkspaceOverview() {
27
21
  if (!components.length) return <EmptyWorkspace name={workspace.name} />;
28
22
 
29
23
  const { isMinimal } = useWorkspaceMode();
30
- const compModelsById = useMemo(() => new Map(components.map((c) => [c.id.toString(), c])), [components]);
31
-
32
24
  const uniqueScopes = [...new Set(components.map((c) => c.id.scope))];
33
25
  const { cloudScopes } = useCloudScopes(uniqueScopes);
34
26
  const cloudMap = new Map((cloudScopes || []).map((s) => [s.id.toString(), s]));
@@ -48,7 +40,13 @@ export function WorkspaceOverview() {
48
40
  (ScopeID.isValid(component.id.scope) && { id: ScopeID.fromString(component.id.scope) }) ||
49
41
  undefined;
50
42
 
51
- return { component, componentDescriptor: descriptor, scope: (scope && { id: scope.id }) || undefined };
43
+ return {
44
+ component,
45
+ componentDescriptor: descriptor,
46
+ scope: scope
47
+ ? { id: scope.id, icon: (scope as any).icon, backgroundIconColor: (scope as any).backgroundIconColor }
48
+ : undefined,
49
+ };
52
50
  })
53
51
  );
54
52
 
@@ -57,7 +55,7 @@ export function WorkspaceOverview() {
57
55
  const [activeScopes, setActiveScopes] = useListParamWithDefault('scopes');
58
56
 
59
57
  const filters = useMemo(
60
- () => ({ namespaces: activeNamespaces, scopes: activeScopes }),
58
+ () => ({ namespaces: activeNamespaces, scopes: activeScopes, statuses: new Set() as any }),
61
59
  [activeNamespaces, activeScopes]
62
60
  );
63
61
 
@@ -67,8 +65,6 @@ export function WorkspaceOverview() {
67
65
  filters
68
66
  );
69
67
 
70
- const plugins = useCardPlugins({ compModelsById, showPreview: isMinimal });
71
-
72
68
  return (
73
69
  <div className={styles.container}>
74
70
  <WorkspaceFilterPanel
@@ -82,80 +78,36 @@ export function WorkspaceOverview() {
82
78
  onScopesChange={setActiveScopes}
83
79
  />
84
80
 
85
- {filteredCount === 0 && <EmptyWorkspace name={workspace.name} />}
86
-
87
- {groups.map((group) => (
88
- <section key={group.name} className={styles.agg}>
89
- {groupType !== 'none' && <H3 className={styles.aggregationTitle}>{group.displayName}</H3>}
90
-
91
- <ComponentGrid className={styles.cardGrid}>
92
- {group.items.map((item) => (
93
- <WorkspaceComponentCard
94
- key={item.component.id.toString()}
95
- component={item.component}
96
- componentDescriptor={item.componentDescriptor}
97
- scope={item.scope}
98
- plugins={plugins}
99
- shouldShowPreviewState={isMinimal}
100
- />
101
- ))}
102
- </ComponentGrid>
103
- </section>
104
- ))}
105
- </div>
106
- );
107
- }
108
-
109
- export function useCardPlugins({
110
- compModelsById,
111
- showPreview,
112
- }: {
113
- compModelsById: Map<string, ComponentModel>;
114
- showPreview?: boolean;
115
- }): ComponentCardPluginType<PluginProps>[] {
116
- const serverUrlsSignature = React.useMemo(() => {
117
- const serversCount = Array.from(compModelsById.values())
118
- .filter((comp) => comp.server?.url)
119
- .map((comp) => comp.server?.url)
120
- .join(',');
121
- return serversCount;
122
- }, [compModelsById]);
123
-
124
- const plugins = React.useMemo(
125
- () => [
126
- {
127
- preview: function Preview({ component, shouldShowPreview }) {
128
- const compModel = compModelsById.get(component.id.toString());
129
- if (!compModel) return null;
130
- return (
131
- <PreviewPlaceholder
132
- componentDescriptor={component}
133
- component={compModel}
134
- shouldShowPreview={showPreview || shouldShowPreview}
135
- />
136
- );
137
- },
138
- },
139
- {
140
- previewBottomRight: function PreviewBottomRight({ component }) {
141
- const env = component.get('teambit.envs/envs');
142
- const envComponentId = env?.id ? ComponentID.fromString(env?.id) : undefined;
143
-
144
- return (
145
- <div className={styles.rightPreviewPlugins}>
146
- <div className={styles.badge}>
147
- <Tooltip delay={300} content={envComponentId?.name}>
148
- <img src={env?.icon} className={styles.envIcon} />
149
- </Tooltip>
81
+ <div className={styles.content}>
82
+ {filteredCount === 0 && <EmptyWorkspace name={workspace.name} />}
83
+
84
+ {groups.map((group) => (
85
+ <section key={group.name} className={styles.section}>
86
+ {groupType !== 'none' && (
87
+ <div className={styles.sectionHeader}>
88
+ <NamespaceHeader
89
+ namespace={group.name}
90
+ items={group.items}
91
+ scopeIcon={group.scopeIcon}
92
+ scopeIconColor={group.scopeIconColor}
93
+ />
150
94
  </div>
151
- </div>
152
- );
153
- },
154
- },
155
- new LinkPlugin(),
156
- ],
157
- [compModelsById.size, serverUrlsSignature, showPreview]
95
+ )}
96
+
97
+ <ComponentGrid className={styles.cardGrid}>
98
+ {group.items.map((item) => (
99
+ <HopeComponentCard
100
+ key={item.component.id.toString()}
101
+ component={item.component}
102
+ componentDescriptor={item.componentDescriptor}
103
+ scope={item.scope as any}
104
+ showPreview={isMinimal}
105
+ />
106
+ ))}
107
+ </ComponentGrid>
108
+ </section>
109
+ ))}
110
+ </div>
111
+ </div>
158
112
  );
159
-
160
- return plugins;
161
113
  }
@@ -5,15 +5,21 @@ import type { ScopeID } from '@teambit/scopes.scope-id';
5
5
  export interface WorkspaceItem {
6
6
  component: ComponentModel;
7
7
  componentDescriptor: ComponentDescriptor;
8
- scope?: { id: ScopeID };
8
+ scope?: { id: ScopeID; icon?: string; backgroundIconColor?: string };
9
9
  }
10
10
 
11
11
  export type AggregationType = 'namespaces' | 'scopes' | 'none';
12
12
 
13
+ export type Density = 'compact' | 'comfy';
14
+
15
+ export type ComponentStatus = 'built' | 'changed' | 'building' | 'queued';
16
+
13
17
  export interface AggregationGroup {
14
18
  name: string;
15
19
  displayName: string;
16
20
  items: WorkspaceItem[];
21
+ scopeIcon?: string;
22
+ scopeIconColor?: string;
17
23
  }
18
24
 
19
25
  export interface AggregationResult {
@@ -18,37 +18,20 @@
18
18
  }
19
19
  }
20
20
 
21
- .minimalCorner {
22
- width: fit-content;
23
- height: 46px !important;
24
- background: var(--background-color, #ededed) !important;
25
-
26
- &.dark {
27
- --bit-border-color-lightest: #333333;
28
- --bit-text-color-heavy: white;
29
-
30
- > a > img {
31
- filter: invert(1);
32
- }
33
- }
34
-
35
- &.light {
36
- --background-color: #ededed;
37
- }
38
-
39
- > a {
40
- &[aria-current='page'] > img {
41
- filter: invert(31%) sepia(75%) saturate(3183%) hue-rotate(235deg) brightness(99%) contrast(108%);
42
- }
43
-
44
- > img {
45
- width: 22px;
46
- height: 22px;
21
+ .backButton {
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ width: 32px;
26
+ height: 32px;
27
+ border-radius: 8px;
28
+ color: var(--on-background-color, var(--bit-text-color-heavy, #2b2b2b));
29
+ text-decoration: none;
30
+ transition: background 0.15s ease;
31
+ margin-left: 8px;
47
32
 
48
- &:hover {
49
- filter: invert(31%) sepia(75%) saturate(3183%) hue-rotate(235deg) brightness(99%) contrast(108%);
50
- }
51
- }
33
+ &:hover {
34
+ background: color-mix(in srgb, var(--on-background-color, #2b2b2b) 8%, transparent);
52
35
  }
53
36
  }
54
37
 
@@ -96,6 +79,28 @@
96
79
  flex-direction: column;
97
80
  overflow: hidden; // TODO
98
81
  height: 100vh;
82
+
83
+ @media (hover: hover) {
84
+ * {
85
+ &::-webkit-scrollbar {
86
+ width: 14px;
87
+ }
88
+
89
+ &::-webkit-scrollbar-track {
90
+ background: var(--background-color, #fff);
91
+ }
92
+
93
+ &::-webkit-scrollbar-thumb {
94
+ border: 5px solid var(--background-color, #fff);
95
+ background: var(--border-medium-color, #d0d0d0);
96
+ border-radius: 100vmax;
97
+ }
98
+
99
+ &::-webkit-scrollbar-thumb:hover {
100
+ background: var(--on-background-color, var(--bit-text-color-light, #999));
101
+ }
102
+ }
103
+ }
99
104
  }
100
105
 
101
106
  .topbar {
@@ -135,6 +140,9 @@
135
140
 
136
141
  &.minimal {
137
142
  height: 46px;
143
+ --bit-bg-heaviest: color-mix(in srgb, var(--bit-accent-color, #6c5ce7) 3%, var(--background-color, #fff));
144
+ --bit-border-color-lightest: var(--bit-bg-heaviest);
145
+ border-bottom: 1px solid var(--border-medium-color, #e6e6e6);
138
146
  }
139
147
  }
140
148
 
@@ -86,6 +86,9 @@ export function Workspace({ routeSlot, menuSlot, sidebar, workspaceUI, onSidebar
86
86
 
87
87
  workspaceUI.setComponents(workspace.components);
88
88
  const inIframe = typeof window !== 'undefined' && window.parent && window.parent !== window;
89
+ const location = useLocation();
90
+ const isOverview = location.pathname === '/' || location.pathname === '';
91
+ const showTopBar = !isMinimal || (isMinimal && !isOverview);
89
92
 
90
93
  return (
91
94
  <WorkspaceProvider workspace={workspace}>
@@ -94,23 +97,37 @@ export function Workspace({ routeSlot, menuSlot, sidebar, workspaceUI, onSidebar
94
97
  <ThemeFromUrlSync />
95
98
  {isMinimal && inIframe && <MinimalModeUrlBroadcasterAndListener />}
96
99
  <div className={styles.workspaceWrapper}>
97
- {
100
+ {showTopBar && (
98
101
  <TopBar
99
102
  className={classNames(styles.topbar, styles[themeName], isMinimal && styles.minimal)}
100
103
  Corner={() => (
101
104
  <div className={classNames(isMinimal && styles.cornerWithBreadcrumb)}>
102
- <Corner
103
- className={classNames((isMinimal && styles.minimalCorner) || styles.corner, styles[themeName])}
104
- name={isMinimal ? '' : workspace.name}
105
- icon={isMinimal ? 'https://static.bit.dev/bit-icons/house.svg' : workspace.icon}
106
- />
105
+ {isMinimal ? (
106
+ <Link to="/" className={styles.backButton}>
107
+ <svg width="18" height="18" viewBox="0 0 18 18" fill="none">
108
+ <path
109
+ d="M11.25 13.5L6.75 9L11.25 4.5"
110
+ stroke="currentColor"
111
+ strokeWidth="1.5"
112
+ strokeLinecap="round"
113
+ strokeLinejoin="round"
114
+ />
115
+ </svg>
116
+ </Link>
117
+ ) : (
118
+ <Corner
119
+ className={classNames(styles.corner, styles[themeName])}
120
+ name={workspace.name}
121
+ icon={workspace.icon}
122
+ />
123
+ )}
107
124
  {isMinimal && <WorkspaceBreadcrumb />}
108
125
  </div>
109
126
  )}
110
127
  // @ts-ignore - getting an error of "Types have separate declarations of a private property 'registerFn'." for some reason after upgrading teambit.harmony/harmony from 0.4.6 to 0.4.7
111
128
  menu={menuSlot}
112
129
  />
113
- }
130
+ )}
114
131
  <SplitPane className={styles.main} size={246} layout={sidebarOpenness}>
115
132
  <Pane className={classNames(styles.sidebar, styles[themeName], !isSidebarOpen && styles.closed)}>
116
133
  {sidebar}