@teambit/workspace 1.0.1219 → 1.0.1221
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto-tag.js +9 -7
- package/dist/auto-tag.js.map +1 -1
- package/dist/{preview-1791883225352.js → preview-1791913706953.js} +2 -2
- package/dist/ui/workspace/workspace-overview/workspace-blank-state.d.ts +2 -2
- package/dist/ui/workspace/workspace-overview/workspace-blank-state.js +5 -13
- package/dist/ui/workspace/workspace-overview/workspace-blank-state.js.map +1 -1
- package/dist/ui/workspace/workspace-overview/workspace-blank-state.module.scss +0 -24
- package/dist/ui/workspace/workspace-skeleton.d.ts +14 -1
- package/dist/ui/workspace/workspace-skeleton.js +18 -5
- package/dist/ui/workspace/workspace-skeleton.js.map +1 -1
- package/dist/ui/workspace/workspace-skeleton.module.scss +4 -0
- package/dist/ui/workspace/workspace.js +4 -1
- package/dist/ui/workspace/workspace.js.map +1 -1
- package/dist/ui/workspace/workspace.module.scss +30 -3
- package/package.json +32 -32
- package/ui/workspace/workspace-overview/workspace-blank-state.module.scss +0 -24
- package/ui/workspace/workspace-overview/workspace-blank-state.tsx +41 -47
- package/ui/workspace/workspace-skeleton.module.scss +4 -0
- package/ui/workspace/workspace-skeleton.tsx +33 -14
- package/ui/workspace/workspace.module.scss +30 -3
- package/ui/workspace/workspace.tsx +1 -1
package/dist/auto-tag.js
CHANGED
|
@@ -97,13 +97,15 @@ function buildGraph(components) {
|
|
|
97
97
|
components.forEach(component => {
|
|
98
98
|
const idStr = component.id.toStringWithoutVersion();
|
|
99
99
|
component.getAllDependencies().forEach(dependency => {
|
|
100
|
-
if (componentsIds.searchWithoutVersion(dependency.id))
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
100
|
+
if (!componentsIds.searchWithoutVersion(dependency.id)) return;
|
|
101
|
+
const depId = dependency.id.toStringWithoutVersion();
|
|
102
|
+
// the component uses the version set in its config (e.g. "bit deps set"), not the workspace one. so a change in
|
|
103
|
+
// the workspace one doesn't affect it.
|
|
104
|
+
if (component.isDependencyVersionFromConfig(dependency.id)) return;
|
|
105
|
+
// save the full ComponentID of a string id to be able to retrieve it later with no confusion
|
|
106
|
+
if (!graph.hasNode(idStr)) graph.setNode(idStr, component.id);
|
|
107
|
+
if (!graph.hasNode(depId)) graph.setNode(depId, dependency.id);
|
|
108
|
+
graph.setEdge(idStr, depId);
|
|
107
109
|
});
|
|
108
110
|
});
|
|
109
111
|
return graph;
|
package/dist/auto-tag.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_graphlib","data","_interopRequireWildcard","require","_semver","_interopRequireDefault","_componentId","_componentVersion","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","getAutoTagPending","workspace","changedComponents","autoTagInfo","getAutoTagInfo","map","a","component","length","potentialComponents","potentialComponentsForAutoTagging","consumer","idsToLoad","ComponentIdList","workspaceComponents","getMany","undefined","components","workspaceComponent","state","_consumer","graph","buildGraph","autoTagResults","forEach","bitId","componentId","idStr","toStringWithoutVersion","hasNode","dependenciesStr","graphlib","alg","preorder","dependenciesBitIds","depStr","node","triggeredDependencies","filter","dependencyId","changedComponentId","searchWithoutVersion","isTag","version","semver","gte","push","triggeredBy","fromArray","Graph","componentsIds","c","id","getAllDependencies","dependency","depId","setNode","setEdge","modifiedComponents","candidateComponentsIds","bitMap","getAllBitIds","idsWithoutModified","candidateId","hasWithoutVersion"],"sources":["auto-tag.ts"],"sourcesContent":["import graphlib, { Graph } from 'graphlib';\nimport semver from 'semver';\nimport { ComponentIdList } from '@teambit/component-id';\nimport { isTag } from '@teambit/component-version';\nimport type { Consumer } from '@teambit/legacy.consumer';\nimport type { Dependency, ConsumerComponent as Component } from '@teambit/legacy.consumer-component';\nimport type { Workspace } from './workspace';\n\nexport async function getAutoTagPending(\n workspace: Workspace,\n changedComponents: ComponentIdList\n): Promise<Component[]> {\n const autoTagInfo = await getAutoTagInfo(workspace, changedComponents);\n return autoTagInfo.map((a) => a.component);\n}\n\nexport type AutoTagResult = { component: Component; triggeredBy: ComponentIdList };\n\nexport async function getAutoTagInfo(\n workspace: Workspace,\n changedComponents: ComponentIdList\n): Promise<AutoTagResult[]> {\n if (!changedComponents.length) return [];\n const potentialComponents = potentialComponentsForAutoTagging(workspace.consumer, changedComponents);\n const idsToLoad = new ComponentIdList(...potentialComponents, ...changedComponents);\n const workspaceComponents = await workspace.getMany(idsToLoad, undefined, false);\n const components = workspaceComponents.map((workspaceComponent) => workspaceComponent.state._consumer);\n const graph = buildGraph(components);\n\n const autoTagResults: AutoTagResult[] = [];\n components.forEach((component) => {\n const bitId = component.componentId;\n const idStr = bitId.toStringWithoutVersion();\n if (!graph.hasNode(idStr)) return;\n // preorder gets all dependencies and dependencies of dependencies and so on.\n // we loop over the dependencies of a component\n // @ts-ignore\n const dependenciesStr = graphlib.alg.preorder(graph, idStr);\n const dependenciesBitIds = dependenciesStr.map((depStr) => graph.node(depStr));\n const triggeredDependencies = dependenciesBitIds.filter((dependencyId) => {\n const changedComponentId = changedComponents.searchWithoutVersion(dependencyId);\n if (!changedComponentId) {\n // the dependency hasn't changed, so the component is not auto-tag pending\n return false;\n }\n if (changedComponents.searchWithoutVersion(bitId)) {\n // the dependency has changed but also the component itself, so it's going to be tagged anyway\n return false;\n }\n // we only check whether a modified component may cause auto-tagging\n // since it's only modified on the file-system, its version might be the same as the version stored in its\n // dependents. That's why \"semver.gte\" is used instead of \"semver.gt\".\n // the case when it returns false is when the changedComponentId.version is smaller than\n // edgeId.version. it happens for example, when A => B (A depends on B), B has changed, A is\n // a candidate. A has the B dependency saved in the model with version 2.0.0 and B is now\n // tagged with 1.0.1. So, because A has B with a higher version already, we don't want to\n // auto-tag it and downgrade its B version.\n if (isTag(changedComponentId.version) && isTag(dependencyId.version)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return semver.gte(changedComponentId.version!, dependencyId.version!);\n }\n // when they're not tags but snaps, it is impossible to snap from a detached head so a\n // component is always candidate when its dependencies have changed.\n return true;\n });\n if (triggeredDependencies.length) {\n autoTagResults.push({ component, triggeredBy: ComponentIdList.fromArray(triggeredDependencies) });\n }\n });\n\n return autoTagResults;\n}\n\nfunction buildGraph(components: Component[]): Graph {\n const graph = new Graph();\n const componentsIds = ComponentIdList.fromArray(components.map((c) => c.id));\n\n components.forEach((component) => {\n const idStr = component.id.toStringWithoutVersion();\n component.getAllDependencies().forEach((dependency: Dependency) => {\n if (componentsIds.searchWithoutVersion(dependency.id)) {\n const depId = dependency.id.toStringWithoutVersion();\n // save the full ComponentID of a string id to be able to retrieve it later with no confusion\n if (!graph.hasNode(idStr)) graph.setNode(idStr, component.id);\n if (!graph.hasNode(depId)) graph.setNode(depId, dependency.id);\n graph.setEdge(idStr, depId);\n }\n });\n });\n return graph;\n}\n\nfunction potentialComponentsForAutoTagging(consumer: Consumer, modifiedComponents: ComponentIdList): ComponentIdList {\n const candidateComponentsIds = consumer.bitMap.getAllBitIds();\n // if a modified component is in candidates array, remove it from the array as it will be already\n // tagged with the correct version\n const idsWithoutModified = candidateComponentsIds.filter(\n (candidateId) => !modifiedComponents.hasWithoutVersion(candidateId)\n );\n return ComponentIdList.fromArray(idsWithoutModified);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_graphlib","data","_interopRequireWildcard","require","_semver","_interopRequireDefault","_componentId","_componentVersion","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","getAutoTagPending","workspace","changedComponents","autoTagInfo","getAutoTagInfo","map","a","component","length","potentialComponents","potentialComponentsForAutoTagging","consumer","idsToLoad","ComponentIdList","workspaceComponents","getMany","undefined","components","workspaceComponent","state","_consumer","graph","buildGraph","autoTagResults","forEach","bitId","componentId","idStr","toStringWithoutVersion","hasNode","dependenciesStr","graphlib","alg","preorder","dependenciesBitIds","depStr","node","triggeredDependencies","filter","dependencyId","changedComponentId","searchWithoutVersion","isTag","version","semver","gte","push","triggeredBy","fromArray","Graph","componentsIds","c","id","getAllDependencies","dependency","depId","isDependencyVersionFromConfig","setNode","setEdge","modifiedComponents","candidateComponentsIds","bitMap","getAllBitIds","idsWithoutModified","candidateId","hasWithoutVersion"],"sources":["auto-tag.ts"],"sourcesContent":["import graphlib, { Graph } from 'graphlib';\nimport semver from 'semver';\nimport { ComponentIdList } from '@teambit/component-id';\nimport { isTag } from '@teambit/component-version';\nimport type { Consumer } from '@teambit/legacy.consumer';\nimport type { Dependency, ConsumerComponent as Component } from '@teambit/legacy.consumer-component';\nimport type { Workspace } from './workspace';\n\nexport async function getAutoTagPending(\n workspace: Workspace,\n changedComponents: ComponentIdList\n): Promise<Component[]> {\n const autoTagInfo = await getAutoTagInfo(workspace, changedComponents);\n return autoTagInfo.map((a) => a.component);\n}\n\nexport type AutoTagResult = { component: Component; triggeredBy: ComponentIdList };\n\nexport async function getAutoTagInfo(\n workspace: Workspace,\n changedComponents: ComponentIdList\n): Promise<AutoTagResult[]> {\n if (!changedComponents.length) return [];\n const potentialComponents = potentialComponentsForAutoTagging(workspace.consumer, changedComponents);\n const idsToLoad = new ComponentIdList(...potentialComponents, ...changedComponents);\n const workspaceComponents = await workspace.getMany(idsToLoad, undefined, false);\n const components = workspaceComponents.map((workspaceComponent) => workspaceComponent.state._consumer);\n const graph = buildGraph(components);\n\n const autoTagResults: AutoTagResult[] = [];\n components.forEach((component) => {\n const bitId = component.componentId;\n const idStr = bitId.toStringWithoutVersion();\n if (!graph.hasNode(idStr)) return;\n // preorder gets all dependencies and dependencies of dependencies and so on.\n // we loop over the dependencies of a component\n // @ts-ignore\n const dependenciesStr = graphlib.alg.preorder(graph, idStr);\n const dependenciesBitIds = dependenciesStr.map((depStr) => graph.node(depStr));\n const triggeredDependencies = dependenciesBitIds.filter((dependencyId) => {\n const changedComponentId = changedComponents.searchWithoutVersion(dependencyId);\n if (!changedComponentId) {\n // the dependency hasn't changed, so the component is not auto-tag pending\n return false;\n }\n if (changedComponents.searchWithoutVersion(bitId)) {\n // the dependency has changed but also the component itself, so it's going to be tagged anyway\n return false;\n }\n // we only check whether a modified component may cause auto-tagging\n // since it's only modified on the file-system, its version might be the same as the version stored in its\n // dependents. That's why \"semver.gte\" is used instead of \"semver.gt\".\n // the case when it returns false is when the changedComponentId.version is smaller than\n // edgeId.version. it happens for example, when A => B (A depends on B), B has changed, A is\n // a candidate. A has the B dependency saved in the model with version 2.0.0 and B is now\n // tagged with 1.0.1. So, because A has B with a higher version already, we don't want to\n // auto-tag it and downgrade its B version.\n if (isTag(changedComponentId.version) && isTag(dependencyId.version)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return semver.gte(changedComponentId.version!, dependencyId.version!);\n }\n // when they're not tags but snaps, it is impossible to snap from a detached head so a\n // component is always candidate when its dependencies have changed.\n return true;\n });\n if (triggeredDependencies.length) {\n autoTagResults.push({ component, triggeredBy: ComponentIdList.fromArray(triggeredDependencies) });\n }\n });\n\n return autoTagResults;\n}\n\nfunction buildGraph(components: Component[]): Graph {\n const graph = new Graph();\n const componentsIds = ComponentIdList.fromArray(components.map((c) => c.id));\n\n components.forEach((component) => {\n const idStr = component.id.toStringWithoutVersion();\n component.getAllDependencies().forEach((dependency: Dependency) => {\n if (!componentsIds.searchWithoutVersion(dependency.id)) return;\n const depId = dependency.id.toStringWithoutVersion();\n // the component uses the version set in its config (e.g. \"bit deps set\"), not the workspace one. so a change in\n // the workspace one doesn't affect it.\n if (component.isDependencyVersionFromConfig(dependency.id)) return;\n // save the full ComponentID of a string id to be able to retrieve it later with no confusion\n if (!graph.hasNode(idStr)) graph.setNode(idStr, component.id);\n if (!graph.hasNode(depId)) graph.setNode(depId, dependency.id);\n graph.setEdge(idStr, depId);\n });\n });\n return graph;\n}\n\nfunction potentialComponentsForAutoTagging(consumer: Consumer, modifiedComponents: ComponentIdList): ComponentIdList {\n const candidateComponentsIds = consumer.bitMap.getAllBitIds();\n // if a modified component is in candidates array, remove it from the array as it will be already\n // tagged with the correct version\n const idsWithoutModified = candidateComponentsIds.filter(\n (candidateId) => !modifiedComponents.hasWithoutVersion(candidateId)\n );\n return ComponentIdList.fromArray(idsWithoutModified);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.
|
|
2
|
-
import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.
|
|
1
|
+
import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.1221/dist/workspace.composition.js';
|
|
2
|
+
import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.1221/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)
|
|
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)
|
|
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
|
|
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":";;;;;;AAAA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,uBAAA,CAAAC,OAAA;EAAAH,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,oBAAA;EAAA,MAAAH,IAAA,GAAAE,OAAA;EAAAC,mBAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAI,aAAA;EAAA,MAAAJ,IAAA,GAAAE,OAAA;EAAAE,YAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAK,YAAA;EAAA,MAAAL,IAAA,GAAAE,OAAA;EAAAG,WAAA,YAAAA,CAAA;IAAA,OAAAL,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAM,2BAAA;EAAA,MAAAN,IAAA,GAAAO,sBAAA,CAAAL,OAAA;EAAAI,0BAAA,YAAAA,CAAA;IAAA,OAAAN,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAyD,SAAAO,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAP,wBAAAO,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAX,uBAAA,YAAAA,CAAAO,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AAEzD,MAAMgB,WAAW,GAAG,4BAA4B;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,mBAAmBA,CAAA,EAAG;EACpC,MAAM;IAAEC;EAAU,CAAC,GAAG,IAAAC,+BAAgB,EAAC,CAAC;EAExC,oBACE/B,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACC;EAAU,gBAC/BnC,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACE,QAAS;IAAC;EAAW,CAAE,CAAC,eAE/CpC,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACG;EAAK,gBAC1BrC,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAIC,SAAS,EAAEC,oCAAM,CAACI;EAAS,GAAC,oBACZ,eAAAtC,MAAA,GAAAW,OAAA,CAAAqB,aAAA,aAAI,OAAS,CAAC,6BAC9B,CAAC,eAELhC,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAGC,SAAS,EAAEC,oCAAM,CAACK;EAAI,GAAC,+CAAgD,CAAC,EAG1ET,SAAS,iBACR9B,MAAA,GAAAW,OAAA,CAAAqB,aAAA,CAAAhC,MAAA,GAAAW,OAAA,CAAA6B,QAAA,qBACExC,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACO;EAAY,gBACjCzC,MAAA,GAAAW,OAAA,CAAAqB,aAAA,CAAC1B,WAAA,GAAAoC,UAAU;IAACC,IAAI,EAAE,EAAG;IAACV,SAAS,EAAEC,oCAAM,CAACU;EAAS,CAAE,CAAC,eACpD5C,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACW;EAAS,gBAC9B7C,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACY;EAAU,GAAC,yBAA4B,CAAC,eAC/D9C,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACa;EAAS,GAAC,sEAE5B,CACF,CACF,CAAC,eAGN/C,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACc;EAAI,gBACzBhD,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACe;EAAQ,CAAE,CAAC,eAClCjD,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAMC,SAAS,EAAEC,oCAAM,CAACgB;EAAS,GAAC,mBAAuB,CAAC,eAC1DlD,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACe;EAAQ,CAAE,CAC9B,CACL,CACH,eAGDjD,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACiB;EAAQ,gBAC7BnD,MAAA,GAAAW,OAAA,CAAAqB,aAAA,CAACoB,MAAM;IAACC,KAAK,EAAC,QAAQ;IAAChB,IAAI,EAAC,2BAA2B;IAACiB,GAAG,EAAC;EAAyB,CAAE,CAAC,eACxFtD,MAAA,GAAAW,OAAA,CAAAqB,aAAA,CAACoB,MAAM;IAACC,KAAK,EAAC,QAAQ;IAAChB,IAAI,EAAC,+BAA+B;IAACiB,GAAG,EAAC;EAA2B,CAAE,CAC1F,CAAC,eAENtD,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACqB;EAAU,gBAC/BvD,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAGwB,IAAI,EAAC,sBAAsB;IAACvB,SAAS,EAAEC,oCAAM,CAACuB,IAAK;IAACC,MAAM,EAAC,QAAQ;IAACC,GAAG,EAAC;EAAqB,GAAC,iBAE9F,CAAC,eACJ3D,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAGwB,IAAI,EAAC,wBAAwB;IAACvB,SAAS,EAAEC,oCAAM,CAACuB,IAAK;IAACC,MAAM,EAAC,QAAQ;IAACC,GAAG,EAAC;EAAqB,GAAC,mBAEhG,CACA,CACF,CAAC,eAEN3D,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAAC0B;EAAO,gBAC5B5D,MAAA,GAAAW,OAAA,CAAAqB,aAAA,CAAC6B,QAAQ;IACPL,IAAI,EAAC,gCAAgC;IACrCM,GAAG,EAAC,2CAA2C;IAC/CC,KAAK,EAAC;EAAe,CACtB,CAAC,eACF/D,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IACEwB,IAAI,EAAE5B,WAAY;IAClBK,SAAS,EAAEC,oCAAM,CAAC8B,QAAS;IAC3BN,MAAM,EAAC,QAAQ;IACfC,GAAG,EAAC,qBAAqB;IACzB,cAAW;EAA0B,gBAErC3D,MAAA,GAAAW,OAAA,CAAAqB,aAAA,CAAC5B,mBAAA,GAAA6D,IAAI;IAACC,EAAE,EAAC,SAAS;IAACjC,SAAS,EAAEC,oCAAM,CAACiC;EAAY,CAAE,CAClD,CACA,CACF,CAAC;AAEV;AAEA,SAASN,QAAQA,CAAC;EAAEL,IAAI;EAAEM,GAAG;EAAEC;AAAoD,CAAC,EAAE;EACpF,oBACE/D,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAGwB,IAAI,EAAEA,IAAK;IAACvB,SAAS,EAAEC,oCAAM,CAAC8B,QAAS;IAACN,MAAM,EAAC,QAAQ;IAACC,GAAG,EAAC,qBAAqB;IAAC,cAAYI;EAAM,gBACrG/D,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAK8B,GAAG,EAAEA,GAAI;IAACM,GAAG,EAAEL,KAAM;IAAC9B,SAAS,EAAEC,oCAAM,CAACmC;EAAK,CAAE,CACnD,CAAC;AAER;AAEA,SAASjB,MAAMA,CAAC;EAAEC,KAAK;EAAEhB,IAAI;EAAEiB;AAAkD,CAAC,EAAE;EAClF,MAAM,CAACgB,MAAM,EAAEC,SAAS,CAAC,GAAG,IAAAC,iBAAQ,EAAC,KAAK,CAAC;EAC3C,MAAMC,MAAM,GAAIhE,CAAmB,IAAK;IACtCA,CAAC,CAACiE,eAAe,CAAC,CAAC;IACnB,IAAI,OAAOC,SAAS,KAAK,WAAW,IAAIA,SAAS,CAACC,SAAS,EAAE;MAC3DD,SAAS,CAACC,SAAS,CAACC,SAAS,CAACvB,GAAG,CAAC,CAACwB,KAAK,CAAC,MAAMC,SAAS,CAAC;IAC3D;IACAR,SAAS,CAAC,IAAI,CAAC;IACfS,UAAU,CAAC,MAAMT,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;EAC1C,CAAC;EACD,oBACEvE,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAAC+C;EAAO,gBAC5BjF,MAAA,GAAAW,OAAA,CAAAqB,aAAA,2BACEhC,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACgD;EAAS,GAAE7B,KAAW,CAAC,eAC9CrD,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACiD;EAAQ,GAAE9C,IAAU,CACxC,CAAC,eACNrC,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACkD;EAAU,gBAC/BpF,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAKC,SAAS,EAAEC,oCAAM,CAACmD;EAAO,gBAC5BrF,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAMC,SAAS,EAAEC,oCAAM,CAACoD;EAAU,GAAC,GAAO,CAAC,eAC3CtF,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAMC,SAAS,EAAEC,oCAAM,CAACqD;EAAW,GAAEjC,GAAU,CAC5C,CAAC,eACNtD,MAAA,GAAAW,OAAA,CAAAqB,aAAA;IAAQwD,IAAI,EAAC,QAAQ;IAACC,OAAO,EAAEhB,MAAO;IAACxC,SAAS,EAAEC,oCAAM,CAACwD;EAAQ,GAC9DpB,MAAM,GAAG,QAAQ,GAAG,MACf,CACL,CACF,CAAC;AAEV","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
|
|
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":[]}
|
|
@@ -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,
|
|
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.
|
|
3
|
+
"version": "1.0.1221",
|
|
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.
|
|
9
|
+
"version": "1.0.1221"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"lodash": "4.18.1",
|
|
@@ -30,44 +30,26 @@
|
|
|
30
30
|
"reset-css": "5.0.1",
|
|
31
31
|
"@teambit/component-id": "1.2.5",
|
|
32
32
|
"@teambit/harmony": "0.4.12",
|
|
33
|
-
"@teambit/legacy.extension-data": "0.0.183",
|
|
34
|
-
"@teambit/legacy.scope": "0.0.181",
|
|
35
33
|
"@teambit/component-version": "1.0.4",
|
|
36
|
-
"@teambit/legacy.consumer-component": "0.0.182",
|
|
37
|
-
"@teambit/legacy.consumer": "0.0.181",
|
|
38
34
|
"@teambit/bit-error": "0.0.404",
|
|
39
35
|
"@teambit/lane-id": "0.0.312",
|
|
40
|
-
"@teambit/legacy.bit-map": "0.0.238",
|
|
41
36
|
"@teambit/toolbox.fs.last-modified": "0.0.24",
|
|
42
37
|
"@teambit/toolbox.path.path": "0.0.26",
|
|
43
38
|
"@teambit/graph.cleargraph": "0.0.11",
|
|
44
39
|
"@teambit/logger": "0.0.1498",
|
|
45
|
-
"@teambit/objects": "0.0.715",
|
|
46
|
-
"@teambit/component-issues": "0.0.191",
|
|
47
|
-
"@teambit/cli": "0.0.1412",
|
|
48
|
-
"@teambit/config-store": "0.0.293",
|
|
49
40
|
"@teambit/legacy.constants": "0.0.49",
|
|
50
41
|
"@teambit/component.ui.component-status-resolver": "0.0.510",
|
|
51
42
|
"@teambit/harmony.modules.load-trace": "0.0.17",
|
|
52
43
|
"@teambit/harmony.modules.resolved-component": "0.0.530",
|
|
53
44
|
"@teambit/legacy.utils": "0.0.56",
|
|
54
|
-
"@teambit/scope.remotes": "0.0.181",
|
|
55
|
-
"@teambit/config": "0.0.1587",
|
|
56
45
|
"@teambit/harmony.modules.requireable-component": "0.0.530",
|
|
57
46
|
"@teambit/harmony.modules.runtimes": "0.0.4",
|
|
58
47
|
"@teambit/toolbox.modules.module-resolver": "0.0.29",
|
|
59
|
-
"@teambit/workspace.modules.node-modules-linker": "0.0.414",
|
|
60
48
|
"@teambit/graphql": "1.0.1205",
|
|
61
|
-
"@teambit/global-config": "0.0.1416",
|
|
62
|
-
"@teambit/legacy.consumer-config": "0.0.181",
|
|
63
|
-
"@teambit/variants": "0.0.1680",
|
|
64
|
-
"@teambit/component.sources": "0.0.233",
|
|
65
49
|
"@teambit/dependencies.modules.packages-excluder": "1.0.8",
|
|
66
50
|
"@teambit/git.modules.git-executable": "0.0.50",
|
|
67
51
|
"@teambit/harmony.modules.in-memory-cache": "0.0.54",
|
|
68
52
|
"@teambit/legacy-bit-id": "1.1.4",
|
|
69
|
-
"@teambit/legacy.component-list": "0.0.235",
|
|
70
|
-
"@teambit/legacy.scope-api": "0.0.236",
|
|
71
53
|
"@teambit/toolbox.path.is-path-inside": "0.0.518",
|
|
72
54
|
"@teambit/workspace.modules.match-pattern": "0.0.539",
|
|
73
55
|
"@teambit/component.ui.component-drawer": "0.0.513",
|
|
@@ -105,18 +87,36 @@
|
|
|
105
87
|
"@teambit/workspace.hooks.use-url-change-broadcaster": "0.0.7",
|
|
106
88
|
"@teambit/workspace.ui.preserve-workspace-mode": "0.0.8",
|
|
107
89
|
"@teambit/evangelist.elements.icon": "1.0.5",
|
|
108
|
-
"@teambit/component": "1.0.
|
|
109
|
-
"@teambit/dependency-resolver": "1.0.
|
|
110
|
-
"@teambit/envs": "1.0.
|
|
111
|
-
"@teambit/
|
|
112
|
-
"@teambit/
|
|
113
|
-
"@teambit/
|
|
114
|
-
"@teambit/
|
|
115
|
-
"@teambit/
|
|
116
|
-
"@teambit/
|
|
117
|
-
"@teambit/
|
|
118
|
-
"@teambit/
|
|
119
|
-
"@teambit/
|
|
90
|
+
"@teambit/component": "1.0.1220",
|
|
91
|
+
"@teambit/dependency-resolver": "1.0.1220",
|
|
92
|
+
"@teambit/envs": "1.0.1220",
|
|
93
|
+
"@teambit/legacy.extension-data": "0.0.184",
|
|
94
|
+
"@teambit/legacy.scope": "0.0.182",
|
|
95
|
+
"@teambit/legacy.consumer-component": "0.0.183",
|
|
96
|
+
"@teambit/legacy.consumer": "0.0.182",
|
|
97
|
+
"@teambit/legacy.bit-map": "0.0.239",
|
|
98
|
+
"@teambit/objects": "0.0.716",
|
|
99
|
+
"@teambit/scope": "1.0.1221",
|
|
100
|
+
"@teambit/component-issues": "0.0.192",
|
|
101
|
+
"@teambit/graph": "1.0.1221",
|
|
102
|
+
"@teambit/cli": "0.0.1413",
|
|
103
|
+
"@teambit/config-store": "0.0.294",
|
|
104
|
+
"@teambit/isolator": "1.0.1221",
|
|
105
|
+
"@teambit/component-tree": "1.0.1220",
|
|
106
|
+
"@teambit/scope.remotes": "0.0.182",
|
|
107
|
+
"@teambit/aspect-loader": "1.0.1220",
|
|
108
|
+
"@teambit/config": "0.0.1588",
|
|
109
|
+
"@teambit/workspace.modules.node-modules-linker": "0.0.415",
|
|
110
|
+
"@teambit/bundler": "1.0.1221",
|
|
111
|
+
"@teambit/global-config": "0.0.1417",
|
|
112
|
+
"@teambit/legacy.consumer-config": "0.0.182",
|
|
113
|
+
"@teambit/ui": "1.0.1221",
|
|
114
|
+
"@teambit/variants": "0.0.1681",
|
|
115
|
+
"@teambit/component.sources": "0.0.234",
|
|
116
|
+
"@teambit/legacy.component-list": "0.0.236",
|
|
117
|
+
"@teambit/legacy.scope-api": "0.0.237",
|
|
118
|
+
"@teambit/command-bar": "1.0.1221",
|
|
119
|
+
"@teambit/sidebar": "1.0.1220"
|
|
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)
|
|
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
|
-
{
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
<div className={styles.
|
|
35
|
-
<
|
|
36
|
-
<div className={styles.
|
|
37
|
-
|
|
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
|
-
{
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
<
|
|
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
|
-
|
|
54
|
-
<div className={styles.
|
|
55
|
-
<
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
<a
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
}
|
|
@@ -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
|
-
|
|
15
|
-
<div className={styles.
|
|
16
|
-
|
|
17
|
-
<
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
38
|
+
)}
|
|
22
39
|
<div className={styles.main}>
|
|
23
|
-
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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 (
|