w-design-system 0.0.20 → 0.0.22

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 (98) hide show
  1. package/dist/assets/icon/alert.svg +3 -0
  2. package/dist/assets/icon/chevron-down.svg +3 -0
  3. package/dist/assets/icon/chevron-left.svg +3 -0
  4. package/dist/assets/icon/chevron-right.svg +3 -0
  5. package/dist/assets/icon/close.svg +10 -0
  6. package/dist/assets/icon/comment.svg +10 -0
  7. package/dist/assets/icon/doc-check.svg +10 -0
  8. package/dist/assets/icon/dump.svg +3 -0
  9. package/dist/assets/icon/edit.svg +10 -0
  10. package/dist/assets/icon/image.svg +3 -0
  11. package/dist/assets/icon/index.d.ts +6 -1
  12. package/dist/assets/icon/index.d.ts.map +1 -1
  13. package/dist/assets/icon/index.js +6 -1
  14. package/dist/assets/icon/index.js.map +1 -1
  15. package/dist/assets/icon/index.ts +22 -0
  16. package/dist/assets/icon/spin.svg +3 -0
  17. package/dist/components/ButtonRound/index.d.ts.map +1 -1
  18. package/dist/components/ButtonRound/index.js +4 -4
  19. package/dist/components/ButtonRound/index.js.map +1 -1
  20. package/dist/components/ButtonRound/stories.d.ts.map +1 -1
  21. package/dist/components/ButtonRound/stories.js +1 -2
  22. package/dist/components/ButtonRound/stories.js.map +1 -1
  23. package/dist/components/ButtonRound/styles.js +5 -5
  24. package/dist/components/ButtonRound/styles.js.map +1 -1
  25. package/dist/components/CardStories/index.d.ts +9 -0
  26. package/dist/components/CardStories/index.d.ts.map +1 -0
  27. package/dist/components/CardStories/index.js +43 -0
  28. package/dist/components/CardStories/index.js.map +1 -0
  29. package/dist/components/CardStories/stories.d.ts +9 -0
  30. package/dist/components/CardStories/stories.d.ts.map +1 -0
  31. package/dist/components/CardStories/stories.js +35 -0
  32. package/dist/components/CardStories/stories.js.map +1 -0
  33. package/dist/components/Loading/index.d.ts +8 -0
  34. package/dist/components/Loading/index.d.ts.map +1 -0
  35. package/dist/components/Loading/index.js +50 -0
  36. package/dist/components/Loading/index.js.map +1 -0
  37. package/dist/components/Loading/stories.d.ts +12 -0
  38. package/dist/components/Loading/stories.d.ts.map +1 -0
  39. package/dist/components/Loading/stories.js +46 -0
  40. package/dist/components/Loading/stories.js.map +1 -0
  41. package/dist/components/Paginate/index.d.ts +10 -0
  42. package/dist/components/Paginate/index.d.ts.map +1 -0
  43. package/dist/components/Paginate/index.js +58 -0
  44. package/dist/components/Paginate/index.js.map +1 -0
  45. package/dist/components/Paginate/stories.d.ts +6 -0
  46. package/dist/components/Paginate/stories.d.ts.map +1 -0
  47. package/dist/components/Paginate/stories.js +37 -0
  48. package/dist/components/Paginate/stories.js.map +1 -0
  49. package/dist/components/Paginate/styles.d.ts +2 -0
  50. package/dist/components/Paginate/styles.d.ts.map +1 -0
  51. package/dist/components/Paginate/styles.js +97 -0
  52. package/dist/components/Paginate/styles.js.map +1 -0
  53. package/dist/components/Paragraph/index.d.ts +1 -0
  54. package/dist/components/Paragraph/index.d.ts.map +1 -1
  55. package/dist/components/Paragraph/index.js +4 -3
  56. package/dist/components/Paragraph/index.js.map +1 -1
  57. package/dist/components/Table/index.d.ts +21 -0
  58. package/dist/components/Table/index.d.ts.map +1 -0
  59. package/dist/components/Table/index.js +90 -0
  60. package/dist/components/Table/index.js.map +1 -0
  61. package/dist/components/Table/stories.d.ts +9 -0
  62. package/dist/components/Table/stories.d.ts.map +1 -0
  63. package/dist/components/Table/stories.js +159 -0
  64. package/dist/components/Table/stories.js.map +1 -0
  65. package/dist/components/Table/styles.d.ts +1 -0
  66. package/dist/components/Table/styles.d.ts.map +1 -0
  67. package/dist/components/Table/styles.js +2 -0
  68. package/dist/components/Table/styles.js.map +1 -0
  69. package/dist/components/Types/index.d.ts +1 -0
  70. package/dist/components/Types/index.d.ts.map +1 -1
  71. package/dist/components/index.d.ts +2 -0
  72. package/dist/components/index.d.ts.map +1 -1
  73. package/dist/components/index.js +2 -0
  74. package/dist/components/index.js.map +1 -1
  75. package/package.json +1 -1
  76. package/src/assets/icon/chevron-down.svg +3 -0
  77. package/src/assets/icon/chevron-left.svg +3 -0
  78. package/src/assets/icon/chevron-right.svg +3 -0
  79. package/src/assets/icon/dump.svg +3 -0
  80. package/src/assets/icon/edit.svg +10 -0
  81. package/src/assets/icon/index.ts +17 -1
  82. package/src/assets/icon/spin.svg +3 -0
  83. package/src/components/ButtonRound/index.tsx +5 -4
  84. package/src/components/ButtonRound/stories.tsx +2 -2
  85. package/src/components/ButtonRound/styles.ts +5 -5
  86. package/src/components/CardStories/index.tsx +59 -0
  87. package/src/components/CardStories/stories.tsx +44 -0
  88. package/src/components/Loading/index.tsx +73 -0
  89. package/src/components/Loading/stories.tsx +65 -0
  90. package/src/components/Paginate/index.tsx +108 -0
  91. package/src/components/Paginate/stories.tsx +53 -0
  92. package/src/components/Paginate/styles.ts +96 -0
  93. package/src/components/Paragraph/index.tsx +13 -4
  94. package/src/components/Table/index.tsx +203 -0
  95. package/src/components/Table/stories.tsx +198 -0
  96. package/src/components/Table/styles.ts +0 -0
  97. package/src/components/Types/index.ts +1 -0
  98. package/src/components/index.tsx +2 -0
