lsoft-ui 0.0.1

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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +82 -0
  3. package/dist/components/Accordion/CustomAccordionGroup.d.ts +10 -0
  4. package/dist/components/Accordion/CustomAccordionGroup.js +20 -0
  5. package/dist/components/Accordion/CustomAccordionItem.d.ts +12 -0
  6. package/dist/components/Accordion/CustomAccordionItem.js +5 -0
  7. package/dist/components/CustomAlertDialog.d.ts +8 -0
  8. package/dist/components/CustomAlertDialog.js +18 -0
  9. package/dist/components/CustomAutoComplete.d.ts +35 -0
  10. package/dist/components/CustomAutoComplete.js +141 -0
  11. package/dist/components/CustomBadge.d.ts +9 -0
  12. package/dist/components/CustomBadge.js +25 -0
  13. package/dist/components/CustomButton.d.ts +16 -0
  14. package/dist/components/CustomButton.js +18 -0
  15. package/dist/components/CustomCard.d.ts +11 -0
  16. package/dist/components/CustomCard.js +20 -0
  17. package/dist/components/CustomCheckBox.d.ts +12 -0
  18. package/dist/components/CustomCheckBox.js +26 -0
  19. package/dist/components/CustomCheckboxGroup.d.ts +21 -0
  20. package/dist/components/CustomCheckboxGroup.js +28 -0
  21. package/dist/components/CustomDrawer.d.ts +11 -0
  22. package/dist/components/CustomDrawer.js +36 -0
  23. package/dist/components/CustomIconButton.d.ts +7 -0
  24. package/dist/components/CustomIconButton.js +19 -0
  25. package/dist/components/CustomInput.d.ts +19 -0
  26. package/dist/components/CustomInput.js +32 -0
  27. package/dist/components/CustomInputNumber.d.ts +17 -0
  28. package/dist/components/CustomInputNumber.js +23 -0
  29. package/dist/components/CustomList.d.ts +22 -0
  30. package/dist/components/CustomList.js +27 -0
  31. package/dist/components/CustomLoadingCenterPage.d.ts +6 -0
  32. package/dist/components/CustomLoadingCenterPage.js +5 -0
  33. package/dist/components/CustomModal.d.ts +19 -0
  34. package/dist/components/CustomModal.js +83 -0
  35. package/dist/components/CustomModalNfe.d.ts +34 -0
  36. package/dist/components/CustomModalNfe.js +86 -0
  37. package/dist/components/CustomMultSelect.d.ts +28 -0
  38. package/dist/components/CustomMultSelect.js +51 -0
  39. package/dist/components/CustomMultipleInputs.d.ts +36 -0
  40. package/dist/components/CustomMultipleInputs.js +91 -0
  41. package/dist/components/CustomPopover.d.ts +21 -0
  42. package/dist/components/CustomPopover.js +19 -0
  43. package/dist/components/CustomRadioGroup.d.ts +32 -0
  44. package/dist/components/CustomRadioGroup.js +37 -0
  45. package/dist/components/CustomSelect.d.ts +20 -0
  46. package/dist/components/CustomSelect.js +25 -0
  47. package/dist/components/CustomSkeleton.d.ts +9 -0
  48. package/dist/components/CustomSkeleton.js +17 -0
  49. package/dist/components/CustomSwitch.d.ts +20 -0
  50. package/dist/components/CustomSwitch.js +15 -0
  51. package/dist/components/CustomTable.d.ts +51 -0
  52. package/dist/components/CustomTable.js +307 -0
  53. package/dist/components/CustomTabs.d.ts +27 -0
  54. package/dist/components/CustomTabs.js +100 -0
  55. package/dist/components/CustomTextarea.d.ts +14 -0
  56. package/dist/components/CustomTextarea.js +35 -0
  57. package/dist/components/CustomToast.d.ts +10 -0
  58. package/dist/components/CustomToast.js +6 -0
  59. package/dist/components/DatePicker/CustomDatePicker.d.ts +24 -0
  60. package/dist/components/DatePicker/CustomDatePicker.js +628 -0
  61. package/dist/components/Pagination/CustomPagination.d.ts +50 -0
  62. package/dist/components/Pagination/CustomPagination.js +159 -0
  63. package/dist/components/ThemeToggle.d.ts +1 -0
  64. package/dist/components/ThemeToggle.js +30 -0
  65. package/dist/components/index.d.ts +30 -0
  66. package/dist/components/index.js +30 -0
  67. package/dist/contexts/ThemeContext.d.ts +18 -0
  68. package/dist/contexts/ThemeContext.js +34 -0
  69. package/dist/examples/CodeViewer.d.ts +8 -0
  70. package/dist/examples/CodeViewer.js +7 -0
  71. package/dist/examples/FormikExample.d.ts +2 -0
  72. package/dist/examples/FormikExample.js +199 -0
  73. package/dist/examples/NumberInputExample.d.ts +2 -0
  74. package/dist/examples/NumberInputExample.js +198 -0
  75. package/dist/examples/ReactHookFormExample.d.ts +2 -0
  76. package/dist/examples/ReactHookFormExample.js +217 -0
  77. package/dist/examples/SimpleFormExample.d.ts +2 -0
  78. package/dist/examples/SimpleFormExample.js +216 -0
  79. package/dist/examples/TabsExample.d.ts +2 -0
  80. package/dist/examples/TabsExample.js +182 -0
  81. package/dist/examples/index.d.ts +6 -0
  82. package/dist/examples/index.js +6 -0
  83. package/dist/index.d.ts +32 -0
  84. package/dist/index.js +32 -0
  85. package/dist/providers/LsCKFrontProvider.d.ts +6 -0
  86. package/dist/providers/LsCKFrontProvider.js +7 -0
  87. package/dist/stories/Londrisoft/Components/Accordion/CustomAccordionGroup.stories.d.ts +13 -0
  88. package/dist/stories/Londrisoft/Components/Accordion/CustomAccordionGroup.stories.js +787 -0
  89. package/dist/stories/Londrisoft/Components/Accordion/CustomAccordionItem.stories.d.ts +13 -0
  90. package/dist/stories/Londrisoft/Components/Accordion/CustomAccordionItem.stories.js +759 -0
  91. package/dist/stories/Londrisoft/Components/Checkbox/CustomCheckBox.stories.d.ts +15 -0
  92. package/dist/stories/Londrisoft/Components/Checkbox/CustomCheckBox.stories.js +770 -0
  93. package/dist/stories/Londrisoft/Components/Checkbox/CustomCheckboxGroup.stories.d.ts +33 -0
  94. package/dist/stories/Londrisoft/Components/Checkbox/CustomCheckboxGroup.stories.js +2152 -0
  95. package/dist/stories/Londrisoft/Components/CustomAlertDialog.stories.d.ts +24 -0
  96. package/dist/stories/Londrisoft/Components/CustomAlertDialog.stories.js +462 -0
  97. package/dist/stories/Londrisoft/Components/CustomAutoComplete.stories.d.ts +41 -0
  98. package/dist/stories/Londrisoft/Components/CustomAutoComplete.stories.js +1135 -0
  99. package/dist/stories/Londrisoft/Components/CustomBadge.stories.d.ts +21 -0
  100. package/dist/stories/Londrisoft/Components/CustomBadge.stories.js +546 -0
  101. package/dist/stories/Londrisoft/Components/CustomButton.stories.d.ts +17 -0
  102. package/dist/stories/Londrisoft/Components/CustomButton.stories.js +1099 -0
  103. package/dist/stories/Londrisoft/Components/CustomCard.stories.d.ts +17 -0
  104. package/dist/stories/Londrisoft/Components/CustomCard.stories.js +687 -0
  105. package/dist/stories/Londrisoft/Components/CustomDrawer.stories.d.ts +24 -0
  106. package/dist/stories/Londrisoft/Components/CustomDrawer.stories.js +521 -0
  107. package/dist/stories/Londrisoft/Components/CustomIconButton.stories.d.ts +14 -0
  108. package/dist/stories/Londrisoft/Components/CustomIconButton.stories.js +1024 -0
  109. package/dist/stories/Londrisoft/Components/CustomInput.stories.d.ts +15 -0
  110. package/dist/stories/Londrisoft/Components/CustomInput.stories.js +1094 -0
  111. package/dist/stories/Londrisoft/Components/CustomInputNumber.stories.d.ts +11 -0
  112. package/dist/stories/Londrisoft/Components/CustomInputNumber.stories.js +676 -0
  113. package/dist/stories/Londrisoft/Components/CustomList.stories.d.ts +18 -0
  114. package/dist/stories/Londrisoft/Components/CustomList.stories.js +1353 -0
  115. package/dist/stories/Londrisoft/Components/CustomLoadingCenterPage.stories.d.ts +17 -0
  116. package/dist/stories/Londrisoft/Components/CustomLoadingCenterPage.stories.js +304 -0
  117. package/dist/stories/Londrisoft/Components/CustomModal.stories.d.ts +19 -0
  118. package/dist/stories/Londrisoft/Components/CustomModal.stories.js +631 -0
  119. package/dist/stories/Londrisoft/Components/CustomModalNfe.stories.d.ts +19 -0
  120. package/dist/stories/Londrisoft/Components/CustomModalNfe.stories.js +589 -0
  121. package/dist/stories/Londrisoft/Components/CustomMultSelect.stories.d.ts +15 -0
  122. package/dist/stories/Londrisoft/Components/CustomMultSelect.stories.js +447 -0
  123. package/dist/stories/Londrisoft/Components/CustomMultipleInputs.stories.d.ts +15 -0
  124. package/dist/stories/Londrisoft/Components/CustomMultipleInputs.stories.js +1068 -0
  125. package/dist/stories/Londrisoft/Components/CustomPopover.stories.d.ts +10 -0
  126. package/dist/stories/Londrisoft/Components/CustomPopover.stories.js +208 -0
  127. package/dist/stories/Londrisoft/Components/CustomSelect.stories.d.ts +27 -0
  128. package/dist/stories/Londrisoft/Components/CustomSelect.stories.js +1086 -0
  129. package/dist/stories/Londrisoft/Components/CustomSkeleton.stories.d.ts +25 -0
  130. package/dist/stories/Londrisoft/Components/CustomSkeleton.stories.js +534 -0
  131. package/dist/stories/Londrisoft/Components/CustomSwitch.stories.d.ts +15 -0
  132. package/dist/stories/Londrisoft/Components/CustomSwitch.stories.js +422 -0
  133. package/dist/stories/Londrisoft/Components/CustomTable.stories.d.ts +43 -0
  134. package/dist/stories/Londrisoft/Components/CustomTable.stories.js +2121 -0
  135. package/dist/stories/Londrisoft/Components/CustomTabs.stories.d.ts +19 -0
  136. package/dist/stories/Londrisoft/Components/CustomTabs.stories.js +866 -0
  137. package/dist/stories/Londrisoft/Components/CustomTextarea.stories.d.ts +21 -0
  138. package/dist/stories/Londrisoft/Components/CustomTextarea.stories.js +408 -0
  139. package/dist/stories/Londrisoft/Components/CustomToast.stories.d.ts +21 -0
  140. package/dist/stories/Londrisoft/Components/CustomToast.stories.js +1041 -0
  141. package/dist/stories/Londrisoft/Components/DatePicker/CustomDatePicker.stories.d.ts +17 -0
  142. package/dist/stories/Londrisoft/Components/DatePicker/CustomDatePicker.stories.js +653 -0
  143. package/dist/stories/Londrisoft/Components/Pagination/CustomPagination.stories.d.ts +17 -0
  144. package/dist/stories/Londrisoft/Components/Pagination/CustomPagination.stories.js +429 -0
  145. package/dist/stories/Londrisoft/Components/Radio/CustomRadioGroup.stories.d.ts +22 -0
  146. package/dist/stories/Londrisoft/Components/Radio/CustomRadioGroup.stories.js +766 -0
  147. package/dist/stories/Londrisoft/Examples/IntegrationExamples.stories.d.ts +16 -0
  148. package/dist/stories/Londrisoft/Examples/IntegrationExamples.stories.js +514 -0
  149. package/dist/stories/Londrisoft/Theme/ThemeShowcase.stories.d.ts +5 -0
  150. package/dist/stories/Londrisoft/Theme/ThemeShowcase.stories.js +112 -0
  151. package/dist/stories/options.d.ts +13 -0
  152. package/dist/stories/options.js +124 -0
  153. package/dist/theme/bime.d.ts +92 -0
  154. package/dist/theme/bime.js +352 -0
  155. package/dist/theme/index.d.ts +5 -0
  156. package/dist/theme/index.js +8 -0
  157. package/dist/theme/waipe.d.ts +102 -0
  158. package/dist/theme/waipe.js +362 -0
  159. package/package.json +53 -0
