diff --git a/packages/components/src/renderers/action/action-bar.tsx b/packages/components/src/renderers/action/action-bar.tsx index af23c60de..4d647d0e9 100644 --- a/packages/components/src/renderers/action/action-bar.tsx +++ b/packages/components/src/renderers/action/action-bar.tsx @@ -36,6 +36,7 @@ import { ComponentRegistry } from '@object-ui/core'; import type { ActionSchema, ActionLocation, ActionComponent } from '@object-ui/types'; import { useCondition } from '@object-ui/react'; import { cn } from '../../lib/utils'; +import { useIsMobile } from '../../hooks/use-mobile'; export interface ActionBarSchema { type: 'action:bar'; @@ -45,6 +46,8 @@ export interface ActionBarSchema { location?: ActionLocation; /** Maximum visible inline actions before overflow into "More" menu (default: 3) */ maxVisible?: number; + /** Maximum visible inline actions on mobile devices (default: 1). Desktop uses maxVisible instead. */ + mobileMaxVisible?: number; /** Visibility condition expression */ visible?: string; /** Layout direction */ @@ -71,6 +74,7 @@ const ActionBarRenderer = forwardRef { @@ -82,7 +86,10 @@ const ActionBarRenderer = forwardRef { if (filteredActions.length <= maxVisible) { return { inlineActions: filteredActions, overflowActions: [] as ActionSchema[] }; diff --git a/packages/layout/src/AppShell.tsx b/packages/layout/src/AppShell.tsx index 103032cdd..a808e4d86 100644 --- a/packages/layout/src/AppShell.tsx +++ b/packages/layout/src/AppShell.tsx @@ -136,8 +136,8 @@ export function AppShell({ {sidebar}
- -
+ +
{navbar}
diff --git a/packages/plugin-detail/src/DetailSection.tsx b/packages/plugin-detail/src/DetailSection.tsx index dd21b1c98..3ef6f366b 100644 --- a/packages/plugin-detail/src/DetailSection.tsx +++ b/packages/plugin-detail/src/DetailSection.tsx @@ -195,9 +195,9 @@ export const DetailSection: React.FC = ({ className={cn( "grid gap-3 sm:gap-4", effectiveColumns === 1 ? "grid-cols-1" : - effectiveColumns === 2 ? "grid-cols-1 md:grid-cols-2" : - effectiveColumns === 3 ? "grid-cols-1 md:grid-cols-2 lg:grid-cols-3" : - "grid-cols-1 md:grid-cols-2 lg:grid-cols-3" + effectiveColumns === 2 ? "grid-cols-1 sm:grid-cols-2" : + effectiveColumns === 3 ? "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3" : + "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3" )} > {layoutFields.map(renderField)} diff --git a/packages/plugin-detail/src/DetailView.tsx b/packages/plugin-detail/src/DetailView.tsx index 3cd810a5d..02cb879fc 100644 --- a/packages/plugin-detail/src/DetailView.tsx +++ b/packages/plugin-detail/src/DetailView.tsx @@ -469,7 +469,7 @@ export const DetailView: React.FC = ({ ))} - {/* Inline Edit Toggle */} + {/* Inline Edit Toggle - hidden on mobile, accessible via more menu */} {inlineEdit && ( @@ -477,7 +477,7 @@ export const DetailView: React.FC = ({ variant={isInlineEditing ? 'default' : 'outline'} size="sm" onClick={handleInlineEditToggle} - className="gap-2" + className="gap-2 hidden sm:inline-flex" > {isInlineEditing ? ( <> @@ -498,21 +498,21 @@ export const DetailView: React.FC = ({ )} - {/* Share Button */} + {/* Share Button - hidden on mobile, accessible via more menu */} - {t('detail.share')} - {/* Edit Button */} + {/* Edit Button - hidden on mobile, accessible via more menu */} {schema.showEdit && ( - @@ -534,6 +534,24 @@ export const DetailView: React.FC = ({ {t('detail.moreActions')} + {/* Mobile-only: Share, Edit, Inline Edit */} + + + {t('detail.share')} + + {schema.showEdit && ( + + + {t('detail.edit')} + + )} + {inlineEdit && ( + + + {isInlineEditing ? t('detail.save') : t('detail.editInline')} + + )} + {t('detail.duplicate')}