@@ -3,4 +3,20 @@ import { default as alertSVG } from './alert.svg'
3
3
  import { default as commentSVG } from './comment.svg'
4
4
  import { default as imageSVG } from './image.svg'
5
5
  import { default as closeSVG } from './close.svg'
6
- export { docCheckSVG, alertSVG, commentSVG, imageSVG, closeSVG }
6
+ import { default as dumpSVG } from './dump.svg'
7
+ import { default as editSVG } from './edit.svg'
8
+ import { default as chevronDownSVG } from './chevron-down.svg'
9
+ import { default as chevronLeftSVG } from './chevron-left.svg'
10
+ import { default as chevronRightSVG } from './chevron-right.svg'
11
+ export {
12
+ docCheckSVG,
13
+ alertSVG,
14
+ commentSVG,
15
+ imageSVG,
16
+ closeSVG,
17
+ dumpSVG,
18
+ editSVG,
19
+ chevronDownSVG,
20
+ chevronRightSVG,
21
+ chevronLeftSVG,
22
+ }
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
2
+ <path d="M13.125 4.875C13.125 5.49844 12.6234 6 12 6C11.3766 6 10.875 5.49844 10.875 4.875V1.125C10.875 0.503906 11.3766 0 12 0C12.6234 0 13.125 0.503906 13.125 1.125V4.875ZM13.125 22.875C13.125 23.4984 12.6234 24 12 24C11.3766 24 10.875 23.4984 10.875 22.875V19.125C10.875 18.5016 11.3766 18 12 18C12.6234 18 13.125 18.5016 13.125 19.125V22.875ZM0 12C0 11.3766 0.503906 10.875 1.125 10.875H4.875C5.49844 10.875 6 11.3766 6 12C6 12.6234 5.49844 13.125 4.875 13.125H1.125C0.503906 13.125 0 12.6234 0 12ZM22.875 10.875C23.4984 10.875 24 11.3766 24 12C24 12.6234 23.4984 13.125 22.875 13.125H19.125C18.5016 13.125 18 12.6234 18 12C18 11.3766 18.5016 10.875 19.125 10.875H22.875ZM20.4844 3.51469C20.925 3.95391 20.925 4.66641 20.4844 5.10469L17.8359 7.75781C17.3953 8.19844 16.6828 8.19844 16.2422 7.75781C15.8016 7.31719 15.8016 6.60469 16.2422 6.16875L18.8953 3.51469C19.3359 3.07547 20.0438 3.07547 20.4844 3.51469ZM5.10469 20.4844C4.66406 20.925 3.95625 20.925 3.47344 20.4844C3.07547 20.0438 3.07547 19.3313 3.47344 18.8953L6.16406 16.2422C6.60469 15.8016 7.31719 15.8016 7.75781 16.2422C8.19844 16.6828 8.19844 17.3953 7.75781 17.8312L5.10469 20.4844ZM3.47344 3.51469C3.95625 3.07547 4.66406 3.07547 5.10469 3.51469L7.75781 6.16875C8.19844 6.60469 8.19844 7.31719 7.75781 7.75781C7.31719 8.19844 6.60469 8.19844 6.16406 7.75781L3.47344 5.10469C3.07547 4.66641 3.07547 3.95391 3.47344 3.51469ZM20.4844 18.8953C20.925 19.3313 20.925 20.0438 20.4844 20.4844C20.0438 20.925 19.3359 20.925 18.8953 20.4844L16.2422 17.8312C15.8016 17.3953 15.8016 16.6828 16.2422 16.2422C16.6828 15.8016 17.3953 15.8016 17.8359 16.2422L20.4844 18.8953Z" fill="black"/>
3
+ </svg>
@@ -10,15 +10,16 @@ export const ButtonRound: React.FC<ButtonRoundTypes> = ({
10
10
  icon,
11
11
  outline,
12
12
  badge,
13
+ size = 'medium',
13
14
  ...props
14
15
  }) => (
15
- <ButtonStyled variant={variant} disabled={disabled} outline={outline} badge={badge} {...props}>
16
- {badge && <span className={'buttonRoundBadge'}>{badge}</span>}
16
+ <ButtonStyled variant={variant} disabled={disabled} outline={outline} badge={badge} size={size} {...props}>
17
+ {badge && size === 'medium' && <span className={'buttonRoundBadge'}>{badge}</span>}
17
18
  <IconWrapper
18
19
  src={icon || ''}
19
20
  color={'white'}
20
- width={'20px'}
21
- height={'20px'}
21
+ width={size === 'small' ? '16px' : '20px'}
22
+ height={size === 'small' ? '16px' : '20px'}
22
23
  className={'buttonRadiusWrapperIcon'}
23
24
  />
24
25
  </ButtonStyled>
@@ -39,12 +39,12 @@ export const Playground: Story = {
39
39
  icon: exampleIcon,
40
40
  },
41
41
  }