@@ -0,0 +1,589 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Button, VStack, Text, Box, HStack } from "@chakra-ui/react";
4
+ import { CustomModalNfe, StatusNFeResumeEnum, } from "../../../components/CustomModalNfe";
5
+ const meta = {
6
+ title: "Londrisoft/Components/CustomModalNfe",
7
+ component: CustomModalNfe,
8
+ tags: ["autodocs"],
9
+ args: {
10
+ isOpen: false,
11
+ onClose: () => { },
12
+ size: "2xl",
13
+ nfSelected: {
14
+ serie: "001",
15
+ nfnumero: 123456,
16
+ modelo: 55,
17
+ dataemissao: "2024-01-15T10:30:00Z",
18
+ datacancelado: "",
19
+ clicnpj: "12.345.678/0001-90",
20
+ agente: 1,
21
+ nomagente: "João Silva",
22
+ pedido: 789,
23
+ totalnota: 1500.75,
24
+ chave_nfe: "35200112345678000190550000001234567890123456",
25
+ tpamb: "1",
26
+ cliemail: "cliente@exemplo.com",
27
+ mensagem: "",
28
+ status: "100",
29
+ },
30
+ },
31
+ argTypes: {
32
+ isOpen: {
33
+ control: { type: "boolean" },
34
+ description: "Controla se o modal está aberto ou fechado. Deve ser gerenciado pelo componente pai.",
35
+ table: { category: "State" },
36
+ },
37
+ onClose: {
38
+ action: "closed",
39
+ description: "Função callback chamada quando o modal é fechado (clique no X, ESC, overlay, etc.).",
40
+ table: { category: "Events" },
41
+ },
42
+ size: {
43
+ control: { type: "select", options: ["sm", "md", "lg", "xl", "2xl"] },
44
+ description: "Tamanho do modal (largura do ModalContent). Padrão: '2xl'.",
45
+ table: { category: "Appearance" },
46
+ },
47
+ nfSelected: {
48
+ control: "object",
49
+ description: "Objeto com os dados da nota fiscal a ser exibida. Deve seguir a interface NFeNotaItem.",
50
+ table: { category: "Content" },
51
+ },
52
+ bodyOptions: {
53
+ control: "text",
54
+ description: "Conteúdo adicional opcional a ser exibido no corpo do modal. Aceita ReactNode.",
55
+ table: { category: "Content" },
56
+ },
57
+ },
58
+ parameters: {
59
+ docs: {
60
+ description: {
61
+ component: `
62
+ **CustomModalNfe** é um componente modal especializado para exibição de detalhes de Nota Fiscal Eletrônica (NFe), com suporte a diferentes status e formatação automática de dados.
63
+
64
+ ## Características Principais
65
+
66
+ - **Especializado em NFe**: Componente específico para exibição de dados de notas fiscais
67
+ - **Status Visuais**: Suporte a 6 status diferentes com cores e ícones específicos
68
+ - **Formatação Automática**: Formatação automática de chave de acesso (44 dígitos)
69
+ - **Cópia de Chave**: Funcionalidade de copiar chave de acesso com feedback visual
70
+ - **Layout Responsivo**: Campos organizados em grid flexível
71
+ - **Acessibilidade**: Implementação completa de ARIA labels e navegação por teclado
72
+ - **Extensível**: Suporte a conteúdo customizado via \`bodyOptions\`
73
+ - **Integração com Toast**: Feedback visual ao copiar chave de acesso
74
+
75
+ ## Casos de Uso Comuns
76
+
77
+ - **Visualização de NFe**: Exibir detalhes completos de uma nota fiscal
78
+ - **Status de Processamento**: Mostrar status atual da nota (aprovada, cancelada, etc.)
79
+ - **Cópia de Chave**: Permitir copiar chave de acesso para uso externo
80
+ - **Detalhes de Emissão**: Exibir série, número, modelo e data de emissão
81
+ - **Mensagens de Erro**: Exibir mensagens quando a nota contém "Arquivo XML"
82
+
83
+ ## Benefícios de UX
84
+
85
+ - **Feedback Visual Imediato**: Status claros com cores e ícones
86
+ - **Ações Rápidas**: Cópia de chave com um clique
87
+ - **Informação Organizada**: Layout claro e hierárquico
88
+ - **Acessibilidade**: Suporte completo para usuários com necessidades especiais
89
+ - **Consistência**: Padrão visual uniforme para todas as NFe
90
+
91
+ ## Status Suportados
92
+
93
+ - **100 (APPROVED)**: Nota fiscal aprovada - verde (alert.success)
94
+ - **101 (CANCELED)**: Nota fiscal cancelada - vermelho (alert.error)
95
+ - **102 (INUTILIZED)**: Nota fiscal inutilizada - vermelho (alert.error)
96
+ - **103 (DENIED)**: Nota fiscal não autorizada - amarelo (alert.warning)
97
+ - **104 (NOT_TRANSMITTED)**: Nota fiscal não transmitida - amarelo (alert.warning)
98
+ - **105 (WITH_ERROR)**: Nota fiscal rejeitada - amarelo (alert.warning)
99
+ `,
100
+ },
101
+ },
102
+ backgrounds: {
103
+ default: "light",
104
+ values: [
105
+ { name: "light", value: "#ffffff" },
106
+ { name: "dark", value: "#000000" },
107
+ ],
108
+ },
109
+ a11y: {
110
+ element: "#root",
111
+ },
112
+ },
113
+ };
114
+ export default meta;
115
+ /** 🎯 Default: Exemplo básico do CustomModalNfe */
116
+ export const Default = {
117
+ name: "Padrão",
118
+ render: (args) => {
119
+ const [isOpen, setIsOpen] = useState(false);
120
+ return (_jsxs(VStack, { spacing: 4, children: [_jsx(Button, { onClick: () => setIsOpen(true), children: "Abrir Modal NFe" }), _jsx(CustomModalNfe, Object.assign({}, args, { isOpen: isOpen, onClose: () => setIsOpen(false) }))] }));
121
+ },
122
+ parameters: {
123
+ docs: {
124
+ description: {
125
+ story: `
126
+ **Exemplo básico** do CustomModalNfe com configuração padrão.
127
+
128
+ **Características:**
129
+ - Modal com tamanho 2xl (padrão)
130
+ - Exibe dados básicos da nota fiscal
131
+ - Status aprovado (100)
132
+ - Chave de acesso formatada
133
+ - Botão de fechar funcional
134
+
135
+ **Casos de uso:**
136
+ - Visualização rápida de NFe
137
+ - Detalhes de nota aprovada
138
+ - Consulta de informações básicas
139
+
140
+ **Dicas de implementação:**
141
+ - Gerencie o estado \`isOpen\` no componente pai
142
+ - Forneça todos os dados obrigatórios em \`nfSelected\`
143
+ - Use \`onClose\` para atualizar o estado de abertura
144
+ `,
145
+ },
146
+ source: {
147
+ code: `
148
+ import React, { useState } from 'react';
149
+ import { CustomModalNfe, StatusNFeResumeEnum, NFeNotaItem } from './CustomModalNfe';
150
+ import { Button } from '@chakra-ui/react';
151
+
152
+ const BasicModalNfe = () => {
153
+ const [isOpen, setIsOpen] = useState(false);
154
+
155
+ const nfData: NFeNotaItem = {
156
+ serie: "001",
157
+ nfnumero: 123456,
158
+ modelo: 55,
159
+ dataemissao: "2024-01-15T10:30:00Z",
160
+ datacancelado: "",
161
+ clicnpj: "12.345.678/0001-90",
162
+ agente: 1,
163
+ nomagente: "João Silva",
164
+ pedido: 789,
165
+ totalnota: 1500.75,
166
+ chave_nfe: "35200112345678000190550000001234567890123456",
167
+ tpamb: "1",
168
+ cliemail: "cliente@exemplo.com",
169
+ mensagem: "",
170
+ status: "100",
171
+ };
172
+
173
+ return (
174
+ <>
175
+ <Button onClick={() => setIsOpen(true)}>Abrir Modal NFe</Button>
176
+ <CustomModalNfe
177
+ isOpen={isOpen}
178
+ onClose={() => setIsOpen(false)}
179
+ nfSelected={nfData}
180
+ />
181
+ </>
182
+ );
183
+ };
184
+ `,
185
+ language: "tsx",
186
+ },
187
+ },
188
+ },
189
+ };
190
+ /** 📊 Status: Demonstração de diferentes status */
191
+ export const Status = {
192
+ name: "Status",
193
+ render: () => {
194
+ const [isOpen, setIsOpen] = useState(false);
195
+ const [currentStatus, setCurrentStatus] = useState(StatusNFeResumeEnum.APPROVED);
196
+ const baseNfData = {
197
+ serie: "001",
198
+ nfnumero: 123456,
199
+ modelo: 55,
200
+ dataemissao: "2024-01-15T10:30:00Z",
201
+ datacancelado: "",
202
+ clicnpj: "12.345.678/0001-90",
203
+ agente: 1,
204
+ nomagente: "João Silva",
205
+ pedido: 789,
206
+ totalnota: 1500.75,
207
+ chave_nfe: "35200112345678000190550000001234567890123456",
208
+ tpamb: "1",
209
+ cliemail: "cliente@exemplo.com",
210
+ mensagem: "",
211
+ status: String(currentStatus),
212
+ };
213
+ const statusOptions = [
214
+ { value: StatusNFeResumeEnum.APPROVED, label: "Aprovada (100)" },
215
+ { value: StatusNFeResumeEnum.CANCELED, label: "Cancelada (101)" },
216
+ { value: StatusNFeResumeEnum.INUTILIZED, label: "Inutilizada (102)" },
217
+ { value: StatusNFeResumeEnum.DENIED, label: "Não Autorizada (103)" },
218
+ { value: StatusNFeResumeEnum.NOT_TRANSMITTED, label: "Não Transmitida (104)" },
219
+ { value: StatusNFeResumeEnum.WITH_ERROR, label: "Rejeitada (105)" },
220
+ ];
221
+ return (_jsxs(VStack, { spacing: 6, align: "stretch", children: [_jsxs(Box, { children: [_jsx(Text, { fontSize: "lg", fontWeight: "bold", mb: 3, children: "Selecione um Status" }), _jsx(HStack, { spacing: 2, flexWrap: "wrap", children: statusOptions.map((option) => (_jsx(Button, { size: "sm", onClick: () => {
222
+ setCurrentStatus(option.value);
223
+ setIsOpen(true);
224
+ }, colorScheme: currentStatus === option.value ? "blue" : "gray", children: option.label }, option.value))) })] }), _jsx(CustomModalNfe, { isOpen: isOpen, onClose: () => setIsOpen(false), nfSelected: baseNfData })] }));
225
+ },
226
+ parameters: {
227
+ docs: {
228
+ description: {
229
+ story: `
230
+ **Demonstração** dos diferentes status de NFe e suas representações visuais.
231
+
232
+ **Status disponíveis:**
233
+
234
+ 1. **Aprovada (100)**
235
+ - Cor: Verde (alert.success)
236
+ - Ícone: CheckCircle2Icon
237
+ - Mensagem: "Nota fiscal aprovada"
238
+
239
+ 2. **Cancelada (101)**
240
+ - Cor: Vermelho (alert.error)
241
+ - Ícone: XCircle
242
+ - Mensagem: "Nota fiscal cancelada"
243
+
244
+ 3. **Inutilizada (102)**
245
+ - Cor: Vermelho (alert.error)
246
+ - Ícone: CircleSlash
247
+ - Mensagem: "Nota fiscal inutilizada"
248
+
249
+ 4. **Não Autorizada (103)**
250
+ - Cor: Amarelo (alert.warning)
251
+ - Ícone: XCircle
252
+ - Mensagem: "Nota fiscal não autorizada"
253
+
254
+ 5. **Não Transmitida (104)**
255
+ - Cor: Amarelo (alert.warning)
256
+ - Ícone: XCircle
257
+ - Mensagem: "Nota fiscal não transmitida"
258
+
259
+ 6. **Rejeitada (105)**
260
+ - Cor: Amarelo (alert.warning)
261
+ - Ícone: XCircle
262
+ - Mensagem: "Nota fiscal rejeitada"
263
+
264
+ **Casos de uso:**
265
+ - Visualizar status atual da nota
266
+ - Identificar problemas rapidamente
267
+ - Feedback visual imediato
268
+
269
+ **Dicas de implementação:**
270
+ - Use cores consistentes para facilitar identificação
271
+ - Ícones ajudam na compreensão rápida
272
+ - Mensagens devem ser claras e objetivas
273
+ `,
274
+ },
275
+ },
276
+ },
277
+ };
278
+ /** 📋 Com Mensagem XML: Exibe textarea quando há mensagem com "Arquivo XML" */
279
+ export const WithXmlMessage = {
280
+ name: "Com Mensagem XML",
281
+ render: () => {
282
+ const [isOpen, setIsOpen] = useState(false);
283
+ const nfDataWithMessage = {
284
+ serie: "001",
285
+ nfnumero: 123456,
286
+ modelo: 55,
287
+ dataemissao: "2024-01-15T10:30:00Z",
288
+ datacancelado: "",
289
+ clicnpj: "12.345.678/0001-90",
290
+ agente: 1,
291
+ nomagente: "João Silva",
292
+ pedido: 789,
293
+ totalnota: 1500.75,
294
+ chave_nfe: "35200112345678000190550000001234567890123456",
295
+ tpamb: "1",
296
+ cliemail: "cliente@exemplo.com",
297
+ mensagem: "Arquivo XML não encontrado ou inválido. Verifique os dados e tente novamente.",
298
+ status: "105",
299
+ };
300
+ return (_jsxs(VStack, { spacing: 4, children: [_jsx(Button, { onClick: () => setIsOpen(true), children: "Abrir Modal com Mensagem XML" }), _jsx(CustomModalNfe, { isOpen: isOpen, onClose: () => setIsOpen(false), nfSelected: nfDataWithMessage })] }));
301
+ },
302
+ parameters: {
303
+ docs: {
304
+ description: {
305
+ story: `
306
+ **Demonstração** do comportamento quando a mensagem contém "Arquivo XML".
307
+
308
+ **Comportamento:**
309
+ - Quando \`mensagem\` contém "Arquivo XML", exibe \`CustomTextarea\` em vez de \`CustomInput\`
310
+ - Textarea permite visualizar mensagens longas
311
+ - Campo de chave de acesso não é exibido quando há mensagem XML
312
+
313
+ **Casos de uso:**
314
+ - Erros relacionados a arquivo XML
315
+ - Mensagens de validação longas
316
+ - Informações detalhadas sobre problemas
317
+
318
+ **Dicas de implementação:**
319
+ - Use mensagens claras e descritivas
320
+ - Considere truncamento para mensagens muito longas
321
+ - Forneça contexto suficiente para o usuário resolver o problema
322
+ `,
323
+ },
324
+ },
325
+ },
326
+ };
327
+ /** 🎨 Com Conteúdo Customizado: Usando bodyOptions */
328
+ export const WithCustomContent = {
329
+ name: "Com Conteúdo Customizado",
330
+ render: () => {
331
+ const [isOpen, setIsOpen] = useState(false);
332
+ const nfData = {
333
+ serie: "001",
334
+ nfnumero: 123456,
335
+ modelo: 55,
336
+ dataemissao: "2024-01-15T10:30:00Z",
337
+ datacancelado: "",
338
+ clicnpj: "12.345.678/0001-90",
339
+ agente: 1,
340
+ nomagente: "João Silva",
341
+ pedido: 789,
342
+ totalnota: 1500.75,
343
+ chave_nfe: "35200112345678000190550000001234567890123456",
344
+ tpamb: "1",
345
+ cliemail: "cliente@exemplo.com",
346
+ mensagem: "",
347
+ status: "100",
348
+ };
349
+ const customBodyContent = (_jsxs(Box, { mt: 4, p: 4, bg: "gray.50", borderRadius: "md", children: [_jsx(Text, { fontSize: "sm", fontWeight: "bold", mb: 2, children: "Informa\u00E7\u00F5es Adicionais" }), _jsxs(VStack, { align: "stretch", spacing: 2, children: [_jsxs(Text, { fontSize: "xs", children: [_jsx("strong", { children: "CNPJ Cliente:" }), " ", nfData.clicnpj] }), _jsxs(Text, { fontSize: "xs", children: [_jsx("strong", { children: "E-mail:" }), " ", nfData.cliemail] }), _jsxs(Text, { fontSize: "xs", children: [_jsx("strong", { children: "Pedido:" }), " ", nfData.pedido] }), _jsxs(Text, { fontSize: "xs", children: [_jsx("strong", { children: "Total:" }), " R$ ", nfData.totalnota.toFixed(2)] })] })] }));
350
+ return (_jsxs(VStack, { spacing: 4, children: [_jsx(Button, { onClick: () => setIsOpen(true), children: "Abrir Modal com Conte\u00FAdo Customizado" }), _jsx(CustomModalNfe, { isOpen: isOpen, onClose: () => setIsOpen(false), nfSelected: nfData, bodyOptions: customBodyContent })] }));
351
+ },
352
+ parameters: {
353
+ docs: {
354
+ description: {
355
+ story: `
356
+ **Demonstração** do uso de \`bodyOptions\` para adicionar conteúdo customizado.
357
+
358
+ **Funcionalidades:**
359
+ - \`bodyOptions\` permite adicionar qualquer ReactNode após os campos padrão
360
+ - Útil para informações adicionais, ações, ou conteúdo específico
361
+ - Mantém o layout consistente com o resto do modal
362
+
363
+ **Casos de uso:**
364
+ - Informações adicionais da nota
365
+ - Botões de ação (download, reenvio, etc.)
366
+ - Histórico de eventos
367
+ - Links relacionados
368
+
369
+ **Dicas de implementação:**
370
+ - Use para informações complementares
371
+ - Mantenha consistência visual
372
+ - Considere responsividade
373
+ - Não abuse - mantenha o modal focado
374
+ `,
375
+ },
376
+ },
377
+ },
378
+ };
379
+ /** 📏 Tamanhos: Demonstração de diferentes tamanhos */
380
+ export const Sizes = {
381
+ name: "Tamanhos",
382
+ render: () => {
383
+ const [isOpen, setIsOpen] = useState(false);
384
+ const [currentSize, setCurrentSize] = useState("2xl");
385
+ const nfData = {
386
+ serie: "001",
387
+ nfnumero: 123456,
388
+ modelo: 55,
389
+ dataemissao: "2024-01-15T10:30:00Z",
390
+ datacancelado: "",
391
+ clicnpj: "12.345.678/0001-90",
392
+ agente: 1,
393
+ nomagente: "João Silva",
394
+ pedido: 789,
395
+ totalnota: 1500.75,
396
+ chave_nfe: "35200112345678000190550000001234567890123456",
397
+ tpamb: "1",
398
+ cliemail: "cliente@exemplo.com",
399
+ mensagem: "",
400
+ status: "100",
401
+ };
402
+ const sizes = ["sm", "md", "lg", "xl", "2xl"];
403
+ return (_jsxs(VStack, { spacing: 6, align: "stretch", children: [_jsxs(Box, { children: [_jsx(Text, { fontSize: "lg", fontWeight: "bold", mb: 3, children: "Selecione um Tamanho" }), _jsx(HStack, { spacing: 2, flexWrap: "wrap", children: sizes.map((size) => (_jsx(Button, { size: "sm", onClick: () => {
404
+ setCurrentSize(size);
405
+ setIsOpen(true);
406
+ }, colorScheme: currentSize === size ? "blue" : "gray", children: size.toUpperCase() }, size))) })] }), _jsx(CustomModalNfe, { isOpen: isOpen, onClose: () => setIsOpen(false), nfSelected: nfData, size: currentSize })] }));
407
+ },
408
+ parameters: {
409
+ docs: {
410
+ description: {
411
+ story: `
412
+ **Demonstração** dos diferentes tamanhos disponíveis para o modal.
413
+
414
+ **Tamanhos disponíveis:**
415
+ - **sm**: Pequeno - ideal para informações mínimas
416
+ - **md**: Médio - uso geral
417
+ - **lg**: Grande - mais espaço para conteúdo
418
+ - **xl**: Extra grande - muito espaço
419
+ - **2xl**: Extra extra grande (padrão) - máximo espaço para NFe
420
+
421
+ **Casos de uso por tamanho:**
422
+ - **sm/md**: Visualização rápida em telas pequenas
423
+ - **lg/xl**: Uso geral em desktop
424
+ - **2xl**: Padrão recomendado para NFe (mais informações)
425
+
426
+ **Dicas de implementação:**
427
+ - Use 2xl como padrão para NFe (mais informações)
428
+ - Considere responsividade em telas menores
429
+ - Teste em diferentes resoluções
430
+ `,
431
+ },
432
+ },
433
+ },
434
+ };
435
+ /** 🔍 Casos Extremos: Edge cases e valores inválidos */
436
+ export const EdgeCases = {
437
+ name: "Casos Extremos",
438
+ render: () => {
439
+ const [isOpen, setIsOpen] = useState(false);
440
+ const [testCase, setTestCase] = useState("short");
441
+ const testCases = {
442
+ short: {
443
+ serie: "1",
444
+ nfnumero: 1,
445
+ modelo: 1,
446
+ dataemissao: "2024-01-01T00:00:00Z",
447
+ chave_nfe: "12345678901234567890123456789012345678901234",
448
+ status: "100",
449
+ },
450
+ long: {
451
+ serie: "999",
452
+ nfnumero: 999999999,
453
+ modelo: 999,
454
+ dataemissao: "2024-12-31T23:59:59Z",
455
+ chave_nfe: "35200112345678000190550000001234567890123456",
456
+ status: "100",
457
+ },
458
+ invalid: {
459
+ serie: "",
460
+ nfnumero: 0,
461
+ modelo: 0,
462
+ dataemissao: "invalid-date",
463
+ chave_nfe: "123", // chave inválida (menos de 44 caracteres)
464
+ status: "999", // status inválido
465
+ },
466
+ };
467
+ const nfData = Object.assign(Object.assign({}, testCases[testCase]), { datacancelado: "", clicnpj: "12.345.678/0001-90", agente: 1, nomagente: "João Silva", pedido: 789, totalnota: 1500.75, tpamb: "1", cliemail: "cliente@exemplo.com", mensagem: "" });
468
+ return (_jsxs(VStack, { spacing: 6, align: "stretch", children: [_jsxs(Box, { children: [_jsx(Text, { fontSize: "lg", fontWeight: "bold", mb: 3, children: "Teste Casos Extremos" }), _jsxs(HStack, { spacing: 2, flexWrap: "wrap", children: [_jsx(Button, { size: "sm", onClick: () => {
469
+ setTestCase("short");
470
+ setIsOpen(true);
471
+ }, colorScheme: testCase === "short" ? "blue" : "gray", children: "Valores M\u00EDnimos" }), _jsx(Button, { size: "sm", onClick: () => {
472
+ setTestCase("long");
473
+ setIsOpen(true);
474
+ }, colorScheme: testCase === "long" ? "blue" : "gray", children: "Valores M\u00E1ximos" }), _jsx(Button, { size: "sm", onClick: () => {
475
+ setTestCase("invalid");
476
+ setIsOpen(true);
477
+ }, colorScheme: testCase === "invalid" ? "blue" : "gray", children: "Valores Inv\u00E1lidos" })] })] }), _jsx(CustomModalNfe, { isOpen: isOpen, onClose: () => setIsOpen(false), nfSelected: nfData })] }));
478
+ },
479
+ parameters: {
480
+ docs: {
481
+ description: {
482
+ story: `
483
+ **Demonstração** de como o modal lida com casos extremos e valores inválidos.
484
+
485
+ **Casos testados:**
486
+
487
+ 1. **Valores Mínimos:**
488
+ - Série, número e modelo com valores mínimos
489
+ - Chave de acesso válida (44 caracteres)
490
+ - Status válido
491
+
492
+ 2. **Valores Máximos:**
493
+ - Série, número e modelo com valores máximos
494
+ - Chave de acesso válida
495
+ - Data no limite
496
+
497
+ 3. **Valores Inválidos:**
498
+ - Campos vazios ou zero
499
+ - Chave de acesso inválida (< 44 caracteres)
500
+ - Status inválido (999)
501
+ - Data inválida
502
+
503
+ **Comportamento esperado:**
504
+ - Chave de acesso com menos de 44 caracteres não é formatada
505
+ - Status inválido usa ícone padrão (XCircle)
506
+ - Campos vazios são exibidos como estão
507
+ - Data inválida pode causar erro na formatação
508
+
509
+ **Dicas de implementação:**
510
+ - Valide dados antes de passar para o modal
511
+ - Trate casos extremos no componente pai
512
+ - Forneça valores padrão quando apropriado
513
+ `,
514
+ },
515
+ },
516
+ },
517
+ };
518
+ /** ♿ Acessibilidade: Demonstração de recursos de acessibilidade */
519
+ export const Accessibility = {
520
+ name: "Acessibilidade",
521
+ render: () => {
522
+ const [isOpen, setIsOpen] = useState(false);
523
+ const nfData = {
524
+ serie: "001",
525
+ nfnumero: 123456,
526
+ modelo: 55,
527
+ dataemissao: "2024-01-15T10:30:00Z",
528
+ datacancelado: "",
529
+ clicnpj: "12.345.678/0001-90",
530
+ agente: 1,
531
+ nomagente: "João Silva",
532
+ pedido: 789,
533
+ totalnota: 1500.75,
534
+ chave_nfe: "35200112345678000190550000001234567890123456",
535
+ tpamb: "1",
536
+ cliemail: "cliente@exemplo.com",
537
+ mensagem: "",
538
+ status: "100",
539
+ };
540
+ return (_jsxs(VStack, { spacing: 4, children: [_jsxs(Box, { p: 4, bg: "blue.50", borderRadius: "md", maxW: "600px", children: [_jsx(Text, { fontSize: "sm", fontWeight: "bold", mb: 2, children: "Recursos de Acessibilidade" }), _jsxs(VStack, { align: "stretch", spacing: 2, fontSize: "xs", children: [_jsxs(Text, { children: ["\u2022 ", _jsx("strong", { children: "ARIA labels:" }), " aria-labelledby e aria-describedby configurados"] }), _jsxs(Text, { children: ["\u2022 ", _jsx("strong", { children: "Navega\u00E7\u00E3o por teclado:" }), " ESC fecha o modal, Tab navega entre elementos"] }), _jsxs(Text, { children: ["\u2022 ", _jsx("strong", { children: "Foco:" }), " Retorna ao elemento anterior ao fechar"] }), _jsxs(Text, { children: ["\u2022 ", _jsx("strong", { children: "Bot\u00E3o fechar:" }), " Acess\u00EDvel via teclado (Enter ou Espa\u00E7o)"] }), _jsxs(Text, { children: ["\u2022 ", _jsx("strong", { children: "\u00CDcone copiar:" }), " Acess\u00EDvel via teclado com aria-label"] }), _jsxs(Text, { children: ["\u2022 ", _jsx("strong", { children: "Sem\u00E2ntica:" }), " Uso correto de roles e labels"] })] })] }), _jsx(Button, { onClick: () => setIsOpen(true), children: "Abrir Modal (Teste Acessibilidade)" }), _jsx(CustomModalNfe, { isOpen: isOpen, onClose: () => setIsOpen(false), nfSelected: nfData })] }));
541
+ },
542
+ parameters: {
543
+ docs: {
544
+ description: {
545
+ story: `
546
+ **Demonstração** dos recursos de acessibilidade implementados no modal.
547
+
548
+ **Recursos de Acessibilidade:**
549
+
550
+ 1. **ARIA Labels:**
551
+ - \`aria-labelledby="modal-nfe-title"\` - vincula título ao modal
552
+ - \`aria-describedby="modal-nfe-description"\` - vincula descrição ao modal
553
+ - \`aria-label\` nos botões de ação
554
+
555
+ 2. **Navegação por Teclado:**
556
+ - **ESC**: Fecha o modal
557
+ - **Tab**: Navega entre elementos focáveis
558
+ - **Enter/Espaço**: Ativa botões e ações
559
+
560
+ 3. **Foco:**
561
+ - Foco automático no primeiro elemento ao abrir
562
+ - Retorna foco ao elemento anterior ao fechar
563
+ - Gerenciamento correto de foco durante interações
564
+
565
+ 4. **Semântica:**
566
+ - Uso correto de \`role="button"\` em elementos clicáveis
567
+ - \`tabIndex={0}\` em elementos interativos
568
+ - Labels descritivos para leitores de tela
569
+
570
+ 5. **Leitores de Tela:**
571
+ - Anúncio correto do título e descrição
572
+ - Feedback ao copiar chave de acesso
573
+ - Navegação lógica entre elementos
574
+
575
+ **Conformidade WCAG:**
576
+ - ✅ Nível A: Contraste, navegação, labels
577
+ - ✅ Nível AA: Foco visível, teclado, semântica
578
+ - ✅ Boas práticas: Feedback, orientação, consistência
579
+
580
+ **Dicas de implementação:**
581
+ - Teste com leitores de tela (NVDA, JAWS, VoiceOver)
582
+ - Valide com ferramentas de acessibilidade
583
+ - Mantenha labels atualizados
584
+ - Teste navegação apenas por teclado
585
+ `,
586
+ },
587
+ },
588
+ },
589
+ };
@@ -0,0 +1,15 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { MultiSelectLikeSelect } from "../../../components/CustomMultSelect";
3
+ declare const meta: Meta<typeof MultiSelectLikeSelect>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof MultiSelectLikeSelect>;
6
+ /** 🎯 Exemplo básico do CustomMultSelect */
7
+ export declare const Default: Story;
8
+ /** 🎨 Exemplo com diferentes tamanhos e configurações */
9
+ export declare const SizesAndConfigurations: Story;
10
+ /** 🏛️ Exemplo com bancos e conversão obrigatória */
11
+ export declare const AllBanks: Story;
12
+ /** 🎯 Exemplo controlado */
13
+ export declare const Controlled: Story;
14
+ /** 🎯 Exemplo com cenários reais */
15
+ export declare const RealWorldScenarios: Story;