@teambit/workspace 1.0.1218 → 1.0.1220

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.
@@ -1,5 +1,5 @@
1
- import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.1218/dist/workspace.composition.js';
2
- import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.1218/dist/workspace.docs.mdx';
1
+ import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.1220/dist/workspace.composition.js';
2
+ import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.1220/dist/workspace.docs.mdx';
3
3
 
4
4
  export const compositions = [compositions_0];
5
5
  export const overview = [overview_0];
@@ -4,7 +4,7 @@ import React from 'react';
4
4
  * Replaces the legacy `@teambit/workspace.ui.empty-workspace` for the Hope flow.
5
5
  *
6
6
  * The default state guides the user through the Bit CLI in their terminal. In
7
- * minimal mode (the embedded Hope experience) we additionally surface the
8
- * "prompt Hope in the chat" CTA.
7
+ * minimal mode (the embedded Hope experience) it is reduced to a single
8
+ * "prompt Hope in the chat" CTA - no CLI commands, docs or community links.
9
9
  */
10
10
  export declare function WorkspaceBlankState(): React.JSX.Element;
@@ -48,8 +48,8 @@ const DISCORD_URL = 'https://discord.bit.cloud/';
48
48
  * Replaces the legacy `@teambit/workspace.ui.empty-workspace` for the Hope flow.
49
49
  *
50
50
  * The default state guides the user through the Bit CLI in their terminal. In
51
- * minimal mode (the embedded Hope experience) we additionally surface the
52
- * "prompt Hope in the chat" CTA.
51
+ * minimal mode (the embedded Hope experience) it is reduced to a single
52
+ * "prompt Hope in the chat" CTA - no CLI commands, docs or community links.
53
53
  */