42
+
42
43
  export const ButtonBadge: Story = {
43
44
  args: {
44
- variant: 'success',
45
+ variant: 'primary',
45
46
  children: 'ButtonPlayground',
46
47
  disabled: false,
47
48
  icon: exampleIcon,
48
- badge: 10,
49
49
  },
50
50
  }
@@ -98,8 +98,8 @@ export const ButtonStyled = styled.button<ButtonRoundTypes>`
98
98
  align-items: center;
99
99
  justify-content: center;
100
100
  box-sizing: border-box;
101
- height: 48px;
102
- width: 48px;
101
+ height: ${({ size }) => (size === 'small' ? '32px' : '40px')};
102
+ width: ${({ size }) => (size === 'small' ? '32px' : '40px')};
103
103
  font-size: 16px;
104
104
  font-weight: 600;
105
105
  line-height: 140%;
@@ -111,7 +111,7 @@ export const ButtonStyled = styled.button<ButtonRoundTypes>`
111
111
  background-color 0.3s,
112
112
  opacity 0.3s;
113
113
  color: white;
114
- gap: 12px;
114
+ gap: ${({ size }) => (size === 'small' ? '8' : '12px')};
115
115
  cursor: ${({ disabled }) => (disabled ? 'not-allowed' : 'pointer')};
