원클릭으로
app-themes
Specialized widgets and themes for Music, Stocks, Weather, App Store, and Books apps
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Specialized widgets and themes for Music, Stocks, Weather, App Store, and Books apps
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | app-themes |
| description | Specialized widgets and themes for Music, Stocks, Weather, App Store, and Books apps |
Pre-built themes and widgets for specific iOS app styles.
This design system includes 6 app-specific themes:
Glassmorphism effects and gradient backgrounds for music player interfaces.
Music-themed card with gradient background.
NeutralCardWidget(
padding: const EdgeInsets.all(16),
child: Column(
children: [
// Album art
ClipRRect(
borderRadius: BorderRadius.circular(12),
child: Image.network(
albumArtUrl,
height: 300,
width: 300,
fit: BoxFit.cover,
),
),
const SizedBox(height: 24),
// Song info
Text(
'Song Title',
style: theme.typography.title2Bold,
),
Text(
'Artist Name',
style: theme.typography.bodyRegular,
),
],
),
)
Circular button with glassmorphism for music controls.
// Playback controls
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
NeutralCircularButtonWidget(
iconData: CupertinoIcons.backward_fill,
onPressed: () {
// Previous track
},
),
NeutralCircularButtonWidget(
iconData: _isPlaying
? CupertinoIcons.pause_fill
: CupertinoIcons.play_fill,
iconSize: 32,
onPressed: () {
setState(() => _isPlaying = !_isPlaying);
},
),
NeutralCircularButtonWidget(
iconData: CupertinoIcons.forward_fill,
onPressed: () {
// Next track
},
),
],
)
Pill-shaped button with gradient styling.
NeutralPillButtonWidget(
label: 'Add to Playlist',
leftIcon: CupertinoIcons.add,
onPressed: () {
// Add to playlist
},
)
NeutralPillButtonWidget(
label: 'Share',
rightIcon: CupertinoIcons.share,
onPressed: () {
// Share song
},
)
class MusicPlayerScreen extends HookWidget {
const MusicPlayerScreen({super.key});
@override
Widget build(BuildContext context) {
final theme = IosTheme.of(context);
final isPlaying = useState(false);
return ScaffoldWidget(
navigationBar: CupertinoNavigatorBarWidget(
title: 'Now Playing',
imageFilter: NavigatorBarImageFilter.enabled,
leading: LabelButtonWidget.label(
label: 'Library',
iconLeft: CupertinoIcons.chevron_down,
onPressed: () => Navigator.pop(context),
),
trailing: LabelButtonWidget.label(
label: 'More',
iconRight: CupertinoIcons.ellipsis,
onPressed: () {},
),
),
toolBar: null,
child: Column(
children: [
Expanded(
child: NeutralCardWidget(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Album art
ClipRRect(
borderRadius: BorderRadius.circular(12),
child: Container(
width: 300,
height: 300,
color: theme.defaultColors.systemGray05,
),
),
const SizedBox(height: 32),
// Song info
Text(
'Song Title',
style: theme.typography.title2Bold,
),
const SizedBox(height: 8),
Text(
'Artist Name',
style: theme.typography.bodyRegular.copyWith(
color: theme.defaultLabelColors.secondary,
),
),
const SizedBox(height: 32),
// Controls
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
NeutralCircularButtonWidget(
iconData: CupertinoIcons.backward_fill,
onPressed: () {},
),
NeutralCircularButtonWidget(
iconData: isPlaying.value
? CupertinoIcons.pause_fill
: CupertinoIcons.play_fill,
iconSize: 32,
onPressed: () => isPlaying.value = !isPlaying.value,
),
NeutralCircularButtonWidget(
iconData: CupertinoIcons.forward_fill,
onPressed: () {},
),
],
),
const SizedBox(height: 24),
// Action buttons
NeutralPillButtonWidget(
label: 'Add to Playlist',
leftIcon: CupertinoIcons.add,
onPressed: () {},
),
],
),
),
),
],
),
);
}
}
Financial app styling with gradient backgrounds and custom colors.
RowWidget.stocks() - Row with stocks stylingGroupedTableWidget.stocks() - Grouped table with gradientSwitchWidget.stocks() - Switch with stocks colorsDividerWidget.stocks - Stocks-styled dividerGroupedTableWidget.stocks(
title: const TitleWidget(
text: 'WATCHLIST',
size: TitleSize.small,
),
rows: [
RowWidget.stocks(
title: 'AAPL',
description: 'Apple Inc.',
leftWidget: null,
rightWidget: Text(
'+2.5%',
style: theme.typography.bodyBold.copyWith(
color: theme.defaultColors.systemGreen, // Positive trend
),
),
displayDivider: true,
onPressed: () {},
onLongPress: null,
decorationCallback: stocksDecorationCallback,
),
RowWidget.stocks(
title: 'GOOGL',
description: 'Alphabet Inc.',
leftWidget: null,
rightWidget: Text(
'-1.2%',
style: theme.typography.bodyBold.copyWith(
color: theme.defaultColors.systemRed, // Negative trend
),
),
displayDivider: false,
onPressed: () {},
onLongPress: null,
decorationCallback: stocksDecorationCallback,
),
],
description: null,
)
// Access stocks theme
final theme = IosTheme.of(context);
final stocksTheme = theme.stocksDecorations;
// Use gradient
Container(
decoration: stocksTheme.gradients.background,
child: child,
)
Weather app colors and gradients.
final theme = IosTheme.of(context);
final weatherTheme = theme.weatherDecorations;
// Day gradient
Container(
decoration: BoxDecoration(
gradient: weatherTheme.weatherDayGradient,
),
)
// Night gradient
Container(
decoration: BoxDecoration(
gradient: weatherTheme.weatherNightGradient,
),
)
// Rain gradient
Container(
decoration: BoxDecoration(
gradient: weatherTheme.weatherRainGradient,
),
)
App Store-style widgets and colors.
App icon with proper sizing and rounded corners.
// Standard app icon
AppIconWidget(
imageUrl: 'https://example.com/icon.png',
size: 60,
borderRadius: 12,
)
// Large featured icon
AppIconWidget(
imageUrl: appIconUrl,
size: 80,
borderRadius: 16,
)
ListView.builder(
itemCount: apps.length,
itemBuilder: (context, index) {
final app = apps[index];
return RowWidget.standard(
title: app.name,
description: app.category,
leftWidget: AppIconWidget(
imageUrl: app.iconUrl,
size: 60,
borderRadius: 12,
),
rightWidget: Column(
mainAxisSize: MainAxisSize.min,
children: [
ButtonWidget.label(
size: const SmallButtonSize(),
color: const BlueButtonColor(),
label: app.isInstalled ? 'OPEN' : 'GET',
onPressed: () {},
),
if (!app.isInstalled)
Text(
'In-App Purchases',
style: theme.typography.caption2Regular.copyWith(
color: theme.defaultLabelColors.tertiary,
),
),
],
),
displayDivider: index < apps.length - 1,
onPressed: () {
// Navigate to app details
},
onLongPress: null,
decorationCallback: null,
);
},
)
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: theme.defaultSystemBackgroundsColors.primaryDarkElevated,
borderRadius: BorderRadius.circular(12),
),
child: Row(
children: [
AppIconWidget(
imageUrl: appIconUrl,
size: 80,
borderRadius: 16,
),
const SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Featured App',
style: theme.typography.caption1Regular.copyWith(
color: theme.defaultLabelColors.secondary,
),
),
Text(
appName,
style: theme.typography.title3Bold,
),
Text(
appDescription,
style: theme.typography.bodyRegular,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
],
),
),
],
),
)
Books app specific colors and styling.
// Access books theme
final theme = IosTheme.of(context);
final booksTheme = theme.booksDecorations;
// Use books colors
Container(
color: booksTheme.backgroundColor,
child: child,
)
Podcast app styling similar to Music theme.
// Access podcast theme
final theme = IosTheme.of(context);
final podcastTheme = theme.neutralPodcastDecorations;
@override
Widget build(BuildContext context) {
final theme = IosTheme.of(context);
// Access specific theme
final musicTheme = theme.neutralMusicDecorations;
final stocksTheme = theme.stocksDecorations;
final weatherTheme = theme.weatherDecorations;
final appStoreTheme = theme.appStoreDecorations;
final booksTheme = theme.booksDecorations;
final podcastTheme = theme.neutralPodcastDecorations;
// Use theme colors
return Container(
decoration: BoxDecoration(
gradient: musicTheme.primaryBackground,
),
child: child,
);
}
// In /lib/src/theme/colors/my_app.dart
part of 'colors.dart';
class MyAppColors {
const MyAppColors({
required this.primary,
required this.secondary,
required this.accent,
});
final Color primary;
final Color secondary;
final Color accent;
MyAppColors lerp(MyAppColors b, double t) {
if (identical(this, b)) return this;
return MyAppColors(
primary: Color.lerp(primary, b.primary, t)!,
secondary: Color.lerp(secondary, b.secondary, t)!,
accent: Color.lerp(accent, b.accent, t)!,
);
}
}
class MyAppColorsLight extends MyAppColors {
const MyAppColorsLight()
: super(
primary: const Color(0xFF0066CC),
secondary: const Color(0xFF00CC66),
accent: const Color(0xFFCC0066),
);
}
class MyAppColorsDark extends MyAppColors {
const MyAppColorsDark()
: super(
primary: const Color(0xFF3399FF),
secondary: const Color(0xFF33FF99),
accent: const Color(0xFFFF3399),
);
}
Update theme to include custom colors.
// Add variant to existing widget
class RowWidget extends StatelessWidget {
factory RowWidget.myApp({
required String title,
required String? description,
// ... other parameters
}) => RowWidget(
decorationCallback: myAppDecorationCallback,
title: (theme) => Text(
title,
style: theme.typography.bodyRegular.copyWith(
color: theme.myAppColors.primary,
),
),
// ... rest of parameters
);
}
/lib/src/widgets/neutral_music/neutral_card_widget.dart/lib/src/widgets/neutral_music/neutral_circular_button_widget.dart/lib/src/widgets/neutral_music/neutral_pill_button_widget.dart/lib/src/widgets/neutral_music/neutral_decorations_style.dart/lib/src/widgets/app_store/app_store_pill_button_widget.dart/lib/src/widgets/app_store/app_store_circular_button_widget.dart/lib/src/widgets/app_icon_widget.dart/lib/src/theme/colors/neutral_music.dart/lib/src/theme/colors/neutral_podcast.dart/lib/src/theme/colors/stocks.dart/lib/src/theme/colors/weather.dart/lib/src/theme/colors/app_store.dart/lib/src/theme/colors/books.dartButton widgets in iOS Design System - CupertinoButtonWidget and ButtonWidget with all variants
Guide to creating new widgets following iOS Design System patterns and conventions
Icons, tags, titles, descriptions, dividers, and markdown rendering for iOS Design System
Using flutter_hooks for cleaner state management in iOS Design System widgets
Text fields, switches, pickers, date pickers, and form validation for iOS Design System
ScaffoldWidget, GroupedTableWidget, RowWidget, NavigationBar, and ToolBar for iOS Design System