superdesign
This commit is contained in:
274
.superdesign/init/components.md
Normal file
274
.superdesign/init/components.md
Normal file
@@ -0,0 +1,274 @@
|
||||
# Shared UI Components
|
||||
|
||||
## Blade Components (Reusable)
|
||||
|
||||
### 1. `x-action-message`
|
||||
**Path:** `resources/views/components/action-message.blade.php`
|
||||
|
||||
Displays a temporary status message that auto-hides after 2 seconds using Alpine.js.
|
||||
|
||||
**Props:**
|
||||
- `on`: Event name to listen for (Livewire event)
|
||||
|
||||
**Features:**
|
||||
- Transition animation with fade-out
|
||||
- Auto-hide timeout (2000ms)
|
||||
- Default text: "Saved."
|
||||
|
||||
```blade
|
||||
@props([
|
||||
'on',
|
||||
])
|
||||
|
||||
<div
|
||||
x-data="{ shown: false, timeout: null }"
|
||||
x-init="@this.on('{{ $on }}', () => { clearTimeout(timeout); shown = true; timeout = setTimeout(() => { shown = false }, 2000); })"
|
||||
x-show.transition.out.opacity.duration.1500ms="shown"
|
||||
x-transition:leave.opacity.duration.1500ms
|
||||
style="display: none"
|
||||
{{ $attributes->merge(['class' => 'text-sm']) }}
|
||||
>
|
||||
{{ $slot->isEmpty() ? __('Saved.') : $slot }}
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. `x-app-logo`
|
||||
**Path:** `resources/views/components/app-logo.blade.php`
|
||||
|
||||
Main app branding component. Renders as `flux:brand` (header) or `flux:sidebar.brand` (sidebar variant).
|
||||
|
||||
**Props:**
|
||||
- `sidebar` (bool): If true, renders sidebar variant
|
||||
- Inherits Flux component attributes
|
||||
|
||||
**Features:**
|
||||
- Dynamic logo rendering based on context (header vs sidebar)
|
||||
- Uses `x-app-logo-icon` for icon
|
||||
- Passes through attributes to Flux components
|
||||
|
||||
```blade
|
||||
@props([
|
||||
'sidebar' => false,
|
||||
])
|
||||
|
||||
@if($sidebar)
|
||||
<flux:sidebar.brand name="Laravel Starter Kit" {{ $attributes }}>
|
||||
<x-slot name="logo" class="flex aspect-square size-8 items-center justify-center rounded-md bg-accent-content text-accent-foreground">
|
||||
<x-app-logo-icon class="size-5 fill-current text-white dark:text-black" />
|
||||
</x-slot>
|
||||
</flux:sidebar.brand>
|
||||
@else
|
||||
<flux:brand name="Laravel Starter Kit" {{ $attributes }}>
|
||||
<x-slot name="logo" class="flex aspect-square size-8 items-center justify-center rounded-md bg-accent-content text-accent-foreground">
|
||||
<x-app-logo-icon class="size-5 fill-current text-white dark:text-black" />
|
||||
</x-slot>
|
||||
</flux:brand>
|
||||
@endif
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. `x-app-logo-icon`
|
||||
**Path:** `resources/views/components/app-logo-icon.blade.php`
|
||||
|
||||
SVG icon for the application logo. Geometric design with fills.
|
||||
|
||||
**Features:**
|
||||
- Scalable SVG
|
||||
- Uses `currentColor` for dynamic styling
|
||||
- Can be sized with Tailwind classes
|
||||
|
||||
```blade
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 42" {{ $attributes }}>
|
||||
<path
|
||||
fill="currentColor"
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M17.2 5.633 8.6.855 0 5.633v26.51l16.2 9 16.2-9v-8.442l7.6-4.223V9.856l-8.6-4.777-8.6 4.777V18.3l-5.6 3.111V5.633ZM38 18.301l-5.6 3.11v-6.157l5.6-3.11V18.3Zm-1.06-7.856-5.54 3.078-5.54-3.079 5.54-3.078 5.54 3.079ZM24.8 18.3v-6.157l5.6 3.111v6.158L24.8 18.3Zm-1 1.732 5.54 3.078-13.14 7.302-5.54-3.078 13.14-7.3v-.002Zm-16.2 7.89 7.6 4.222V38.3L2 30.966V7.92l5.6 3.111v16.892ZM8.6 9.3 3.06 6.222 8.6 3.143l5.54 3.08L8.6 9.3Zm21.8 15.51-13.2 7.334V38.3l13.2-7.334v-6.156ZM9.6 11.034l5.6-3.11v14.6l-5.6 3.11v-14.6Z"
|
||||
/>
|
||||
</svg>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. `x-auth-header`
|
||||
**Path:** `resources/views/components/auth-header.blade.php`
|
||||
|
||||
Centered header for authentication pages with title and description.
|
||||
|
||||
**Props:**
|
||||
- `title`: Main heading text
|
||||
- `description`: Subheading/description text
|
||||
|
||||
**Features:**
|
||||
- Centered layout
|
||||
- Uses Flux typography components
|
||||
|
||||
```blade
|
||||
@props([
|
||||
'title',
|
||||
'description',
|
||||
])
|
||||
|
||||
<div class="flex w-full flex-col text-center">
|
||||
<flux:heading size="xl">{{ $title }}</flux:heading>
|
||||
<flux:subheading>{{ $description }}</flux:subheading>
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. `x-auth-session-status`
|
||||
**Path:** `resources/views/components/auth-session-status.blade.php`
|
||||
|
||||
Displays session status messages (typically success messages after redirect).
|
||||
|
||||
**Props:**
|
||||
- `status`: Status message text (if present)
|
||||
- Passes through attributes
|
||||
|
||||
**Features:**
|
||||
- Conditional rendering (only shows if status exists)
|
||||
- Green success styling
|
||||
|
||||
```blade
|
||||
@props([
|
||||
'status',
|
||||
])
|
||||
|
||||
@if ($status)
|
||||
<div {{ $attributes->merge(['class' => 'font-medium text-sm text-green-600']) }}>
|
||||
{{ $status }}
|
||||
</div>
|
||||
@endif
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. `x-desktop-user-menu`
|
||||
**Path:** `resources/views/components/desktop-user-menu.blade.php`
|
||||
|
||||
User profile dropdown menu with settings and logout options. Uses Flux components.
|
||||
|
||||
**Features:**
|
||||
- Sidebar profile with dropdown
|
||||
- Shows user avatar, name, and email
|
||||
- Menu items: Settings (cog icon), Logout (arrow icon)
|
||||
- Logout form with CSRF protection
|
||||
- Data test attributes for testing
|
||||
|
||||
```blade
|
||||
<flux:dropdown position="bottom" align="start">
|
||||
<flux:sidebar.profile
|
||||
:name="auth()->user()->name"
|
||||
:initials="auth()->user()->initials()"
|
||||
icon:trailing="chevrons-up-down"
|
||||
data-test="sidebar-menu-button"
|
||||
/>
|
||||
|
||||
<flux:menu>
|
||||
<div class="flex items-center gap-2 px-1 py-1.5 text-start text-sm">
|
||||
<flux:avatar
|
||||
:name="auth()->user()->name"
|
||||
:initials="auth()->user()->initials()"
|
||||
/>
|
||||
<div class="grid flex-1 text-start text-sm leading-tight">
|
||||
<flux:heading class="truncate">{{ auth()->user()->name }}</flux:heading>
|
||||
<flux:text class="truncate">{{ auth()->user()->email }}</flux:text>
|
||||
</div>
|
||||
</div>
|
||||
<flux:menu.separator />
|
||||
<flux:menu.radio.group>
|
||||
<flux:menu.item :href="route('profile.edit')" icon="cog" wire:navigate>
|
||||
{{ __('Settings') }}
|
||||
</flux:menu.item>
|
||||
<form method="POST" action="{{ route('logout') }}" class="w-full">
|
||||
@csrf
|
||||
<flux:menu.item
|
||||
as="button"
|
||||
type="submit"
|
||||
icon="arrow-right-start-on-rectangle"
|
||||
class="w-full cursor-pointer"
|
||||
data-test="logout-button"
|
||||
>
|
||||
{{ __('Log out') }}
|
||||
</flux:menu.item>
|
||||
</form>
|
||||
</flux:menu.radio.group>
|
||||
</flux:menu>
|
||||
</flux:dropdown>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7. `x-placeholder-pattern`
|
||||
**Path:** `resources/views/components/placeholder-pattern.blade.php`
|
||||
|
||||
SVG placeholder pattern for skeleton/loading states. Diagonal line pattern.
|
||||
|
||||
**Props:**
|
||||
- `id`: Unique pattern ID (auto-generated)
|
||||
|
||||
**Features:**
|
||||
- Reusable SVG pattern definition
|
||||
- Can be styled with Tailwind stroke classes
|
||||
- Used in dashboard placeholder cards
|
||||
|
||||
```blade
|
||||
@props([
|
||||
'id' => uniqid(),
|
||||
])
|
||||
|
||||
<svg {{ $attributes }} fill="none">
|
||||
<defs>
|
||||
<pattern id="pattern-{{ $id }}" x="0" y="0" width="8" height="8" patternUnits="userSpaceOnUse">
|
||||
<path d="M-1 5L5 -1M3 9L8.5 3.5" stroke-width="0.5"></path>
|
||||
</pattern>
|
||||
</defs>
|
||||
<rect stroke="none" fill="url(#pattern-{{ $id }})" width="100%" height="100%"></rect>
|
||||
</svg>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Flux UI Components Used
|
||||
|
||||
Flux v2 components extensively used throughout the application:
|
||||
|
||||
- **Layout:** `flux:header`, `flux:sidebar`, `flux:main`, `flux:spacer`
|
||||
- **Navigation:** `flux:navbar`, `flux:navbar.item`, `flux:sidebar.nav`, `flux:sidebar.item`, `flux:sidebar.group`
|
||||
- **Forms:** `flux:input`, `flux:select`, `flux:checkbox`, `flux:button`
|
||||
- **Typography:** `flux:heading`, `flux:subheading`, `flux:text`
|
||||
- **Dropdowns/Menus:** `flux:dropdown`, `flux:menu`, `flux:menu.item`, `flux:menu.separator`
|
||||
- **UI Elements:** `flux:badge`, `flux:avatar`, `flux:brand`, `flux:profile`
|
||||
- **Other:** `flux:tooltip`, `flux:separator`, `flux:link`
|
||||
|
||||
---
|
||||
|
||||
## Flux Custom Icons
|
||||
|
||||
Located in `resources/views/flux/icon/`:
|
||||
- `layout-grid.blade.php`
|
||||
- `folder-git-2.blade.php`
|
||||
- `chevrons-up-down.blade.php`
|
||||
- `book-open-text.blade.php`
|
||||
|
||||
These extend Flux's default icon library.
|
||||
|
||||
---
|
||||
|
||||
## Alpine.js Data Objects
|
||||
|
||||
### `stationMap`
|
||||
**Path:** `resources/js/maps/station-map.js`
|
||||
|
||||
Leaflet map integration for displaying fuel stations:
|
||||
- Initializes map centered on UK
|
||||
- Plots colored circle markers for stations
|
||||
- Color coding: green (current), slate (recent), amber (stale), red (outdated)
|
||||
- Popup display with station details
|
||||
- Responsive bounds fitting
|
||||
- Watches for data changes via Alpine
|
||||
|
||||
Reference in New Issue
Block a user