116
116
  opacity: ${({ disabled }) => (disabled ? 0.5 : 1)};
117
117
  ${({ variant = 'primary', outline }) => colorScheme[variant]};
@@ -124,8 +124,8 @@ export const ButtonStyled = styled.button<ButtonRoundTypes>`
124
124
  margin-bottom: 24px;
125
125
  margin-left: 54px;
126
126
  position: absolute;
127
- width: 26px;
128
- height: 26px;
127
+ width: ${({ size }) => (size === 'small' ? '16px' : '26px')};
128
+ height: ${({ size }) => (size === 'small' ? '16px' : '26px')};
129
129
  border-radius: 100%;
130
130
  font-size: 12px;
131
131
  display: flex;
@@ -0,0 +1,59 @@
1
+ import React from 'react'
2
+ import styled, { keyframes } from 'styled-components'
3
+ import { Paragraph } from '../Paragraph'
4
+ import { theme } from '../Themes'
5
+
6
+ const ContainerCardStories = styled.div`
7
+ min-height: 300px;
8
+ min-width: 200px;
9
+ height: auto;
10
+ width: auto;
11
+ border: 1px solid #e0e0e0;
12
+ border-radius: 8px;
13
+ display: flex;
14
+ justify-content: space-between;
15
+ flex-direction: column;
16
+ `
17
+
18
+ const Wrapper = styled.div`
19
+ padding: 16px;
20
+ display: flex;
21
+ min-height: 240px;
22
+ min-width: 200px;
23
+ justify-content: center;
24
+ align-items: center;
25
+ flex-wrap: wrap;
26
+ flex-direction: column;
27
+ `
28
+ const WrapperFooter = styled.div`
29
+ height: 50px;
30
+ width: 100%;
31
+ display: flex;
32
+ justify-content: center;
33
+ align-items: center;
34
+ border-top: 1px solid #e0e0e0;
35
+ flex-direction: column;
36
+ `
37
+
38
+ interface CardStoriesProps {
39
+ title?: string
40
+ subTitle?: string
41
+ children?: React.ReactNode
42
+ }
43
+ const CardStories = ({ title, subTitle, children }: CardStoriesProps) => {
44
+ return (
45
+ <ContainerCardStories>
46
+ <Wrapper>{children}</Wrapper>
47
+ <WrapperFooter>
48
+ <Paragraph color={theme.colors.shade50} weight={800}>
49
+ {title}
50
+ </Paragraph>
51
+ <Paragraph size={'x-small'} color={theme.colors.shade30}>
52
+ {subTitle}
53
+ </Paragraph>
54
+ </WrapperFooter>
55
+ </ContainerCardStories>
56
+ )
57
+ }
58
+
59
+ export default CardStories
@@ -0,0 +1,44 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import CardStories from './index'
3
+ import { Paragraph } from '../Paragraph'
4
+ import React from 'react'
5
+
6
+ const meta: Meta<typeof CardStories> = {
7
+ title: 'Components/CardStories',
8
+ component: CardStories,
9
+ parameters: {
10
+ layout: 'centered',
11
+ },
12
+ tags: ['autodocs'],
13
+ } satisfies Meta<typeof CardStories>
14
+
15
+ export default meta
16
+ type Story = StoryObj<typeof meta>
17
+
18
+ export const Default: Story = {
19
+ args: {
20
+ title: 'Default Title',
21
+ subTitle: 'Default Subtitle',
22
+ children: 'This is the default content.',
23
+ },
24
+ }
25
+
26
+ export const WithCustomContent: Story = {
27
+ args: {
28
+ title: 'Custom Title',
29
+ subTitle: 'Custom Subtitle',
30
+ children: (
31
+ <>
32
+ <Paragraph>This is custom content.</Paragraph>
33
+ <Paragraph size="small">Additional custom content.</Paragraph>
34
+ </>
35
+ ),
36
+ },
37
+ }
38
+
39
+ export const WithoutSubtitle: Story = {
40
+ args: {
41
+ title: 'Title Only',
42
+ children: <Paragraph>This card has no subtitle.</Paragraph>,
43
+ },
44
+ }
@@ -0,0 +1,73 @@
1
+ import React from 'react'
2
+ import styled, { keyframes } from 'styled-components'
3
+ import spinSVG from '../../assets/icon/spin.svg'
4
+ import { Paragraph } from '../Paragraph'
5
+ import { theme } from '../Themes'
6
+
7
+ // Animação de rotação
8
+ const spinAnimation = keyframes`
9
+ 0% { transform: rotate(0deg); }
10
+ 100% { transform: rotate(360deg); }
11
+ `
12
+
13
+ // Estilos para o wrapper de tela cheia
14
+ const FullScreenWrapper = styled.div`
15
+ position: fixed;
16
+ top: 0;
17
+ left: 0;
18
+ width: 100vw;
19
+ height: 100vh;
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ background-color: rgb(164, 162, 162);
24
+ z-index: 9999;
25
+ `
26
+
27
+ // Estilos para o wrapper do contêiner
28
+ const ContainerWrapper = styled.div``
29
+
30
+ // Estilos para o wrapper do conteúdo
31
+ const ContainerWrapperStyles = styled.div`
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: center;
35
+ flex-direction: column;
36
+ gap: 16px;
37
+ `
38
+
39
+ // Estilos para a imagem de loading
40
+ const LoadingImage = styled.img<{ size: 'small' | 'medium' | 'large' }>`
41
+ width: ${({ size }) => (size === 'small' ? '30px' : size === 'medium' ? '50px' : '70px')};
42
+ height: ${({ size }) => (size === 'small' ? '30px' : size === 'medium' ? '50px' : '70px')};
43
+ animation: ${spinAnimation} 2s linear infinite;
44
+ `
45
+
46
+ // Tipagem para as props de loading
47
+ interface LoadingProps {
48
+ size?: 'small' | 'medium' | 'large'
49
+ }
50
+
51
+ // Componente de loading em tela cheia
52
+ export const FullScreenLoading: React.FC<LoadingProps> = ({ size = 'medium' }) => (
53
+ <FullScreenWrapper>
54
+ <ContainerWrapperStyles>
55
+ <LoadingImage src={spinSVG} alt="loading" size={size} />
56
+ <Paragraph color={theme.colors.shade40} size="x-small">
57
+ CARREGANDO
58
+ </Paragraph>
59
+ </ContainerWrapperStyles>
60
+ </FullScreenWrapper>
61
+ )
62
+
63
+ // Componente de loading no contêiner
64
+ export const ContainerLoading: React.FC<LoadingProps> = ({ size = 'medium' }) => (
65
+ <ContainerWrapper>
66
+ <ContainerWrapperStyles>
67
+ <LoadingImage src={spinSVG} alt="loading" size={size} />
68
+ <Paragraph color={theme.colors.shade30} size="x-small">
69
+ CARREGANDO
70
+ </Paragraph>
71
+ </ContainerWrapperStyles>
72
+ </ContainerWrapper>
73
+ )
@@ -0,0 +1,65 @@
1
+ // src/components/Loading/stories.tsx
2
+ import type { Meta, StoryObj } from '@storybook/react'
3
+ import { FullScreenLoading, ContainerLoading } from './index'
4
+ import React from 'react'
5
+ import CardStories from '../CardStories'
6
+
7
+ const meta: Meta<typeof FullScreenLoading> = {
8
+ title: 'Components/Loading',
9
+ component: FullScreenLoading,
10
+ parameters: {
11
+ layout: 'centered',
12
+ },
13
+ tags: ['autodocs'],
14
+ argTypes: {
15
+ size: {
16
+ control: { type: 'select', options: ['small', 'medium', 'large'] },
17
+ description: 'Select the size of the loading spinner',
18
+ },
19
+ },
20
+ } satisfies Meta<typeof FullScreenLoading>
21
+
22
+ export default meta
23
+ type Story = StoryObj<typeof meta>
24
+
25
+ export const FullScreenSmall: Story = {
26
+ args: {
27
+ size: 'small',
28
+ },
29
+ }
30
+
31
+ export const FullScreenMedium: Story = {
32
+ args: {
33
+ size: 'medium',
34
+ },
35
+ }
36
+
37
+ export const FullScreenLarge: Story = {
38
+ args: {
39
+ size: 'large',
40
+ },
41
+ }
42
+
43
+ export const ContainerSmall: Story = {
44
+ render: () => (
45
+ <CardStories title="Loading" subTitle="small">
46
+ <ContainerLoading size="small" />
47
+ </CardStories>
48
+ ),
49
+ }
50
+
51
+ export const ContainerMedium: Story = {
52
+ render: () => (
53
+ <CardStories title="Loading" subTitle="medium">
54
+ <ContainerLoading size="medium" />
55
+ </CardStories>
56
+ ),
57
+ }
58
+
59
+ export const ContainerLarge: Story = {
60
+ render: () => (
61
+ <CardStories title="Loading" subTitle="large">
62
+ <ContainerLoading size="large" />
63
+ </CardStories>
64
+ ),
65
+ }
@@ -0,0 +1,108 @@
1
+ import React from 'react'
2
+ import { Container } from './styles'
3
+ import { IconWrapper } from '../IconWrapper'
4
+ import { chevronLeftSVG, chevronRightSVG } from '../../assets/icon'
5
+ export type PropsPaginate = {
6
+ currentPage: number
7
+ itemCount: number
8
+ itemsPerPage?: number
9
+ onChangePage: (page: number) => void
10
+ onChangeItemsPerPage: (itemsPerPage: number) => void
11
+ }
12
+
13
+ export const Paginate = ({
14
+ currentPage,
15
+ itemCount,
16
+ onChangePage,
17
+ itemsPerPage,
18
+ onChangeItemsPerPage,
19
+ }: PropsPaginate) => {
20
+ // Se itemsPerPage for undefined, o valor default e 20
21
+ let itemsPerPageValue = itemsPerPage || 20
22
+
23
+ const pageCount = Math.ceil(itemCount / itemsPerPageValue)
24
+
25
+ const pages: (number | 'elipsis')[] = []
26
+
27
+ // o interval indica quantas paginas mostrar antes e depois da pagina atual
28
+ const interval = 2
29
+
30
+ // Adiciona a primeira pagina
31
+ if (pageCount > 0 && currentPage - interval > 1) {
32
+ pages.push(1)
33
+ }
34
+
35
+ // Adiciona as paginas entre a primeira e a ultima do intervalo
36
+ const start = Math.max(currentPage - interval, 1)
37
+ const end = Math.min(currentPage + interval, pageCount)
38
+
39
+ if (start > 2) {
40
+ pages.push('elipsis')
41
+ }
42
+
43
+ for (let i = start; i <= end; i++) {
44
+ pages.push(i)
45
+ }
46
+
47
+ if (end < pageCount - 1) {
48
+ pages.push('elipsis')
49
+ }
50
+
51
+ if (pageCount > currentPage + interval) {
52
+ pages.push(pageCount)
53
+ }
54
+
55
+ const minItem = (currentPage - 1) * itemsPerPageValue + 1
56
+ const maxItem = Math.min(currentPage * itemsPerPageValue, itemCount)
57
+
58
+ const itemPerPageOptions = Array.from(new Set([10, 20, 50, 100, itemsPerPage]))
59
+
60
+ return (
61
+ <Container>
62
+ <ul className="pagination">
63
+ <IconWrapper
64
+ className={currentPage === 1 ? 'icon-disabled' : 'icon'}
65
+ src={chevronLeftSVG}
66
+ width="14px"
67
+ onClick={() => onChangePage(currentPage - 1)}
68
+ />
69
+ {pages.map((page, index) => {
70
+ if (page === 'elipsis') {
71
+ return <li key={`elipsis-${index}`}>...</li>
72
+ }
73
+ return (
74
+ <li key={page} className={page === currentPage ? 'page-active' : 'page'} onClick={() => onChangePage(page)}>
75
+ {page}
76
+ </li>
77
+ )
78
+ })}
79
+ <IconWrapper
80
+ className={currentPage === pageCount ? 'icon-disabled' : 'icon'}
81
+ src={chevronRightSVG}
82
+ width="14px"
83
+ onClick={() => onChangePage(currentPage + 1)}
84
+ />
85
+ </ul>
86
+ <div className="items-per-page-wrapper">
87
+ <div className="item-per-page">Itens por página</div>
88
+ <select
89
+ value={itemsPerPageValue}
90
+ onChange={e => {
91
+ onChangeItemsPerPage(Number(e.target.value))
92
+ }}
93
+ >
94
+ {itemPerPageOptions.map((item, index) => {
95
+ return (
96
+ <option key={index} value={item}>
97
+ {item}
98
+ </option>
99
+ )
100
+ })}
101
+ </select>
102
+ <div className="items-per-page-selected">
103
+ {minItem} - {maxItem} de {itemCount}
104
+ </div>
105
+ </div>
106
+ </Container>
107
+ )
108
+ }
@@ -0,0 +1,53 @@
1
+ import { Meta, StoryObj } from '@storybook/react'
2
+ import React, { useState } from 'react'
3
+
4
+ import { action } from '@storybook/addon-actions'
5
+ import { fn } from '@storybook/test'
6
+ import { Paginate, PropsPaginate } from '.'
7
+
8
+ const meta: Meta<PropsPaginate> = {
9
+ title: 'Components/Paginate',
10
+ component: Paginate,
11
+ tags: ['autodocs'],
12
+ args: {
13
+ currentPage: 1,
14
+ itemCount: 100,
15
+ itemsPerPage: 10,
16
+ onChangePage: fn(),
17
+ onChangeItemsPerPage: fn(),
18
+ },
19
+ }
20
+
21
+ export default meta
22
+
23
+ const NewPaginate = (args: PropsPaginate) => {
24
+ const [currentPage, setCurrentPage] = useState(args.currentPage)
25
+ const [itemCount, setItemCount] = useState(args.itemCount)
26
+ const [itemsPerPage, setItemsPerPage] = useState(args.itemsPerPage)
27
+
28
+ const handleChangePage = (page: number) => {
29
+ setCurrentPage(page)
30
+ action('changePage')(page)
31
+ }
32
+
33
+ const handleChangeItemsPerPage = (items: number) => {
34
+ setItemsPerPage(items)
35
+ action('changeItemsPerPage')(items)
36
+ }
37
+ return (
38
+ <Paginate
39
+ {...args}
40
+ currentPage={currentPage}
41
+ itemCount={itemCount}
42
+ itemsPerPage={itemsPerPage}
43
+ onChangePage={handleChangePage}
44
+ onChangeItemsPerPage={handleChangeItemsPerPage}
45
+ />
46
+ )
47
+ }
48
+
49
+ export const Default: StoryObj<PropsPaginate> = {
50
+ render: args => {
51
+ return <NewPaginate {...args} />
52
+ },
53
+ }
@@ -0,0 +1,96 @@
1
+ import styled from 'styled-components'
2
+ import { theme } from '../Themes'
3
+ import { chevronDownSVG } from '../../assets/icon'
4
+ export const Container = styled.div`
5
+ display: flex;
6
+ justify-content: space-between;
7
+ align-items: center;
8
+
9
+ .icon,
10
+ .icon svg,
11
+ .icon svg path {
12
+ fill: ${theme.colors.shade30} !important;
13
+ }
14
+
15
+ .icon:hover,
16
+ .icon:hover svg,
17
+ .icon:hover svg path {
18
+ fill: ${theme.colors.cyan30} !important;
19
+ }
20
+
21
+ .icon-disabled,
22
+ .icon-disabled svg,
23
+ .icon-disabled svg path {
24
+ fill: ${theme.colors.shade20} !important;
25
+ }
26
+
27
+ ul.pagination {
28
+ display: flex;
29
+ gap: 1rem;
30
+ font-family: 'Nunito Sans', sans-serif;
31
+ font-size: 1rem;
32
+ color: ${theme.colors.shade40};
33
+ li {
34
+ list-style: none;
35
+ }
36
+
37
+ li.page {
38
+ cursor: pointer;
39
+ }
40
+
41
+ li.page:hover {
42
+ color: ${theme.colors.cyan30};
43
+ }
44
+
45
+ li.page-active {
46
+ color: ${theme.colors.cyan30};
47
+ cursor: default;
48
+ }
49
+ }
50
+
51
+ .items-per-page-wrapper {
52
+ display: flex;
53
+ align-items: center;
54
+
55
+ gap: 1rem;
56
+ font-family: 'Nunito Sans', sans-serif;
57
+ color: ${theme.colors.shade40};
58
+
59
+ select {
60
+ /* styling */
61
+ cursor: pointer;
62
+ background-color: ${theme.colors.shade05};
63
+ background-image: url(${chevronDownSVG});
64
+ background-repeat: no-repeat;
65
+ background-size: 1rem;
66
+ background-position: right 1rem top calc(50% + 1px);
67
+ border: 1px solid ${theme.colors.shade20};
68
+ color: ${theme.colors.shade40};
69
+ border-radius: 4px;
70
+ display: inline-block;
71
+ font: inherit;
72
+ outline: 0;
73
+
74
+ padding: 18px 48px 14px 16px;
75
+
76
+ margin: 0;
77
+ -webkit-box-sizing: border-box;
78
+ -moz-box-sizing: border-box;
79
+ box-sizing: border-box;
80
+ -webkit-appearance: none;
81
+ -moz-appearance: none; /* Firefox */
82
+ -webkit-appearance: none; /* Safari and Chrome */
83
+ appearance: none;
84
+ }
85
+
86
+ select:hover {
87
+ background-color: ${theme.colors.shade10};
88
+ border: 1px solid ${theme.colors.shade20};
89
+ }
90
+
91
+ select:focus {
92
+ background-color: ${theme.colors.shade10};
93
+ border: 1px solid ${theme.colors.shade30};
94
+ }
95
+ }
96
+ `
@@ -5,7 +5,8 @@ interface ParagraphProps {
5
5
  size?: 'x-small' | 'small' | 'medium' | 'large'
6
6
  weight?: 400 | 600 | 700 | 800
7
7
  as?: 'span' | 'div' | 'label' | 'p'
8
- color?: string // Adicionando a propriedade color
8
+ color?: string
9
+ textTransform?: 'none' | 'capitalize' | 'uppercase' | 'lowercase' // Adicionando a propriedade textTransform
9
10
  children: React.ReactNode
10
11
  }
11
12
 
@@ -30,12 +31,20 @@ const ParagraphStyled = styled.p<ParagraphProps>`
30
31
  font-weight: ${props => (props.weight ? weights[props.weight] : 400)};
31
32
  line-height: 140%;
32
33
  font-family: 'Nunito Sans', sans-serif;
33
- color: ${props => props.color || 'inherit'}; // Aplicando a cor
34
+ color: ${props => props.color || 'inherit'};
35
+ text-transform: ${props => props.textTransform || 'none'}; // Aplicando textTransform
34
36
  `
35
37
 
36
- export const Paragraph: React.FC<ParagraphProps> = ({ size = 'small', weight, as = 'p', color, children }) => {
38
+ export const Paragraph: React.FC<ParagraphProps> = ({
39
+ size = 'small',
40
+ weight,
41
+ as = 'p',
42
+ color,
43
+ textTransform,
44
+ children,
45
+ }) => {
37
46
  return (
38
- <ParagraphStyled as={as} size={size} weight={weight} color={color}>
47
+ <ParagraphStyled as={as} size={size} weight={weight} color={color} textTransform={textTransform}>
39
48
  {children}
40
49
  </ParagraphStyled>
41
50
  )