@teambit/workspace 1.0.983 → 1.0.985

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/{preview-1778621260574.js → preview-1778686821215.js} +2 -2
  2. package/dist/ui/workspace/use-workspace.d.ts +7 -6
  3. package/dist/ui/workspace/workspace-overview/card-overlays.d.ts +4 -0
  4. package/dist/ui/workspace/workspace-overview/card-overlays.js +133 -0
  5. package/dist/ui/workspace/workspace-overview/card-overlays.js.map +1 -0
  6. package/dist/ui/workspace/workspace-overview/card-overlays.module.scss +72 -0
  7. package/dist/ui/workspace/workspace-overview/filter-utils.d.ts +4 -1
  8. package/dist/ui/workspace/workspace-overview/filter-utils.js +17 -1
  9. package/dist/ui/workspace/workspace-overview/filter-utils.js.map +1 -1
  10. package/dist/ui/workspace/workspace-overview/hope-component-card.d.ts +14 -0
  11. package/dist/ui/workspace/workspace-overview/hope-component-card.js +186 -0
  12. package/dist/ui/workspace/workspace-overview/hope-component-card.js.map +1 -0
  13. package/dist/ui/workspace/workspace-overview/hope-component-card.module.scss +162 -0
  14. package/dist/ui/workspace/workspace-overview/namespace-header.d.ts +8 -0
  15. package/dist/ui/workspace/workspace-overview/namespace-header.js +107 -0
  16. package/dist/ui/workspace/workspace-overview/namespace-header.js.map +1 -0
  17. package/dist/ui/workspace/workspace-overview/namespace-header.module.scss +88 -0
  18. package/dist/ui/workspace/workspace-overview/use-workspace-aggregation.js +11 -5
  19. package/dist/ui/workspace/workspace-overview/use-workspace-aggregation.js.map +1 -1
  20. package/dist/ui/workspace/workspace-overview/workspace-filter-panel.js +8 -6
  21. package/dist/ui/workspace/workspace-overview/workspace-filter-panel.js.map +1 -1
  22. package/dist/ui/workspace/workspace-overview/workspace-overview.d.ts +0 -6
  23. package/dist/ui/workspace/workspace-overview/workspace-overview.js +38 -105
  24. package/dist/ui/workspace/workspace-overview/workspace-overview.js.map +1 -1
  25. package/dist/ui/workspace/workspace-overview/workspace-overview.module.scss +38 -158
  26. package/dist/ui/workspace/workspace-overview/workspace-overview.types.d.ts +6 -0
  27. package/dist/ui/workspace/workspace-overview/workspace-overview.types.js.map +1 -1
  28. package/dist/ui/workspace/workspace.js +22 -5
  29. package/dist/ui/workspace/workspace.js.map +1 -1
  30. package/dist/ui/workspace/workspace.module.scss +38 -30
  31. package/package.json +43 -44
  32. package/ui/workspace/workspace-overview/card-overlays.module.scss +72 -0
  33. package/ui/workspace/workspace-overview/card-overlays.tsx +66 -0
  34. package/ui/workspace/workspace-overview/filter-utils.ts +18 -1
  35. package/ui/workspace/workspace-overview/hope-component-card.module.scss +162 -0
  36. package/ui/workspace/workspace-overview/hope-component-card.tsx +152 -0
  37. package/ui/workspace/workspace-overview/namespace-header.module.scss +88 -0
  38. package/ui/workspace/workspace-overview/namespace-header.tsx +72 -0
  39. package/ui/workspace/workspace-overview/use-workspace-aggregation.ts +11 -5
  40. package/ui/workspace/workspace-overview/workspace-filter-panel.tsx +10 -9
  41. package/ui/workspace/workspace-overview/workspace-overview.module.scss +38 -158
  42. package/ui/workspace/workspace-overview/workspace-overview.tsx +40 -88
  43. package/ui/workspace/workspace-overview/workspace-overview.types.ts +7 -1
  44. package/ui/workspace/workspace.module.scss +38 -30
  45. package/ui/workspace/workspace.tsx +24 -7