54
54
  function WorkspaceBlankState() {
55
55
  const {
@@ -66,7 +66,7 @@ function WorkspaceBlankState() {
66
66
  className: _workspaceBlankStateModule().default.headline
67
67
  }, "Your workspace is ", /*#__PURE__*/_react().default.createElement("em", null, "ready"), " for its first component."), /*#__PURE__*/_react().default.createElement("p", {
68
68
  className: _workspaceBlankStateModule().default.sub
69
- }, "Components will appear here as they're built."), isMinimal && /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, /*#__PURE__*/_react().default.createElement("div", {
69
+ }, "Components will appear here as they're built."), isMinimal ? /*#__PURE__*/_react().default.createElement("div", {
70
70
  className: _workspaceBlankStateModule().default.hopeCallout
71
71
  }, /*#__PURE__*/_react().default.createElement(_hopeAiIcon().HopeAiIcon, {
72
72
  size: 32,
@@ -77,15 +77,7 @@ function WorkspaceBlankState() {
77
77
  className: _workspaceBlankStateModule().default.hopeTitle
78
78
  }, "Prompt Hope in the chat"), /*#__PURE__*/_react().default.createElement("div", {
79
79
  className: _workspaceBlankStateModule().default.hopeHelp
80
- }, "Describe what you want to build, from one prompt to a whole company."))), /*#__PURE__*/_react().default.createElement("div", {
81
- className: _workspaceBlankStateModule().default.sep
82
- }, /*#__PURE__*/_react().default.createElement("div", {
83
- className: _workspaceBlankStateModule().default.sepLine
84
- }), /*#__PURE__*/_react().default.createElement("span", {
85
- className: _workspaceBlankStateModule().default.sepLabel
86
- }, "or do it yourself"), /*#__PURE__*/_react().default.createElement("div", {
87
- className: _workspaceBlankStateModule().default.sepLine
88
- }))), /*#__PURE__*/_react().default.createElement("div", {
80
+ }, "Describe what you want to build, from one prompt to a whole company."))) : /*#__PURE__*/_react().default.createElement(_react().default.Fragment, null, /*#__PURE__*/_react().default.createElement("div", {
89
81
  className: _workspaceBlankStateModule().default.diyGrid
90
82
  }, /*#__PURE__*/_react().default.createElement(DiyRow, {
91
83
  title: "Create",
@@ -107,7 +99,7 @@ function WorkspaceBlankState() {
107
99
  className: _workspaceBlankStateModule().default.link,
108
100
  target: "_blank",
109
101
  rel: "noopener noreferrer"
110
- }, "Cloud docs \u2197"))), /*#__PURE__*/_react().default.createElement("div", {
102
+ }, "Cloud docs \u2197")))), !isMinimal && /*#__PURE__*/_react().default.createElement("div", {
111
103
  className: _workspaceBlankStateModule().default.bottom
112
104
  }, /*#__PURE__*/_react().default.createElement(IconLink, {
113
105
  href: "https://github.com/teambit/bit",
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireWildcard","require","_evangelistElements","_workspaceUi","_hopeAiIcon","_workspaceBlankStateModule","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DISCORD_URL","WorkspaceBlankState","isMinimal","useWorkspaceMode","createElement","className","styles","container","vignette","body","headline","sub","Fragment","hopeCallout","HopeAiIcon","size","hopeIcon","hopeText","hopeTitle","hopeHelp","sep","sepLine","sepLabel","diyGrid","DiyRow","title","cmd","docsLinks","href","link","target","rel","bottom","IconLink","src","label","iconLink","Icon","of","discordIcon","alt","logo","copied","setCopied","useState","onCopy","stopPropagation","navigator","clipboard","writeText","catch","undefined","setTimeout","diyRow","diyTitle","diyBody","diyCmdRow","diyCmd","diyPrompt","diyCmdText","type","onClick","diyCopy"],"sources":["workspace-blank-state.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { Icon } from '@teambit/evangelist.elements.icon';\nimport { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';\nimport { HopeAiIcon } from './hope-ai-icon';\nimport styles from './workspace-blank-state.module.scss';\n\nconst DISCORD_URL = 'https://discord.bit.cloud/';\n\n/**\n * Empty workspace state, shown when the workspace has no components.\n * Replaces the legacy `@teambit/workspace.ui.empty-workspace` for the Hope flow.\n *\n * The default state guides the user through the Bit CLI in their terminal. In\n * minimal mode (the embedded Hope experience) we additionally surface the\n * \"prompt Hope in the chat\" CTA.\n */\nexport function WorkspaceBlankState() {\n const { isMinimal } = useWorkspaceMode();\n\n return (\n <div className={styles.container}>\n <div className={styles.vignette} aria-hidden />\n\n <div className={styles.body}>\n <h1 className={styles.headline}>\n Your workspace is <em>ready</em> for its first component.\n </h1>\n\n <p className={styles.sub}>Components will appear here as they're built.</p>\n\n {/* Primary — prompt Hope in the chat (minimal mode only) */}\n {isMinimal && (\n <>\n <div className={styles.hopeCallout}>\n <HopeAiIcon size={32} className={styles.hopeIcon} />\n <div className={styles.hopeText}>\n <div className={styles.hopeTitle}>Prompt Hope in the chat</div>\n <div className={styles.hopeHelp}>\n Describe what you want to build, from one prompt to a whole company.\n </div>\n </div>\n </div>\n\n {/* OR separator */}\n <div className={styles.sep}>\n <div className={styles.sepLine} />\n <span className={styles.sepLabel}>or do it yourself</span>\n <div className={styles.sepLine} />\n </div>\n </>\n )}\n\n {/* DIY CLI options */}\n <div className={styles.diyGrid}>\n <DiyRow title=\"Create\" body=\"Scaffold a new component.\" cmd=\"bit create react button\" />\n <DiyRow title=\"Import\" body=\"Bring one from another scope.\" cmd=\"bit import org.scope/comp\" />\n </div>\n\n <div className={styles.docsLinks}>\n <a href=\"https://bit.dev/docs\" className={styles.link} target=\"_blank\" rel=\"noopener noreferrer\">\n CLI docs ↗\n </a>\n <a href=\"https://bit.cloud/docs\" className={styles.link} target=\"_blank\" rel=\"noopener noreferrer\">\n Cloud docs ↗\n </a>\n </div>\n </div>\n\n <div className={styles.bottom}>\n <IconLink\n href=\"https://github.com/teambit/bit\"\n src=\"https://static.bit.dev/harmony/github.svg\"\n label=\"Bit on GitHub\"\n />\n <a\n href={DISCORD_URL}\n className={styles.iconLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Bit community on Discord\"\n >\n <Icon of=\"discord\" className={styles.discordIcon} />\n </a>\n </div>\n </div>\n );\n}\n\nfunction IconLink({ href, src, label }: { href: string; src: string; label: string }) {\n return (\n <a href={href} className={styles.iconLink} target=\"_blank\" rel=\"noopener noreferrer\" aria-label={label}>\n <img src={src} alt={label} className={styles.logo} />\n </a>\n );\n}\n\nfunction DiyRow({ title, body, cmd }: { title: string; body: string; cmd: string }) {\n const [copied, setCopied] = useState(false);\n const onCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(cmd).catch(() => undefined);\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 1400);\n };\n return (\n <div className={styles.diyRow}>\n <div>\n <div className={styles.diyTitle}>{title}</div>\n <div className={styles.diyBody}>{body}</div>\n </div>\n <div className={styles.diyCmdRow}>\n <div className={styles.diyCmd}>\n <span className={styles.diyPrompt}>$</span>\n <span className={styles.diyCmdText}>{cmd}</span>\n </div>\n <button type=\"button\" onClick={onCopy} className={styles.diyCopy}>\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireWildcard","require","_evangelistElements","_workspaceUi","_hopeAiIcon","_workspaceBlankStateModule","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DISCORD_URL","WorkspaceBlankState","isMinimal","useWorkspaceMode","createElement","className","styles","container","vignette","body","headline","sub","hopeCallout","HopeAiIcon","size","hopeIcon","hopeText","hopeTitle","hopeHelp","Fragment","diyGrid","DiyRow","title","cmd","docsLinks","href","link","target","rel","bottom","IconLink","src","label","iconLink","Icon","of","discordIcon","alt","logo","copied","setCopied","useState","onCopy","stopPropagation","navigator","clipboard","writeText","catch","undefined","setTimeout","diyRow","diyTitle","diyBody","diyCmdRow","diyCmd","diyPrompt","diyCmdText","type","onClick","diyCopy"],"sources":["workspace-blank-state.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { Icon } from '@teambit/evangelist.elements.icon';\nimport { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';\nimport { HopeAiIcon } from './hope-ai-icon';\nimport styles from './workspace-blank-state.module.scss';\n\nconst DISCORD_URL = 'https://discord.bit.cloud/';\n\n/**\n * Empty workspace state, shown when the workspace has no components.\n * Replaces the legacy `@teambit/workspace.ui.empty-workspace` for the Hope flow.\n *\n * The default state guides the user through the Bit CLI in their terminal. In\n * minimal mode (the embedded Hope experience) it is reduced to a single\n * \"prompt Hope in the chat\" CTA - no CLI commands, docs or community links.\n */\nexport function WorkspaceBlankState() {\n const { isMinimal } = useWorkspaceMode();\n\n return (\n <div className={styles.container}>\n <div className={styles.vignette} aria-hidden />\n\n <div className={styles.body}>\n <h1 className={styles.headline}>\n Your workspace is <em>ready</em> for its first component.\n </h1>\n\n <p className={styles.sub}>Components will appear here as they're built.</p>\n\n {isMinimal ? (\n <div className={styles.hopeCallout}>\n <HopeAiIcon size={32} className={styles.hopeIcon} />\n <div className={styles.hopeText}>\n <div className={styles.hopeTitle}>Prompt Hope in the chat</div>\n <div className={styles.hopeHelp}>\n Describe what you want to build, from one prompt to a whole company.\n </div>\n </div>\n </div>\n ) : (\n <>\n {/* DIY CLI options */}\n <div className={styles.diyGrid}>\n <DiyRow title=\"Create\" body=\"Scaffold a new component.\" cmd=\"bit create react button\" />\n <DiyRow title=\"Import\" body=\"Bring one from another scope.\" cmd=\"bit import org.scope/comp\" />\n </div>\n\n <div className={styles.docsLinks}>\n <a href=\"https://bit.dev/docs\" className={styles.link} target=\"_blank\" rel=\"noopener noreferrer\">\n CLI docs ↗\n </a>\n <a href=\"https://bit.cloud/docs\" className={styles.link} target=\"_blank\" rel=\"noopener noreferrer\">\n Cloud docs ↗\n </a>\n </div>\n </>\n )}\n </div>\n\n {!isMinimal && (\n <div className={styles.bottom}>\n <IconLink\n href=\"https://github.com/teambit/bit\"\n src=\"https://static.bit.dev/harmony/github.svg\"\n label=\"Bit on GitHub\"\n />\n <a\n href={DISCORD_URL}\n className={styles.iconLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Bit community on Discord\"\n >\n <Icon of=\"discord\" className={styles.discordIcon} />\n </a>\n </div>\n )}\n </div>\n );\n}\n\nfunction IconLink({ href, src, label }: { href: string; src: string; label: string }) {\n return (\n <a href={href} className={styles.iconLink} target=\"_blank\" rel=\"noopener noreferrer\" aria-label={label}>\n <img src={src} alt={label} className={styles.logo} />\n </a>\n );\n}\n\nfunction DiyRow({ title, body, cmd }: { title: string; body: string; cmd: string }) {\n const [copied, setCopied] = useState(false);\n const onCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(cmd).catch(() => undefined);\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 1400);\n };\n return (\n <div className={styles.diyRow}>\n <div>\n <div className={styles.diyTitle}>{title}</div>\n <div className={styles.diyBody}>{body}</div>\n </div>\n <div className={styles.diyCmdRow}>\n <div className={styles.diyCmd}>\n <span className={styles.diyPrompt}>$</span>\n <span className={styles.diyCmdText}>{cmd}</span>\n </div>\n <button type=\"button\" onClick={onCopy} className={styles.diyCopy}>\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -99,30 +99,6 @@
99
99
  line-height: 1.5;
100
100
  }
101
101
 
102
- /* ---- Separator ---- */
103
-
104
- .sep {
105
- display: flex;
106
- align-items: center;
107
- gap: 14px;
108
- margin: 32px auto 20px;
109
- max-width: 340px;
110
- }
111
-
112
- .sepLine {
113
- flex: 1;
114
- height: 1px;
115
- background: var(--border-medium-color);
116
- }
117
-
118
- .sepLabel {
119
- font-family: 'JetBrains Mono', ui-monospace, Menlo, monospace;
120
- font-size: 11px;
121
- color: var(--on-background-low-color);
122
- letter-spacing: 0.14em;
123
- text-transform: uppercase;
124
- }
125
-
126
102
  /* ---- DIY rows ---- */
127
103
 
128
104
  .diyGrid {
@@ -1,8 +1,21 @@
1
1
  import React from 'react';
2
+ export type WorkspaceSkeletonProps = {
3
+ /**
4
+ * minimal (Hope) mode layout - no sidebar and no workspace corner.
5
+ */
6
+ isMinimal?: boolean;
7
+ /**
8
+ * whether the real UI renders a top bar for the current route.
9
+ */
10
+ showTopBar?: boolean;
11
+ };
2
12
  /**
3
13
  * Full-shell loading placeholder shown while the (light) workspace query resolves. Mirrors the real
4
14
  * workspace chrome — top bar, sidebar column, content grid — so there is no blank flash and no
5
15
  * layout shift when the live UI takes over. Previously this gap rendered an empty `<div>`, which
6
16
  * read as a frozen/blank screen on slower workspaces.
17
+ *
18
+ * In minimal (Hope) mode the sidebar starts closed and there is no workspace corner, so the skeleton
19
+ * drops both, and skips the top bar entirely where the real UI hides it (the workspace overview).
7
20
  */
8
- export declare function WorkspaceSkeleton(): React.JSX.Element;
21
+ export declare function WorkspaceSkeleton({ isMinimal, showTopBar }: WorkspaceSkeletonProps): React.JSX.Element;
@@ -11,6 +11,13 @@ function _react() {
11
11
  };
12
12
  return data;
13
13
  }
14
+ function _classnames() {
15
+ const data = _interopRequireDefault(require("classnames"));
16
+ _classnames = function () {
17
+ return data;
18
+ };
19
+ return data;
20
+ }
14
21
  function _explorerUi() {
15
22
  const data = require("@teambit/explorer.ui.components-overview");
16
23
  _explorerUi = function () {
@@ -31,15 +38,21 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
31
38
  * workspace chrome — top bar, sidebar column, content grid — so there is no blank flash and no
32
39
  * layout shift when the live UI takes over. Previously this gap rendered an empty `<div>`, which
33
40
  * read as a frozen/blank screen on slower workspaces.
41
+ *
42
+ * In minimal (Hope) mode the sidebar starts closed and there is no workspace corner, so the skeleton
43
+ * drops both, and skips the top bar entirely where the real UI hides it (the workspace overview).
34
44
  */
35
- function WorkspaceSkeleton() {
45
+ function WorkspaceSkeleton({
46
+ isMinimal = false,
47
+ showTopBar = true
48
+ }) {
36
49
  return /*#__PURE__*/_react().default.createElement("div", {
37
50
  className: _workspaceSkeletonModule().default.wrapper,
38
51
  "aria-busy": "true",
39
52
  "aria-live": "polite"
40
- }, /*#__PURE__*/_react().default.createElement("div", {
41
- className: _workspaceSkeletonModule().default.topbar
42
- }, /*#__PURE__*/_react().default.createElement("div", {
53
+ }, showTopBar && /*#__PURE__*/_react().default.createElement("div", {
54
+ className: (0, _classnames().default)(_workspaceSkeletonModule().default.topbar, isMinimal && _workspaceSkeletonModule().default.minimalTopbar)
55
+ }, !isMinimal && /*#__PURE__*/_react().default.createElement("div", {
43
56
  className: _workspaceSkeletonModule().default.corner
44
57
  }), /*#__PURE__*/_react().default.createElement("div", {
45
58
  className: _workspaceSkeletonModule().default.topbarNav
@@ -51,7 +64,7 @@ function WorkspaceSkeleton() {
51
64
  className: _workspaceSkeletonModule().default.navItem
52
65
  }))), /*#__PURE__*/_react().default.createElement("div", {
53
66
  className: _workspaceSkeletonModule().default.main
54
- }, /*#__PURE__*/_react().default.createElement("div", {
67
+ }, !isMinimal && /*#__PURE__*/_react().default.createElement("div", {
55
68
  className: _workspaceSkeletonModule().default.sidebar
56
69
  }, /*#__PURE__*/_react().default.createElement("span", {
57
70
  className: _workspaceSkeletonModule().default.sidebarSearch
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireDefault","require","_explorerUi","_workspaceSkeletonModule","e","__esModule","default","WorkspaceSkeleton","createElement","className","styles","wrapper","topbar","corner","topbarNav","navItem","main","sidebar","sidebarSearch","Array","from","length","map","_","i","key","sidebarRow","style","width","content","ComponentsOverviewSkeleton","count"],"sources":["workspace-skeleton.tsx"],"sourcesContent":["import React from 'react';\nimport { ComponentsOverviewSkeleton } from '@teambit/explorer.ui.components-overview';\nimport styles from './workspace-skeleton.module.scss';\n\n/**\n * Full-shell loading placeholder shown while the (light) workspace query resolves. Mirrors the real\n * workspace chrome — top bar, sidebar column, content grid — so there is no blank flash and no\n * layout shift when the live UI takes over. Previously this gap rendered an empty `<div>`, which\n * read as a frozen/blank screen on slower workspaces.\n */\nexport function WorkspaceSkeleton() {\n return (\n <div className={styles.wrapper} aria-busy=\"true\" aria-live=\"polite\">\n <div className={styles.topbar}>\n <div className={styles.corner} />\n <div className={styles.topbarNav}>\n <span className={styles.navItem} />\n <span className={styles.navItem} />\n <span className={styles.navItem} />\n </div>\n </div>\n <div className={styles.main}>\n <div className={styles.sidebar}>\n <span className={styles.sidebarSearch} />\n {Array.from({ length: 10 }).map((_, i) => (\n <span key={i} className={styles.sidebarRow} style={{ width: `${55 + ((i * 13) % 35)}%` }} />\n ))}\n </div>\n <div className={styles.content}>\n <ComponentsOverviewSkeleton count={12} />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAAA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,YAAA;EAAA,MAAAH,IAAA,GAAAE,OAAA;EAAAC,WAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAI,yBAAA;EAAA,MAAAJ,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAE,wBAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAsD,SAAAC,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEtD;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,iBAAiBA,CAAA,EAAG;EAClC,oBACET,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAKC,SAAS,EAAEC,kCAAM,CAACC,OAAQ;IAAC,aAAU,MAAM;IAAC,aAAU;EAAQ,gBACjEb,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAKC,SAAS,EAAEC,kCAAM,CAACE;EAAO,gBAC5Bd,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAKC,SAAS,EAAEC,kCAAM,CAACG;EAAO,CAAE,CAAC,eACjCf,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAKC,SAAS,EAAEC,kCAAM,CAACI;EAAU,gBAC/BhB,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAMC,SAAS,EAAEC,kCAAM,CAACK;EAAQ,CAAE,CAAC,eACnCjB,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAMC,SAAS,EAAEC,kCAAM,CAACK;EAAQ,CAAE,CAAC,eACnCjB,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAMC,SAAS,EAAEC,kCAAM,CAACK;EAAQ,CAAE,CAC/B,CACF,CAAC,eACNjB,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAKC,SAAS,EAAEC,kCAAM,CAACM;EAAK,gBAC1BlB,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAKC,SAAS,EAAEC,kCAAM,CAACO;EAAQ,gBAC7BnB,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAMC,SAAS,EAAEC,kCAAM,CAACQ;EAAc,CAAE,CAAC,EACxCC,KAAK,CAACC,IAAI,CAAC;IAAEC,MAAM,EAAE;EAAG,CAAC,CAAC,CAACC,GAAG,CAAC,CAACC,CAAC,EAAEC,CAAC,kBACnC1B,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAMiB,GAAG,EAAED,CAAE;IAACf,SAAS,EAAEC,kCAAM,CAACgB,UAAW;IAACC,KAAK,EAAE;MAAEC,KAAK,EAAE,GAAG,EAAE,GAAKJ,CAAC,GAAG,EAAE,GAAI,EAAG;IAAI;EAAE,CAAE,CAC5F,CACE,CAAC,eACN1B,MAAA,GAAAQ,OAAA,CAAAE,aAAA;IAAKC,SAAS,EAAEC,kCAAM,CAACmB;EAAQ,gBAC7B/B,MAAA,GAAAQ,OAAA,CAAAE,aAAA,CAACN,WAAA,GAAA4B,0BAA0B;IAACC,KAAK,EAAE;EAAG,CAAE,CACrC,CACF,CACF,CAAC;AAEV","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireDefault","require","_classnames","_explorerUi","_workspaceSkeletonModule","e","__esModule","default","WorkspaceSkeleton","isMinimal","showTopBar","createElement","className","styles","wrapper","classNames","topbar","minimalTopbar","corner","topbarNav","navItem","main","sidebar","sidebarSearch","Array","from","length","map","_","i","key","sidebarRow","style","width","content","ComponentsOverviewSkeleton","count"],"sources":["workspace-skeleton.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { ComponentsOverviewSkeleton } from '@teambit/explorer.ui.components-overview';\nimport styles from './workspace-skeleton.module.scss';\n\nexport type WorkspaceSkeletonProps = {\n /**\n * minimal (Hope) mode layout - no sidebar and no workspace corner.\n */\n isMinimal?: boolean;\n /**\n * whether the real UI renders a top bar for the current route.\n */\n showTopBar?: boolean;\n};\n\n/**\n * Full-shell loading placeholder shown while the (light) workspace query resolves. Mirrors the real\n * workspace chrome — top bar, sidebar column, content grid — so there is no blank flash and no\n * layout shift when the live UI takes over. Previously this gap rendered an empty `<div>`, which\n * read as a frozen/blank screen on slower workspaces.\n *\n * In minimal (Hope) mode the sidebar starts closed and there is no workspace corner, so the skeleton\n * drops both, and skips the top bar entirely where the real UI hides it (the workspace overview).\n */\nexport function WorkspaceSkeleton({ isMinimal = false, showTopBar = true }: WorkspaceSkeletonProps) {\n return (\n <div className={styles.wrapper} aria-busy=\"true\" aria-live=\"polite\">\n {showTopBar && (\n <div className={classNames(styles.topbar, isMinimal && styles.minimalTopbar)}>\n {!isMinimal && <div className={styles.corner} />}\n <div className={styles.topbarNav}>\n <span className={styles.navItem} />\n <span className={styles.navItem} />\n <span className={styles.navItem} />\n </div>\n </div>\n )}\n <div className={styles.main}>\n {!isMinimal && (\n <div className={styles.sidebar}>\n <span className={styles.sidebarSearch} />\n {Array.from({ length: 10 }).map((_, i) => (\n <span key={i} className={styles.sidebarRow} style={{ width: `${55 + ((i * 13) % 35)}%` }} />\n ))}\n </div>\n )}\n <div className={styles.content}>\n <ComponentsOverviewSkeleton count={12} />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -16,6 +16,10 @@
16
16
  border-bottom: 1px solid var(--border-medium-color, #e6e6e6);
17
17
  }
18
18
 
19
+ .minimalTopbar {
20
+ height: 46px;
21
+ }
22
+
19
23
  .corner {
20
24
  width: 246px;
21
25
  height: 100%;
@@ -235,7 +235,10 @@ function Workspace({
235
235
  if (!workspace) {
236
236
  // While the light workspace query resolves, show a full-shell skeleton instead of a blank
237
237
  // screen. The heavy per-component data (status, issues) streams in after first paint.
238
- return /*#__PURE__*/_react().default.createElement(_workspaceSkeleton().WorkspaceSkeleton, null);
238
+ return /*#__PURE__*/_react().default.createElement(_workspaceSkeleton().WorkspaceSkeleton, {
239
+ isMinimal: isMinimal,
240
+ showTopBar: showTopBar
241
+ });
239
242
  }
240
243
  return /*#__PURE__*/_react().default.createElement(_workspaceProvider().WorkspaceProvider, {
241
244
  workspace: workspace
@@ -1 +1 @@
1
- {"version":3,"names":["require","_pluralize","data","_interopRequireDefault","_react","_interopRequireWildcard","_reactRouterDom","_component","_lanesUiModels","_uiFoundationUiNotifications","_uiFoundationUiReactRouter","_uiFoundationUi","_uiFoundationUiButtons","_baseUiSurfacesSplitPane","_baseReactThemes","_baseUiSurfacesSplitPane2","_uiFoundationUi2","_workspaceUi","_classnames","_workspaceUi2","_workspaceHooks","_workspaceHooks2","_useWorkspace","_workspaceOverview","_workspaceProvider","_workspaceSkeleton","_workspaceModule","_themeFromUrl","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","Workspace","routeSlot","menuSlot","sidebar","workspaceUI","onSidebarTogglerChange","isMinimal","useWorkspaceMode","reactionsRef","useRef","onComponentAdded","onComponentRemoved","reactions","useMemo","comps","current","ids","workspace","useWorkspace","theme","useThemePicker","currentTheme","isSidebarOpen","setSidebarOpen","useState","handleSidebarToggle","useCallback","prev","sidebarOpenness","Layout","row","right","themeName","useEffect","window","innerWidth","useLayoutEffect","location","useLocation","setComponents","components","inIframe","parent","isOverview","pathname","showTopBar","createElement","WorkspaceSkeleton","WorkspaceProvider","NotificationsBinder","PreserveWorkspaceMode","ThemeFromUrlSync","MinimalModeUrlBroadcasterAndListener","className","styles","workspaceWrapper","TopBar","classNames","topbar","minimal","Corner","cornerWithBreadcrumb","Link","to","backButton","width","height","viewBox","fill","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","corner","name","icon","WorkspaceBreadcrumb","menu","SplitPane","main","size","layout","Pane","closed","HoverSplitter","splitter","splitterClosed","Collapser","isOpen","Boolean","onMouseDown","stopPropagation","onClick","tooltipContent","SlotRouter","slot","Route","index","element","WorkspaceOverview","notifications","useNotifications","notificationsMapped","notificationId","log","pluralize","length","map","comp","id","toString","join","setTimeout","dismiss","useUrlChangeBroadcaster","useNavigationMessageListener","useComponentFullNameFromUrl","laneComponentUrl","marker","LanesModel","baseLaneComponentRoute","replace","idx","indexOf","slice","includes","lanesPrefix","undefined","useIdFromLocation","fullName","searchParams","useSearchParams","parts","split","isLast","breadcrumb","part","namespace","overviewParams","URLSearchParams","Fragment","key","breadcrumbSeparator","breadcrumbLast","breadcrumbLink"],"sources":["workspace.tsx"],"sourcesContent":["import 'reset-css';\nimport pluralize from 'pluralize';\nimport React, { useState, useMemo, useEffect, useCallback, useLayoutEffect, useRef } from 'react';\nimport { Route, Link, useLocation, useSearchParams } from 'react-router-dom';\nimport type { ComponentModel } from '@teambit/component';\nimport { useIdFromLocation } from '@teambit/component';\nimport type { ComponentID } from '@teambit/component-id';\nimport { LanesModel } from '@teambit/lanes.ui.models.lanes-model';\nimport { useNotifications } from '@teambit/ui-foundation.ui.notifications.notification-context';\nimport { SlotRouter } from '@teambit/ui-foundation.ui.react-router.slot-router';\nimport type { RouteSlot } from '@teambit/ui-foundation.ui.react-router.slot-router';\nimport { Corner } from '@teambit/ui-foundation.ui.corner';\nimport { Collapser } from '@teambit/ui-foundation.ui.buttons.collapser';\nimport { SplitPane, Pane, Layout } from '@teambit/base-ui.surfaces.split-pane.split-pane';\nimport { useThemePicker } from '@teambit/base-react.themes.theme-switcher';\nimport { HoverSplitter } from '@teambit/base-ui.surfaces.split-pane.hover-splitter';\nimport { TopBar } from '@teambit/ui-foundation.ui.top-bar';\nimport { PreserveWorkspaceMode } from '@teambit/workspace.ui.preserve-workspace-mode';\nimport classNames from 'classnames';\nimport { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';\nimport { useUrlChangeBroadcaster } from '@teambit/workspace.hooks.use-url-change-broadcaster';\nimport { useNavigationMessageListener } from '@teambit/workspace.hooks.use-navigation-message-listener';\n\nimport { useWorkspace } from './use-workspace';\nimport { WorkspaceOverview } from './workspace-overview';\nimport { WorkspaceProvider } from './workspace-provider';\nimport { WorkspaceSkeleton } from './workspace-skeleton';\nimport styles from './workspace.module.scss';\nimport type { WorkspaceUI } from '../../workspace.ui.runtime';\nimport { ThemeFromUrlSync } from './theme-from-url';\n\nexport type WorkspaceProps = {\n routeSlot: RouteSlot;\n menuSlot: RouteSlot;\n sidebar: React.JSX.Element;\n workspaceUI: WorkspaceUI;\n onSidebarTogglerChange: (callback: () => void) => void;\n};\n\n/**\n * main workspace component.\n */\nexport function Workspace({ routeSlot, menuSlot, sidebar, workspaceUI, onSidebarTogglerChange }: WorkspaceProps) {\n const { isMinimal } = useWorkspaceMode();\n\n const reactionsRef = useRef<{\n onComponentAdded: (comps: ComponentModel[]) => void;\n onComponentRemoved: (ids: ComponentID[]) => void;\n }>({\n onComponentAdded: () => {},\n onComponentRemoved: () => {},\n });\n\n const reactions = useMemo(\n () => ({\n onComponentAdded: (comps: ComponentModel[]) => reactionsRef.current.onComponentAdded(comps),\n onComponentRemoved: (ids: ComponentID[]) => reactionsRef.current.onComponentRemoved(ids),\n }),\n []\n );\n\n const { workspace } = useWorkspace(reactions);\n const theme = useThemePicker();\n const currentTheme = theme?.current;\n const [isSidebarOpen, setSidebarOpen] = useState<boolean | null>(null);\n const handleSidebarToggle = useCallback(() => {\n setSidebarOpen((prev) => !prev);\n }, []);\n const sidebarOpenness = isSidebarOpen ? Layout.row : Layout.right;\n const themeName = currentTheme?.themeName || 'light';\n // register the toggler with the parent in an effect, not during render — calling a parent callback\n // (which stores/setStates it) mid-render risks \"cannot update a component while rendering another\".\n useEffect(() => {\n onSidebarTogglerChange(handleSidebarToggle);\n }, [onSidebarTogglerChange, handleSidebarToggle]);\n\n useEffect(() => {\n if (!window) return;\n if (window.innerWidth <= 1024) {\n setSidebarOpen(false);\n }\n }, []);\n\n useLayoutEffect(() => {\n setSidebarOpen(!isMinimal);\n }, [isMinimal]);\n\n const location = useLocation();\n\n // push the loaded components into the workspace UI store from an effect rather than during render —\n // mutating an external store mid-render can re-render its subscribers in the middle of this render.\n useEffect(() => {\n if (workspace) workspaceUI.setComponents(workspace.components);\n }, [workspaceUI, workspace]);\n\n const inIframe = typeof window !== 'undefined' && window.parent && window.parent !== window;\n const isOverview = location.pathname === '/' || location.pathname === '';\n const showTopBar = !isMinimal || (isMinimal && !isOverview);\n if (!workspace) {\n // While the light workspace query resolves, show a full-shell skeleton instead of a blank\n // screen. The heavy per-component data (status, issues) streams in after first paint.\n return <WorkspaceSkeleton />;\n }\n\n return (\n <WorkspaceProvider workspace={workspace}>\n {!isMinimal && <NotificationsBinder reactionsRef={reactionsRef} />}\n <PreserveWorkspaceMode>\n <ThemeFromUrlSync />\n {isMinimal && inIframe && <MinimalModeUrlBroadcasterAndListener />}\n <div className={styles.workspaceWrapper}>\n {showTopBar && (\n <TopBar\n className={classNames(styles.topbar, styles[themeName], isMinimal && styles.minimal)}\n Corner={() => (\n <div className={classNames(isMinimal && styles.cornerWithBreadcrumb)}>\n {isMinimal ? (\n <Link to=\"/\" className={styles.backButton}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path\n d=\"M11.25 13.5L6.75 9L11.25 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Link>\n ) : (\n <Corner\n className={classNames(styles.corner, styles[themeName])}\n name={workspace.name}\n icon={workspace.icon}\n />\n )}\n {isMinimal && <WorkspaceBreadcrumb />}\n </div>\n )}\n // @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\n menu={menuSlot}\n />\n )}\n <SplitPane className={styles.main} size={246} layout={sidebarOpenness}>\n <Pane className={classNames(styles.sidebar, styles[themeName], !isSidebarOpen && styles.closed)}>\n {sidebar}\n </Pane>\n <HoverSplitter\n className={classNames(styles.splitter, isMinimal && !isSidebarOpen && styles.splitterClosed)}\n >\n <Collapser\n isOpen={Boolean(isSidebarOpen)}\n onMouseDown={(e) => e.stopPropagation()} // avoid split-pane drag\n onClick={handleSidebarToggle}\n tooltipContent={`${isSidebarOpen ? 'Hide' : 'Show'} side panel`}\n />\n </HoverSplitter>\n <Pane>\n <SlotRouter slot={routeSlot}>\n <Route index element={<WorkspaceOverview />} />\n </SlotRouter>\n </Pane>\n </SplitPane>\n </div>\n </PreserveWorkspaceMode>\n </WorkspaceProvider>\n );\n}\n\nfunction NotificationsBinder({\n reactionsRef,\n}: {\n reactionsRef: React.MutableRefObject<{\n onComponentAdded: (comps: ComponentModel[]) => void;\n onComponentRemoved: (ids: ComponentID[]) => void;\n }>;\n}) {\n const notifications = useNotifications();\n\n const notificationsMapped = useMemo(() => {\n return {\n onComponentAdded: (comps: ComponentModel[]) => {\n const notificationId = notifications.log(\n `added ${pluralize('component', comps.length)}: ${comps.map((comp) => comp.id.toString()).join(', ')}`\n );\n setTimeout(() => notifications.dismiss(notificationId), 12 * 1000);\n },\n onComponentRemoved: (ids: ComponentID[]) => {\n const notificationId = notifications.log(\n `removed ${pluralize('component', ids.length)} ${ids.map((id) => id.toString()).join(', ')}`\n );\n setTimeout(() => notifications.dismiss(notificationId), 12 * 1000);\n },\n };\n }, [notifications]);\n\n useEffect(() => {\n reactionsRef.current = notificationsMapped;\n return () => {\n reactionsRef.current = { onComponentAdded: () => {}, onComponentRemoved: () => {} };\n };\n }, [notificationsMapped, reactionsRef]);\n\n return null;\n}\n\nexport function MinimalModeUrlBroadcasterAndListener() {\n useUrlChangeBroadcaster();\n useNavigationMessageListener();\n return null;\n}\n\n/**\n * Extracts the component fullName from the URL.\n * For lane URLs (`/~lane/scope/lane/~component/...`), extracts the path after ~component/\n * and passes it to useIdFromLocation. For regular URLs, useIdFromLocation handles it directly.\n */\nfunction useComponentFullNameFromUrl(): string | undefined {\n const { pathname } = useLocation();\n const laneComponentUrl = useMemo(() => {\n const marker = LanesModel.baseLaneComponentRoute.replace(/^\\//, '') + '/';\n const idx = pathname.indexOf(marker);\n if (idx !== -1) return pathname.slice(idx + marker.length);\n if (pathname.includes(LanesModel.lanesPrefix)) return ''; // lane page, no component\n return undefined;\n }, [pathname]);\n\n return useIdFromLocation(laneComponentUrl || undefined);\n}\n\nfunction WorkspaceBreadcrumb() {\n const fullName = useComponentFullNameFromUrl();\n const [searchParams] = useSearchParams();\n if (!fullName) return null;\n\n const parts = fullName.split('/');\n const isLast = (i: number) => i === parts.length - 1;\n\n return (\n <span className={styles.breadcrumb}>\n {parts.map((part, i) => {\n // build the namespace from all segments up to this one\n const namespace = parts.slice(0, i + 1).join('/');\n const overviewParams = new URLSearchParams(searchParams);\n overviewParams.set('aggregation', 'none');\n overviewParams.set('ns', namespace);\n\n return (\n <React.Fragment key={i}>\n {i > 0 && <span className={styles.breadcrumbSeparator}>/</span>}\n {isLast(i) ? (\n <span className={styles.breadcrumbLast}>{part}</span>\n ) : (\n <Link to={`/?${overviewParams.toString()}`} className={styles.breadcrumbLink}>\n {part}\n </Link>\n )}\n </React.Fragment>\n );\n })}\n </span>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["require","_pluralize","data","_interopRequireDefault","_react","_interopRequireWildcard","_reactRouterDom","_component","_lanesUiModels","_uiFoundationUiNotifications","_uiFoundationUiReactRouter","_uiFoundationUi","_uiFoundationUiButtons","_baseUiSurfacesSplitPane","_baseReactThemes","_baseUiSurfacesSplitPane2","_uiFoundationUi2","_workspaceUi","_classnames","_workspaceUi2","_workspaceHooks","_workspaceHooks2","_useWorkspace","_workspaceOverview","_workspaceProvider","_workspaceSkeleton","_workspaceModule","_themeFromUrl","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","Workspace","routeSlot","menuSlot","sidebar","workspaceUI","onSidebarTogglerChange","isMinimal","useWorkspaceMode","reactionsRef","useRef","onComponentAdded","onComponentRemoved","reactions","useMemo","comps","current","ids","workspace","useWorkspace","theme","useThemePicker","currentTheme","isSidebarOpen","setSidebarOpen","useState","handleSidebarToggle","useCallback","prev","sidebarOpenness","Layout","row","right","themeName","useEffect","window","innerWidth","useLayoutEffect","location","useLocation","setComponents","components","inIframe","parent","isOverview","pathname","showTopBar","createElement","WorkspaceSkeleton","WorkspaceProvider","NotificationsBinder","PreserveWorkspaceMode","ThemeFromUrlSync","MinimalModeUrlBroadcasterAndListener","className","styles","workspaceWrapper","TopBar","classNames","topbar","minimal","Corner","cornerWithBreadcrumb","Link","to","backButton","width","height","viewBox","fill","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","corner","name","icon","WorkspaceBreadcrumb","menu","SplitPane","main","size","layout","Pane","closed","HoverSplitter","splitter","splitterClosed","Collapser","isOpen","Boolean","onMouseDown","stopPropagation","onClick","tooltipContent","SlotRouter","slot","Route","index","element","WorkspaceOverview","notifications","useNotifications","notificationsMapped","notificationId","log","pluralize","length","map","comp","id","toString","join","setTimeout","dismiss","useUrlChangeBroadcaster","useNavigationMessageListener","useComponentFullNameFromUrl","laneComponentUrl","marker","LanesModel","baseLaneComponentRoute","replace","idx","indexOf","slice","includes","lanesPrefix","undefined","useIdFromLocation","fullName","searchParams","useSearchParams","parts","split","isLast","breadcrumb","part","namespace","overviewParams","URLSearchParams","Fragment","key","breadcrumbSeparator","breadcrumbLast","breadcrumbLink"],"sources":["workspace.tsx"],"sourcesContent":["import 'reset-css';\nimport pluralize from 'pluralize';\nimport React, { useState, useMemo, useEffect, useCallback, useLayoutEffect, useRef } from 'react';\nimport { Route, Link, useLocation, useSearchParams } from 'react-router-dom';\nimport type { ComponentModel } from '@teambit/component';\nimport { useIdFromLocation } from '@teambit/component';\nimport type { ComponentID } from '@teambit/component-id';\nimport { LanesModel } from '@teambit/lanes.ui.models.lanes-model';\nimport { useNotifications } from '@teambit/ui-foundation.ui.notifications.notification-context';\nimport { SlotRouter } from '@teambit/ui-foundation.ui.react-router.slot-router';\nimport type { RouteSlot } from '@teambit/ui-foundation.ui.react-router.slot-router';\nimport { Corner } from '@teambit/ui-foundation.ui.corner';\nimport { Collapser } from '@teambit/ui-foundation.ui.buttons.collapser';\nimport { SplitPane, Pane, Layout } from '@teambit/base-ui.surfaces.split-pane.split-pane';\nimport { useThemePicker } from '@teambit/base-react.themes.theme-switcher';\nimport { HoverSplitter } from '@teambit/base-ui.surfaces.split-pane.hover-splitter';\nimport { TopBar } from '@teambit/ui-foundation.ui.top-bar';\nimport { PreserveWorkspaceMode } from '@teambit/workspace.ui.preserve-workspace-mode';\nimport classNames from 'classnames';\nimport { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';\nimport { useUrlChangeBroadcaster } from '@teambit/workspace.hooks.use-url-change-broadcaster';\nimport { useNavigationMessageListener } from '@teambit/workspace.hooks.use-navigation-message-listener';\n\nimport { useWorkspace } from './use-workspace';\nimport { WorkspaceOverview } from './workspace-overview';\nimport { WorkspaceProvider } from './workspace-provider';\nimport { WorkspaceSkeleton } from './workspace-skeleton';\nimport styles from './workspace.module.scss';\nimport type { WorkspaceUI } from '../../workspace.ui.runtime';\nimport { ThemeFromUrlSync } from './theme-from-url';\n\nexport type WorkspaceProps = {\n routeSlot: RouteSlot;\n menuSlot: RouteSlot;\n sidebar: React.JSX.Element;\n workspaceUI: WorkspaceUI;\n onSidebarTogglerChange: (callback: () => void) => void;\n};\n\n/**\n * main workspace component.\n */\nexport function Workspace({ routeSlot, menuSlot, sidebar, workspaceUI, onSidebarTogglerChange }: WorkspaceProps) {\n const { isMinimal } = useWorkspaceMode();\n\n const reactionsRef = useRef<{\n onComponentAdded: (comps: ComponentModel[]) => void;\n onComponentRemoved: (ids: ComponentID[]) => void;\n }>({\n onComponentAdded: () => {},\n onComponentRemoved: () => {},\n });\n\n const reactions = useMemo(\n () => ({\n onComponentAdded: (comps: ComponentModel[]) => reactionsRef.current.onComponentAdded(comps),\n onComponentRemoved: (ids: ComponentID[]) => reactionsRef.current.onComponentRemoved(ids),\n }),\n []\n );\n\n const { workspace } = useWorkspace(reactions);\n const theme = useThemePicker();\n const currentTheme = theme?.current;\n const [isSidebarOpen, setSidebarOpen] = useState<boolean | null>(null);\n const handleSidebarToggle = useCallback(() => {\n setSidebarOpen((prev) => !prev);\n }, []);\n const sidebarOpenness = isSidebarOpen ? Layout.row : Layout.right;\n const themeName = currentTheme?.themeName || 'light';\n // register the toggler with the parent in an effect, not during render — calling a parent callback\n // (which stores/setStates it) mid-render risks \"cannot update a component while rendering another\".\n useEffect(() => {\n onSidebarTogglerChange(handleSidebarToggle);\n }, [onSidebarTogglerChange, handleSidebarToggle]);\n\n useEffect(() => {\n if (!window) return;\n if (window.innerWidth <= 1024) {\n setSidebarOpen(false);\n }\n }, []);\n\n useLayoutEffect(() => {\n setSidebarOpen(!isMinimal);\n }, [isMinimal]);\n\n const location = useLocation();\n\n // push the loaded components into the workspace UI store from an effect rather than during render —\n // mutating an external store mid-render can re-render its subscribers in the middle of this render.\n useEffect(() => {\n if (workspace) workspaceUI.setComponents(workspace.components);\n }, [workspaceUI, workspace]);\n\n const inIframe = typeof window !== 'undefined' && window.parent && window.parent !== window;\n const isOverview = location.pathname === '/' || location.pathname === '';\n const showTopBar = !isMinimal || (isMinimal && !isOverview);\n if (!workspace) {\n // While the light workspace query resolves, show a full-shell skeleton instead of a blank\n // screen. The heavy per-component data (status, issues) streams in after first paint.\n return <WorkspaceSkeleton isMinimal={isMinimal} showTopBar={showTopBar} />;\n }\n\n return (\n <WorkspaceProvider workspace={workspace}>\n {!isMinimal && <NotificationsBinder reactionsRef={reactionsRef} />}\n <PreserveWorkspaceMode>\n <ThemeFromUrlSync />\n {isMinimal && inIframe && <MinimalModeUrlBroadcasterAndListener />}\n <div className={styles.workspaceWrapper}>\n {showTopBar && (\n <TopBar\n className={classNames(styles.topbar, styles[themeName], isMinimal && styles.minimal)}\n Corner={() => (\n <div className={classNames(isMinimal && styles.cornerWithBreadcrumb)}>\n {isMinimal ? (\n <Link to=\"/\" className={styles.backButton}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path\n d=\"M11.25 13.5L6.75 9L11.25 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Link>\n ) : (\n <Corner\n className={classNames(styles.corner, styles[themeName])}\n name={workspace.name}\n icon={workspace.icon}\n />\n )}\n {isMinimal && <WorkspaceBreadcrumb />}\n </div>\n )}\n // @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\n menu={menuSlot}\n />\n )}\n <SplitPane className={styles.main} size={246} layout={sidebarOpenness}>\n <Pane className={classNames(styles.sidebar, styles[themeName], !isSidebarOpen && styles.closed)}>\n {sidebar}\n </Pane>\n <HoverSplitter\n className={classNames(styles.splitter, isMinimal && !isSidebarOpen && styles.splitterClosed)}\n >\n <Collapser\n isOpen={Boolean(isSidebarOpen)}\n onMouseDown={(e) => e.stopPropagation()} // avoid split-pane drag\n onClick={handleSidebarToggle}\n tooltipContent={`${isSidebarOpen ? 'Hide' : 'Show'} side panel`}\n />\n </HoverSplitter>\n <Pane>\n <SlotRouter slot={routeSlot}>\n <Route index element={<WorkspaceOverview />} />\n </SlotRouter>\n </Pane>\n </SplitPane>\n </div>\n </PreserveWorkspaceMode>\n </WorkspaceProvider>\n );\n}\n\nfunction NotificationsBinder({\n reactionsRef,\n}: {\n reactionsRef: React.MutableRefObject<{\n onComponentAdded: (comps: ComponentModel[]) => void;\n onComponentRemoved: (ids: ComponentID[]) => void;\n }>;\n}) {\n const notifications = useNotifications();\n\n const notificationsMapped = useMemo(() => {\n return {\n onComponentAdded: (comps: ComponentModel[]) => {\n const notificationId = notifications.log(\n `added ${pluralize('component', comps.length)}: ${comps.map((comp) => comp.id.toString()).join(', ')}`\n );\n setTimeout(() => notifications.dismiss(notificationId), 12 * 1000);\n },\n onComponentRemoved: (ids: ComponentID[]) => {\n const notificationId = notifications.log(\n `removed ${pluralize('component', ids.length)} ${ids.map((id) => id.toString()).join(', ')}`\n );\n setTimeout(() => notifications.dismiss(notificationId), 12 * 1000);\n },\n };\n }, [notifications]);\n\n useEffect(() => {\n reactionsRef.current = notificationsMapped;\n return () => {\n reactionsRef.current = { onComponentAdded: () => {}, onComponentRemoved: () => {} };\n };\n }, [notificationsMapped, reactionsRef]);\n\n return null;\n}\n\nexport function MinimalModeUrlBroadcasterAndListener() {\n useUrlChangeBroadcaster();\n useNavigationMessageListener();\n return null;\n}\n\n/**\n * Extracts the component fullName from the URL.\n * For lane URLs (`/~lane/scope/lane/~component/...`), extracts the path after ~component/\n * and passes it to useIdFromLocation. For regular URLs, useIdFromLocation handles it directly.\n */\nfunction useComponentFullNameFromUrl(): string | undefined {\n const { pathname } = useLocation();\n const laneComponentUrl = useMemo(() => {\n const marker = LanesModel.baseLaneComponentRoute.replace(/^\\//, '') + '/';\n const idx = pathname.indexOf(marker);\n if (idx !== -1) return pathname.slice(idx + marker.length);\n if (pathname.includes(LanesModel.lanesPrefix)) return ''; // lane page, no component\n return undefined;\n }, [pathname]);\n\n return useIdFromLocation(laneComponentUrl || undefined);\n}\n\nfunction WorkspaceBreadcrumb() {\n const fullName = useComponentFullNameFromUrl();\n const [searchParams] = useSearchParams();\n if (!fullName) return null;\n\n const parts = fullName.split('/');\n const isLast = (i: number) => i === parts.length - 1;\n\n return (\n <span className={styles.breadcrumb}>\n {parts.map((part, i) => {\n // build the namespace from all segments up to this one\n const namespace = parts.slice(0, i + 1).join('/');\n const overviewParams = new URLSearchParams(searchParams);\n overviewParams.set('aggregation', 'none');\n overviewParams.set('ns', namespace);\n\n return (\n <React.Fragment key={i}>\n {i > 0 && <span className={styles.breadcrumbSeparator}>/</span>}\n {isLast(i) ? (\n <span className={styles.breadcrumbLast}>{part}</span>\n ) : (\n <Link to={`/?${overviewParams.toString()}`} className={styles.breadcrumbLink}>\n {part}\n </Link>\n )}\n </React.Fragment>\n );\n })}\n </span>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -40,13 +40,15 @@
40
40
  display: flex;
41
41
  align-items: center;
42
42
  height: 100%;
43
+ // Let a long component path give up its space before the component tabs do, at every width,
44
+ // so it can never push the tabs (e.g. Preview) or the menu actions off-screen.
45
+ flex-shrink: 1000;
46
+ min-width: 0;
47
+ overflow: hidden;
43
48
 
44
- // Let a long component path clip instead of pushing the menu actions off-screen.
45
49
  @media screen and (max-width: $br-md) {
46
50
  flex: 1 1 0;
47
51
  height: 46px;
48
- min-width: 0;
49
- overflow: hidden;
50
52
  }
51
53
  }
52
54
 
@@ -60,6 +62,31 @@
60
62
  font-weight: 500;
61
63
  white-space: nowrap;
62
64
  border-right: 1px solid var(--bit-border-color-lightest, #e0e0e0);
65
+ min-width: 0;
66
+ overflow: hidden;
67
+
68
+ // when space runs out, the namespace segments truncate first and the component name last
69
+ > * {
70
+ flex-shrink: 0;
71
+ }
72
+
73
+ > .breadcrumbLink,
74
+ > .breadcrumbSeparator,
75
+ > .breadcrumbLast {
76
+ min-width: 0;
77
+ overflow: hidden;
78
+ text-overflow: ellipsis;
79
+ }
80
+
81
+ // separators collapse together with the namespace, so no orphan "/" is left before the name
82
+ > .breadcrumbLink,
83
+ > .breadcrumbSeparator {
84
+ flex-shrink: 1000;
85
+ }
86
+
87
+ > .breadcrumbLast {
88
+ flex-shrink: 1;
89
+ }
63
90
  }
64
91
 
65
92
  .breadcrumbSeparator {
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/workspace",
3
- "version": "1.0.1218",
3
+ "version": "1.0.1220",
4
4
  "homepage": "https://bit.cloud/teambit/workspace/workspace",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.workspace",
8
8
  "name": "workspace",
9
- "version": "1.0.1218"
9
+ "version": "1.0.1220"
10
10
  },
11
11
  "dependencies": {
12
12
  "lodash": "4.18.1",
@@ -29,9 +29,6 @@
29
29
  "pluralize": "8.0.0",
30
30
  "reset-css": "5.0.1",
31
31
  "@teambit/component-id": "1.2.5",
32
- "@teambit/component": "1.0.1217",
33
- "@teambit/dependency-resolver": "1.0.1217",
34
- "@teambit/envs": "1.0.1217",
35
32
  "@teambit/harmony": "0.4.12",
36
33
  "@teambit/legacy.extension-data": "0.0.183",
37
34
  "@teambit/legacy.scope": "0.0.181",
@@ -50,13 +47,11 @@
50
47
  "@teambit/cli": "0.0.1412",
51
48
  "@teambit/config-store": "0.0.293",
52
49
  "@teambit/legacy.constants": "0.0.49",
53
- "@teambit/component-tree": "1.0.1217",
54
50
  "@teambit/component.ui.component-status-resolver": "0.0.510",
55
51
  "@teambit/harmony.modules.load-trace": "0.0.17",
56
52
  "@teambit/harmony.modules.resolved-component": "0.0.530",
57
53
  "@teambit/legacy.utils": "0.0.56",
58
54
  "@teambit/scope.remotes": "0.0.181",
59
- "@teambit/aspect-loader": "1.0.1217",
60
55
  "@teambit/config": "0.0.1587",
61
56
  "@teambit/harmony.modules.requireable-component": "0.0.530",
62
57
  "@teambit/harmony.modules.runtimes": "0.0.4",
@@ -86,7 +81,6 @@
86
81
  "@teambit/component.ui.component-filters.env-filter": "0.0.296",
87
82
  "@teambit/component.ui.component-filters.show-main-filter": "0.0.243",
88
83
  "@teambit/design.ui.surfaces.menu.link-item": "1.0.13",
89
- "@teambit/sidebar": "1.0.1217",
90
84
  "@teambit/ui-foundation.ui.main-dropdown": "0.0.505",
91
85
  "@teambit/ui-foundation.ui.menu": "0.0.503",
92
86
  "@teambit/ui-foundation.ui.react-router.slot-router": "0.0.533",
@@ -111,12 +105,18 @@
111
105
  "@teambit/workspace.hooks.use-url-change-broadcaster": "0.0.7",
112
106
  "@teambit/workspace.ui.preserve-workspace-mode": "0.0.8",
113
107
  "@teambit/evangelist.elements.icon": "1.0.5",
114
- "@teambit/scope": "1.0.1218",
115
- "@teambit/graph": "1.0.1218",
116
- "@teambit/isolator": "1.0.1218",
117
- "@teambit/bundler": "1.0.1218",
118
- "@teambit/ui": "1.0.1218",
119
- "@teambit/command-bar": "1.0.1218"
108
+ "@teambit/component": "1.0.1219",
109
+ "@teambit/dependency-resolver": "1.0.1219",
110
+ "@teambit/envs": "1.0.1219",
111
+ "@teambit/scope": "1.0.1220",
112
+ "@teambit/graph": "1.0.1220",
113
+ "@teambit/isolator": "1.0.1220",
114
+ "@teambit/component-tree": "1.0.1219",
115
+ "@teambit/aspect-loader": "1.0.1219",
116
+ "@teambit/bundler": "1.0.1220",
117
+ "@teambit/ui": "1.0.1220",
118
+ "@teambit/command-bar": "1.0.1220",
119
+ "@teambit/sidebar": "1.0.1219"
120
120
  },
121
121
  "devDependencies": {
122
122
  "@types/lodash": "4.14.165",
@@ -99,30 +99,6 @@
99
99
  line-height: 1.5;
100
100
  }
101
101
 
102
- /* ---- Separator ---- */
103
-
104
- .sep {
105
- display: flex;
106
- align-items: center;
107
- gap: 14px;
108
- margin: 32px auto 20px;
109
- max-width: 340px;
110
- }
111
-
112
- .sepLine {
113
- flex: 1;
114
- height: 1px;
115
- background: var(--border-medium-color);
116
- }
117
-
118
- .sepLabel {
119
- font-family: 'JetBrains Mono', ui-monospace, Menlo, monospace;
120
- font-size: 11px;
121
- color: var(--on-background-low-color);
122
- letter-spacing: 0.14em;
123
- text-transform: uppercase;
124
- }
125
-
126
102
  /* ---- DIY rows ---- */
127
103
 
128
104
  .diyGrid {
@@ -11,8 +11,8 @@ const DISCORD_URL = 'https://discord.bit.cloud/';
11
11
  * Replaces the legacy `@teambit/workspace.ui.empty-workspace` for the Hope flow.
12
12
  *
13
13
  * The default state guides the user through the Bit CLI in their terminal. In
14
- * minimal mode (the embedded Hope experience) we additionally surface the
15
- * "prompt Hope in the chat" CTA.
14
+ * minimal mode (the embedded Hope experience) it is reduced to a single
15
+ * "prompt Hope in the chat" CTA - no CLI commands, docs or community links.
16
16
  */
17
17
  export function WorkspaceBlankState() {
18
18
  const { isMinimal } = useWorkspaceMode();
@@ -28,60 +28,54 @@ export function WorkspaceBlankState() {
28
28
 
29
29
  <p className={styles.sub}>Components will appear here as they're built.</p>
30
30
 
31
- {/* Primary — prompt Hope in the chat (minimal mode only) */}
32
- {isMinimal && (
33
- <>
34
- <div className={styles.hopeCallout}>
35
- <HopeAiIcon size={32} className={styles.hopeIcon} />
36
- <div className={styles.hopeText}>
37
- <div className={styles.hopeTitle}>Prompt Hope in the chat</div>
38
- <div className={styles.hopeHelp}>
39
- Describe what you want to build, from one prompt to a whole company.
40
- </div>
31
+ {isMinimal ? (
32
+ <div className={styles.hopeCallout}>
33
+ <HopeAiIcon size={32} className={styles.hopeIcon} />
34
+ <div className={styles.hopeText}>
35
+ <div className={styles.hopeTitle}>Prompt Hope in the chat</div>
36
+ <div className={styles.hopeHelp}>
37
+ Describe what you want to build, from one prompt to a whole company.
41
38
  </div>
42
39
  </div>
40
+ </div>
41
+ ) : (
42
+ <>
43
+ {/* DIY CLI options */}
44
+ <div className={styles.diyGrid}>
45
+ <DiyRow title="Create" body="Scaffold a new component." cmd="bit create react button" />
46
+ <DiyRow title="Import" body="Bring one from another scope." cmd="bit import org.scope/comp" />
47
+ </div>
43
48
 
44
- {/* OR separator */}
45
- <div className={styles.sep}>
46
- <div className={styles.sepLine} />
47
- <span className={styles.sepLabel}>or do it yourself</span>
48
- <div className={styles.sepLine} />
49
+ <div className={styles.docsLinks}>
50
+ <a href="https://bit.dev/docs" className={styles.link} target="_blank" rel="noopener noreferrer">
51
+ CLI docs ↗
52
+ </a>
53
+ <a href="https://bit.cloud/docs" className={styles.link} target="_blank" rel="noopener noreferrer">
54
+ Cloud docs ↗
55
+ </a>
49
56
  </div>
50
57
  </>
51
58
  )}
59
+ </div>
52
60
 
53
- {/* DIY CLI options */}
54
- <div className={styles.diyGrid}>
55
- <DiyRow title="Create" body="Scaffold a new component." cmd="bit create react button" />
56
- <DiyRow title="Import" body="Bring one from another scope." cmd="bit import org.scope/comp" />
57
- </div>
58
-
59
- <div className={styles.docsLinks}>
60
- <a href="https://bit.dev/docs" className={styles.link} target="_blank" rel="noopener noreferrer">
61
- CLI docs ↗
62
- </a>
63
- <a href="https://bit.cloud/docs" className={styles.link} target="_blank" rel="noopener noreferrer">
64
- Cloud docs ↗
61
+ {!isMinimal && (
62
+ <div className={styles.bottom}>
63
+ <IconLink
64
+ href="https://github.com/teambit/bit"
65
+ src="https://static.bit.dev/harmony/github.svg"
66
+ label="Bit on GitHub"
67
+ />
68
+ <a
69
+ href={DISCORD_URL}
70
+ className={styles.iconLink}
71
+ target="_blank"
72
+ rel="noopener noreferrer"
73
+ aria-label="Bit community on Discord"
74
+ >
75
+ <Icon of="discord" className={styles.discordIcon} />
65
76
  </a>
66
77
  </div>
67
- </div>
68
-
69
- <div className={styles.bottom}>
70
- <IconLink
71
- href="https://github.com/teambit/bit"
72
- src="https://static.bit.dev/harmony/github.svg"
73
- label="Bit on GitHub"
74
- />
75
- <a
76
- href={DISCORD_URL}
77
- className={styles.iconLink}
78
- target="_blank"
79
- rel="noopener noreferrer"
80
- aria-label="Bit community on Discord"
81
- >
82
- <Icon of="discord" className={styles.discordIcon} />
83
- </a>
84
- </div>
78
+ )}
85
79
  </div>
86
80
  );
87
81
  }
@@ -16,6 +16,10 @@
16
16
  border-bottom: 1px solid var(--border-medium-color, #e6e6e6);
17
17
  }
18
18
 
19
+ .minimalTopbar {
20
+ height: 46px;
21
+ }
22
+
19
23
  .corner {
20
24
  width: 246px;
21
25
  height: 100%;
@@ -1,31 +1,50 @@
1
1
  import React from 'react';
2
+ import classNames from 'classnames';
2
3
  import { ComponentsOverviewSkeleton } from '@teambit/explorer.ui.components-overview';
3
4
  import styles from './workspace-skeleton.module.scss';
4
5
 
6
+ export type WorkspaceSkeletonProps = {
7
+ /**
8
+ * minimal (Hope) mode layout - no sidebar and no workspace corner.
9
+ */
10
+ isMinimal?: boolean;
11
+ /**
12
+ * whether the real UI renders a top bar for the current route.
13
+ */
14
+ showTopBar?: boolean;
15
+ };
16
+
5
17
  /**
6
18
  * Full-shell loading placeholder shown while the (light) workspace query resolves. Mirrors the real
7
19
  * workspace chrome — top bar, sidebar column, content grid — so there is no blank flash and no
8
20
  * layout shift when the live UI takes over. Previously this gap rendered an empty `<div>`, which
9
21
  * read as a frozen/blank screen on slower workspaces.
22
+ *
23
+ * In minimal (Hope) mode the sidebar starts closed and there is no workspace corner, so the skeleton
24
+ * drops both, and skips the top bar entirely where the real UI hides it (the workspace overview).
10
25
  */
11
- export function WorkspaceSkeleton() {
26
+ export function WorkspaceSkeleton({ isMinimal = false, showTopBar = true }: WorkspaceSkeletonProps) {
12
27
  return (
13
28
  <div className={styles.wrapper} aria-busy="true" aria-live="polite">
14
- <div className={styles.topbar}>
15
- <div className={styles.corner} />
16
- <div className={styles.topbarNav}>
17
- <span className={styles.navItem} />
18
- <span className={styles.navItem} />
19
- <span className={styles.navItem} />
29
+ {showTopBar && (
30
+ <div className={classNames(styles.topbar, isMinimal && styles.minimalTopbar)}>
31
+ {!isMinimal && <div className={styles.corner} />}
32
+ <div className={styles.topbarNav}>
33
+ <span className={styles.navItem} />
34
+ <span className={styles.navItem} />
35
+ <span className={styles.navItem} />
36
+ </div>
20
37
  </div>
21
- </div>
38
+ )}
22
39
  <div className={styles.main}>
23
- <div className={styles.sidebar}>
24
- <span className={styles.sidebarSearch} />
25
- {Array.from({ length: 10 }).map((_, i) => (
26
- <span key={i} className={styles.sidebarRow} style={{ width: `${55 + ((i * 13) % 35)}%` }} />
27
- ))}
28
- </div>
40
+ {!isMinimal && (
41
+ <div className={styles.sidebar}>
42
+ <span className={styles.sidebarSearch} />
43
+ {Array.from({ length: 10 }).map((_, i) => (
44
+ <span key={i} className={styles.sidebarRow} style={{ width: `${55 + ((i * 13) % 35)}%` }} />
45
+ ))}
46
+ </div>
47
+ )}
29
48
  <div className={styles.content}>
30
49
  <ComponentsOverviewSkeleton count={12} />
31
50
  </div>
@@ -40,13 +40,15 @@
40
40
  display: flex;
41
41
  align-items: center;
42
42
  height: 100%;
43
+ // Let a long component path give up its space before the component tabs do, at every width,
44
+ // so it can never push the tabs (e.g. Preview) or the menu actions off-screen.
45
+ flex-shrink: 1000;
46
+ min-width: 0;
47
+ overflow: hidden;
43
48
 
44
- // Let a long component path clip instead of pushing the menu actions off-screen.
45
49
  @media screen and (max-width: $br-md) {
46
50
  flex: 1 1 0;
47
51
  height: 46px;
48
- min-width: 0;
49
- overflow: hidden;
50
52
  }
51
53
  }
52
54
 
@@ -60,6 +62,31 @@
60
62
  font-weight: 500;
61
63
  white-space: nowrap;
62
64
  border-right: 1px solid var(--bit-border-color-lightest, #e0e0e0);
65
+ min-width: 0;
66
+ overflow: hidden;
67
+
68
+ // when space runs out, the namespace segments truncate first and the component name last
69
+ > * {
70
+ flex-shrink: 0;
71
+ }
72
+
73
+ > .breadcrumbLink,
74
+ > .breadcrumbSeparator,
75
+ > .breadcrumbLast {
76
+ min-width: 0;
77
+ overflow: hidden;
78
+ text-overflow: ellipsis;
79
+ }
80
+
81
+ // separators collapse together with the namespace, so no orphan "/" is left before the name
82
+ > .breadcrumbLink,
83
+ > .breadcrumbSeparator {
84
+ flex-shrink: 1000;
85
+ }
86
+
87
+ > .breadcrumbLast {
88
+ flex-shrink: 1;
89
+ }
63
90
  }
64
91
 
65
92
  .breadcrumbSeparator {
@@ -99,7 +99,7 @@ export function Workspace({ routeSlot, menuSlot, sidebar, workspaceUI, onSidebar
99
99
  if (!workspace) {
100
100
  // While the light workspace query resolves, show a full-shell skeleton instead of a blank
101
101
  // screen. The heavy per-component data (status, issues) streams in after first paint.
102
- return <WorkspaceSkeleton />;
102
+ return <WorkspaceSkeleton isMinimal={isMinimal} showTopBar={showTopBar} />;
103
103
  }
104
104
 
105
105
  return (