conectar_design_system 0.1.0
conectar_design_system: ^0.1.0 copied to clipboard
Conectar Design System - Biblioteca completa de componentes reutilizáveis para Flutter com showcase interativo
Conectar Design System #
Um sistema de design completo para Flutter que fornece componentes reutilizáveis, utilitários e padrões de interface consistentes para aplicações da Conectar.
📋 Índice #
🚀 Instalação #
Adicione o seguinte ao seu pubspec.yaml:
dependencies:
conectar_design_system:
git:
url: https://github.com/seu-usuario/conectar_design_system.git
ref: main
⚙️ Configuração #
Inicialização básica #
import 'package:conectar_design_system/conectar_design_system.dart';
void main() {
// Configuração opcional do sistema
ConectarDesignSystem.init(
systemSettings: ConectarSettings(
primaryColor: Color(0xff1bb17a),
backgroundColor: Color(0xFFfafafa),
successColor: Color(0xFF4CAF50),
textColor: Color(0xFF000000),
borderColor: Color(0xFFDEE2E6),
cardRadius: 6,
paddingDefault: 16,
),
);
runApp(MyApp());
}
Configurações Disponíveis #
primaryColor: Cor principal do tema (padrão: #1bb17a)backgroundColor: Cor de fundo (padrão: #fafafa)successColor: Cor de sucesso (padrão: #4CAF50)textColor: Cor do texto (padrão: #000000)borderColor: Cor das bordas (padrão: #DEE2E6)cardRadius: Raio dos cartões (padrão: 6)paddingDefault: Padding padrão (padrão: 16)
🧩 Componentes #
Botões #
MyButton
Botão principal com estilo customizável.
MyButton(
text: "Confirmar",
onPressed: () => print("Botão pressionado"),
width: 200,
height: 48,
backgroundColor: Colors.blue,
icon: Icon(Icons.check),
)
MyFlatButton
Botão sem preenchimento para ações secundárias.
MyFlatButton(
text: "Cancelar",
onPressed: () => print("Cancelar"),
)
MyLinkButton
Botão estilo link para navegação.
MyLinkButton(
text: "Esqueceu a senha?",
onPressed: () => Navigator.push(...),
)
Campos de Formulário #
MyTextFormField
Campo de texto com validação e customização completa.
MyTextFormField(
label: "Nome completo",
hintText: "Digite seu nome",
controller: nameController,
validator: (value) => value?.isEmpty == true ? "Campo obrigatório" : null,
required: true,
prefixIcon: Icon(Icons.person),
maxLength: 50,
textCapitalization: TextCapitalization.words,
)
MyDrowdownFormField
Dropdown com integração ao BaseModel.
MyDrowdownFormField<StatusModel>(
label: "Status",
items: statusList,
selectedItem: currentStatus,
onChanged: (status) => setState(() => currentStatus = status),
validator: (value) => value == null ? "Selecione um status" : null,
required: true,
)
MyCurrencyFormField
Campo especializado para valores monetários.
MyCurrencyFormField(
label: "Valor",
controller: valueController,
onChanged: (value) => print("Valor: $value"),
validator: (value) => value?.isEmpty == true ? "Informe o valor" : null,
)
MyDebouncedTextFormField
Campo de texto com debounce para busca em tempo real.
MyDebouncedTextFormField(
label: "Buscar produto",
onChanged: (value) => searchProducts(value),
debounceTime: Duration(milliseconds: 500),
)
MyMultiSelectDropdownFormField
Dropdown com seleção múltipla.
MyMultiSelectDropdownFormField<CategoryModel>(
label: "Categorias",
items: categories,
selectedItems: selectedCategories,
onChanged: (selected) => setState(() => selectedCategories = selected),
)
Cartões e Containers #
MyBaseCard
Container base com título e estilo consistente.
MyBaseCard(
title: "Informações do Usuário",
subTitle: "Dados pessoais e de contato",
showBullet: true,
bulletColor: Colors.green,
child: Column(
children: [
// Conteúdo do cartão
],
),
)
CustomDialog (MyModalView)
Modal customizável para exibição de conteúdo.
showDialog(
context: context,
builder: (context) => CustomDialog(
width: 400,
height: 300,
child: YourContentWidget(),
),
);
Navegação #
MyTabbar
Barra de abas customizável.
MyTabbar(
tabs: ["Aba 1", "Aba 2", "Aba 3"],
onTabChanged: (index) => print("Aba $index selecionada"),
)
Feedback #
MyAlertView
Sistema de alertas e diálogos.
MyAlertView(context).show(
message: "Operação realizada com sucesso!",
buttonTitle: "OK",
onPressedOk: () => Navigator.pop(context),
);
MyAnimatedStarRating
Sistema de avaliação com estrelas animadas.
MyAnimatedStarRating(
rating: 4.5,
onRatingChanged: (rating) => print("Avaliação: $rating"),
starCount: 5,
)
CustomLoadingOverlay
Overlay de carregamento.
CustomLoadingOverlay(
isLoading: isLoadingData,
child: YourContentWidget(),
)
MyNotificationIcon
Ícone de notificação com contador.
MyNotificationIcon(
notificationCount: 5,
onTap: () => Navigator.push(...),
)
Seleção #
MyCheckboxGroup
Grupo de checkboxes com validação.
MyCheckboxGroup<OptionModel>(
options: availableOptions,
onChanged: (selected) => print("Selecionados: $selected"),
label: "Selecione as opções",
required: true,
validator: (selected) => selected?.isEmpty == true ? "Selecione ao menos uma opção" : null,
)
MyRoundedCheckbox
Checkbox com estilo arredondado.
MyRoundedCheckbox(
value: isChecked,
onChanged: (value) => setState(() => isChecked = value),
label: "Aceito os termos de uso",
)
MyRadionOptions
Grupo de radio buttons.
MyRadionOptions<String>(
options: ["Opção 1", "Opção 2", "Opção 3"],
selectedValue: selectedOption,
onChanged: (value) => setState(() => selectedOption = value),
)
MySwitchButton
Switch personalizado.
MySwitchButton(
value: isEnabled,
onChanged: (value) => setState(() => isEnabled = value),
label: "Ativar notificações",
)
Mídia #
MyImagePicker
Seletor de imagens com suporte web e mobile.
MyImagePicker(
onImageSelected: (image) => print("Imagem selecionada: $image"),
width: 200,
height: 200,
label: "Selecionar foto de perfil",
imageUrl: currentImageUrl,
)
Tabelas #
MyTableView
Tabela completa com paginação e funcionalidades avançadas.
MyTableView<UserModel>(
title: "Lista de Usuários",
model: paginatedUsers,
columns: [
TableColumn(key: "name", label: "Nome"),
TableColumn(key: "email", label: "E-mail"),
TableColumn(key: "status", label: "Status"),
],
onTap: (user) => editUser(user),
onNext: (page) => loadPage(page),
onPrevious: (page) => loadPage(page),
onAdd: () => createNewUser(),
)
Outros Componentes #
MySearchField
Campo de busca especializado.
MySearchField(
hintText: "Buscar...",
onChanged: (query) => performSearch(query),
onClear: () => clearSearch(),
)
MyPaginatedComponent
Componente de paginação.
MyPaginatedComponent(
currentPage: currentPage,
totalPages: totalPages,
onPageChanged: (page) => loadPage(page),
)
MyFilterView
Interface para filtros.
MyFilterView(
filters: availableFilters,
selectedFilters: currentFilters,
onFiltersChanged: (filters) => applyFilters(filters),
)
MyCalendarPicker
Seletor de datas.
MyCalendarPicker(
selectedDate: selectedDate,
onDateSelected: (date) => setState(() => selectedDate = date),
label: "Data de nascimento",
)
MyRegisterSteps
Componente para fluxos de registro com etapas.
MyRegisterSteps(
currentStep: currentStep,
totalSteps: 4,
onStepChanged: (step) => navigateToStep(step),
)
🛠️ Utilitários #
Responsive #
Utilitário para responsividade.
Responsive.isMobile(context)
Responsive.isTablet(context)
Responsive.isDesktop(context)
Debounce #
Utilitário para debounce de funções.
final debouncer = Debouncer(milliseconds: 500);
debouncer.run(() => performSearch(query));
RequestHandler #
Manipulador de requisições HTTP.
final handler = RequestHandler();
final response = await handler.get('/api/users');
DocumentValidator #
Validador de documentos brasileiros.
DocumentValidator.isValidCPF(cpf)
DocumentValidator.isValidCNPJ(cnpj)
📊 Modelos #
BaseModel #
Classe base para todos os modelos.
class UserModel extends BaseModel {
final String name;
final String email;
UserModel({required this.name, required this.email});
@override
String get label => name;
@override
String get value => email;
}
PaginatedModel #
Modelo para dados paginados.
PaginatedModel<UserModel>(
data: users,
currentPage: 1,
totalPages: 10,
totalItems: 100,
)
✅ Validadores #
TaxInputFormatter #
Formatador para documentos fiscais.
TextFormField(
inputFormatters: [TaxInputFormatter()],
)
🔧 Extensões #
DateExtension #
Extensões para DateTime.
DateTime.now().formatBR() // "25/12/2023"
DateTime.now().isToday()
StringExtension #
Extensões para String.
"João Silva".initials() // "JS"
"12345678000195".formatCNPJ() // "12.345.678/0001-95"
📱 Exemplo de Uso Completo #
import 'package:flutter/material.dart';
import 'package:conectar_design_system/conectar_design_system.dart';
class ExamplePage extends StatefulWidget {
@override
_ExamplePageState createState() => _ExamplePageState();
}
class _ExamplePageState extends State<ExamplePage> {
final _formKey = GlobalKey<FormState>();
final _nameController = TextEditingController();
final _emailController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Exemplo")),
body: Form(
key: _formKey,
child: MyBaseCard(
title: "Cadastro de Usuário",
child: Column(
children: [
MyTextFormField(
label: "Nome",
controller: _nameController,
required: true,
validator: (value) => value?.isEmpty == true ? "Campo obrigatório" : null,
),
SizedBox(height: 16),
MyTextFormField(
label: "E-mail",
controller: _emailController,
keyboardType: TextInputType.emailAddress,
required: true,
validator: (value) => value?.isEmpty == true ? "Campo obrigatório" : null,
),
SizedBox(height: 24),
MyButton(
text: "Salvar",
onPressed: () {
if (_formKey.currentState?.validate() == true) {
// Processar dados
MyAlertView(context).show(
message: "Usuário cadastrado com sucesso!",
);
}
},
),
],
),
),
),
);
}
}
🤝 Contribuição #
Para contribuir com o projeto:
- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
📄 Licença #
Este projeto está sob a licença especificada no arquivo LICENSE.
🌐 Links #
Versão atual: 0.0.39