@@ -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","_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","createElement","className","styles","emptyContainer","setComponents","components","inIframe","parent","WorkspaceProvider","NotificationsBinder","PreserveWorkspaceMode","ThemeFromUrlSync","MinimalModeUrlBroadcasterAndListener","workspaceWrapper","TopBar","classNames","topbar","minimal","Corner","cornerWithBreadcrumb","minimalCorner","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","pathname","useLocation","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","Link","to","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 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: 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 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 if (!workspace) {\n return <div className={styles.emptyContainer}></div>;\n }\n\n workspaceUI.setComponents(workspace.components);\n const inIframe = typeof window !== 'undefined' && window.parent && window.parent !== window;\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 {\n <TopBar\n className={classNames(styles.topbar, styles[themeName], isMinimal && styles.minimal)}\n Corner={() => (\n <div className={classNames(isMinimal && styles.cornerWithBreadcrumb)}>\n <Corner\n className={classNames((isMinimal && styles.minimalCorner) || styles.corner, styles[themeName])}\n name={isMinimal ? '' : workspace.name}\n icon={isMinimal ? 'https://static.bit.dev/bit-icons/house.svg' : workspace.icon}\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","_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","createElement","className","styles","emptyContainer","setComponents","components","inIframe","parent","location","useLocation","isOverview","pathname","showTopBar","WorkspaceProvider","NotificationsBinder","PreserveWorkspaceMode","ThemeFromUrlSync","MinimalModeUrlBroadcasterAndListener","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 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: 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 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 if (!workspace) {\n return <div className={styles.emptyContainer}></div>;\n }\n\n workspaceUI.setComponents(workspace.components);\n const inIframe = typeof window !== 'undefined' && window.parent && window.parent !== window;\n const location = useLocation();\n const isOverview = location.pathname === '/' || location.pathname === '';\n const showTopBar = !isMinimal || (isMinimal && !isOverview);\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":[]}
@@ -18,37 +18,20 @@
18
18
  }
19
19
  }
20
20
 
21
- .minimalCorner {
22
- width: fit-content;
23
- height: 46px !important;
24
- background: var(--background-color, #ededed) !important;
25
-
26
- &.dark {
27
- --bit-border-color-lightest: #333333;
28
- --bit-text-color-heavy: white;
29
-
30
- > a > img {
31
- filter: invert(1);
32
- }
33
- }
34
-
35
- &.light {
36
- --background-color: #ededed;
37
- }
38
-
39
- > a {
40
- &[aria-current='page'] > img {
41
- filter: invert(31%) sepia(75%) saturate(3183%) hue-rotate(235deg) brightness(99%) contrast(108%);
42
- }
43
-
44
- > img {
45
- width: 22px;
46
- height: 22px;
21
+ .backButton {
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ width: 32px;
26
+ height: 32px;
27
+ border-radius: 8px;
28
+ color: var(--on-background-color, var(--bit-text-color-heavy, #2b2b2b));
29
+ text-decoration: none;
30
+ transition: background 0.15s ease;
31
+ margin-left: 8px;
47
32
 
48
- &:hover {
49
- filter: invert(31%) sepia(75%) saturate(3183%) hue-rotate(235deg) brightness(99%) contrast(108%);
50
- }
51
- }
33
+ &:hover {
34
+ background: color-mix(in srgb, var(--on-background-color, #2b2b2b) 8%, transparent);
52
35
  }
53
36
  }
54
37
 
@@ -96,6 +79,28 @@
96
79
  flex-direction: column;
97
80
  overflow: hidden; // TODO
98
81
  height: 100vh;
82
+
83
+ @media (hover: hover) {
84
+ * {
85
+ &::-webkit-scrollbar {
86
+ width: 14px;
87
+ }
88
+
89
+ &::-webkit-scrollbar-track {
90
+ background: var(--background-color, #fff);
91
+ }
92
+
93
+ &::-webkit-scrollbar-thumb {
94
+ border: 5px solid var(--background-color, #fff);
95
+ background: var(--border-medium-color, #d0d0d0);
96
+ border-radius: 100vmax;
97
+ }
98
+
99
+ &::-webkit-scrollbar-thumb:hover {
100
+ background: var(--on-background-color, var(--bit-text-color-light, #999));
101
+ }
102
+ }
103
+ }
99
104
  }
100
105
 
101
106
  .topbar {
@@ -135,6 +140,9 @@
135
140
 
136
141
  &.minimal {
137
142
  height: 46px;
143
+ --bit-bg-heaviest: color-mix(in srgb, var(--bit-accent-color, #6c5ce7) 3%, var(--background-color, #fff));
144
+ --bit-border-color-lightest: var(--bit-bg-heaviest);
145
+ border-bottom: 1px solid var(--border-medium-color, #e6e6e6);
138
146
  }
139
147
  }
140
148
 
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/workspace",
3
- "version": "1.0.983",
3
+ "version": "1.0.985",
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.983"
9
+ "version": "1.0.985"
10
10
  },
11
11
  "dependencies": {
12
12
  "lodash": "4.17.21",
@@ -30,22 +30,40 @@
30
30
  "reset-css": "5.0.1",
31
31
  "@teambit/component-id": "1.2.4",
32
32
  "@teambit/harmony": "0.4.7",
33
+ "@teambit/legacy.extension-data": "0.0.117",
34
+ "@teambit/legacy.scope": "0.0.115",
33
35
  "@teambit/component-version": "1.0.4",
36
+ "@teambit/legacy.consumer-component": "0.0.116",
37
+ "@teambit/legacy.consumer": "0.0.115",
34
38
  "@teambit/bit-error": "0.0.404",
35
39
  "@teambit/lane-id": "0.0.312",
40
+ "@teambit/legacy.bit-map": "0.0.172",
36
41
  "@teambit/toolbox.fs.last-modified": "0.0.14",
37
42
  "@teambit/toolbox.path.path": "0.0.16",
38
43
  "@teambit/graph.cleargraph": "0.0.11",
44
+ "@teambit/logger": "0.0.1417",
45
+ "@teambit/cli": "0.0.1324",
39
46
  "@teambit/component.ui.component-status-resolver": "0.0.510",
40
47
  "@teambit/legacy.constants": "0.0.26",
41
48
  "@teambit/harmony.modules.resolved-component": "0.0.513",
49
+ "@teambit/legacy.utils": "0.0.37",
50
+ "@teambit/scope.remotes": "0.0.115",
51
+ "@teambit/config-store": "0.0.205",
52
+ "@teambit/config": "0.0.1499",
42
53
  "@teambit/harmony.modules.requireable-component": "0.0.513",
43
54
  "@teambit/toolbox.modules.module-resolver": "0.0.19",
55
+ "@teambit/workspace.modules.node-modules-linker": "0.0.346",
56
+ "@teambit/global-config": "0.0.1328",
57
+ "@teambit/legacy.consumer-config": "0.0.115",
58
+ "@teambit/variants": "0.0.1592",
44
59
  "@teambit/component-issues": "0.0.171",
60
+ "@teambit/component.sources": "0.0.167",
45
61
  "@teambit/dependencies.modules.packages-excluder": "1.0.8",
46
62
  "@teambit/git.modules.git-executable": "0.0.27",
47
63
  "@teambit/harmony.modules.in-memory-cache": "0.0.30",
48
64
  "@teambit/legacy-bit-id": "1.1.3",
65
+ "@teambit/legacy.component-list": "0.0.169",
66
+ "@teambit/legacy.scope-api": "0.0.170",
49
67
  "@teambit/toolbox.path.is-path-inside": "0.0.508",
50
68
  "@teambit/workspace.modules.match-pattern": "0.0.520",
51
69
  "@teambit/component.ui.component-drawer": "0.0.479",
@@ -79,52 +97,32 @@
79
97
  "@teambit/workspace.hooks.use-url-change-broadcaster": "0.0.1",
80
98
  "@teambit/workspace.ui.preserve-workspace-mode": "0.0.2",
81
99
  "@teambit/ui-foundation.ui.top-bar": "0.0.515",
100
+ "@teambit/design.ui.tooltip": "0.0.382",
101
+ "@teambit/preview.ui.preview-placeholder": "0.0.564",
102
+ "@teambit/scopes.scope-id": "0.0.9",
103
+ "@teambit/workspace.ui.load-preview": "0.0.504",
82
104
  "@teambit/component.filters.base-filter": "0.0.6",
83
105
  "@teambit/design.inputs.toggle-button": "0.0.16",
84
106
  "@teambit/cloud.hooks.use-cloud-scopes": "0.0.19",
85
- "@teambit/design.ui.heading": "1.0.26",
86
- "@teambit/design.ui.tooltip": "0.0.382",
87
107
  "@teambit/explorer.ui.gallery.component-grid": "0.0.496",
88
- "@teambit/preview.ui.preview-placeholder": "0.0.564",
89
- "@teambit/scopes.scope-id": "0.0.9",
90
- "@teambit/workspace.ui.workspace-component-card": "0.0.569",
91
- "@teambit/explorer.ui.component-card": "0.0.52",
92
108
  "@teambit/workspace.ui.empty-workspace": "0.0.509",
93
- "@teambit/component": "1.0.983",
94
- "@teambit/dependency-resolver": "1.0.983",
95
- "@teambit/envs": "1.0.983",
96
- "@teambit/legacy.extension-data": "0.0.117",
97
- "@teambit/legacy.scope": "0.0.115",
98
- "@teambit/legacy.consumer-component": "0.0.116",
99
- "@teambit/legacy.consumer": "0.0.115",
100
- "@teambit/legacy.bit-map": "0.0.172",
101
- "@teambit/logger": "0.0.1417",
102
- "@teambit/objects": "0.0.490",
103
- "@teambit/scope": "1.0.983",
104
- "@teambit/graph": "1.0.983",
105
- "@teambit/cli": "0.0.1324",
106
- "@teambit/isolator": "1.0.983",
107
- "@teambit/component-tree": "1.0.983",
108
- "@teambit/legacy.utils": "0.0.37",
109
- "@teambit/watcher": "1.0.983",
110
- "@teambit/scope.remotes": "0.0.115",
111
- "@teambit/aspect-loader": "1.0.983",
112
- "@teambit/config-store": "0.0.205",
113
- "@teambit/config": "0.0.1499",
114
- "@teambit/workspace.modules.node-modules-linker": "0.0.346",
115
- "@teambit/graphql": "1.0.983",
116
- "@teambit/bundler": "1.0.983",
117
- "@teambit/global-config": "0.0.1328",
118
- "@teambit/legacy.consumer-config": "0.0.115",
119
- "@teambit/ui": "1.0.983",
120
- "@teambit/variants": "0.0.1592",
121
- "@teambit/component.sources": "0.0.167",
122
- "@teambit/legacy.component-list": "0.0.169",
123
- "@teambit/legacy.scope-api": "0.0.170",
124
- "@teambit/command-bar": "1.0.983",
125
- "@teambit/sidebar": "1.0.983",
126
- "@teambit/pubsub": "1.0.983",
127
- "@teambit/deprecation": "1.0.983"
109
+ "@teambit/component": "1.0.985",
110
+ "@teambit/dependency-resolver": "1.0.985",
111
+ "@teambit/envs": "1.0.985",
112
+ "@teambit/objects": "0.0.492",
113
+ "@teambit/scope": "1.0.985",
114
+ "@teambit/graph": "1.0.985",
115
+ "@teambit/isolator": "1.0.985",
116
+ "@teambit/component-tree": "1.0.985",
117
+ "@teambit/watcher": "1.0.985",
118
+ "@teambit/aspect-loader": "1.0.985",
119
+ "@teambit/graphql": "1.0.985",
120
+ "@teambit/bundler": "1.0.985",
121
+ "@teambit/ui": "1.0.985",
122
+ "@teambit/command-bar": "1.0.985",
123
+ "@teambit/sidebar": "1.0.985",
124
+ "@teambit/pubsub": "1.0.985",
125
+ "@teambit/deprecation": "1.0.985"
128
126
  },
129
127
  "devDependencies": {
130
128
  "@types/lodash": "4.14.165",
@@ -143,7 +141,8 @@
143
141
  "@apollo/client": "^3.6.0",
144
142
  "react": "^17.0.0 || ^18.0.0",
145
143
  "react-router-dom": "^6.16.0",
146
- "@types/react": "^17.0.73"
144
+ "@types/react": "^17.0.73",
145
+ "@teambit/base-react.navigation.link": "2.0.33"
147
146
  },
148
147
  "license": "Apache-2.0",
149
148
  "optionalDependencies": {},
@@ -0,0 +1,72 @@
1
+ .changedPill {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ gap: 5px;
5
+ font-size: 10px;
6
+ padding: 3px 8px;
7
+ border-radius: 999px;
8
+ background: var(--warning-surface-color);
9
+ color: var(--warning-color);
10
+ font-weight: 600;
11
+ letter-spacing: 0.02em;
12
+ }
13
+
14
+ .changedDot {
15
+ width: 5px;
16
+ height: 5px;
17
+ border-radius: 50%;
18
+ background: var(--warning-color);
19
+ }
20
+
21
+ .spinnerBadge {
22
+ width: 22px;
23
+ height: 22px;
24
+ border-radius: 50%;
25
+ background: var(--surface-color);
26
+ display: inline-flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
30
+ }
31
+
32
+ .spinnerArc {
33
+ transform-origin: center;
34
+ animation: spinSlow 0.9s linear infinite;
35
+ }
36
+
37
+ .buildingPreview {
38
+ position: relative;
39
+ height: 100%;
40
+ }
41
+
42
+ .dotsPattern {
43
+ position: absolute;
44
+ inset: 0;
45
+ }
46
+
47
+ .buildingPlaceholder {
48
+ position: absolute;
49
+ inset: 20% 14%;
50
+ border-radius: 10px;
51
+ background: rgba(255, 255, 255, 0.55);
52
+ backdrop-filter: blur(2px);
53
+ display: flex;
54
+ flex-direction: column;
55
+ justify-content: center;
56
+ padding: 0 16px;
57
+ gap: 7px;
58
+ }
59
+
60
+ .queuedPreview {
61
+ position: absolute;
62
+ inset: 0;
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ }
67
+
68
+ @keyframes spinSlow {
69
+ to {
70
+ transform: rotate(360deg);
71
+ }
72
+ }
@@ -0,0 +1,66 @@
1
+ import React from 'react';
2
+ import styles from './card-overlays.module.scss';
3
+
4
+ const accent = 'var(--bit-accent-color, #6c5ce7)';
5
+ const accentAlpha = (pct: number) => `color-mix(in srgb, var(--bit-accent-color, #6c5ce7) ${pct}%, transparent)`;
6
+
7
+ export function ChangedPill() {
8
+ return (
9
+ <span className={styles.changedPill}>
10
+ <span className={styles.changedDot} />
11
+ changed
12
+ </span>
13
+ );
14
+ }
15
+
16
+ export function BuildSpinner() {
17
+ return (
18
+ <div className={styles.spinnerBadge}>
19
+ <svg width="14" height="14" viewBox="0 0 14 14">
20
+ <circle cx="7" cy="7" r="5" stroke={accentAlpha(20)} strokeWidth="1.5" fill="none" />
21
+ <circle
22
+ cx="7"
23
+ cy="7"
24
+ r="5"
25
+ stroke={accent}
26
+ strokeWidth="1.5"
27
+ fill="none"
28
+ strokeDasharray="8 24"
29
+ strokeLinecap="round"
30
+ className={styles.spinnerArc}
31
+ />
32
+ </svg>
33
+ </div>
34
+ );
35
+ }
36
+
37
+ export function BuildingPreview() {
38
+ return (
39
+ <div className={styles.buildingPreview}>
40
+ <svg width="100%" height="100%" preserveAspectRatio="none" className={styles.dotsPattern}>
41
+ <defs>
42
+ <pattern id="dots-accent" width="14" height="14" patternUnits="userSpaceOnUse">
43
+ <circle cx="7" cy="7" r="1" fill={accentAlpha(20)} />
44
+ </pattern>
45
+ </defs>
46
+ <rect width="100%" height="100%" fill="url(#dots-accent)" />
47
+ </svg>
48
+ <div className={styles.buildingPlaceholder} style={{ border: `1.5px dashed ${accentAlpha(40)}` }}>
49
+ <div style={{ height: 6, width: '55%', background: accentAlpha(27), borderRadius: 3 }} />
50
+ <div style={{ height: 4, width: '85%', background: accentAlpha(13), borderRadius: 2 }} />
51
+ <div style={{ height: 4, width: '70%', background: accentAlpha(13), borderRadius: 2 }} />
52
+ </div>
53
+ </div>
54
+ );
55
+ }
56
+
57
+ export function QueuedPreview() {
58
+ return (
59
+ <div className={styles.queuedPreview}>
60
+ <svg width="46" height="46" viewBox="0 0 46 46">
61
+ <circle cx="23" cy="23" r="20" fill="none" stroke={accentAlpha(20)} strokeWidth="1.2" strokeDasharray="3 4" />
62
+ <circle cx="23" cy="23" r="3" fill={accentAlpha(53)} />
63
+ </svg>
64
+ </div>
65
+ );
66
+ }
@@ -1,17 +1,30 @@
1
- import type { WorkspaceItem } from './workspace-overview.types';
1
+ import type { WorkspaceItem, ComponentStatus } from './workspace-overview.types';
2
2
 
3
3
  export interface ActiveFilters {
4
4
  namespaces: string[];
5
5
  scopes: string[];
6
+ statuses: Set<ComponentStatus>;
6
7
  }
7
8
 
9
+ export const ALL_STATUSES: ComponentStatus[] = ['built', 'changed', 'building', 'queued'];
10
+
8
11
  export function parseActiveFilters(search: URLSearchParams): ActiveFilters {
9
12
  return {
10
13
  namespaces: (search.get('ns') || '').split(',').filter(Boolean),
11
14
  scopes: (search.get('scopes') || '').split(',').filter(Boolean),
15
+ statuses: new Set(ALL_STATUSES),
12
16
  };
13
17
  }
14
18
 
19
+ export function getComponentStatus(item: WorkspaceItem): ComponentStatus {
20
+ const buildStatus = (item.component as any).buildStatus;
21
+ const status = (item.component as any).status;
22
+ if (buildStatus === 'pending') return 'queued';
23
+ if (status?.modifyInfo?.hasModifiedFiles || status?.modifyInfo?.hasModifiedDependencies) return 'changed';
24
+ if (buildStatus === 'building') return 'building';
25
+ return 'built';
26
+ }
27
+
15
28
  export function filterItems(items: WorkspaceItem[], filters: ActiveFilters): WorkspaceItem[] {
16
29
  return items.filter((item) => {
17
30
  const ns = item.component.id.namespace || '/';
@@ -19,6 +32,10 @@ export function filterItems(items: WorkspaceItem[], filters: ActiveFilters): Wor
19
32
 
20
33
  if (filters.namespaces.length && !filters.namespaces.includes(ns)) return false;
21
34
  if (filters.scopes.length && !filters.scopes.includes(sc)) return false;
35
+ if (filters.statuses.size > 0 && filters.statuses.size < ALL_STATUSES.length) {
36
+ const componentStatus = getComponentStatus(item);
37
+ if (!filters.statuses.has(componentStatus)) return false;
38
+ }
22
39
 
23
40
  return true;
24
41
  });