mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-23 16:11:08 -05:00
454 lines
12 KiB
Markdown
454 lines
12 KiB
Markdown
# ThrillWiki Component Library
|
|
|
|
This document catalogs all reusable UI components available in ThrillWiki.
|
|
|
|
## Layout Components
|
|
|
|
### Page Header
|
|
|
|
Standardized header for pages with optional actions and breadcrumbs.
|
|
|
|
```django
|
|
{% include 'components/layout/page_header.html' with
|
|
title='Parks'
|
|
subtitle='Browse theme parks worldwide'
|
|
icon='fas fa-map-marker-alt'
|
|
primary_action_url='/parks/create/'
|
|
primary_action_text='Add Park'
|
|
primary_action_icon='fas fa-plus'
|
|
%}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Description |
|
|
|-----------|------|-------------|
|
|
| `title` | string | Page title (required) |
|
|
| `subtitle` | string | Optional subtitle |
|
|
| `icon` | string | Icon class for title |
|
|
| `primary_action_url` | string | URL for primary action button |
|
|
| `primary_action_text` | string | Text for primary action |
|
|
| `primary_action_icon` | string | Icon for primary action |
|
|
| `secondary_action_url` | string | URL for secondary action |
|
|
| `secondary_action_text` | string | Text for secondary action |
|
|
|
|
### Action Bar
|
|
|
|
Container for action buttons with consistent layout.
|
|
|
|
```django
|
|
{% include 'components/ui/action_bar.html' with
|
|
align='between'
|
|
primary_action_text='Save'
|
|
secondary_action_text='Preview'
|
|
tertiary_action_text='Cancel'
|
|
tertiary_action_url='/back/'
|
|
%}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `align` | string | 'right' | 'left', 'right', 'center', 'between' |
|
|
| `mobile_stack` | boolean | true | Stack vertically on mobile |
|
|
| `show_border` | boolean | false | Show top border |
|
|
| `primary_action_*` | various | - | Primary button configuration |
|
|
| `secondary_action_*` | various | - | Secondary button configuration |
|
|
| `tertiary_action_*` | various | - | Tertiary button configuration |
|
|
|
|
## Navigation Components
|
|
|
|
### Breadcrumbs
|
|
|
|
Hierarchical navigation with Schema.org support.
|
|
|
|
```django
|
|
{% include 'components/navigation/breadcrumbs.html' %}
|
|
```
|
|
|
|
Set breadcrumbs in your view:
|
|
|
|
```python
|
|
from apps.core.utils import build_breadcrumb
|
|
|
|
def park_detail(request, slug):
|
|
park = get_object_or_404(Park, slug=slug)
|
|
request.breadcrumbs = [
|
|
build_breadcrumb('Home', '/', icon='fas fa-home'),
|
|
build_breadcrumb('Parks', reverse('parks:list')),
|
|
build_breadcrumb(park.name, is_current=True),
|
|
]
|
|
return render(request, 'parks/detail.html', {'park': park})
|
|
```
|
|
|
|
## Modal Components
|
|
|
|
### Modal Base
|
|
|
|
Base modal component with customizable content.
|
|
|
|
```django
|
|
{% include 'components/modals/modal_base.html' with
|
|
modal_id='edit-modal'
|
|
show_var='showEditModal'
|
|
title='Edit Park'
|
|
subtitle='Update park information'
|
|
icon='fas fa-edit'
|
|
size='lg'
|
|
animation='scale'
|
|
%}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `modal_id` | string | required | Unique identifier |
|
|
| `show_var` | string | required | Alpine.js show variable |
|
|
| `title` | string | - | Modal title |
|
|
| `subtitle` | string | - | Modal subtitle |
|
|
| `icon` | string | - | Title icon class |
|
|
| `size` | string | 'md' | 'sm', 'md', 'lg', 'xl', 'full' |
|
|
| `animation` | string | 'scale' | 'scale', 'slide-up', 'fade' |
|
|
| `close_on_backdrop` | boolean | true | Close when clicking backdrop |
|
|
| `close_on_escape` | boolean | true | Close on Escape key |
|
|
| `show_close_button` | boolean | true | Show X button |
|
|
| `prevent_scroll` | boolean | true | Prevent body scroll |
|
|
|
|
### Confirmation Modal
|
|
|
|
Pre-styled confirmation dialog.
|
|
|
|
```django
|
|
{% include 'components/modals/modal_confirm.html' with
|
|
modal_id='delete-confirm'
|
|
show_var='showDeleteModal'
|
|
title='Delete Park'
|
|
message='Are you sure? This cannot be undone.'
|
|
confirm_text='Delete'
|
|
confirm_variant='destructive'
|
|
confirm_hx_delete='/parks/123/'
|
|
%}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `modal_id` | string | required | Unique identifier |
|
|
| `show_var` | string | required | Alpine.js show variable |
|
|
| `title` | string | required | Modal title |
|
|
| `message` | string | required | Confirmation message |
|
|
| `icon` | string | auto | Icon class |
|
|
| `icon_variant` | string | 'warning' | 'destructive', 'warning', 'info', 'success' |
|
|
| `confirm_text` | string | 'Confirm' | Confirm button text |
|
|
| `confirm_variant` | string | 'primary' | 'destructive', 'primary', 'warning' |
|
|
| `cancel_text` | string | 'Cancel' | Cancel button text |
|
|
| `confirm_url` | string | - | URL for confirm (makes it a link) |
|
|
| `confirm_hx_post` | string | - | HTMX POST URL |
|
|
| `confirm_hx_delete` | string | - | HTMX DELETE URL |
|
|
| `on_confirm` | string | - | Alpine.js expression |
|
|
|
|
## Skeleton Components
|
|
|
|
### List Skeleton
|
|
|
|
```django
|
|
{% include 'components/skeletons/list_skeleton.html' with rows=5 %}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `rows` | number | 5 | Number of skeleton rows |
|
|
| `show_avatar` | boolean | false | Show avatar placeholder |
|
|
| `show_meta` | boolean | true | Show metadata line |
|
|
| `show_action` | boolean | true | Show action button placeholder |
|
|
|
|
### Card Grid Skeleton
|
|
|
|
```django
|
|
{% include 'components/skeletons/card_grid_skeleton.html' with cards=6 cols=3 %}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `cards` | number | 6 | Number of skeleton cards |
|
|
| `cols` | number | 3 | Grid columns (sm screens) |
|
|
| `show_image` | boolean | true | Show image placeholder |
|
|
| `show_badge` | boolean | false | Show badge placeholder |
|
|
|
|
### Detail Skeleton
|
|
|
|
```django
|
|
{% include 'components/skeletons/detail_skeleton.html' %}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `show_image` | boolean | true | Show hero image placeholder |
|
|
| `show_sidebar` | boolean | true | Show sidebar section |
|
|
| `content_lines` | number | 8 | Number of content lines |
|
|
|
|
### Table Skeleton
|
|
|
|
```django
|
|
{% include 'components/skeletons/table_skeleton.html' with rows=10 columns=5 %}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `rows` | number | 5 | Number of table rows |
|
|
| `columns` | number | 4 | Number of columns |
|
|
| `show_checkbox` | boolean | false | Show checkbox column |
|
|
| `show_actions` | boolean | true | Show actions column |
|
|
|
|
### Form Skeleton
|
|
|
|
```django
|
|
{% include 'components/skeletons/form_skeleton.html' with fields=4 %}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `fields` | number | 4 | Number of form fields |
|
|
| `show_textarea` | boolean | true | Include textarea field |
|
|
| `columns` | number | 1 | Form columns (1 or 2) |
|
|
|
|
## Form Components
|
|
|
|
### Form Field
|
|
|
|
Standardized form field with label, input, and validation.
|
|
|
|
```django
|
|
{% include 'forms/partials/form_field.html' with
|
|
field=form.name
|
|
help_text='Enter the full park name'
|
|
size='lg'
|
|
%}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `field` | Field | required | Django form field |
|
|
| `label` | string | field.label | Override label |
|
|
| `help_text` | string | field.help_text | Help text |
|
|
| `size` | string | 'md' | 'sm', 'md', 'lg' |
|
|
| `show_label` | boolean | true | Show label |
|
|
| `inline` | boolean | false | Inline layout |
|
|
|
|
### Form Actions
|
|
|
|
Form submission buttons.
|
|
|
|
```django
|
|
{% include 'forms/partials/form_actions.html' with
|
|
submit_text='Save Park'
|
|
cancel_url='/parks/'
|
|
%}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `submit_text` | string | 'Submit' | Submit button text |
|
|
| `submit_icon` | string | - | Submit button icon |
|
|
| `cancel_url` | string | - | Cancel button URL |
|
|
| `cancel_text` | string | 'Cancel' | Cancel button text |
|
|
| `show_cancel` | boolean | true | Show cancel button |
|
|
|
|
### Field Error
|
|
|
|
Display field validation errors.
|
|
|
|
```django
|
|
{% include 'forms/partials/field_error.html' with errors=field.errors %}
|
|
```
|
|
|
|
### Field Success
|
|
|
|
Display field validation success.
|
|
|
|
```django
|
|
{% include 'forms/partials/field_success.html' with message='Available' %}
|
|
```
|
|
|
|
## UI Components
|
|
|
|
### Button
|
|
|
|
```html
|
|
<button class="btn btn-primary">Primary</button>
|
|
<button class="btn btn-secondary">Secondary</button>
|
|
<button class="btn btn-outline">Outline</button>
|
|
<button class="btn btn-ghost">Ghost</button>
|
|
<button class="btn btn-link">Link</button>
|
|
<button class="btn btn-destructive">Destructive</button>
|
|
```
|
|
|
|
**Sizes:**
|
|
```html
|
|
<button class="btn btn-primary btn-sm">Small</button>
|
|
<button class="btn btn-primary">Default</button>
|
|
<button class="btn btn-primary btn-lg">Large</button>
|
|
```
|
|
|
|
### Card
|
|
|
|
```django
|
|
{% include 'components/ui/card.html' with
|
|
title='Card Title'
|
|
subtitle='Card subtitle'
|
|
%}
|
|
<p>Card content goes here.</p>
|
|
{% endinclude %}
|
|
```
|
|
|
|
### Input
|
|
|
|
```django
|
|
{% include 'components/ui/input.html' with
|
|
name='email'
|
|
type='email'
|
|
placeholder='Enter email'
|
|
required=True
|
|
%}
|
|
```
|
|
|
|
### Status Badge
|
|
|
|
```django
|
|
{% include 'components/status_badge.html' with
|
|
status='published'
|
|
label='Published'
|
|
%}
|
|
```
|
|
|
|
**Status variants:**
|
|
- `published` / `active` / `approved` - Green
|
|
- `draft` / `pending` - Yellow
|
|
- `rejected` / `archived` - Red
|
|
- `review` - Blue
|
|
|
|
### Icon
|
|
|
|
```django
|
|
{% include 'components/ui/icon.html' with
|
|
icon='fas fa-star'
|
|
size='lg'
|
|
color='primary'
|
|
%}
|
|
```
|
|
|
|
### Dialog (Alert Dialog)
|
|
|
|
```django
|
|
{% include 'components/ui/dialog.html' with
|
|
dialog_id='alert-dialog'
|
|
show_var='showAlert'
|
|
title='Alert'
|
|
message='This is an alert message.'
|
|
confirm_text='OK'
|
|
%}
|
|
```
|
|
|
|
## Toast Notifications
|
|
|
|
### From JavaScript
|
|
|
|
```javascript
|
|
// Success toast
|
|
Alpine.store('toast').success('Saved successfully!');
|
|
|
|
// Error toast
|
|
Alpine.store('toast').error('Something went wrong');
|
|
|
|
// Warning toast
|
|
Alpine.store('toast').warning('Session expiring soon');
|
|
|
|
// Info toast
|
|
Alpine.store('toast').info('New features available');
|
|
|
|
// With custom duration (ms)
|
|
Alpine.store('toast').success('Quick message', 2000);
|
|
|
|
// With action button
|
|
Alpine.store('toast').success('Item deleted', 5000, {
|
|
action: { label: 'Undo', onClick: () => undoAction() }
|
|
});
|
|
```
|
|
|
|
### From Django Views
|
|
|
|
```python
|
|
from apps.core.htmx_utils import htmx_success, htmx_error
|
|
|
|
# Success toast
|
|
return htmx_success('Park saved successfully!')
|
|
|
|
# Error toast
|
|
return htmx_error('Validation failed', status=422)
|
|
|
|
# With action
|
|
return htmx_success('Item deleted', action={
|
|
'label': 'Undo',
|
|
'onClick': 'undoDelete()'
|
|
})
|
|
```
|
|
|
|
## Loading Components
|
|
|
|
### Loading Indicator
|
|
|
|
```django
|
|
{% include 'htmx/components/loading_indicator.html' with
|
|
id='my-loading'
|
|
text='Loading...'
|
|
size='md'
|
|
%}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `id` | string | - | Element ID for hx-indicator |
|
|
| `text` | string | 'Loading...' | Loading text |
|
|
| `size` | string | 'md' | 'sm', 'md', 'lg' |
|
|
| `type` | string | 'spinner' | 'spinner', 'dots', 'pulse' |
|
|
|
|
## Pagination
|
|
|
|
### Standard Pagination
|
|
|
|
```django
|
|
{% include 'components/pagination.html' with
|
|
page_obj=page_obj
|
|
show_first_last=True
|
|
%}
|
|
```
|
|
|
|
### HTMX Pagination
|
|
|
|
```django
|
|
{% include 'components/pagination.html' with
|
|
page_obj=page_obj
|
|
hx_target='#items-list'
|
|
hx_swap='innerHTML'
|
|
hx_push_url='true'
|
|
%}
|
|
```
|
|
|
|
**Parameters:**
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `page_obj` | Page | required | Django paginator page |
|
|
| `show_first_last` | boolean | true | Show first/last buttons |
|
|
| `show_page_numbers` | boolean | true | Show page numbers |
|
|
| `max_pages` | number | 5 | Max visible page numbers |
|
|
| `hx_target` | string | - | HTMX target selector |
|
|
| `hx_swap` | string | - | HTMX swap method |
|
|
| `hx_push_url` | boolean | false | Push URL on navigation |
|