This skill should be used when the user asks about "EDGE component", "native-top-bar", "native-bottom-nav", "native-side-nav", "native-fab", "native ui component", "TopBar", "BottomNav", "SideNav", "Fab component", "native navigation", "nativephp-safe-area", "safe area insets", or needs to implement native UI elements that render natively on device.
/plugin marketplace add NativePHP/ClaudePlugins/plugin install nativephp-mobile@nativephp-mobile-pluginThis skill inherits all available tools. When active, it can use any tool Claude has access to.
This skill provides guidance for using EDGE (Element Definition and Generation Engine) components to render truly native UI elements in NativePHP Mobile apps.
EDGE components are Blade components that generate JSON structures passed to the native layer, which renders platform-specific UI (iOS/Android). They provide native look and feel while being defined in PHP/Blade.
<native:top-bar>) render JSON structureRenderEdgeComponents middleware handles this automaticallyMobile devices have notches, rounded corners, and home indicators. Handle these with:
Apply the nativephp-safe-area class to your main container:
<body class="nativephp-safe-area">
<!-- Content respects device safe areas -->
</body>
For custom layouts, use safe area CSS variables:
.my-element {
padding-top: var(--inset-top);
padding-bottom: var(--inset-bottom);
padding-left: var(--inset-left);
padding-right: var(--inset-right);
}
For edge-to-edge rendering:
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
Native top navigation bar with title and action buttons.
<native:top-bar title="Dashboard" />
<native:top-bar
title="My App"
subtitle="Welcome back"
:show-navigation-icon="true"
background-color="#1a1a2e"
text-color="#ffffff"
:elevation="4"
>
<native:top-bar-action
id="search"
icon="search"
label="Search"
:url="route('search')"
/>
<native:top-bar-action
id="settings"
icon="settings"
label="Settings"
:url="route('settings')"
/>
</native:top-bar>
| Property | Type | Description |
|---|---|---|
title | string | Main heading text |
subtitle | string | Secondary text below title |
show-navigation-icon | bool | Show back/menu button (default: true) |
background-color | string | Hex color for background |
text-color | string | Hex color for text |
elevation | int | Shadow depth 0-24 (Android only) |
| Property | Type | Description |
|---|---|---|
id | string | Unique identifier (required) |
icon | string | Icon name (required) |
label | string | Accessibility text and overflow menu text |
url | string | Navigation target when tapped |
event | string | Livewire event to dispatch instead of navigation |
Action limits: Android shows first 3 as icons, rest in overflow. iOS shows up to 5, then overflow.
Native bottom navigation bar with tab items.
<native:bottom-nav>
<native:bottom-nav-item
id="home"
icon="home"
label="Home"
:url="route('home')"
:active="request()->routeIs('home')"
/>
<native:bottom-nav-item
id="search"
icon="search"
label="Search"
:url="route('search')"
:active="request()->routeIs('search')"
/>
<native:bottom-nav-item
id="profile"
icon="person"
label="Profile"
:url="route('profile')"
:active="request()->routeIs('profile')"
/>
</native:bottom-nav>
| Property | Type | Description |
|---|---|---|
dark | bool | Dark mode styling |
label-visibility | string | When to show labels |
| Property | Type | Description |
|---|---|---|
id | string | Unique identifier (required) |
icon | string | Icon name (required) |
label | string | Tab label (required) |
url | string | Navigation URL (required) |
active | bool | Whether tab is currently selected |
badge | string | Badge text (e.g., notification count) |
badge-color | string | Hex color for badge |
news | bool | Show news indicator dot |
Native side/drawer navigation.
<native:side-nav>
<native:side-nav-header
title="My App"
subtitle="user@example.com"
icon="account_circle"
/>
<native:side-nav-item
id="dashboard"
icon="dashboard"
label="Dashboard"
:url="route('dashboard')"
:active="request()->routeIs('dashboard')"
/>
<native:horizontal-divider />
<native:side-nav-group heading="Settings" icon="settings">
<native:side-nav-item
id="account"
icon="person"
label="Account"
:url="route('account')"
/>
<native:side-nav-item
id="preferences"
icon="tune"
label="Preferences"
:url="route('preferences')"
/>
</native:side-nav-group>
</native:side-nav>
| Property | Type | Description |
|---|---|---|
dark | bool | Dark mode styling |
label-visibility | string | When to show labels |
gestures-enabled | bool | Enable swipe to open |
| Property | Type | Description |
|---|---|---|
title | string | Header title |
subtitle | string | Header subtitle |
icon | string | Icon name |
background-color | string | Hex background color |
image-url | string | Background image URL |
event | string | Livewire event on tap |
show-close-button | bool | Show close button |
pinned | bool | Keep header visible when scrolling |
| Property | Type | Description |
|---|---|---|
id | string | Unique identifier (required) |
icon | string | Icon name (required) |
label | string | Item label (required) |
url | string | Navigation URL (required) |
active | bool | Whether item is selected |
badge | string | Badge text |
badge-color | string | Badge color |
open-in-browser | bool | Open URL in external browser |
| Property | Type | Description |
|---|---|---|
heading | string | Group heading text (required) |
icon | string | Group icon |
expanded | bool | Whether group is expanded |
Floating action button for primary actions.
<native:fab
icon="add"
:url="route('create')"
/>
<native:fab
icon="add"
label="Create New"
:url="route('create')"
size="large"
position="bottom-end"
:bottom-offset="16"
:elevation="6"
:corner-radius="16"
container-color="#6200ee"
content-color="#ffffff"
/>
| Property | Type | Description |
|---|---|---|
icon | string | Icon name (required) |
label | string | Extended FAB label |
url | string | Navigation URL |
event | string | Livewire event to dispatch |
size | string | 'small', 'regular', 'large' |
position | string | 'bottom-start', 'bottom-end', etc. |
bottom-offset | int | Pixels from bottom |
elevation | int | Shadow depth |
corner-radius | int | Corner rounding |
container-color | string | Background hex color |
content-color | string | Icon/text hex color |
Visual separator between items.
<native:horizontal-divider />
EDGE components use Material Design icons. Common icons:
home, menu, arrow_back, close, searchadd, edit, delete, share, settingsemail, chat, notifications, phonefolder, file_copy, link, cloudperson, group, account_circleplay_arrow, pause, camera, micFull list: https://fonts.google.com/icons
EDGE components render natively while your web content renders in the WebView:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
</head>
<body class="nativephp-safe-area">
{{-- Native top bar --}}
<native:top-bar title="My App">
<native:top-bar-action id="menu" icon="menu" />
</native:top-bar>
{{-- Web content --}}
<main class="p-4">
@yield('content')
</main>
{{-- Native bottom nav --}}
<native:bottom-nav>
<native:bottom-nav-item id="home" icon="home" label="Home" :url="route('home')" />
<native:bottom-nav-item id="profile" icon="person" label="Profile" :url="route('profile')" />
</native:bottom-nav>
</body>
</html>
Important: When using Inertia.js with Vue or React, EDGE components MUST be placed in the app.blade.php layout file, NOT in your JavaScript components.
EDGE components are Blade components that generate JSON passed via HTTP headers to the native layer. They need to be processed by Laravel's Blade engine, which happens in the layout file before Inertia renders your JavaScript components.
resources/views/app.blade.php:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="csrf-token" content="{{ csrf_token() }}">
@vite(['resources/js/app.js'])
@inertiaHead
</head>
<body class="nativephp-safe-area">
{{-- EDGE components go here in the Blade layout --}}
<native:top-bar title="{{ config('app.name') }}" />
{{-- Inertia renders your Vue/React components here --}}
@inertia
{{-- Bottom navigation --}}
<native:bottom-nav>
<native:bottom-nav-item
id="home"
icon="home"
label="Home"
:url="route('home')"
:active="request()->routeIs('home')"
/>
<native:bottom-nav-item
id="search"
icon="search"
label="Search"
:url="route('search')"
:active="request()->routeIs('search')"
/>
<native:bottom-nav-item
id="profile"
icon="person"
label="Profile"
:url="route('profile')"
:active="request()->routeIs('profile')"
/>
</native:bottom-nav>
</body>
</html>
Your Vue/React components then render inside the @inertia directive, with native navigation chrome handled by EDGE.
You can pass data from your controller to EDGE components via Inertia's shared data:
app/Http/Middleware/HandleInertiaRequests.php:
public function share(Request $request): array
{
return array_merge(parent::share($request), [
'pageTitle' => fn () => $request->route()?->getName() ?? 'Home',
]);
}
resources/views/app.blade.php:
<native:top-bar :title="$page['props']['pageTitle'] ?? 'My App'" />
For detailed EDGE documentation:
https://nativephp.com/docs/mobile/2/edge-components/overviewhttps://nativephp.com/docs/mobile/2/edge-components/top-barhttps://nativephp.com/docs/mobile/2/edge-components/bottom-navhttps://nativephp.com/docs/mobile/2/edge-components/side-navhttps://nativephp.com/docs/mobile/2/edge-components/iconshttps://nativephp.com/docs/mobile/2/the-basics/web-viewUse WebFetch to retrieve the latest EDGE component details.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.