first commit

This commit is contained in:
2025-03-07 00:29:07 -06:00
commit b21a11c2ee
564 changed files with 94041 additions and 0 deletions

View File

@ -0,0 +1,63 @@
@props([
'type' => 'button', // Tipo de botón: button, submit, reset (solo para botones)
'href' => null, // URL si es un enlace
'route' => null, // URL si es un enlace
'target' => '_self', // Target del enlace (_self, _blank, etc.)
'label' => '', // Texto del botón
'size' => 'md', // Tamaño: xs, sm, md, lg, xl
'variant' => 'primary', // Color del botón (primary, secondary, success, danger, warning, info, dark)
'labelStyle' => false, // Usa `btn-label-*`
'outline' => false, // Habilitar estilo outline
'textStyle' => false, // Habilitar estilo de texto
'rounded' => false, // Habilitar bordes redondeados
'block' => false, // Convertir en botón de ancho completo
'waves' => true, // Habilitar efecto Vuexy (waves-effect)
'icon' => '', // Clases del ícono (ej: 'ti ti-home')
'iconOnly' => false, // Botón solo con ícono
'iconPosition' => 'left', // Posición del ícono: left, right
'active' => false, // Activar estado de botón
'disabled' => false, // Deshabilitar botón
'attributes' => new \Illuminate\View\ComponentAttributeBag([]), // Atributos adicionales
])
@php
// Generar clases dinámicas
$classes = [
'btn',
$labelStyle ? "btn-label-$variant" : '',
$outline ? "btn-outline-$variant" : '',
$textStyle ? "btn-text-$variant" : '',
$labelStyle || $outline || $textStyle ? '' : "btn-$variant",
$rounded ? 'rounded-pill' : '',
$block ? 'd-block w-100' : '',
$waves ? 'waves-effect' : '',
$size !== 'md' ? "btn-$size" : '',
$active ? 'active' : '',
$disabled ? 'disabled' : '',
$iconOnly ? 'btn-icon' : '',
];
@endphp
@if ($href || $route)
{{-- Si es un enlace --}}
<a {{ $attributes->merge(['class' => implode(' ', array_filter($classes)), 'href' => ($href?? route($route)), 'target' => $target]) }}>
@if ($icon && $iconPosition === 'left')
<i class="{{ $icon }} {{ $label ? 'me-2' : '' }}"></i>
@endif
{{ $label }}
@if ($icon && $iconPosition === 'right')
<i class="{{ $icon }} {{ $label ? 'ms-2' : '' }}"></i>
@endif
</a>
@else
{{-- Si es un botón --}}
<button type="{{ $type }}" {{ $attributes->merge(['class' => implode(' ', array_filter($classes))]) }}>
@if ($icon && $iconPosition === 'left')
<i class="{{ $icon }} {{ $label ? 'me-2' : '' }}"></i>
@endif
{{ $label }}
@if ($icon && $iconPosition === 'right')
<i class="{{ $icon }} {{ $label ? 'ms-2' : '' }}"></i>
@endif
</button>
@endif

View File

@ -0,0 +1,46 @@
@props([
'buttons' => [], // Lista de botones en formato de array
'toolbar' => false, // Si es un grupo de botones estilo "toolbar"
'nesting' => false, // Si hay un grupo anidado con dropdown
'class' => '', // Clases adicionales
])
@php
// Determinar si es un toolbar o un grupo simple
$groupClass = $toolbar ? 'btn-toolbar' : 'btn-group';
@endphp
<div class="{{ $groupClass }} {{ $class }}" role="group" aria-label="Button group">
@foreach($buttons as $button)
@if(isset($button['dropdown']))
{{-- Botón con dropdown anidado --}}
<div class="btn-group" role="group">
<button id="btnGroupDrop{{ $loop->index }}" type="button" class="btn {{ $button['variant'] ?? 'btn-outline-secondary' }} dropdown-toggle waves-effect" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
@if(isset($button['icon'])) <i class="{{ $button['icon'] }} ti-md"></i> @endif
<span class="d-none d-sm-block">{{ $button['label'] ?? 'Dropdown' }}</span>
</button>
<div class="dropdown-menu" aria-labelledby="btnGroupDrop{{ $loop->index }}">
@foreach($button['dropdown'] as $dropdownItem)
<a class="dropdown-item waves-effect" href="{{ $dropdownItem['href'] ?? 'javascript:void(0);' }}">
{{ $dropdownItem['label'] }}
</a>
@endforeach
</div>
</div>
@else
{{-- Botón normal o ancla --}}
@if(isset($button['href']))
<a href="{{ route($button['href']) }}" class="btn {{ $button['variant'] ?? 'btn-outline-secondary' }} waves-effect">
@if(isset($button['icon'])) <i class="{{ $button['icon'] }} ti-md"></i> @endif
{{ $button['label'] }}
</a>
@else
<button type="{{ $button['type'] ?? 'button' }}" class="btn {{ $button['variant'] ?? 'btn-outline-secondary' }} waves-effect"
{{ $button['disabled'] ?? false ? 'disabled' : '' }}>
@if(isset($button['icon'])) <i class="{{ $button['icon'] }} ti-md"></i> @endif
{{ $button['label'] }}
</button>
@endif
@endif
@endforeach
</div>

View File

@ -0,0 +1,30 @@
@php
use Illuminate\Support\Str;
@endphp
@props([
'label' => '',
'tagName' => '',
'icon' => 'ti ti-pencil-plus',
])
@php
$tagOffcanvas = ucfirst(Str::camel($tagName));
$helperTag = Str::kebab($tagName);
$ariaControls = "'offcanvas{$tagOffcanvas}";
$dataBsToggle = 'offcanvas';
$dataBsTarget = "#offcanvas{$tagOffcanvas}";
$onclick = "window.formHelpers['{$helperTag}'].reloadOffcanvas('create')";
@endphp
<button
type="button"
class="btn btn-primary waves-effect waves-light"
tabindex="0"
aria-controls='{{ $ariaControls }}'
data-bs-toggle="{{ $dataBsToggle }}"
data-bs-target="{{ $dataBsTarget }}"
onclick="{!! $onclick !!}">
<span class="ti-xs {{ $icon }} me-2"></span>{{ ucfirst($label) }}
</button>

View File

@ -0,0 +1,18 @@
@props([
'tagName' => '',
'mode' => 'create',
])
@php
$helperTag = Str::kebab($tagName);
$onclick = "window.formHelpers['{$helperTag}'].reloadOffcanvas('reset')";
@endphp
<div class="pt-3">
<button type="submit" class="btn btn-submit waves-effect waves mr-3 mb-3"></button>
<button type="reset" class="btn btn-reset mr-3 mb-3" onclick="{{ $onclick }}" data-bs-dismiss="offcanvas" aria-label="Close">Cancelar</button>
</div>
@if($mode == 'delete')
<x-vuexy-admin::form.checkbox model="confirmDeletion" label="Confirmar eliminación" parentClass="confirm-deletion" data-always-enabled switch switch-type="square" color="danger" size="lg" with-icon />
@endif