@cyber-harbour/ui 1.0.64 → 1.0.65

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyber-harbour/ui",
3
- "version": "1.0.64",
3
+ "version": "1.0.65",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
@@ -1,35 +1,39 @@
1
1
  import { styled } from 'styled-components';
2
2
  import React from 'react';
3
3
  import { SidebarContext } from './SidebarContext';
4
+ import { createComponent } from '../../Theme';
4
5
 
5
6
  export interface SidebarProps {
6
7
  defaultCollapsed?: boolean;
7
8
  children: any;
9
+ canGrow: boolean;
8
10
  }
9
11
 
10
12
  interface StyledProps {
11
13
  $collapsed: boolean;
14
+ $canGrow: boolean;
12
15
  }
13
16
 
14
- export const Sidebar = ({ defaultCollapsed, children }: SidebarProps) => {
17
+ export const Sidebar = createComponent<SidebarProps>(({ defaultCollapsed, canGrow, children }) => {
15
18
  const [collapsed, setCollapsed] = React.useState(!!defaultCollapsed);
16
19
 
17
20
  return (
18
- <StyledContainer $collapsed={collapsed}>
21
+ <StyledContainer $collapsed={collapsed} $canGrow={canGrow}>
19
22
  <SidebarContext.Provider
20
23
  value={{
21
24
  collapsed,
22
25
  setCollapsed,
26
+ canGrow,
23
27
  }}
24
28
  >
25
29
  {children}
26
30
  </SidebarContext.Provider>
27
31
  </StyledContainer>
28
32
  );
29
- };
33
+ });
30
34
 
31
35
  const StyledContainer = styled.aside<StyledProps>(
32
- ({ theme, $collapsed }) => `
36
+ ({ theme, $collapsed, $canGrow }) => `
33
37
  display: flex;
34
38
  flex-direction: column;
35
39
  justify-content: space-between;
@@ -40,10 +44,11 @@ const StyledContainer = styled.aside<StyledProps>(
40
44
  width: ${theme.sidebar.width};
41
45
  padding: 12px;
42
46
  height: 100%;
47
+ overflow: hidden auto;
43
48
  border-right: 1px solid ${theme.sidebar.border};
44
49
  background: ${theme.sidebar.background};
45
50
  ${
46
- $collapsed
51
+ $collapsed || !$canGrow
47
52
  ? `
48
53
  width: 65px;
49
54
  `
@@ -64,7 +69,7 @@ const StyledContainer = styled.aside<StyledProps>(
64
69
 
65
70
  width: ${theme.sidebar.width};
66
71
  ${
67
- $collapsed
72
+ $collapsed || !$canGrow
68
73
  ? `
69
74
  width: 65px;
70
75
  `
@@ -3,9 +3,11 @@ import { createContext } from 'react';
3
3
  interface SidebarContext {
4
4
  collapsed: boolean;
5
5
  setCollapsed: React.Dispatch<React.SetStateAction<boolean>>;
6
+ canGrow: boolean;
6
7
  }
7
8
 
8
9
  export const SidebarContext = createContext<SidebarContext>({
9
10
  collapsed: false,
10
11
  setCollapsed: () => {},
12
+ canGrow: false,
11
13
  });
@@ -4,15 +4,16 @@ import { styled } from 'styled-components';
4
4
 
5
5
  type StyledProps = {
6
6
  $collapsed: boolean;
7
+ $canGrow: boolean;
7
8
  };
8
9
 
9
10
  export const SidebarDelimeter = () => {
10
- const { collapsed } = useContext(SidebarContext);
11
- return <StyledDelimeter $collapsed={collapsed} />;
11
+ const { collapsed, canGrow } = useContext(SidebarContext);
12
+ return <StyledDelimeter $collapsed={collapsed} $canGrow={canGrow} />;
12
13
  };
13
14
 
14
15
  const StyledDelimeter = styled.div<StyledProps>(
15
- ({ $collapsed, theme }) => `
16
+ ({ $collapsed, $canGrow, theme }) => `
16
17
  min-width: 32px;
17
18
  width: 0;
18
19
 
@@ -22,6 +23,7 @@ const StyledDelimeter = styled.div<StyledProps>(
22
23
 
23
24
  ${
24
25
  !$collapsed &&
26
+ $canGrow &&
25
27
  `
26
28
  & {
27
29
  width: 100%;
@@ -17,6 +17,7 @@ interface SidebarItemAnchor {
17
17
  type StyledProps = {
18
18
  $active: SidebarItemBase['active'];
19
19
  $collapsed: boolean;
20
+ $canGrow: boolean;
20
21
  };
21
22
 
22
23
  interface SidebarItemButton {
@@ -27,7 +28,7 @@ interface SidebarItemButton {
27
28
  export type SidebarItemProps = SidebarItemBase & (SidebarItemAnchor | SidebarItemButton);
28
29
 
29
30
  export const SidebarItem = ({ active, icon: Icon, label, ...props }: SidebarItemProps) => {
30
- const { collapsed } = useContext(SidebarContext);
31
+ const { collapsed, canGrow } = useContext(SidebarContext);
31
32
 
32
33
  const isAnchor = 'href' in props;
33
34
 
@@ -37,10 +38,11 @@ export const SidebarItem = ({ active, icon: Icon, label, ...props }: SidebarItem
37
38
  as={isAnchor ? 'a' : 'button'}
38
39
  $collapsed={collapsed}
39
40
  $active={active}
41
+ $canGrow={canGrow}
40
42
  {...props}
41
43
  >
42
44
  {Icon && <Icon aria-label={label} width={16} height={16} />}
43
- <StyledText $collapsed={collapsed} $active={active}>
45
+ <StyledText $collapsed={collapsed} $active={active} $canGrow={canGrow}>
44
46
  {label}
45
47
  </StyledText>
46
48
  </StyledItem>
@@ -48,7 +50,7 @@ export const SidebarItem = ({ active, icon: Icon, label, ...props }: SidebarItem
48
50
  };
49
51
 
50
52
  const StyledText = styled.span<StyledProps>(
51
- ({ $collapsed }) => `
53
+ ({ $collapsed, $canGrow }) => `
52
54
  margin-top: 2px;
53
55
  overflow: hidden;
54
56
  white-space: nowrap;
@@ -62,18 +64,19 @@ const StyledText = styled.span<StyledProps>(
62
64
  font-family: Inter;
63
65
 
64
66
  ${
65
- $collapsed &&
66
- `
67
+ $collapsed || !$canGrow
68
+ ? `
67
69
  & {
68
70
  width: 0;
69
71
  }
70
72
  `
73
+ : ''
71
74
  }
72
75
  `
73
76
  );
74
77
 
75
78
  const StyledItem = styled.a<StyledProps>(
76
- ({ $active, $collapsed, theme }) => `
79
+ ({ $active, $collapsed, $canGrow, theme }) => `
77
80
  display: flex;
78
81
  align-items: center;
79
82
  gap: 12px;
@@ -96,7 +99,7 @@ const StyledItem = styled.a<StyledProps>(
96
99
  `
97
100
  : ''
98
101
  }
99
- ${$collapsed ? `gap: 0;` : ''}
102
+ ${$collapsed || !$canGrow ? `gap: 0;` : ''}
100
103
 
101
104
 
102
105