From 7bf992c6f005ee6df04c85fc7725497db1f48b00 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sat, 6 Jun 2026 19:57:53 +0900 Subject: [PATCH 01/28] docs: add MVP demo frames --- .../lib/components/mvp_frames_usecase.dart | 662 ++++++++++++++++++ packages/flutter/example/lib/main.dart | 2 + .../react/src/components/examples.stories.tsx | 328 ++++++++- 3 files changed, 980 insertions(+), 12 deletions(-) create mode 100644 packages/flutter/example/lib/components/mvp_frames_usecase.dart diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart new file mode 100644 index 0000000..a506ea5 --- /dev/null +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -0,0 +1,662 @@ +import 'package:flutter/material.dart'; +import 'package:hugeicons/hugeicons.dart'; +import 'package:ids_flutter/ids.dart'; +import 'package:widgetbook/widgetbook.dart'; + +final mvpFrameUseCases = [ + WidgetbookUseCase( + name: 'Ziggle Notice Detail', + builder: (context) => _withTheme( + context, + initialColor: IdsColor.orange, + child: const _Phone(child: _ZiggleNoticeDetailFrame()), + ), + ), + WidgetbookUseCase( + name: 'Ziggle Profile', + builder: (context) => _withTheme( + context, + initialColor: IdsColor.orange, + child: const _Phone(child: _ZiggleProfileFrame()), + ), + ), + WidgetbookUseCase( + name: 'Potg Main List', + builder: (context) => _withTheme( + context, + initialColor: IdsColor.green, + child: const _Phone(child: _PotgMainListFrame()), + ), + ), + WidgetbookUseCase( + name: 'Potg Create Time', + builder: (context) => _withTheme( + context, + initialColor: IdsColor.green, + child: const _Phone(child: _PotgCreateTimeFrame()), + ), + ), +]; + +Widget _withTheme( + BuildContext context, { + required IdsColor initialColor, + required Widget child, +}) { + final color = context.knobs.object.dropdown( + label: 'Color', + options: IdsColor.values, + initialOption: initialColor, + labelBuilder: (c) => c.name, + ); + final mode = context.knobs.object.dropdown( + label: 'Mode', + options: IdsMode.values, + initialOption: IdsMode.light, + labelBuilder: (m) => m.name, + ); + + return ThemeProvider( + color: color, + mode: mode, + child: Center(child: child), + ); +} + +class _Phone extends StatelessWidget { + const _Phone({required this.child}); + + final Widget child; + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return ClipRect( + child: Container( + width: 390, + height: 760, + color: theme.muted, + child: child, + ), + ); + } +} + +class _PhoneHeader extends StatelessWidget { + const _PhoneHeader({required this.title, this.backLabel}); + + final String title; + final String? backLabel; + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return Container( + height: 56, + decoration: BoxDecoration( + color: theme.surface, + border: Border(bottom: BorderSide(color: theme.outline)), + ), + child: Stack( + alignment: Alignment.center, + children: [ + if (backLabel != null) + Positioned( + left: 16, + child: IdsText( + backLabel!, + variant: IdsTextVariant.label, + color: theme.primary, + ), + ), + IdsText(title, variant: IdsTextVariant.label), + ], + ), + ); + } +} + +class _ZiggleNoticeDetailFrame extends StatelessWidget { + const _ZiggleNoticeDetailFrame(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return Column( + children: [ + const _PhoneHeader(title: '공지 상세', backLabel: '공지'), + Expanded( + child: ColoredBox( + color: theme.surface, + child: SingleChildScrollView( + padding: const EdgeInsets.all(24), + child: IdsVStack( + gap: 20, + crossAxis: CrossAxis.start, + children: [ + IdsButton( + onPressed: () {}, + children: const [Text('마감기한 2024.03.30. 18:00')], + ), + const IdsHStack( + gap: 10, + crossAxis: CrossAxis.center, + children: [ + IdsAvatar(name: '인포팀'), + IdsText('인포팀 · 32분 전', variant: IdsTextVariant.label), + ], + ), + const IdsText( + '2024 정보국 신입 국원 모집', + variant: IdsTextVariant.heading, + ), + Wrap( + spacing: 8, + runSpacing: 8, + children: const [ + IdsBadge('#모집'), + IdsBadge('#인포팀'), + IdsBadge('#개발'), + IdsBadge('#지글'), + IdsBadge('#비대위'), + IdsBadge('#정보국'), + ], + ), + const _NoticePoster(), + const IdsText( + '비상대책위원회 정보국(Infoteam)에서 신규 부원 모집을 진행합니다!\n지원서 작성 구글 폼 링크', + ), + const IdsText( + '인포팀은 IT 서비스 개발을 통해 GIST 학부생의 학교 생활을 편리하게 만들어주는 역할을 수행하고 있습니다. 현재 지글(Ziggle), IdP 등의 서비스를 운영 중입니다.', + ), + const _ReactionBar(), + ], + ), + ), + ), + ), + ], + ); + } +} + +class _NoticePoster extends StatelessWidget { + const _NoticePoster(); + + @override + Widget build(BuildContext context) { + return Container( + height: 320, + alignment: Alignment.center, + decoration: BoxDecoration( + color: const Color(0xFFFFE0E3), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: ThemeProvider.of(context).outline), + ), + child: const IdsText( + '2024 정보국\n신규 국원 모집', + variant: IdsTextVariant.heading, + align: TextAlign.center, + color: Color(0xFFE85F6A), + ), + ); + } +} + +class _ReactionBar extends StatelessWidget { + const _ReactionBar(); + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 8, + runSpacing: 8, + children: [ + IdsButton( + onPressed: () {}, + size: IdsSize.sm, + children: const [Text('🔥 268')], + ), + IdsButton( + onPressed: () {}, + size: IdsSize.sm, + variant: IdsVariant.soft, + children: const [Text('😮 37')], + ), + IdsButton( + onPressed: () {}, + size: IdsSize.sm, + variant: IdsVariant.soft, + children: const [Text('공유하기')], + ), + IdsButton( + onPressed: () {}, + size: IdsSize.sm, + variant: IdsVariant.soft, + children: const [Text('링크 복사하기')], + ), + ], + ); + } +} + +class _ZiggleProfileFrame extends StatelessWidget { + const _ZiggleProfileFrame(); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(24), + child: IdsVStack( + gap: 24, + children: [ + const IdsCard( + size: IdsCardSize.lg, + child: IdsCardContent( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 24), + child: IdsVStack( + gap: 10, + crossAxis: CrossAxis.center, + children: [ + IdsAvatar(name: '이정우', size: IdsSize.xxl), + IdsText('이정우', variant: IdsTextVariant.heading), + IdsText('20260000', variant: IdsTextVariant.title), + IdsText('crowntheking@gm.gist.ac.kr'), + ], + ), + ), + ), + ), + _ProfileSection( + items: const [ + ('계정', '회원 정보 수정 · 아이디 및 비밀번호 변경'), + ('회원 탈퇴', null), + ('로그아웃', null), + ], + ), + _ProfileSection( + items: const [ + ('설정', '알림 · 언어 · 정보'), + ('피드백 · 버그 제보하기', null), + ], + ), + ], + ), + ), + ), + IdsBottomNavigation( + currentIndex: 2, + onTap: (_) {}, + items: [ + _navItem(HugeIcons.strokeRoundedHome01, '홈'), + _navItem(HugeIcons.strokeRoundedBookmark01, '즐겨찾기'), + _navItem(HugeIcons.strokeRoundedUserCircle02, '프로필'), + ], + ), + ], + ); + } +} + +class _ProfileSection extends StatelessWidget { + const _ProfileSection({required this.items}); + + final List<(String, String?)> items; + + @override + Widget build(BuildContext context) { + return IdsCard( + child: IdsCardContent( + child: Column( + children: [ + for (var i = 0; i < items.length; i++) ...[ + IdsItem( + children: [ + IdsItemContent( + children: [ + IdsItemTitle(items[i].$1), + if (items[i].$2 != null) IdsItemDescription(items[i].$2!), + ], + ), + ], + ), + if (i < items.length - 1) + Container(height: 1, color: ThemeProvider.of(context).outline), + ], + ], + ), + ), + ); + } +} + +class _PotgMainListFrame extends StatelessWidget { + const _PotgMainListFrame(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return Stack( + children: [ + Column( + children: [ + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.all(24), + child: IdsVStack( + gap: 20, + crossAxis: CrossAxis.start, + children: [ + const IdsText('팟쥐', variant: IdsTextVariant.heading), + const _WeekStatusCard(), + IdsText( + '2025/11/15 토요일', + variant: IdsTextVariant.label, + color: theme.onMuted, + ), + for (var i = 0; i < 5; i++) const _TaxiPotCard(), + ], + ), + ), + ), + IdsBottomNavigation( + currentIndex: 0, + onTap: (_) {}, + items: [ + _navItem(HugeIcons.strokeRoundedHome01, '모든 팟'), + _navItem(HugeIcons.strokeRoundedSearch01, '팟 검색'), + _navItem(HugeIcons.strokeRoundedMessage01, '채팅방'), + _navItem(HugeIcons.strokeRoundedUserCircle02, '내 정보'), + ], + ), + ], + ), + IdsFloatingButton( + semanticLabel: '새 팟 만들기', + onPressed: () {}, + children: const [_HugeIcon(HugeIcons.strokeRoundedCar03)], + ), + ], + ); + } +} + +class _WeekStatusCard extends StatelessWidget { + const _WeekStatusCard(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + const days = ['일', '월', '화', '수', '목', '금', '토']; + + return IdsCard( + child: IdsCardContent( + child: IdsVStack( + gap: 16, + crossAxis: CrossAxis.start, + children: [ + const IdsText('요일 별 팟 현황', variant: IdsTextVariant.title), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + for (var i = 0; i < days.length; i++) + Column( + children: [ + IdsText(days[i], variant: IdsTextVariant.caption), + const SizedBox(height: 8), + for (var row = 0; row < 3; row++) ...[ + Container( + width: 34, + height: 34, + alignment: Alignment.center, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: i == 6 && row == 1 ? theme.primary : null, + border: Border.all(color: theme.outline), + ), + child: IdsText( + i == 6 && row == 1 ? '5' : (row == 0 ? '0' : '1'), + variant: IdsTextVariant.label, + color: i == 6 && row == 1 + ? theme.onPrimary + : theme.onSurface, + ), + ), + if (row < 2) const SizedBox(height: 8), + ], + ], + ), + ], + ), + ], + ), + ), + ); + } +} + +class _TaxiPotCard extends StatelessWidget { + const _TaxiPotCard(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return IdsCard( + variant: IdsCardVariant.elevated, + interactive: true, + child: Row( + children: [ + const Expanded( + child: IdsCardContent( + child: IdsVStack( + gap: 8, + crossAxis: CrossAxis.start, + children: [ + IdsText('지스트 → 송정역', variant: IdsTextVariant.label), + IdsText('13:10~14:00', variant: IdsTextVariant.title), + ], + ), + ), + ), + Container( + width: 88, + height: 92, + alignment: Alignment.center, + decoration: BoxDecoration( + color: theme.secondary, + border: Border(left: BorderSide(color: theme.outline)), + ), + child: IdsVStack( + gap: 4, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: [ + const IdsText('정원', variant: IdsTextVariant.caption), + IdsText( + '1/4', + variant: IdsTextVariant.title, + color: theme.primary, + ), + ], + ), + ), + ], + ), + ); + } +} + +class _PotgCreateTimeFrame extends StatelessWidget { + const _PotgCreateTimeFrame(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return ColoredBox( + color: theme.surface, + child: Padding( + padding: const EdgeInsets.all(32), + child: IdsVStack( + gap: 24, + crossAxis: CrossAxis.start, + children: [ + const IdsText('팟 생성', variant: IdsTextVariant.heading), + _StepRow(index: '1', label: '지스트 → 광주송정역', filled: true), + _StepRow(index: '2', label: '11월 14일 금요일', filled: true), + _StepRow(index: '3', label: '시간대 설정', filled: false), + const IdsCard( + child: IdsCardContent( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _TimeSummary(label: '금요일 오전', time: '9:41'), + IdsText('~', variant: IdsTextVariant.heading), + _TimeSummary(label: '금요일 오후', time: '12:30'), + ], + ), + ), + ), + const IdsText( + '출발 가능한 가장 늦은 시각을 설정하세요', + variant: IdsTextVariant.title, + ), + IdsCard( + variant: IdsCardVariant.filled, + child: IdsCardContent( + child: SizedBox( + height: 240, + child: IdsVStack( + gap: 28, + mainAxis: MainAxis.center, + crossAxis: CrossAxis.center, + children: [ + IdsHStack( + gap: 32, + fit: IdsStackFit.content, + children: [ + IdsText( + '9', + variant: IdsTextVariant.heading, + color: theme.onMuted, + ), + IdsText( + '41', + variant: IdsTextVariant.heading, + color: theme.onMuted, + ), + IdsText( + 'AM', + variant: IdsTextVariant.heading, + color: theme.onMuted, + ), + ], + ), + IdsButton( + onPressed: () {}, + variant: IdsVariant.outline, + children: const [Text('확인')], + ), + ], + ), + ), + ), + ), + ], + ), + ), + ); + } +} + +class _StepRow extends StatelessWidget { + const _StepRow({ + required this.index, + required this.label, + required this.filled, + }); + + final String index; + final String label; + final bool filled; + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return IdsHStack( + gap: 12, + crossAxis: CrossAxis.center, + children: [ + Container( + width: 34, + height: 34, + alignment: Alignment.center, + decoration: BoxDecoration( + color: filled ? theme.primary : null, + borderRadius: BorderRadius.circular(10), + border: filled ? null : Border.all(color: theme.primary, width: 2), + ), + child: IdsText( + index, + variant: IdsTextVariant.title, + color: filled ? theme.onPrimary : theme.primary, + ), + ), + Expanded(child: IdsText(label, variant: IdsTextVariant.title)), + ], + ); + } +} + +class _TimeSummary extends StatelessWidget { + const _TimeSummary({required this.label, required this.time}); + + final String label; + final String time; + + @override + Widget build(BuildContext context) { + return IdsVStack( + gap: 4, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: [ + IdsText(label, variant: IdsTextVariant.caption), + IdsText(time, variant: IdsTextVariant.title), + ], + ); + } +} + +IdsBottomNavigationItem _navItem(List> icon, String label) { + return IdsBottomNavigationItem( + label: label, + icon: (color, size) => HugeIcon(icon: icon, color: color, size: size), + ); +} + +class _HugeIcon extends StatelessWidget { + const _HugeIcon(this.icon); + + final List> icon; + + @override + Widget build(BuildContext context) { + final iconTheme = IconTheme.of(context); + return HugeIcon( + icon: icon, + color: iconTheme.color ?? const Color(0xFF000000), + size: iconTheme.size ?? 24, + ); + } +} diff --git a/packages/flutter/example/lib/main.dart b/packages/flutter/example/lib/main.dart index c3f8fd7..795ef89 100644 --- a/packages/flutter/example/lib/main.dart +++ b/packages/flutter/example/lib/main.dart @@ -9,6 +9,7 @@ import 'components/feedback_usecase.dart'; import 'components/divider_usecase.dart'; import 'components/item_usecase.dart'; import 'components/icon_button_usecase.dart'; +import 'components/mvp_frames_usecase.dart'; import 'components/navigation_usecase.dart'; import 'components/stack_usecase.dart'; import 'components/text_usecase.dart'; @@ -57,6 +58,7 @@ class WidgetbookApp extends StatelessWidget { WidgetbookComponent(name: 'IdsCheckbox', useCases: checkboxUseCases), WidgetbookComponent(name: 'IdsDialog', useCases: dialogUseCases), WidgetbookComponent(name: 'IdsEmpty', useCases: emptyUseCases), + WidgetbookComponent(name: 'MVP Frames', useCases: mvpFrameUseCases), ], ); } diff --git a/packages/react/src/components/examples.stories.tsx b/packages/react/src/components/examples.stories.tsx index cb827b6..4f1caf2 100644 --- a/packages/react/src/components/examples.stories.tsx +++ b/packages/react/src/components/examples.stories.tsx @@ -9,6 +9,7 @@ import { UserCircle02Icon, } from 'hugeicons-react'; +import { Avatar } from './avatar'; import { Badge } from './badge'; import { BottomNavigation } from './bottom-navigation'; import { Button } from './button'; @@ -19,6 +20,7 @@ import { Empty } from './empty'; import { FloatingButton } from './floating-button'; import { HStack } from './hstack'; import { IconButton } from './icon-button'; +import { Item } from './item'; import { Tabs } from './tabs'; import { Text } from './text'; @@ -38,6 +40,106 @@ const Phone = ({ children }: { children: ReactNode }) => ( ); +const PhoneHeader = ({ title, backLabel }: { title: string; backLabel?: string }) => ( +
+ {backLabel ? ( + + ) : null} + {title} +
+); + +const PotgNavigation = ({ value }: { value: string }) => ( + + } label="모든 팟" /> + } label="팟 검색" /> + } label="채팅방" /> + } label="내 정보" /> + +); + +const NoticePoster = () => ( +
+ 2024 정보국 +
+ 신규 국원 모집 +
+); + +const NoticeBody = ({ withImage }: { withImage: boolean }) => ( +
+ {withImage ? ( + <> + + + + + Q. Infoteam이 무엇인가요? + + + Infoteam은 IT기술을 이용해 GIST 학생들의 삶을 편리하게 만듭니다. + + + + + ) : null} + + 비상대책위원회 정보국(Infoteam)에서 신규 부원 모집을 진행합니다! +
+ 지원서 작성 구글 폼 링크 +
+ + 인포팀은 IT 서비스 개발을 통해 GIST 학부생의 학교 생활을 편리하게 만들어주는 역할을 수행하고 + 있습니다. 현재 지글(Ziggle), IdP 등의 서비스를 운영 중입니다. + + + 올해 모집은 개발자, 디자이너로 나누어 진행하며 각 직군별 역할을 잘 읽어보신 후 지원해주세요. + +
+); + +const NoticeActions = () => ( +
+ + + + + + +
+); + +const TaxiPotCard = () => ( + +
+ + + 지스트 → 송정역 + + + 13:10~14:00 + + +
+ 정원 + + 1/4 + +
+
+
+); + export const ZiggleGroups: Story = { render: () => ( @@ -91,6 +193,164 @@ export const ZiggleGroups: Story = { ), }; +export const ZiggleNoticeDetailWithImage: Story = { + render: () => ( + + +
+ + + + 인포팀 · 32분 전 + + 2024 정보국 신입 국원 모집 +
+ {['#모집', '#인포팀', '#개발', '#지글', '#비대위', '#정보국'].map((tag) => ( + {tag} + ))} +
+ + +
+
+ ), +}; + +export const ZiggleNoticeDetailTextOnly: Story = { + render: () => ( + + +
+ + + 인포팀 · 32분 전 + + 2024 정보국 신입 국원 모집 +
+ {['#모집', '#인포팀', '#개발', '#지글', '#비대위', '#정보국'].map((tag) => ( + {tag} + ))} +
+ + +
+
+ ), +}; + +export const ZiggleProfile: Story = { + render: () => ( + +
+ + + + + 이정우 + + 20260000 + + crowntheking@gm.gist.ac.kr + + + + + + + + 계정 + 회원 정보 수정 · 아이디 및 비밀번호 변경 + + + + + + + + + 회원 탈퇴 + + +
+ + + 로그아웃 + + + + + + + + + 설정 + 알림 · 언어 · 정보 + + +
+ + + 피드백 · 버그 제보하기 + + + + +
+ + } label="홈" /> + } label="즐겨찾기" /> + } + label="프로필" + /> + + + ), +}; + +export const PotgMainList: Story = { + render: () => ( + +
+ 팟쥐 + + + 요일 별 팟 현황 +
+ {['일', '월', '화', '수', '목', '금', '토'].map((day, index) => ( +
+ {day} + {[0, 1, 2].map((row) => ( +
+ {index === 6 && row === 1 ? 5 : row === 0 ? 0 : 1} +
+ ))} +
+ ))} +
+
+
+ 2025/11/15 토요일 + {Array.from({ length: 5 }, (_, i) => ( + + ))} +
+ + + + +
+ ), +}; + export const PotgSearchEmpty: Story = { render: () => ( @@ -109,12 +369,7 @@ export const PotgSearchEmpty: Story = { - - } label="모든 팟" /> - } label="팟 검색" /> - } label="채팅방" /> - } label="내 정보" /> - + ), }; @@ -166,12 +421,7 @@ export const PotgFilterAndDialog: Story = { - - } label="모든 팟" /> - } label="팟 검색" /> - } label="채팅방" /> - } label="내 정보" /> - + 입장하시겠습니까? @@ -200,3 +450,57 @@ export const PotgFilterAndDialog: Story = { ); }, }; + +export const PotgCreateTime: Story = { + render: () => ( + +
+ 팟 생성 +
+ + + 1 + + 지스트 → 광주송정역 + + + + 2 + + 11월 14일 금요일 + + + + 3 + + 시간대 설정 + +
+ + +
+ 금요일 오전 + 9:41 +
+ ~ +
+ 금요일 오후 + 12:30 +
+
+
+ 출발 가능한 가장 늦은 시각을 설정하세요 + + +
+ 9 + 41 + AM +
+ +
+
+
+
+ ), +}; From 58376bf9a0ad4b08e3f53e6ef36b2201ead1d053 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sat, 6 Jun 2026 20:01:07 +0900 Subject: [PATCH 02/28] docs(flutter): expand MVP frame coverage --- .../lib/components/mvp_frames_usecase.dart | 443 ++++++++++++++++++ 1 file changed, 443 insertions(+) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index a506ea5..1688689 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -4,6 +4,14 @@ import 'package:ids_flutter/ids.dart'; import 'package:widgetbook/widgetbook.dart'; final mvpFrameUseCases = [ + WidgetbookUseCase( + name: 'Ziggle Groups', + builder: (context) => _withTheme( + context, + initialColor: IdsColor.orange, + child: const _Phone(child: _ZiggleGroupsFrame()), + ), + ), WidgetbookUseCase( name: 'Ziggle Notice Detail', builder: (context) => _withTheme( @@ -28,6 +36,22 @@ final mvpFrameUseCases = [ child: const _Phone(child: _PotgMainListFrame()), ), ), + WidgetbookUseCase( + name: 'Potg Search Empty', + builder: (context) => _withTheme( + context, + initialColor: IdsColor.green, + child: const _Phone(child: _PotgSearchEmptyFrame()), + ), + ), + WidgetbookUseCase( + name: 'Potg Filter Dialog', + builder: (context) => _withTheme( + context, + initialColor: IdsColor.green, + child: const _Phone(child: _PotgFilterDialogFrame()), + ), + ), WidgetbookUseCase( name: 'Potg Create Time', builder: (context) => _withTheme( @@ -83,6 +107,182 @@ class _Phone extends StatelessWidget { } } +class _ZiggleGroupsFrame extends StatelessWidget { + const _ZiggleGroupsFrame(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return Column( + children: [ + const _GroupHeader(), + Expanded( + child: IdsTabs( + defaultValue: 'notice', + items: [ + const IdsTabItem( + value: 'intro', + label: '소개', + child: Padding( + padding: EdgeInsets.all(24), + child: IdsText('지속 가능한 개발 문화를 통해 지스트 학부생의 삶의 질을 높이는 팀입니다.'), + ), + ), + IdsTabItem( + value: 'notice', + label: '공지', + child: SingleChildScrollView( + padding: const EdgeInsets.all(20), + child: IdsVStack( + gap: 16, + children: [ + const _GroupNoticeCard(), + IdsCard( + variant: IdsCardVariant.elevated, + child: IdsCardContent( + child: IdsVStack( + gap: 12, + crossAxis: CrossAxis.start, + children: [ + const IdsText( + '제휴업체 댓글 이벤트 당첨자 공지', + variant: IdsTextVariant.title, + ), + const _NoticePoster(), + Wrap( + spacing: 8, + children: const [ + IdsBadge('# 태그1'), + IdsBadge('# 태그1'), + IdsBadge('# 태그1'), + ], + ), + IdsText( + '10일 남음', + variant: IdsTextVariant.caption, + color: theme.primary, + ), + ], + ), + ), + ), + ], + ), + ), + ), + const IdsTabItem( + value: 'members', + label: '멤버', + child: Padding( + padding: EdgeInsets.all(24), + child: IdsText('멤버 목록'), + ), + ), + ], + ), + ), + ], + ); + } +} + +class _GroupHeader extends StatelessWidget { + const _GroupHeader(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return ColoredBox( + color: theme.surface, + child: Padding( + padding: const EdgeInsets.all(24), + child: IdsVStack( + gap: 18, + children: [ + const IdsHStack( + gap: 16, + crossAxis: CrossAxis.center, + children: [ + IdsAvatar(name: '짭인포팀', size: IdsSize.xxl), + Expanded( + child: IdsVStack( + gap: 4, + crossAxis: CrossAxis.start, + children: [ + IdsText('짭인포팀', variant: IdsTextVariant.heading), + IdsText( + '구독자 19명 · 게시글 5개', + variant: IdsTextVariant.label, + ), + ], + ), + ), + ], + ), + IdsCard( + variant: IdsCardVariant.filled, + child: IdsCardContent( + child: IdsText( + '지속 가능한 개발 문화를 통해 지스트 학부생의 삶의 질을 높이는 팀, 인포팀입니다.', + color: theme.onMuted, + ), + ), + ), + IdsButton(onPressed: () {}, children: const [Text('즐겨찾기')]), + ], + ), + ), + ); + } +} + +class _GroupNoticeCard extends StatelessWidget { + const _GroupNoticeCard(); + + @override + Widget build(BuildContext context) { + return IdsCard( + variant: IdsCardVariant.elevated, + child: IdsCardContent( + child: IdsVStack( + gap: 12, + crossAxis: CrossAxis.start, + children: [ + const IdsHStack( + gap: 10, + crossAxis: CrossAxis.center, + children: [ + IdsAvatar(name: '짭인포팀'), + IdsVStack( + gap: 2, + crossAxis: CrossAxis.start, + fit: IdsStackFit.content, + children: [ + IdsText('짭인포팀', variant: IdsTextVariant.label), + IdsText('10분 전', variant: IdsTextVariant.caption), + ], + ), + ], + ), + const IdsText('공지 제목', variant: IdsTextVariant.title), + const _NoticePoster(), + Wrap( + spacing: 8, + children: const [ + IdsBadge('# 태그1'), + IdsBadge('# 태그1'), + IdsBadge('# 태그1'), + ], + ), + ], + ), + ), + ); + } +} + class _PhoneHeader extends StatelessWidget { const _PhoneHeader({required this.title, this.backLabel}); @@ -495,6 +695,229 @@ class _TaxiPotCard extends StatelessWidget { } } +class _PotgSearchEmptyFrame extends StatelessWidget { + const _PotgSearchEmptyFrame(); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Column( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(24), + child: IdsVStack( + gap: 24, + crossAxis: CrossAxis.start, + children: [ + const IdsText('팟 검색', variant: IdsTextVariant.heading), + Expanded( + child: Center( + child: IdsEmpty( + children: [ + const IdsEmptyMedia( + child: _HugeIcon(HugeIcons.strokeRoundedSad01), + ), + const IdsEmptyDescription('해당 조건의 택시 팟이 존재하지 않습니다'), + IdsEmptyActions( + children: [ + IdsButton( + onPressed: () {}, + variant: IdsVariant.outline, + children: const [ + _HugeIcon(HugeIcons.strokeRoundedCar03), + Text('새 팟 만들기'), + ], + ), + ], + ), + ], + ), + ), + ), + ], + ), + ), + ), + _PotgBottomNavigation(currentIndex: 1), + ], + ), + IdsFloatingButton( + semanticLabel: '새 팟 만들기', + onPressed: () {}, + children: const [_HugeIcon(HugeIcons.strokeRoundedCar03)], + ), + ], + ); + } +} + +class _PotgFilterDialogFrame extends StatefulWidget { + const _PotgFilterDialogFrame(); + + @override + State<_PotgFilterDialogFrame> createState() => _PotgFilterDialogFrameState(); +} + +class _PotgFilterDialogFrameState extends State<_PotgFilterDialogFrame> { + var checked = true; + var open = true; + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return Stack( + children: [ + Column( + children: [ + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.all(24), + child: IdsVStack( + gap: 20, + crossAxis: CrossAxis.start, + children: [ + const IdsText('팟 검색', variant: IdsTextVariant.heading), + const IdsText('노선 필터', variant: IdsTextVariant.caption), + const IdsCard( + child: IdsCardContent( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IdsText('지스트', variant: IdsTextVariant.title), + IdsText('→', variant: IdsTextVariant.title), + IdsText('유스퀘어', variant: IdsTextVariant.title), + ], + ), + ), + ), + const IdsText('날짜 필터', variant: IdsTextVariant.caption), + const _CalendarFilterCard(), + IdsHStack( + gap: 8, + crossAxis: CrossAxis.center, + children: [ + IdsCheckbox( + checked: checked, + semanticLabel: '정원이 가득 찬 팟 숨기기', + onChanged: (value) => setState(() => checked = value), + ), + const Expanded( + child: IdsText( + '정원이 가득 찬 팟 숨기기', + variant: IdsTextVariant.label, + ), + ), + ], + ), + IdsButton( + onPressed: () => setState(() => open = true), + children: const [Text('적용')], + ), + _TaxiPotCard(), + ], + ), + ), + ), + _PotgBottomNavigation(currentIndex: 1), + ], + ), + IdsFloatingButton( + semanticLabel: '새 팟 만들기', + onPressed: () {}, + children: const [_HugeIcon(HugeIcons.strokeRoundedCar03)], + ), + IdsDialog( + open: open, + onOpenChanged: (value) => setState(() => open = value), + children: [ + const IdsDialogHeader(children: [IdsDialogTitle('입장하시겠습니까?')]), + const IdsDialogContent( + child: IdsVStack( + gap: 8, + crossAxis: CrossAxis.start, + children: [ + IdsText('노선 송정역 → 지스트', variant: IdsTextVariant.label), + IdsText( + '날짜 2025년 12월 13일 토요일', + variant: IdsTextVariant.label, + ), + IdsText('시간 23:30~01:00', variant: IdsTextVariant.label), + IdsText( + '참여자 목록 홍길동, 심청이, 변사또', + variant: IdsTextVariant.label, + ), + ], + ), + ), + IdsDialogFooter( + children: [ + IdsButton( + onPressed: () => setState(() => open = false), + variant: IdsVariant.ghost, + children: const [Text('아니요')], + ), + IdsButton( + onPressed: () => setState(() => open = false), + variant: IdsVariant.ghost, + children: [Text('네', style: TextStyle(color: theme.primary))], + ), + ], + ), + ], + ), + ], + ); + } +} + +class _CalendarFilterCard extends StatelessWidget { + const _CalendarFilterCard(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return IdsCard( + child: IdsCardContent( + child: IdsVStack( + gap: 16, + children: [ + const IdsText( + '2025년 11월', + variant: IdsTextVariant.title, + align: TextAlign.center, + ), + Wrap( + spacing: 18, + runSpacing: 14, + children: [ + for (var day = 8; day <= 22; day++) + Container( + width: 34, + height: 34, + alignment: Alignment.center, + decoration: BoxDecoration( + color: day == 14 ? theme.primary : null, + borderRadius: BorderRadius.circular(12), + ), + child: IdsText( + '$day', + variant: IdsTextVariant.label, + color: day == 14 ? theme.onPrimary : theme.onSurface, + ), + ), + ], + ), + ], + ), + ), + ); + } +} + class _PotgCreateTimeFrame extends StatelessWidget { const _PotgCreateTimeFrame(); @@ -638,6 +1061,26 @@ class _TimeSummary extends StatelessWidget { } } +class _PotgBottomNavigation extends StatelessWidget { + const _PotgBottomNavigation({required this.currentIndex}); + + final int currentIndex; + + @override + Widget build(BuildContext context) { + return IdsBottomNavigation( + currentIndex: currentIndex, + onTap: (_) {}, + items: [ + _navItem(HugeIcons.strokeRoundedHome01, '모든 팟'), + _navItem(HugeIcons.strokeRoundedSearch01, '팟 검색'), + _navItem(HugeIcons.strokeRoundedMessage01, '채팅방'), + _navItem(HugeIcons.strokeRoundedUserCircle02, '내 정보'), + ], + ); + } +} + IdsBottomNavigationItem _navItem(List> icon, String label) { return IdsBottomNavigationItem( label: label, From 5d62d51cc5dc43dcbeae24e62c6f03d4fe49387c Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sat, 6 Jun 2026 20:07:26 +0900 Subject: [PATCH 03/28] fix(flutter): constrain MVP group tabs panel --- .../lib/components/mvp_frames_usecase.dart | 133 ++++++++++-------- 1 file changed, 75 insertions(+), 58 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 1688689..27883b7 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -118,68 +118,85 @@ class _ZiggleGroupsFrame extends StatelessWidget { children: [ const _GroupHeader(), Expanded( - child: IdsTabs( - defaultValue: 'notice', - items: [ - const IdsTabItem( - value: 'intro', - label: '소개', - child: Padding( - padding: EdgeInsets.all(24), - child: IdsText('지속 가능한 개발 문화를 통해 지스트 학부생의 삶의 질을 높이는 팀입니다.'), - ), - ), - IdsTabItem( - value: 'notice', - label: '공지', - child: SingleChildScrollView( - padding: const EdgeInsets.all(20), - child: IdsVStack( - gap: 16, - children: [ - const _GroupNoticeCard(), - IdsCard( - variant: IdsCardVariant.elevated, - child: IdsCardContent( - child: IdsVStack( - gap: 12, - crossAxis: CrossAxis.start, - children: [ - const IdsText( - '제휴업체 댓글 이벤트 당첨자 공지', - variant: IdsTextVariant.title, - ), - const _NoticePoster(), - Wrap( - spacing: 8, - children: const [ - IdsBadge('# 태그1'), - IdsBadge('# 태그1'), - IdsBadge('# 태그1'), - ], - ), - IdsText( - '10일 남음', - variant: IdsTextVariant.caption, - color: theme.primary, + child: LayoutBuilder( + builder: (context, constraints) { + final panelHeight = constraints.maxHeight - 49; + + return IdsTabs( + defaultValue: 'notice', + items: [ + IdsTabItem( + value: 'intro', + label: '소개', + child: SizedBox( + height: panelHeight, + child: const Padding( + padding: EdgeInsets.all(24), + child: IdsText( + '지속 가능한 개발 문화를 통해 지스트 학부생의 삶의 질을 높이는 팀입니다.', + ), + ), + ), + ), + IdsTabItem( + value: 'notice', + label: '공지', + child: SizedBox( + height: panelHeight, + child: SingleChildScrollView( + padding: const EdgeInsets.all(20), + child: IdsVStack( + gap: 16, + children: [ + const _GroupNoticeCard(), + IdsCard( + variant: IdsCardVariant.elevated, + child: IdsCardContent( + child: IdsVStack( + gap: 12, + crossAxis: CrossAxis.start, + children: [ + const IdsText( + '제휴업체 댓글 이벤트 당첨자 공지', + variant: IdsTextVariant.title, + ), + const _NoticePoster(), + Wrap( + spacing: 8, + children: const [ + IdsBadge('# 태그1'), + IdsBadge('# 태그1'), + IdsBadge('# 태그1'), + ], + ), + IdsText( + '10일 남음', + variant: IdsTextVariant.caption, + color: theme.primary, + ), + ], + ), ), - ], - ), + ), + ], ), ), - ], + ), ), - ), - ), - const IdsTabItem( - value: 'members', - label: '멤버', - child: Padding( - padding: EdgeInsets.all(24), - child: IdsText('멤버 목록'), - ), - ), - ], + IdsTabItem( + value: 'members', + label: '멤버', + child: SizedBox( + height: panelHeight, + child: const Padding( + padding: EdgeInsets.all(24), + child: IdsText('멤버 목록'), + ), + ), + ), + ], + ); + }, ), ), ], From 417ba1af8aa32ad9dfcebb2f9a610a7898c9f1b6 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sat, 6 Jun 2026 20:09:04 +0900 Subject: [PATCH 04/28] fix(flutter): restore notice reaction chips --- .../lib/components/mvp_frames_usecase.dart | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 27883b7..93ae520 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -428,38 +428,47 @@ class _ReactionBar extends StatelessWidget { @override Widget build(BuildContext context) { - return Wrap( - spacing: 8, - runSpacing: 8, + return const Wrap( + spacing: 10, + runSpacing: 10, children: [ - IdsButton( - onPressed: () {}, - size: IdsSize.sm, - children: const [Text('🔥 268')], - ), - IdsButton( - onPressed: () {}, - size: IdsSize.sm, - variant: IdsVariant.soft, - children: const [Text('😮 37')], - ), - IdsButton( - onPressed: () {}, - size: IdsSize.sm, - variant: IdsVariant.soft, - children: const [Text('공유하기')], - ), - IdsButton( - onPressed: () {}, - size: IdsSize.sm, - variant: IdsVariant.soft, - children: const [Text('링크 복사하기')], - ), + _ReactionChip(label: '🔥 268', selected: true, width: 92), + _ReactionChip(label: '😮 37', width: 84), + _ReactionChip(label: '😭 2', width: 76), + _ReactionChip(label: '🤔 1', width: 76), + _ReactionChip(label: '☹️ 0', width: 76), + _ReactionChip(label: '공유하기', width: 118), + _ReactionChip(label: '링크 복사하기', width: 138), ], ); } } +class _ReactionChip extends StatelessWidget { + const _ReactionChip({ + required this.label, + required this.width, + this.selected = false, + }); + + final String label; + final double width; + final bool selected; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: width, + child: IdsButton( + onPressed: () {}, + size: IdsSize.sm, + variant: selected ? IdsVariant.solid : IdsVariant.soft, + children: [Text(label)], + ), + ); + } +} + class _ZiggleProfileFrame extends StatelessWidget { const _ZiggleProfileFrame(); From 62e534e0edb1b8c0ffa1561bbf52cc4cf7723929 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sat, 6 Jun 2026 20:10:17 +0900 Subject: [PATCH 05/28] fix(flutter): make profile frame scrollable --- packages/flutter/example/lib/components/mvp_frames_usecase.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 93ae520..646ea28 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -477,7 +477,7 @@ class _ZiggleProfileFrame extends StatelessWidget { return Column( children: [ Expanded( - child: Padding( + child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: IdsVStack( gap: 24, From 8cee5c80787068540a7d47e3b07fe4f80002b028 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sat, 6 Jun 2026 20:11:44 +0900 Subject: [PATCH 06/28] fix(flutter): lift Potg MVP floating button --- .../lib/components/mvp_frames_usecase.dart | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 646ea28..c5473b1 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -605,11 +605,7 @@ class _PotgMainListFrame extends StatelessWidget { ), ], ), - IdsFloatingButton( - semanticLabel: '새 팟 만들기', - onPressed: () {}, - children: const [_HugeIcon(HugeIcons.strokeRoundedCar03)], - ), + const _PotgFloatingButton(), ], ); } @@ -769,11 +765,7 @@ class _PotgSearchEmptyFrame extends StatelessWidget { _PotgBottomNavigation(currentIndex: 1), ], ), - IdsFloatingButton( - semanticLabel: '새 팟 만들기', - onPressed: () {}, - children: const [_HugeIcon(HugeIcons.strokeRoundedCar03)], - ), + const _PotgFloatingButton(), ], ); } @@ -850,11 +842,7 @@ class _PotgFilterDialogFrameState extends State<_PotgFilterDialogFrame> { _PotgBottomNavigation(currentIndex: 1), ], ), - IdsFloatingButton( - semanticLabel: '새 팟 만들기', - onPressed: () {}, - children: const [_HugeIcon(HugeIcons.strokeRoundedCar03)], - ), + const _PotgFloatingButton(), IdsDialog( open: open, onOpenChanged: (value) => setState(() => open = value), @@ -1107,6 +1095,22 @@ class _PotgBottomNavigation extends StatelessWidget { } } +class _PotgFloatingButton extends StatelessWidget { + const _PotgFloatingButton(); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 88), + child: IdsFloatingButton( + semanticLabel: '새 팟 만들기', + onPressed: () {}, + children: const [_HugeIcon(HugeIcons.strokeRoundedCar03)], + ), + ); + } +} + IdsBottomNavigationItem _navItem(List> icon, String label) { return IdsBottomNavigationItem( label: label, From eedb6d0894fa6ef005845947655b085115b1d83e Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sat, 6 Jun 2026 20:14:03 +0900 Subject: [PATCH 07/28] fix(flutter): make Potg create time frame visible --- .../lib/components/mvp_frames_usecase.dart | 127 +++++++++--------- 1 file changed, 65 insertions(+), 62 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index c5473b1..9e3c5b3 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -941,74 +941,77 @@ class _PotgCreateTimeFrame extends StatelessWidget { return ColoredBox( color: theme.surface, - child: Padding( + child: SingleChildScrollView( padding: const EdgeInsets.all(32), - child: IdsVStack( - gap: 24, - crossAxis: CrossAxis.start, - children: [ - const IdsText('팟 생성', variant: IdsTextVariant.heading), - _StepRow(index: '1', label: '지스트 → 광주송정역', filled: true), - _StepRow(index: '2', label: '11월 14일 금요일', filled: true), - _StepRow(index: '3', label: '시간대 설정', filled: false), - const IdsCard( - child: IdsCardContent( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _TimeSummary(label: '금요일 오전', time: '9:41'), - IdsText('~', variant: IdsTextVariant.heading), - _TimeSummary(label: '금요일 오후', time: '12:30'), - ], - ), - ), - ), - const IdsText( - '출발 가능한 가장 늦은 시각을 설정하세요', - variant: IdsTextVariant.title, - ), - IdsCard( - variant: IdsCardVariant.filled, - child: IdsCardContent( - child: SizedBox( - height: 240, - child: IdsVStack( - gap: 28, - mainAxis: MainAxis.center, - crossAxis: CrossAxis.center, + child: ConstrainedBox( + constraints: const BoxConstraints(minHeight: 696), + child: IdsVStack( + gap: 24, + crossAxis: CrossAxis.start, + children: [ + const IdsText('팟 생성', variant: IdsTextVariant.heading), + _StepRow(index: '1', label: '지스트 → 광주송정역', filled: true), + _StepRow(index: '2', label: '11월 14일 금요일', filled: true), + _StepRow(index: '3', label: '시간대 설정', filled: false), + const IdsCard( + child: IdsCardContent( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - IdsHStack( - gap: 32, - fit: IdsStackFit.content, - children: [ - IdsText( - '9', - variant: IdsTextVariant.heading, - color: theme.onMuted, - ), - IdsText( - '41', - variant: IdsTextVariant.heading, - color: theme.onMuted, - ), - IdsText( - 'AM', - variant: IdsTextVariant.heading, - color: theme.onMuted, - ), - ], - ), - IdsButton( - onPressed: () {}, - variant: IdsVariant.outline, - children: const [Text('확인')], - ), + _TimeSummary(label: '금요일 오전', time: '9:41'), + IdsText('~', variant: IdsTextVariant.heading), + _TimeSummary(label: '금요일 오후', time: '12:30'), ], ), ), ), - ), - ], + const IdsText( + '출발 가능한 가장 늦은 시각을 설정하세요', + variant: IdsTextVariant.title, + ), + IdsCard( + variant: IdsCardVariant.filled, + child: IdsCardContent( + child: SizedBox( + height: 240, + child: IdsVStack( + gap: 28, + mainAxis: MainAxis.center, + crossAxis: CrossAxis.center, + children: [ + IdsHStack( + gap: 32, + fit: IdsStackFit.content, + children: [ + IdsText( + '9', + variant: IdsTextVariant.heading, + color: theme.onMuted, + ), + IdsText( + '41', + variant: IdsTextVariant.heading, + color: theme.onMuted, + ), + IdsText( + 'AM', + variant: IdsTextVariant.heading, + color: theme.onMuted, + ), + ], + ), + IdsButton( + onPressed: () {}, + variant: IdsVariant.outline, + children: const [Text('확인')], + ), + ], + ), + ), + ), + ), + ], + ), ), ), ); From 7a28f276bd02568a023860612a5583a07a29d250 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sat, 6 Jun 2026 20:41:14 +0900 Subject: [PATCH 08/28] fix(flutter): polish MVP presentation frames --- .../lib/components/mvp_frames_usecase.dart | 140 +++++++++++++----- packages/flutter/example/lib/main.dart | 4 + .../lib/src/components/card/ids_card.dart | 6 +- 3 files changed, 106 insertions(+), 44 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 9e3c5b3..7ea56fb 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -36,6 +36,14 @@ final mvpFrameUseCases = [ child: const _Phone(child: _PotgMainListFrame()), ), ), + WidgetbookUseCase( + name: 'Potg Create Time', + builder: (context) => _withTheme( + context, + initialColor: IdsColor.green, + child: const _Phone(child: _PotgCreateTimeFrame()), + ), + ), WidgetbookUseCase( name: 'Potg Search Empty', builder: (context) => _withTheme( @@ -52,8 +60,11 @@ final mvpFrameUseCases = [ child: const _Phone(child: _PotgFilterDialogFrame()), ), ), +]; + +final potgCreateTimeFrameUseCases = [ WidgetbookUseCase( - name: 'Potg Create Time', + name: 'Time Range', builder: (context) => _withTheme( context, initialColor: IdsColor.green, @@ -157,16 +168,16 @@ class _ZiggleGroupsFrame extends StatelessWidget { crossAxis: CrossAxis.start, children: [ const IdsText( - '제휴업체 댓글 이벤트 당첨자 공지', + '2026 봄학기 개발자 모집 안내', variant: IdsTextVariant.title, ), const _NoticePoster(), Wrap( spacing: 8, children: const [ - IdsBadge('# 태그1'), - IdsBadge('# 태그1'), - IdsBadge('# 태그1'), + IdsBadge('#공지'), + IdsBadge('#행사'), + IdsBadge('#지원'), ], ), IdsText( @@ -222,15 +233,15 @@ class _GroupHeader extends StatelessWidget { gap: 16, crossAxis: CrossAxis.center, children: [ - IdsAvatar(name: '짭인포팀', size: IdsSize.xxl), + IdsAvatar(name: '인포팀', size: IdsSize.xxl), Expanded( child: IdsVStack( gap: 4, crossAxis: CrossAxis.start, children: [ - IdsText('짭인포팀', variant: IdsTextVariant.heading), + IdsText('GIST 인포팀', variant: IdsTextVariant.heading), IdsText( - '구독자 19명 · 게시글 5개', + '구독자 248명 · 게시글 12개', variant: IdsTextVariant.label, ), ], @@ -242,7 +253,7 @@ class _GroupHeader extends StatelessWidget { variant: IdsCardVariant.filled, child: IdsCardContent( child: IdsText( - '지속 가능한 개발 문화를 통해 지스트 학부생의 삶의 질을 높이는 팀, 인포팀입니다.', + 'GIST 학생을 위한 웹 서비스와 인증 인프라를 만들고 운영하는 개발팀입니다.', color: theme.onMuted, ), ), @@ -271,26 +282,26 @@ class _GroupNoticeCard extends StatelessWidget { gap: 10, crossAxis: CrossAxis.center, children: [ - IdsAvatar(name: '짭인포팀'), + IdsAvatar(name: '인포팀'), IdsVStack( gap: 2, crossAxis: CrossAxis.start, fit: IdsStackFit.content, children: [ - IdsText('짭인포팀', variant: IdsTextVariant.label), - IdsText('10분 전', variant: IdsTextVariant.caption), + IdsText('GIST 인포팀', variant: IdsTextVariant.label), + IdsText('12분 전', variant: IdsTextVariant.caption), ], ), ], ), - const IdsText('공지 제목', variant: IdsTextVariant.title), + const IdsText('2026 봄학기 인포팀 개발자 모집', variant: IdsTextVariant.title), const _NoticePoster(), Wrap( spacing: 8, children: const [ - IdsBadge('# 태그1'), - IdsBadge('# 태그1'), - IdsBadge('# 태그1'), + IdsBadge('#모집'), + IdsBadge('#개발'), + IdsBadge('#인포팀'), ], ), ], @@ -356,7 +367,7 @@ class _ZiggleNoticeDetailFrame extends StatelessWidget { children: [ IdsButton( onPressed: () {}, - children: const [Text('마감기한 2024.03.30. 18:00')], + children: const [Text('마감기한 2026.03.30. 18:00')], ), const IdsHStack( gap: 10, @@ -367,7 +378,7 @@ class _ZiggleNoticeDetailFrame extends StatelessWidget { ], ), const IdsText( - '2024 정보국 신입 국원 모집', + '2026 봄학기 인포팀 개발자 모집', variant: IdsTextVariant.heading, ), Wrap( @@ -377,17 +388,17 @@ class _ZiggleNoticeDetailFrame extends StatelessWidget { IdsBadge('#모집'), IdsBadge('#인포팀'), IdsBadge('#개발'), - IdsBadge('#지글'), - IdsBadge('#비대위'), - IdsBadge('#정보국'), + IdsBadge('#앱개발'), + IdsBadge('#디자인시스템'), + IdsBadge('#서비스운영'), ], ), const _NoticePoster(), const IdsText( - '비상대책위원회 정보국(Infoteam)에서 신규 부원 모집을 진행합니다!\n지원서 작성 구글 폼 링크', + 'GIST 인포팀에서 2026 봄학기 신규 멤버를 모집합니다.\n지원서 작성 구글 폼 링크', ), const IdsText( - '인포팀은 IT 서비스 개발을 통해 GIST 학부생의 학교 생활을 편리하게 만들어주는 역할을 수행하고 있습니다. 현재 지글(Ziggle), IdP 등의 서비스를 운영 중입니다.', + '인포팀은 지글(Ziggle), IdP, 디자인 시스템 등 학생들이 매일 사용하는 서비스를 설계하고 운영합니다. 제품 개발과 서비스 운영을 함께 경험하고 싶은 분을 기다립니다.', ), const _ReactionBar(), ], @@ -409,12 +420,16 @@ class _NoticePoster extends StatelessWidget { height: 320, alignment: Alignment.center, decoration: BoxDecoration( - color: const Color(0xFFFFE0E3), - borderRadius: BorderRadius.circular(12), + gradient: const LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [Color(0xFFFFECE8), Color(0xFFFFD6DC)], + ), + borderRadius: BorderRadius.circular(24), border: Border.all(color: ThemeProvider.of(context).outline), ), child: const IdsText( - '2024 정보국\n신규 국원 모집', + '2026 봄학기\n인포팀 개발자 모집', variant: IdsTextVariant.heading, align: TextAlign.center, color: Color(0xFFE85F6A), @@ -491,10 +506,10 @@ class _ZiggleProfileFrame extends StatelessWidget { gap: 10, crossAxis: CrossAxis.center, children: [ - IdsAvatar(name: '이정우', size: IdsSize.xxl), - IdsText('이정우', variant: IdsTextVariant.heading), - IdsText('20260000', variant: IdsTextVariant.title), - IdsText('crowntheking@gm.gist.ac.kr'), + IdsAvatar(name: '류현승', size: IdsSize.xxl), + IdsText('류현승', variant: IdsTextVariant.heading), + IdsText('20255070', variant: IdsTextVariant.title), + IdsText('rhseungg@gm.gist.ac.kr'), ], ), ), @@ -588,7 +603,30 @@ class _PotgMainListFrame extends StatelessWidget { variant: IdsTextVariant.label, color: theme.onMuted, ), - for (var i = 0; i < 5; i++) const _TaxiPotCard(), + const _TaxiPotCard( + from: '지스트', + to: '광주송정역', + time: '13:10~14:00', + capacity: '1/4', + ), + const _TaxiPotCard( + from: '지스트', + to: '유스퀘어', + time: '17:30~18:10', + capacity: '2/4', + ), + const _TaxiPotCard( + from: '광주송정역', + to: '지스트', + time: '21:20~22:00', + capacity: '3/4', + ), + const _TaxiPotCard( + from: '지스트', + to: '광주공항', + time: '08:40~09:20', + capacity: '1/3', + ), ], ), ), @@ -666,25 +704,45 @@ class _WeekStatusCard extends StatelessWidget { } class _TaxiPotCard extends StatelessWidget { - const _TaxiPotCard(); + const _TaxiPotCard({ + this.from = '지스트', + this.to = '광주송정역', + this.time = '13:10~14:00', + this.capacity = '1/4', + }); + + final String from; + final String to; + final String time; + final String capacity; @override Widget build(BuildContext context) { final theme = ThemeProvider.of(context); - return IdsCard( - variant: IdsCardVariant.elevated, - interactive: true, + return Container( + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: theme.surface, + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: const Color(0xFF000000).withValues(alpha: 0.08), + blurRadius: 18, + offset: const Offset(0, 8), + ), + ], + ), child: Row( children: [ - const Expanded( + Expanded( child: IdsCardContent( child: IdsVStack( gap: 8, crossAxis: CrossAxis.start, children: [ - IdsText('지스트 → 송정역', variant: IdsTextVariant.label), - IdsText('13:10~14:00', variant: IdsTextVariant.title), + IdsText('$from → $to', variant: IdsTextVariant.label), + IdsText(time, variant: IdsTextVariant.title), ], ), ), @@ -704,7 +762,7 @@ class _TaxiPotCard extends StatelessWidget { children: [ const IdsText('정원', variant: IdsTextVariant.caption), IdsText( - '1/4', + capacity, variant: IdsTextVariant.title, color: theme.primary, ), @@ -853,14 +911,14 @@ class _PotgFilterDialogFrameState extends State<_PotgFilterDialogFrame> { gap: 8, crossAxis: CrossAxis.start, children: [ - IdsText('노선 송정역 → 지스트', variant: IdsTextVariant.label), + IdsText('노선 광주송정역 → 지스트', variant: IdsTextVariant.label), IdsText( '날짜 2025년 12월 13일 토요일', variant: IdsTextVariant.label, ), IdsText('시간 23:30~01:00', variant: IdsTextVariant.label), IdsText( - '참여자 목록 홍길동, 심청이, 변사또', + '참여자 목록 김민준, 박서연, 이서연', variant: IdsTextVariant.label, ), ], diff --git a/packages/flutter/example/lib/main.dart b/packages/flutter/example/lib/main.dart index 795ef89..f3a1eab 100644 --- a/packages/flutter/example/lib/main.dart +++ b/packages/flutter/example/lib/main.dart @@ -59,6 +59,10 @@ class WidgetbookApp extends StatelessWidget { WidgetbookComponent(name: 'IdsDialog', useCases: dialogUseCases), WidgetbookComponent(name: 'IdsEmpty', useCases: emptyUseCases), WidgetbookComponent(name: 'MVP Frames', useCases: mvpFrameUseCases), + WidgetbookComponent( + name: 'MVP Potg Create Time', + useCases: potgCreateTimeFrameUseCases, + ), ], ); } diff --git a/packages/flutter/lib/src/components/card/ids_card.dart b/packages/flutter/lib/src/components/card/ids_card.dart index d22f895..1d2ab2a 100644 --- a/packages/flutter/lib/src/components/card/ids_card.dart +++ b/packages/flutter/lib/src/components/card/ids_card.dart @@ -25,9 +25,9 @@ class IdsCard extends StatelessWidget { final bool interactive; double get _radius => switch (size) { - IdsCardSize.sm => 6, - IdsCardSize.md => 8, - IdsCardSize.lg => 12, + IdsCardSize.sm => 10, + IdsCardSize.md => 16, + IdsCardSize.lg => 24, }; @override From d904bdef2c102a16c8ef868338a4ade4ecafbd60 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sat, 6 Jun 2026 21:23:58 +0900 Subject: [PATCH 09/28] fix(flutter): stretch MVP phone header --- .../example/lib/components/mvp_frames_usecase.dart | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 7ea56fb..7f2b3e3 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -322,6 +322,7 @@ class _PhoneHeader extends StatelessWidget { final theme = ThemeProvider.of(context); return Container( + width: double.infinity, height: 56, decoration: BoxDecoration( color: theme.surface, @@ -333,10 +334,14 @@ class _PhoneHeader extends StatelessWidget { if (backLabel != null) Positioned( left: 16, - child: IdsText( - backLabel!, - variant: IdsTextVariant.label, - color: theme.primary, + top: 0, + bottom: 0, + child: Center( + child: IdsText( + backLabel!, + variant: IdsTextVariant.label, + color: theme.primary, + ), ), ), IdsText(title, variant: IdsTextVariant.label), From 7fa39ccb527f5bb6202f5aecba6c7b102e36aeea Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 02:29:25 +0900 Subject: [PATCH 10/28] fix(flutter): polish MVP presentation details --- .../lib/components/mvp_frames_usecase.dart | 170 +++++++++++++----- .../lib/src/components/button/ids_button.dart | 40 +++-- 2 files changed, 155 insertions(+), 55 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 7f2b3e3..79f11bc 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:hugeicons/hugeicons.dart'; import 'package:ids_flutter/ids.dart'; +import 'package:ids_flutter/tokens/ids_typography.dart'; import 'package:widgetbook/widgetbook.dart'; final mvpFrameUseCases = [ @@ -449,16 +450,16 @@ class _ReactionBar extends StatelessWidget { @override Widget build(BuildContext context) { return const Wrap( - spacing: 10, - runSpacing: 10, + spacing: 8, + runSpacing: 8, children: [ - _ReactionChip(label: '🔥 268', selected: true, width: 92), - _ReactionChip(label: '😮 37', width: 84), - _ReactionChip(label: '😭 2', width: 76), - _ReactionChip(label: '🤔 1', width: 76), - _ReactionChip(label: '☹️ 0', width: 76), - _ReactionChip(label: '공유하기', width: 118), - _ReactionChip(label: '링크 복사하기', width: 138), + _ReactionChip(label: '🔥 268', selected: true, width: 72), + _ReactionChip(label: '😮 37', width: 66), + _ReactionChip(label: '😭 2', width: 58), + _ReactionChip(label: '🤔 1', width: 58), + _ReactionChip(label: '☹️ 0', width: 58), + _ReactionChip(label: '공유하기', width: 92), + _ReactionChip(label: '링크 복사하기', width: 112), ], ); } @@ -477,13 +478,27 @@ class _ReactionChip extends StatelessWidget { @override Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + return SizedBox( width: width, - child: IdsButton( - onPressed: () {}, - size: IdsSize.sm, - variant: selected ? IdsVariant.solid : IdsVariant.soft, - children: [Text(label)], + child: Container( + height: 36, + alignment: Alignment.center, + decoration: BoxDecoration( + color: selected ? theme.primary : theme.secondary, + borderRadius: BorderRadius.circular(16), + ), + child: Text( + label, + style: IdsTypography.label.copyWith( + color: selected ? theme.onPrimary : theme.onSecondary, + fontWeight: FontWeight.w700, + leadingDistribution: TextLeadingDistribution.even, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), ), ); } @@ -494,27 +509,43 @@ class _ZiggleProfileFrame extends StatelessWidget { @override Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + return Column( children: [ Expanded( child: SingleChildScrollView( - padding: const EdgeInsets.all(24), + padding: const EdgeInsets.fromLTRB(24, 28, 24, 32), child: IdsVStack( gap: 24, children: [ - const IdsCard( + IdsCard( size: IdsCardSize.lg, child: IdsCardContent( child: Padding( - padding: EdgeInsets.symmetric(vertical: 24), + padding: const EdgeInsets.symmetric(vertical: 28), child: IdsVStack( - gap: 10, + gap: 12, crossAxis: CrossAxis.center, children: [ - IdsAvatar(name: '류현승', size: IdsSize.xxl), - IdsText('류현승', variant: IdsTextVariant.heading), - IdsText('20255070', variant: IdsTextVariant.title), - IdsText('rhseungg@gm.gist.ac.kr'), + const IdsAvatar(name: '류현승', size: IdsSize.xxl), + const IdsVStack( + gap: 4, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: [ + IdsText('류현승', variant: IdsTextVariant.heading), + IdsText( + '20255070', + variant: IdsTextVariant.title, + ), + ], + ), + IdsText( + 'rhseungg@gm.gist.ac.kr', + variant: IdsTextVariant.label, + color: theme.onMuted, + ), ], ), ), @@ -522,15 +553,23 @@ class _ZiggleProfileFrame extends StatelessWidget { ), _ProfileSection( items: const [ - ('계정', '회원 정보 수정 · 아이디 및 비밀번호 변경'), - ('회원 탈퇴', null), - ('로그아웃', null), + ( + HugeIcons.strokeRoundedUserCircle02, + '계정', + '회원 정보 수정 · 아이디 및 비밀번호 변경', + ), + (HugeIcons.strokeRoundedUserRemove01, '회원 탈퇴', null), + (HugeIcons.strokeRoundedLogout03, '로그아웃', null), ], ), _ProfileSection( items: const [ - ('설정', '알림 · 언어 · 정보'), - ('피드백 · 버그 제보하기', null), + (HugeIcons.strokeRoundedSettings02, '설정', '알림 · 언어 · 정보'), + ( + HugeIcons.strokeRoundedMessageEdit01, + '피드백 · 버그 제보하기', + null, + ), ], ), ], @@ -554,27 +593,35 @@ class _ZiggleProfileFrame extends StatelessWidget { class _ProfileSection extends StatelessWidget { const _ProfileSection({required this.items}); - final List<(String, String?)> items; + final List<(List>, String, String?)> items; @override Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + return IdsCard( child: IdsCardContent( child: Column( children: [ for (var i = 0; i < items.length; i++) ...[ IdsItem( + onPressed: () {}, children: [ + IdsItemLeading( + child: IconTheme( + data: IconThemeData(color: theme.onSurface, size: 22), + child: _HugeIcon(items[i].$1), + ), + ), IdsItemContent( children: [ - IdsItemTitle(items[i].$1), - if (items[i].$2 != null) IdsItemDescription(items[i].$2!), + IdsItemTitle(items[i].$2), + if (items[i].$3 != null) IdsItemDescription(items[i].$3!), ], ), ], ), - if (i < items.length - 1) - Container(height: 1, color: ThemeProvider.of(context).outline), + if (i < items.length - 1) const IdsDivider(), ], ], ), @@ -596,7 +643,7 @@ class _PotgMainListFrame extends StatelessWidget { children: [ Expanded( child: SingleChildScrollView( - padding: const EdgeInsets.all(24), + padding: const EdgeInsets.fromLTRB(24, 24, 24, 128), child: IdsVStack( gap: 20, crossAxis: CrossAxis.start, @@ -741,20 +788,37 @@ class _TaxiPotCard extends StatelessWidget { child: Row( children: [ Expanded( - child: IdsCardContent( + child: Padding( + padding: const EdgeInsets.fromLTRB(18, 16, 14, 16), child: IdsVStack( - gap: 8, + gap: 10, crossAxis: CrossAxis.start, children: [ - IdsText('$from → $to', variant: IdsTextVariant.label), + IdsHStack( + gap: 8, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: [ + IconTheme( + data: IconThemeData(color: theme.primary, size: 18), + child: const _HugeIcon(HugeIcons.strokeRoundedRoute01), + ), + Expanded( + child: IdsText( + '$from → $to', + variant: IdsTextVariant.label, + ), + ), + ], + ), IdsText(time, variant: IdsTextVariant.title), ], ), ), ), Container( - width: 88, - height: 92, + width: 86, + height: 96, alignment: Alignment.center, decoration: BoxDecoration( color: theme.secondary, @@ -785,6 +849,8 @@ class _PotgSearchEmptyFrame extends StatelessWidget { @override Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + return Stack( children: [ Column( @@ -801,10 +867,32 @@ class _PotgSearchEmptyFrame extends StatelessWidget { child: Center( child: IdsEmpty( children: [ - const IdsEmptyMedia( - child: _HugeIcon(HugeIcons.strokeRoundedSad01), + IdsEmptyMedia( + child: Container( + width: 84, + height: 84, + alignment: Alignment.center, + decoration: BoxDecoration( + color: theme.secondary, + shape: BoxShape.circle, + ), + child: IconTheme( + data: IconThemeData( + color: theme.primary, + size: 48, + ), + child: const _HugeIcon( + HugeIcons.strokeRoundedSad01, + ), + ), + ), + ), + IdsText( + '해당 조건의 택시 팟이 존재하지 않습니다', + variant: IdsTextVariant.label, + color: theme.primary, + align: TextAlign.center, ), - const IdsEmptyDescription('해당 조건의 택시 팟이 존재하지 않습니다'), IdsEmptyActions( children: [ IdsButton( diff --git a/packages/flutter/lib/src/components/button/ids_button.dart b/packages/flutter/lib/src/components/button/ids_button.dart index 1d9634c..fa6c080 100644 --- a/packages/flutter/lib/src/components/button/ids_button.dart +++ b/packages/flutter/lib/src/components/button/ids_button.dart @@ -26,21 +26,30 @@ class IdsButton extends StatelessWidget { final theme = ThemeProvider.of(context); final (bg, fg, border) = switch (variant) { - IdsVariant.solid => (theme.primary, theme.onPrimary, null), - IdsVariant.soft => (theme.secondary, theme.onSecondary, null), - IdsVariant.outline => (null, theme.primary, theme.primary), - IdsVariant.ghost => (null, theme.primary, null), + IdsVariant.solid => (theme.primary, theme.onPrimary, null), + IdsVariant.soft => (theme.secondary, theme.onSecondary, null), + IdsVariant.outline => (null, theme.primary, theme.primary), + IdsVariant.ghost => (null, theme.primary, null), }; final (hPad, textStyle) = switch (size) { - IdsSize.xs => (8.0, IdsTypography.caption), - IdsSize.sm => (10.0, IdsTypography.label), - IdsSize.md => (16.0, IdsTypography.label), - IdsSize.lg => (20.0, IdsTypography.body), - IdsSize.xl => (24.0, IdsTypography.title), + IdsSize.xs => (8.0, IdsTypography.caption), + IdsSize.sm => (10.0, IdsTypography.label), + IdsSize.md => (16.0, IdsTypography.label), + IdsSize.lg => (20.0, IdsTypography.body), + IdsSize.xl => (24.0, IdsTypography.title), IdsSize.xxl => (32.0, IdsTypography.heading), }; + final iconSize = switch (size) { + IdsSize.xs => 16.0, + IdsSize.sm => 18.0, + IdsSize.md => 20.0, + IdsSize.lg => 22.0, + IdsSize.xl => 24.0, + IdsSize.xxl => 28.0, + }; + return GestureDetector( onTap: disabled ? null : onPressed, child: AnimatedOpacity( @@ -61,11 +70,14 @@ class IdsButton extends StatelessWidget { fontWeight: FontWeight.w600, leadingDistribution: TextLeadingDistribution.even, ), - child: IdsHStack( - gap: 8, - fit: IdsStackFit.content, - crossAxis: CrossAxis.center, - children: children, + child: IconTheme( + data: IconThemeData(color: fg, size: iconSize), + child: IdsHStack( + gap: 8, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: children, + ), ), ), ), From bb32c2842c5d98cd5ff6391af1229967e7c8de92 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 02:38:28 +0900 Subject: [PATCH 11/28] fix(flutter): add icons to notice action chips --- .../lib/components/mvp_frames_usecase.dart | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 79f11bc..a719978 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -458,8 +458,16 @@ class _ReactionBar extends StatelessWidget { _ReactionChip(label: '😭 2', width: 58), _ReactionChip(label: '🤔 1', width: 58), _ReactionChip(label: '☹️ 0', width: 58), - _ReactionChip(label: '공유하기', width: 92), - _ReactionChip(label: '링크 복사하기', width: 112), + _ReactionChip( + label: '공유하기', + icon: HugeIcons.strokeRoundedShare01, + width: 112, + ), + _ReactionChip( + label: '링크 복사하기', + icon: HugeIcons.strokeRoundedCopyLink, + width: 136, + ), ], ); } @@ -469,11 +477,13 @@ class _ReactionChip extends StatelessWidget { const _ReactionChip({ required this.label, required this.width, + this.icon, this.selected = false, }); final String label; final double width; + final List>? icon; final bool selected; @override @@ -489,15 +499,29 @@ class _ReactionChip extends StatelessWidget { color: selected ? theme.primary : theme.secondary, borderRadius: BorderRadius.circular(16), ), - child: Text( - label, - style: IdsTypography.label.copyWith( + child: IconTheme( + data: IconThemeData( color: selected ? theme.onPrimary : theme.onSecondary, - fontWeight: FontWeight.w700, - leadingDistribution: TextLeadingDistribution.even, + size: 17, + ), + child: IdsHStack( + gap: icon == null ? 0 : 5, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: [ + if (icon != null) _HugeIcon(icon!), + Text( + label, + style: IdsTypography.label.copyWith( + color: selected ? theme.onPrimary : theme.onSecondary, + fontWeight: FontWeight.w700, + leadingDistribution: TextLeadingDistribution.even, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], ), - maxLines: 1, - overflow: TextOverflow.ellipsis, ), ), ); From 24ad7d8d2692f4847a4163261a1bc5714ea65912 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 02:41:04 +0900 Subject: [PATCH 12/28] fix: remove component shadows --- .../example/lib/components/mvp_frames_usecase.dart | 8 +------- packages/flutter/lib/src/components/card/ids_card.dart | 9 --------- .../flutter/lib/src/components/dialog/ids_dialog.dart | 7 ------- .../components/floating_button/ids_floating_button.dart | 7 ------- packages/react/src/components/card/index.tsx | 2 +- packages/react/src/components/dialog/index.tsx | 2 +- packages/react/src/components/floating-button/index.tsx | 4 ++-- 7 files changed, 5 insertions(+), 34 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index a719978..b143ded 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -801,13 +801,7 @@ class _TaxiPotCard extends StatelessWidget { decoration: BoxDecoration( color: theme.surface, borderRadius: BorderRadius.circular(18), - boxShadow: [ - BoxShadow( - color: const Color(0xFF000000).withValues(alpha: 0.08), - blurRadius: 18, - offset: const Offset(0, 8), - ), - ], + border: Border.all(color: theme.outline), ), child: Row( children: [ diff --git a/packages/flutter/lib/src/components/card/ids_card.dart b/packages/flutter/lib/src/components/card/ids_card.dart index 1d2ab2a..9f5e4ad 100644 --- a/packages/flutter/lib/src/components/card/ids_card.dart +++ b/packages/flutter/lib/src/components/card/ids_card.dart @@ -43,15 +43,6 @@ class IdsCard extends StatelessWidget { border: variant == IdsCardVariant.outline ? Border.all(color: theme.outline) : null, - boxShadow: variant == IdsCardVariant.elevated - ? [ - BoxShadow( - color: const Color(0xFF000000).withValues(alpha: 0.12), - blurRadius: 16, - offset: const Offset(0, 8), - ), - ] - : null, ); final card = AnimatedContainer( diff --git a/packages/flutter/lib/src/components/dialog/ids_dialog.dart b/packages/flutter/lib/src/components/dialog/ids_dialog.dart index 4a8aa8b..e03eabd 100644 --- a/packages/flutter/lib/src/components/dialog/ids_dialog.dart +++ b/packages/flutter/lib/src/components/dialog/ids_dialog.dart @@ -49,13 +49,6 @@ class IdsDialog extends StatelessWidget { decoration: BoxDecoration( color: theme.surface, borderRadius: BorderRadius.circular(12), - boxShadow: [ - BoxShadow( - color: const Color(0xFF000000).withValues(alpha: 0.2), - blurRadius: 24, - offset: const Offset(0, 12), - ), - ], ), child: Column( mainAxisSize: MainAxisSize.min, diff --git a/packages/flutter/lib/src/components/floating_button/ids_floating_button.dart b/packages/flutter/lib/src/components/floating_button/ids_floating_button.dart index 5ce4356..df4c581 100644 --- a/packages/flutter/lib/src/components/floating_button/ids_floating_button.dart +++ b/packages/flutter/lib/src/components/floating_button/ids_floating_button.dart @@ -72,13 +72,6 @@ class IdsFloatingButton extends StatelessWidget { color: bg, borderRadius: BorderRadius.circular(999), border: border, - boxShadow: [ - BoxShadow( - color: const Color(0xFF000000).withValues(alpha: 0.18), - blurRadius: 18, - offset: const Offset(0, 8), - ), - ], ), child: DefaultTextStyle( style: IdsTypography.label.copyWith( diff --git a/packages/react/src/components/card/index.tsx b/packages/react/src/components/card/index.tsx index 3c759a0..4a4a25b 100644 --- a/packages/react/src/components/card/index.tsx +++ b/packages/react/src/components/card/index.tsx @@ -32,7 +32,7 @@ export function Card({ 'bg-(--ids-color-surface) transition-colors', { 'border border-(--ids-color-outline)': variant === 'outline', - 'border border-transparent shadow-lg': variant === 'elevated', + 'border border-transparent': variant === 'elevated', 'border border-transparent bg-(--ids-color-muted)': variant === 'filled', 'border border-transparent bg-transparent': variant === 'ghost', }, diff --git a/packages/react/src/components/dialog/index.tsx b/packages/react/src/components/dialog/index.tsx index 49403f4..cbfbf4f 100644 --- a/packages/react/src/components/dialog/index.tsx +++ b/packages/react/src/components/dialog/index.tsx @@ -46,7 +46,7 @@ export function Dialog({ role={role} aria-modal="true" className={cn( - 'relative w-full rounded-xl bg-(--ids-color-surface) text-(--ids-color-on-surface) shadow-xl', + 'relative w-full rounded-xl bg-(--ids-color-surface) text-(--ids-color-on-surface)', { 'max-w-sm': size === 'sm', 'max-w-md': size === 'md', diff --git a/packages/react/src/components/floating-button/index.tsx b/packages/react/src/components/floating-button/index.tsx index 7b1bfaa..e38cc56 100644 --- a/packages/react/src/components/floating-button/index.tsx +++ b/packages/react/src/components/floating-button/index.tsx @@ -16,9 +16,9 @@ export function FloatingButton({ type="button" disabled={disabled} className={cn( - 'fixed z-40 inline-flex items-center justify-center gap-2 font-semibold shadow-lg transition-all', + 'fixed z-40 inline-flex items-center justify-center gap-2 font-semibold transition-all', 'focus-visible:outline-2 focus-visible:outline-offset-2 disabled:pointer-events-none disabled:opacity-40', - 'hover:-translate-y-0.5 hover:shadow-xl', + 'hover:-translate-y-0.5', { 'bg-(--ids-color-primary) text-(--ids-color-on-primary)': variant === 'solid', 'border border-(--ids-color-outline) bg-(--ids-color-surface) text-(--ids-color-on-surface)': From 2fe0a1683c5aed029ab988851e70acc7de68f15c Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 10:30:35 +0900 Subject: [PATCH 13/28] fix(flutter): keep taxi pot card border visible --- .../flutter/example/lib/components/mvp_frames_usecase.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index b143ded..db5dcd2 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -801,6 +801,9 @@ class _TaxiPotCard extends StatelessWidget { decoration: BoxDecoration( color: theme.surface, borderRadius: BorderRadius.circular(18), + ), + foregroundDecoration: BoxDecoration( + borderRadius: BorderRadius.circular(18), border: Border.all(color: theme.outline), ), child: Row( From a6a1d5364f571a49fd73eacd5e80ad0ba69f959b Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 10:33:48 +0900 Subject: [PATCH 14/28] fix(flutter): reduce MVP frame text scale --- .../lib/components/mvp_frames_usecase.dart | 95 ++++++++++--------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index db5dcd2..d7b73a4 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -146,6 +146,7 @@ class _ZiggleGroupsFrame extends StatelessWidget { padding: EdgeInsets.all(24), child: IdsText( '지속 가능한 개발 문화를 통해 지스트 학부생의 삶의 질을 높이는 팀입니다.', + variant: IdsTextVariant.label, ), ), ), @@ -170,7 +171,7 @@ class _ZiggleGroupsFrame extends StatelessWidget { children: [ const IdsText( '2026 봄학기 개발자 모집 안내', - variant: IdsTextVariant.title, + variant: IdsTextVariant.body, ), const _NoticePoster(), Wrap( @@ -202,7 +203,7 @@ class _ZiggleGroupsFrame extends StatelessWidget { height: panelHeight, child: const Padding( padding: EdgeInsets.all(24), - child: IdsText('멤버 목록'), + child: IdsText('멤버 목록', variant: IdsTextVariant.label), ), ), ), @@ -240,10 +241,10 @@ class _GroupHeader extends StatelessWidget { gap: 4, crossAxis: CrossAxis.start, children: [ - IdsText('GIST 인포팀', variant: IdsTextVariant.heading), + IdsText('GIST 인포팀', variant: IdsTextVariant.title), IdsText( '구독자 248명 · 게시글 12개', - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, ), ], ), @@ -255,6 +256,7 @@ class _GroupHeader extends StatelessWidget { child: IdsCardContent( child: IdsText( 'GIST 학생을 위한 웹 서비스와 인증 인프라를 만들고 운영하는 개발팀입니다.', + variant: IdsTextVariant.label, color: theme.onMuted, ), ), @@ -289,13 +291,13 @@ class _GroupNoticeCard extends StatelessWidget { crossAxis: CrossAxis.start, fit: IdsStackFit.content, children: [ - IdsText('GIST 인포팀', variant: IdsTextVariant.label), + IdsText('GIST 인포팀', variant: IdsTextVariant.caption), IdsText('12분 전', variant: IdsTextVariant.caption), ], ), ], ), - const IdsText('2026 봄학기 인포팀 개발자 모집', variant: IdsTextVariant.title), + const IdsText('2026 봄학기 인포팀 개발자 모집', variant: IdsTextVariant.body), const _NoticePoster(), Wrap( spacing: 8, @@ -340,12 +342,12 @@ class _PhoneHeader extends StatelessWidget { child: Center( child: IdsText( backLabel!, - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, color: theme.primary, ), ), ), - IdsText(title, variant: IdsTextVariant.label), + IdsText(title, variant: IdsTextVariant.caption), ], ), ); @@ -380,12 +382,12 @@ class _ZiggleNoticeDetailFrame extends StatelessWidget { crossAxis: CrossAxis.center, children: [ IdsAvatar(name: '인포팀'), - IdsText('인포팀 · 32분 전', variant: IdsTextVariant.label), + IdsText('인포팀 · 32분 전', variant: IdsTextVariant.caption), ], ), const IdsText( '2026 봄학기 인포팀 개발자 모집', - variant: IdsTextVariant.heading, + variant: IdsTextVariant.title, ), Wrap( spacing: 8, @@ -402,9 +404,11 @@ class _ZiggleNoticeDetailFrame extends StatelessWidget { const _NoticePoster(), const IdsText( 'GIST 인포팀에서 2026 봄학기 신규 멤버를 모집합니다.\n지원서 작성 구글 폼 링크', + variant: IdsTextVariant.label, ), const IdsText( '인포팀은 지글(Ziggle), IdP, 디자인 시스템 등 학생들이 매일 사용하는 서비스를 설계하고 운영합니다. 제품 개발과 서비스 운영을 함께 경험하고 싶은 분을 기다립니다.', + variant: IdsTextVariant.label, ), const _ReactionBar(), ], @@ -436,7 +440,7 @@ class _NoticePoster extends StatelessWidget { ), child: const IdsText( '2026 봄학기\n인포팀 개발자 모집', - variant: IdsTextVariant.heading, + variant: IdsTextVariant.title, align: TextAlign.center, color: Color(0xFFE85F6A), ), @@ -512,7 +516,7 @@ class _ReactionChip extends StatelessWidget { if (icon != null) _HugeIcon(icon!), Text( label, - style: IdsTypography.label.copyWith( + style: IdsTypography.caption.copyWith( color: selected ? theme.onPrimary : theme.onSecondary, fontWeight: FontWeight.w700, leadingDistribution: TextLeadingDistribution.even, @@ -558,16 +562,13 @@ class _ZiggleProfileFrame extends StatelessWidget { fit: IdsStackFit.content, crossAxis: CrossAxis.center, children: [ - IdsText('류현승', variant: IdsTextVariant.heading), - IdsText( - '20255070', - variant: IdsTextVariant.title, - ), + IdsText('류현승', variant: IdsTextVariant.title), + IdsText('20255070', variant: IdsTextVariant.body), ], ), IdsText( 'rhseungg@gm.gist.ac.kr', - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, color: theme.onMuted, ), ], @@ -672,11 +673,11 @@ class _PotgMainListFrame extends StatelessWidget { gap: 20, crossAxis: CrossAxis.start, children: [ - const IdsText('팟쥐', variant: IdsTextVariant.heading), + const IdsText('팟쥐', variant: IdsTextVariant.title), const _WeekStatusCard(), IdsText( '2025/11/15 토요일', - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, color: theme.onMuted, ), const _TaxiPotCard( @@ -739,7 +740,7 @@ class _WeekStatusCard extends StatelessWidget { gap: 16, crossAxis: CrossAxis.start, children: [ - const IdsText('요일 별 팟 현황', variant: IdsTextVariant.title), + const IdsText('요일 별 팟 현황', variant: IdsTextVariant.body), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -760,7 +761,7 @@ class _WeekStatusCard extends StatelessWidget { ), child: IdsText( i == 6 && row == 1 ? '5' : (row == 0 ? '0' : '1'), - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, color: i == 6 && row == 1 ? theme.onPrimary : theme.onSurface, @@ -827,12 +828,12 @@ class _TaxiPotCard extends StatelessWidget { Expanded( child: IdsText( '$from → $to', - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, ), ), ], ), - IdsText(time, variant: IdsTextVariant.title), + IdsText(time, variant: IdsTextVariant.body), ], ), ), @@ -853,7 +854,7 @@ class _TaxiPotCard extends StatelessWidget { const IdsText('정원', variant: IdsTextVariant.caption), IdsText( capacity, - variant: IdsTextVariant.title, + variant: IdsTextVariant.body, color: theme.primary, ), ], @@ -883,7 +884,7 @@ class _PotgSearchEmptyFrame extends StatelessWidget { gap: 24, crossAxis: CrossAxis.start, children: [ - const IdsText('팟 검색', variant: IdsTextVariant.heading), + const IdsText('팟 검색', variant: IdsTextVariant.title), Expanded( child: Center( child: IdsEmpty( @@ -910,7 +911,7 @@ class _PotgSearchEmptyFrame extends StatelessWidget { ), IdsText( '해당 조건의 택시 팟이 존재하지 않습니다', - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, color: theme.primary, align: TextAlign.center, ), @@ -969,16 +970,16 @@ class _PotgFilterDialogFrameState extends State<_PotgFilterDialogFrame> { gap: 20, crossAxis: CrossAxis.start, children: [ - const IdsText('팟 검색', variant: IdsTextVariant.heading), + const IdsText('팟 검색', variant: IdsTextVariant.title), const IdsText('노선 필터', variant: IdsTextVariant.caption), const IdsCard( child: IdsCardContent( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - IdsText('지스트', variant: IdsTextVariant.title), - IdsText('→', variant: IdsTextVariant.title), - IdsText('유스퀘어', variant: IdsTextVariant.title), + IdsText('지스트', variant: IdsTextVariant.body), + IdsText('→', variant: IdsTextVariant.body), + IdsText('유스퀘어', variant: IdsTextVariant.body), ], ), ), @@ -997,7 +998,7 @@ class _PotgFilterDialogFrameState extends State<_PotgFilterDialogFrame> { const Expanded( child: IdsText( '정원이 가득 찬 팟 숨기기', - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, ), ), ], @@ -1025,15 +1026,15 @@ class _PotgFilterDialogFrameState extends State<_PotgFilterDialogFrame> { gap: 8, crossAxis: CrossAxis.start, children: [ - IdsText('노선 광주송정역 → 지스트', variant: IdsTextVariant.label), + IdsText('노선 광주송정역 → 지스트', variant: IdsTextVariant.caption), IdsText( '날짜 2025년 12월 13일 토요일', - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, ), - IdsText('시간 23:30~01:00', variant: IdsTextVariant.label), + IdsText('시간 23:30~01:00', variant: IdsTextVariant.caption), IdsText( '참여자 목록 김민준, 박서연, 이서연', - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, ), ], ), @@ -1073,7 +1074,7 @@ class _CalendarFilterCard extends StatelessWidget { children: [ const IdsText( '2025년 11월', - variant: IdsTextVariant.title, + variant: IdsTextVariant.body, align: TextAlign.center, ), Wrap( @@ -1091,7 +1092,7 @@ class _CalendarFilterCard extends StatelessWidget { ), child: IdsText( '$day', - variant: IdsTextVariant.label, + variant: IdsTextVariant.caption, color: day == 14 ? theme.onPrimary : theme.onSurface, ), ), @@ -1121,7 +1122,7 @@ class _PotgCreateTimeFrame extends StatelessWidget { gap: 24, crossAxis: CrossAxis.start, children: [ - const IdsText('팟 생성', variant: IdsTextVariant.heading), + const IdsText('팟 생성', variant: IdsTextVariant.title), _StepRow(index: '1', label: '지스트 → 광주송정역', filled: true), _StepRow(index: '2', label: '11월 14일 금요일', filled: true), _StepRow(index: '3', label: '시간대 설정', filled: false), @@ -1131,7 +1132,7 @@ class _PotgCreateTimeFrame extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _TimeSummary(label: '금요일 오전', time: '9:41'), - IdsText('~', variant: IdsTextVariant.heading), + IdsText('~', variant: IdsTextVariant.title), _TimeSummary(label: '금요일 오후', time: '12:30'), ], ), @@ -1139,7 +1140,7 @@ class _PotgCreateTimeFrame extends StatelessWidget { ), const IdsText( '출발 가능한 가장 늦은 시각을 설정하세요', - variant: IdsTextVariant.title, + variant: IdsTextVariant.body, ), IdsCard( variant: IdsCardVariant.filled, @@ -1157,17 +1158,17 @@ class _PotgCreateTimeFrame extends StatelessWidget { children: [ IdsText( '9', - variant: IdsTextVariant.heading, + variant: IdsTextVariant.title, color: theme.onMuted, ), IdsText( '41', - variant: IdsTextVariant.heading, + variant: IdsTextVariant.title, color: theme.onMuted, ), IdsText( 'AM', - variant: IdsTextVariant.heading, + variant: IdsTextVariant.title, color: theme.onMuted, ), ], @@ -1220,11 +1221,11 @@ class _StepRow extends StatelessWidget { ), child: IdsText( index, - variant: IdsTextVariant.title, + variant: IdsTextVariant.body, color: filled ? theme.onPrimary : theme.primary, ), ), - Expanded(child: IdsText(label, variant: IdsTextVariant.title)), + Expanded(child: IdsText(label, variant: IdsTextVariant.body)), ], ); } @@ -1244,7 +1245,7 @@ class _TimeSummary extends StatelessWidget { crossAxis: CrossAxis.center, children: [ IdsText(label, variant: IdsTextVariant.caption), - IdsText(time, variant: IdsTextVariant.title), + IdsText(time, variant: IdsTextVariant.body), ], ); } From eba6d2be56d286ef86367647bf8caf6dd7561230 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 15:27:33 +0900 Subject: [PATCH 15/28] fix(flutter): balance profile card padding --- .../lib/components/mvp_frames_usecase.dart | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index d7b73a4..c92bd02 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -549,30 +549,28 @@ class _ZiggleProfileFrame extends StatelessWidget { children: [ IdsCard( size: IdsCardSize.lg, - child: IdsCardContent( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 28), - child: IdsVStack( - gap: 12, - crossAxis: CrossAxis.center, - children: [ - const IdsAvatar(name: '류현승', size: IdsSize.xxl), - const IdsVStack( - gap: 4, - fit: IdsStackFit.content, - crossAxis: CrossAxis.center, - children: [ - IdsText('류현승', variant: IdsTextVariant.title), - IdsText('20255070', variant: IdsTextVariant.body), - ], - ), - IdsText( - 'rhseungg@gm.gist.ac.kr', - variant: IdsTextVariant.caption, - color: theme.onMuted, - ), - ], - ), + child: Padding( + padding: const EdgeInsets.all(28), + child: IdsVStack( + gap: 10, + crossAxis: CrossAxis.center, + children: [ + const IdsAvatar(name: '류현승', size: IdsSize.xxl), + const IdsVStack( + gap: 4, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: [ + IdsText('류현승', variant: IdsTextVariant.title), + IdsText('20255070', variant: IdsTextVariant.body), + ], + ), + IdsText( + 'rhseungg@gm.gist.ac.kr', + variant: IdsTextVariant.caption, + color: theme.onMuted, + ), + ], ), ), ), From 03b2f3b92f76fabed63e521c5462456a91c6e90a Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 15:29:21 +0900 Subject: [PATCH 16/28] fix(flutter): raise taxi pot card text hierarchy --- .../flutter/example/lib/components/mvp_frames_usecase.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index c92bd02..56700de 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -826,7 +826,7 @@ class _TaxiPotCard extends StatelessWidget { Expanded( child: IdsText( '$from → $to', - variant: IdsTextVariant.caption, + variant: IdsTextVariant.label, ), ), ], @@ -849,10 +849,10 @@ class _TaxiPotCard extends StatelessWidget { fit: IdsStackFit.content, crossAxis: CrossAxis.center, children: [ - const IdsText('정원', variant: IdsTextVariant.caption), + const IdsText('정원', variant: IdsTextVariant.label), IdsText( capacity, - variant: IdsTextVariant.body, + variant: IdsTextVariant.title, color: theme.primary, ), ], From eeb490c8c105bcbd57fe8906a12d63e9d0209a0e Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 15:31:04 +0900 Subject: [PATCH 17/28] fix: restore floating button shadow --- .../components/floating_button/ids_floating_button.dart | 7 +++++++ packages/react/src/components/floating-button/index.tsx | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/components/floating_button/ids_floating_button.dart b/packages/flutter/lib/src/components/floating_button/ids_floating_button.dart index df4c581..1928aa1 100644 --- a/packages/flutter/lib/src/components/floating_button/ids_floating_button.dart +++ b/packages/flutter/lib/src/components/floating_button/ids_floating_button.dart @@ -72,6 +72,13 @@ class IdsFloatingButton extends StatelessWidget { color: bg, borderRadius: BorderRadius.circular(999), border: border, + boxShadow: [ + BoxShadow( + color: const Color(0xFF000000).withValues(alpha: 0.16), + blurRadius: 18, + offset: const Offset(0, 8), + ), + ], ), child: DefaultTextStyle( style: IdsTypography.label.copyWith( diff --git a/packages/react/src/components/floating-button/index.tsx b/packages/react/src/components/floating-button/index.tsx index e38cc56..7b1bfaa 100644 --- a/packages/react/src/components/floating-button/index.tsx +++ b/packages/react/src/components/floating-button/index.tsx @@ -16,9 +16,9 @@ export function FloatingButton({ type="button" disabled={disabled} className={cn( - 'fixed z-40 inline-flex items-center justify-center gap-2 font-semibold transition-all', + 'fixed z-40 inline-flex items-center justify-center gap-2 font-semibold shadow-lg transition-all', 'focus-visible:outline-2 focus-visible:outline-offset-2 disabled:pointer-events-none disabled:opacity-40', - 'hover:-translate-y-0.5', + 'hover:-translate-y-0.5 hover:shadow-xl', { 'bg-(--ids-color-primary) text-(--ids-color-on-primary)': variant === 'solid', 'border border-(--ids-color-outline) bg-(--ids-color-surface) text-(--ids-color-on-surface)': From 0beb35f5f036f8e38e40f5a41dc2dd1450cac6c9 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 15:33:00 +0900 Subject: [PATCH 18/28] fix(flutter): adjust empty description rhythm --- .../flutter/example/lib/components/mvp_frames_usecase.dart | 2 +- packages/flutter/lib/src/components/empty/ids_empty.dart | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 56700de..6c89b1b 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -909,7 +909,7 @@ class _PotgSearchEmptyFrame extends StatelessWidget { ), IdsText( '해당 조건의 택시 팟이 존재하지 않습니다', - variant: IdsTextVariant.caption, + variant: IdsTextVariant.label, color: theme.primary, align: TextAlign.center, ), diff --git a/packages/flutter/lib/src/components/empty/ids_empty.dart b/packages/flutter/lib/src/components/empty/ids_empty.dart index 6de365a..ff43674 100644 --- a/packages/flutter/lib/src/components/empty/ids_empty.dart +++ b/packages/flutter/lib/src/components/empty/ids_empty.dart @@ -30,7 +30,7 @@ class IdsEmpty extends StatelessWidget { List _withGaps(List widgets) { return [ for (var i = 0; i < widgets.length; i++) ...[ - if (i > 0) const SizedBox(height: 10), + if (i > 0) SizedBox(height: widgets[i] is IdsEmptyActions ? 18 : 10), widgets[i], ], ]; @@ -82,7 +82,7 @@ class IdsEmptyDescription extends StatelessWidget { final theme = ThemeProvider.of(context); return Text( data, - style: IdsTypography.label.copyWith( + style: IdsTypography.body.copyWith( color: theme.onMuted, leadingDistribution: TextLeadingDistribution.even, ), From 5ad79731bf152e5d378bf4c3230558c1c0a49aae Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 15:34:59 +0900 Subject: [PATCH 19/28] fix(flutter): raise dialog body text level --- .../example/lib/components/mvp_frames_usecase.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 6c89b1b..e2c074a 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -1024,15 +1024,15 @@ class _PotgFilterDialogFrameState extends State<_PotgFilterDialogFrame> { gap: 8, crossAxis: CrossAxis.start, children: [ - IdsText('노선 광주송정역 → 지스트', variant: IdsTextVariant.caption), + IdsText('노선 광주송정역 → 지스트', variant: IdsTextVariant.label), IdsText( '날짜 2025년 12월 13일 토요일', - variant: IdsTextVariant.caption, + variant: IdsTextVariant.label, ), - IdsText('시간 23:30~01:00', variant: IdsTextVariant.caption), + IdsText('시간 23:30~01:00', variant: IdsTextVariant.label), IdsText( '참여자 목록 김민준, 박서연, 이서연', - variant: IdsTextVariant.caption, + variant: IdsTextVariant.label, ), ], ), From d1a7c208af1dcdc8f6db463864ac73e65c5cafe7 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 15:38:10 +0900 Subject: [PATCH 20/28] fix(flutter): make Potg create time frame render reliably --- .../lib/components/mvp_frames_usecase.dart | 18 +++--------------- packages/flutter/example/lib/main.dart | 4 ---- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index e2c074a..492a13e 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -63,17 +63,6 @@ final mvpFrameUseCases = [ ), ]; -final potgCreateTimeFrameUseCases = [ - WidgetbookUseCase( - name: 'Time Range', - builder: (context) => _withTheme( - context, - initialColor: IdsColor.green, - child: const _Phone(child: _PotgCreateTimeFrame()), - ), - ), -]; - Widget _withTheme( BuildContext context, { required IdsColor initialColor, @@ -1112,10 +1101,9 @@ class _PotgCreateTimeFrame extends StatelessWidget { return ColoredBox( color: theme.surface, - child: SingleChildScrollView( - padding: const EdgeInsets.all(32), - child: ConstrainedBox( - constraints: const BoxConstraints(minHeight: 696), + child: SizedBox.expand( + child: SingleChildScrollView( + padding: const EdgeInsets.all(32), child: IdsVStack( gap: 24, crossAxis: CrossAxis.start, diff --git a/packages/flutter/example/lib/main.dart b/packages/flutter/example/lib/main.dart index f3a1eab..795ef89 100644 --- a/packages/flutter/example/lib/main.dart +++ b/packages/flutter/example/lib/main.dart @@ -59,10 +59,6 @@ class WidgetbookApp extends StatelessWidget { WidgetbookComponent(name: 'IdsDialog', useCases: dialogUseCases), WidgetbookComponent(name: 'IdsEmpty', useCases: emptyUseCases), WidgetbookComponent(name: 'MVP Frames', useCases: mvpFrameUseCases), - WidgetbookComponent( - name: 'MVP Potg Create Time', - useCases: potgCreateTimeFrameUseCases, - ), ], ); } From 12e66f275480fb762a7f03acee847c0743a50022 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 18:33:22 +0900 Subject: [PATCH 21/28] fix(flutter): refine MVP frame hierarchy --- .../lib/components/mvp_frames_usecase.dart | 52 ++++++++++++++----- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 492a13e..6691a25 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -331,12 +331,12 @@ class _PhoneHeader extends StatelessWidget { child: Center( child: IdsText( backLabel!, - variant: IdsTextVariant.caption, + variant: IdsTextVariant.label, color: theme.primary, ), ), ), - IdsText(title, variant: IdsTextVariant.caption), + IdsText(title, variant: IdsTextVariant.label), ], ), ); @@ -371,7 +371,7 @@ class _ZiggleNoticeDetailFrame extends StatelessWidget { crossAxis: CrossAxis.center, children: [ IdsAvatar(name: '인포팀'), - IdsText('인포팀 · 32분 전', variant: IdsTextVariant.caption), + IdsText('인포팀 · 32분 전', variant: IdsTextVariant.label), ], ), const IdsText( @@ -446,11 +446,32 @@ class _ReactionBar extends StatelessWidget { spacing: 8, runSpacing: 8, children: [ - _ReactionChip(label: '🔥 268', selected: true, width: 72), - _ReactionChip(label: '😮 37', width: 66), - _ReactionChip(label: '😭 2', width: 58), - _ReactionChip(label: '🤔 1', width: 58), - _ReactionChip(label: '☹️ 0', width: 58), + _ReactionChip( + label: '268', + icon: HugeIcons.strokeRoundedFire, + selected: true, + width: 70, + ), + _ReactionChip( + label: '37', + icon: HugeIcons.strokeRoundedSurprise, + width: 64, + ), + _ReactionChip( + label: '2', + icon: HugeIcons.strokeRoundedCrying, + width: 58, + ), + _ReactionChip( + label: '1', + icon: HugeIcons.strokeRoundedIdea01, + width: 58, + ), + _ReactionChip( + label: '0', + icon: HugeIcons.strokeRoundedSad01, + width: 58, + ), _ReactionChip( label: '공유하기', icon: HugeIcons.strokeRoundedShare01, @@ -612,7 +633,8 @@ class _ProfileSection extends StatelessWidget { final theme = ThemeProvider.of(context); return IdsCard( - child: IdsCardContent( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8), child: Column( children: [ for (var i = 0; i < items.length; i++) ...[ @@ -809,13 +831,19 @@ class _TaxiPotCard extends StatelessWidget { crossAxis: CrossAxis.center, children: [ IconTheme( - data: IconThemeData(color: theme.primary, size: 18), + data: IconThemeData(color: theme.primary, size: 20), child: const _HugeIcon(HugeIcons.strokeRoundedRoute01), ), Expanded( - child: IdsText( + child: Text( '$from → $to', - variant: IdsTextVariant.label, + style: IdsTypography.body.copyWith( + color: theme.onSurface, + fontWeight: FontWeight.w600, + leadingDistribution: TextLeadingDistribution.even, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, ), ), ], From e65d07abb203076feaa1f8fad8236458d64b245a Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 18:36:04 +0900 Subject: [PATCH 22/28] fix(flutter): restore Potg create time widgetbook entry --- .../lib/components/mvp_frames_usecase.dart | 15 ++++++++++++++- packages/flutter/example/lib/main.dart | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 6691a25..5936da3 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -63,6 +63,17 @@ final mvpFrameUseCases = [ ), ]; +final potgCreateTimeFrameUseCases = [ + WidgetbookUseCase( + name: 'Time Range', + builder: (context) => _withTheme( + context, + initialColor: IdsColor.green, + child: const _Phone(child: _PotgCreateTimeFrame()), + ), + ), +]; + Widget _withTheme( BuildContext context, { required IdsColor initialColor, @@ -1129,7 +1140,9 @@ class _PotgCreateTimeFrame extends StatelessWidget { return ColoredBox( color: theme.surface, - child: SizedBox.expand( + child: SizedBox( + width: double.infinity, + height: 760, child: SingleChildScrollView( padding: const EdgeInsets.all(32), child: IdsVStack( diff --git a/packages/flutter/example/lib/main.dart b/packages/flutter/example/lib/main.dart index 795ef89..f3a1eab 100644 --- a/packages/flutter/example/lib/main.dart +++ b/packages/flutter/example/lib/main.dart @@ -59,6 +59,10 @@ class WidgetbookApp extends StatelessWidget { WidgetbookComponent(name: 'IdsDialog', useCases: dialogUseCases), WidgetbookComponent(name: 'IdsEmpty', useCases: emptyUseCases), WidgetbookComponent(name: 'MVP Frames', useCases: mvpFrameUseCases), + WidgetbookComponent( + name: 'MVP Potg Create Time', + useCases: potgCreateTimeFrameUseCases, + ), ], ); } From 334c2e506517af5dc434a1a7a054d985d6d3e5e3 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Sun, 7 Jun 2026 18:42:06 +0900 Subject: [PATCH 23/28] fix(flutter): use theme onSurface as HugeIcon fallback color --- .../flutter/example/lib/components/mvp_frames_usecase.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 5936da3..637ec75 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -1329,9 +1329,10 @@ class _HugeIcon extends StatelessWidget { @override Widget build(BuildContext context) { final iconTheme = IconTheme.of(context); + final theme = ThemeProvider.of(context); return HugeIcon( icon: icon, - color: iconTheme.color ?? const Color(0xFF000000), + color: iconTheme.color ?? theme.onSurface, size: iconTheme.size ?? 24, ); } From e4fffa90384aa6820ad1abe445cc3fd0402b4919 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Mon, 8 Jun 2026 12:34:50 +0900 Subject: [PATCH 24/28] feat(flutter): add iOS MVP frame demo app --- packages/flutter/example/.gitignore | 3 +- packages/flutter/example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 24 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 644 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 119 ++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 16 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../flutter/example/ios/Runner/Info.plist | 70 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/ios/Runner/SceneDelegate.swift | 6 + .../example/ios/RunnerTests/RunnerTests.swift | 12 + .../lib/components/mvp_frames_usecase.dart | 149 +++- packages/flutter/example/lib/main.dart | 7 +- packages/flutter/example/pubspec.yaml | 1 + 44 files changed, 1327 insertions(+), 20 deletions(-) create mode 100644 packages/flutter/example/ios/.gitignore create mode 100644 packages/flutter/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 packages/flutter/example/ios/Flutter/Debug.xcconfig create mode 100644 packages/flutter/example/ios/Flutter/Release.xcconfig create mode 100644 packages/flutter/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 packages/flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 packages/flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/flutter/example/ios/Runner/AppDelegate.swift create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 packages/flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 packages/flutter/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 packages/flutter/example/ios/Runner/Info.plist create mode 100644 packages/flutter/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 packages/flutter/example/ios/Runner/SceneDelegate.swift create mode 100644 packages/flutter/example/ios/RunnerTests/RunnerTests.swift diff --git a/packages/flutter/example/.gitignore b/packages/flutter/example/.gitignore index 9457467..fd94508 100644 --- a/packages/flutter/example/.gitignore +++ b/packages/flutter/example/.gitignore @@ -7,9 +7,8 @@ pubspec.lock .metadata -# Generated platform directories — run `flutter create .` to regenerate locally +# Generated platform directories. iOS is committed for simulator demos. android/ -ios/ linux/ macos/ web/ diff --git a/packages/flutter/example/ios/.gitignore b/packages/flutter/example/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/packages/flutter/example/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/packages/flutter/example/ios/Flutter/AppFrameworkInfo.plist b/packages/flutter/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..391a902 --- /dev/null +++ b/packages/flutter/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/packages/flutter/example/ios/Flutter/Debug.xcconfig b/packages/flutter/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/packages/flutter/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/flutter/example/ios/Flutter/Release.xcconfig b/packages/flutter/example/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/packages/flutter/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/packages/flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/flutter/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..627eed1 --- /dev/null +++ b/packages/flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,644 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 7884E8682EC3CC0700C636F2 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + ); + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + 7884E8682EC3CC0700C636F2 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.idsFlutterExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.idsFlutterExample.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.idsFlutterExample.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.idsFlutterExample.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.idsFlutterExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.idsFlutterExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/packages/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..c3fedb2 --- /dev/null +++ b/packages/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/packages/flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/packages/flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/packages/flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/flutter/example/ios/Runner/AppDelegate.swift b/packages/flutter/example/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..c30b367 --- /dev/null +++ b/packages/flutter/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,16 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } + + func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { + GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) + } +} diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/packages/flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/packages/flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/packages/flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/flutter/example/ios/Runner/Base.lproj/Main.storyboard b/packages/flutter/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/packages/flutter/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/flutter/example/ios/Runner/Info.plist b/packages/flutter/example/ios/Runner/Info.plist new file mode 100644 index 0000000..c171a97 --- /dev/null +++ b/packages/flutter/example/ios/Runner/Info.plist @@ -0,0 +1,70 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Ids Flutter Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ids_flutter_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneConfigurationName + flutter + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/packages/flutter/example/ios/Runner/Runner-Bridging-Header.h b/packages/flutter/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/packages/flutter/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/packages/flutter/example/ios/Runner/SceneDelegate.swift b/packages/flutter/example/ios/Runner/SceneDelegate.swift new file mode 100644 index 0000000..b9ce8ea --- /dev/null +++ b/packages/flutter/example/ios/Runner/SceneDelegate.swift @@ -0,0 +1,6 @@ +import Flutter +import UIKit + +class SceneDelegate: FlutterSceneDelegate { + +} diff --git a/packages/flutter/example/ios/RunnerTests/RunnerTests.swift b/packages/flutter/example/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/packages/flutter/example/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 637ec75..175e67f 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -39,10 +39,10 @@ final mvpFrameUseCases = [ ), WidgetbookUseCase( name: 'Potg Create Time', - builder: (context) => _withTheme( - context, - initialColor: IdsColor.green, - child: const _Phone(child: _PotgCreateTimeFrame()), + builder: (context) => const ThemeProvider( + color: IdsColor.green, + mode: IdsMode.light, + child: Center(child: _Phone(child: _PotgCreateTimeFrame())), ), ), WidgetbookUseCase( @@ -63,16 +63,139 @@ final mvpFrameUseCases = [ ), ]; -final potgCreateTimeFrameUseCases = [ - WidgetbookUseCase( - name: 'Time Range', - builder: (context) => _withTheme( - context, - initialColor: IdsColor.green, - child: const _Phone(child: _PotgCreateTimeFrame()), +class MvpFramesApp extends StatefulWidget { + const MvpFramesApp({super.key}); + + @override + State createState() => _MvpFramesAppState(); +} + +class _MvpFramesAppState extends State { + var _index = 0; + + static const _frames = [ + _MvpFrameSpec( + label: '공지 상세', + color: IdsColor.orange, + child: _ZiggleNoticeDetailFrame(), ), - ), -]; + _MvpFrameSpec( + label: '프로필', + color: IdsColor.orange, + child: _ZiggleProfileFrame(), + ), + _MvpFrameSpec( + label: '그룹', + color: IdsColor.orange, + child: _ZiggleGroupsFrame(), + ), + _MvpFrameSpec( + label: '팟 리스트', + color: IdsColor.green, + child: _PotgMainListFrame(), + ), + _MvpFrameSpec( + label: '팟 생성', + color: IdsColor.green, + child: _PotgCreateTimeFrame(), + ), + _MvpFrameSpec( + label: '팟 검색', + color: IdsColor.green, + child: _PotgSearchEmptyFrame(), + ), + _MvpFrameSpec( + label: '팟 필터', + color: IdsColor.green, + child: _PotgFilterDialogFrame(), + ), + ]; + + @override + Widget build(BuildContext context) { + final frame = _frames[_index]; + + return ThemeProvider( + color: frame.color, + mode: IdsMode.light, + child: Builder( + builder: (context) { + final theme = ThemeProvider.of(context); + + return MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData( + fontFamily: IdsTypography.sansFontFamily, + package: IdsTypography.sansFontPackage, + scaffoldBackgroundColor: theme.muted, + ), + home: ColoredBox( + color: theme.muted, + child: SafeArea( + child: Column( + children: [ + SizedBox( + height: 52, + child: ListView.separated( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + final selected = index == _index; + + return GestureDetector( + onTap: () => setState(() => _index = index), + child: Container( + alignment: Alignment.center, + padding: const EdgeInsets.symmetric( + horizontal: 14, + ), + decoration: BoxDecoration( + color: selected ? theme.primary : theme.surface, + borderRadius: BorderRadius.circular(999), + border: Border.all(color: theme.outline), + ), + child: IdsText( + _frames[index].label, + variant: IdsTextVariant.caption, + color: selected + ? theme.onPrimary + : theme.onSurface, + ), + ), + ); + }, + separatorBuilder: (_, _) => const SizedBox(width: 8), + itemCount: _frames.length, + ), + ), + Expanded( + child: Center(child: _Phone(child: frame.child)), + ), + ], + ), + ), + ), + ); + }, + ), + ); + } +} + +class _MvpFrameSpec { + const _MvpFrameSpec({ + required this.label, + required this.color, + required this.child, + }); + + final String label; + final IdsColor color; + final Widget child; +} Widget _withTheme( BuildContext context, { diff --git a/packages/flutter/example/lib/main.dart b/packages/flutter/example/lib/main.dart index f3a1eab..9503e90 100644 --- a/packages/flutter/example/lib/main.dart +++ b/packages/flutter/example/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:ids_flutter/ids.dart'; import 'package:widgetbook/widgetbook.dart'; @@ -15,7 +16,7 @@ import 'components/stack_usecase.dart'; import 'components/text_usecase.dart'; void main() { - runApp(const WidgetbookApp()); + runApp(kIsWeb ? const WidgetbookApp() : const MvpFramesApp()); } class WidgetbookApp extends StatelessWidget { @@ -59,10 +60,6 @@ class WidgetbookApp extends StatelessWidget { WidgetbookComponent(name: 'IdsDialog', useCases: dialogUseCases), WidgetbookComponent(name: 'IdsEmpty', useCases: emptyUseCases), WidgetbookComponent(name: 'MVP Frames', useCases: mvpFrameUseCases), - WidgetbookComponent( - name: 'MVP Potg Create Time', - useCases: potgCreateTimeFrameUseCases, - ), ], ); } diff --git a/packages/flutter/example/pubspec.yaml b/packages/flutter/example/pubspec.yaml index d6d5a3e..c993bf6 100644 --- a/packages/flutter/example/pubspec.yaml +++ b/packages/flutter/example/pubspec.yaml @@ -1,6 +1,7 @@ name: ids_flutter_example description: Widgetbook catalog for ids_flutter. publish_to: none +version: 0.0.0+1 environment: sdk: ^3.11.5 From 050ee7a51b2633a6128c9548eb88eaeeb6a317ce Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Mon, 8 Jun 2026 13:56:37 +0900 Subject: [PATCH 25/28] fix(flutter): render MVP frames cleanly on simulator --- .../lib/components/mvp_frames_usecase.dart | 83 +++++-------------- .../ids_bottom_navigation.dart | 24 +++--- 2 files changed, 35 insertions(+), 72 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 175e67f..99bf982 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -39,9 +39,9 @@ final mvpFrameUseCases = [ ), WidgetbookUseCase( name: 'Potg Create Time', - builder: (context) => const ThemeProvider( - color: IdsColor.green, - mode: IdsMode.light, + builder: (context) => _withTheme( + context, + initialColor: IdsColor.green, child: Center(child: _Phone(child: _PotgCreateTimeFrame())), ), ), @@ -63,15 +63,10 @@ final mvpFrameUseCases = [ ), ]; -class MvpFramesApp extends StatefulWidget { - const MvpFramesApp({super.key}); +const mvpFrameIndex = int.fromEnvironment('MVP_FRAME_INDEX'); - @override - State createState() => _MvpFramesAppState(); -} - -class _MvpFramesAppState extends State { - var _index = 0; +class MvpFramesApp extends StatelessWidget { + const MvpFramesApp({super.key}); static const _frames = [ _MvpFrameSpec( @@ -113,7 +108,8 @@ class _MvpFramesAppState extends State { @override Widget build(BuildContext context) { - final frame = _frames[_index]; + final index = mvpFrameIndex.clamp(0, _frames.length - 1); + final frame = _frames[index]; return ThemeProvider( color: frame.color, @@ -129,54 +125,9 @@ class _MvpFramesAppState extends State { package: IdsTypography.sansFontPackage, scaffoldBackgroundColor: theme.muted, ), - home: ColoredBox( - color: theme.muted, - child: SafeArea( - child: Column( - children: [ - SizedBox( - height: 52, - child: ListView.separated( - padding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 8, - ), - scrollDirection: Axis.horizontal, - itemBuilder: (context, index) { - final selected = index == _index; - - return GestureDetector( - onTap: () => setState(() => _index = index), - child: Container( - alignment: Alignment.center, - padding: const EdgeInsets.symmetric( - horizontal: 14, - ), - decoration: BoxDecoration( - color: selected ? theme.primary : theme.surface, - borderRadius: BorderRadius.circular(999), - border: Border.all(color: theme.outline), - ), - child: IdsText( - _frames[index].label, - variant: IdsTextVariant.caption, - color: selected - ? theme.onPrimary - : theme.onSurface, - ), - ), - ); - }, - separatorBuilder: (_, _) => const SizedBox(width: 8), - itemCount: _frames.length, - ), - ), - Expanded( - child: Center(child: _Phone(child: frame.child)), - ), - ], - ), - ), + home: Scaffold( + backgroundColor: theme.muted, + body: SafeArea(bottom: false, child: frame.child), ), ); }, @@ -218,7 +169,16 @@ Widget _withTheme( return ThemeProvider( color: color, mode: mode, - child: Center(child: child), + child: Builder( + builder: (context) { + final theme = ThemeProvider.of(context); + + return Scaffold( + backgroundColor: theme.muted, + body: Center(child: child), + ); + }, + ), ); } @@ -1305,6 +1265,7 @@ class _PotgCreateTimeFrame extends StatelessWidget { IdsHStack( gap: 32, fit: IdsStackFit.content, + crossAxis: CrossAxis.center, children: [ IdsText( '9', diff --git a/packages/flutter/lib/src/components/bottom_navigation/ids_bottom_navigation.dart b/packages/flutter/lib/src/components/bottom_navigation/ids_bottom_navigation.dart index 5dd1d84..25e8049 100644 --- a/packages/flutter/lib/src/components/bottom_navigation/ids_bottom_navigation.dart +++ b/packages/flutter/lib/src/components/bottom_navigation/ids_bottom_navigation.dart @@ -27,24 +27,26 @@ class IdsBottomNavigation extends StatelessWidget { final theme = ThemeProvider.of(context); return Container( - height: 72, decoration: BoxDecoration( color: theme.surface, border: Border(top: BorderSide(color: theme.outline)), ), child: SafeArea( top: false, - child: Row( - children: [ - for (var i = 0; i < items.length; i++) - Expanded( - child: _IdsBottomNavigationButton( - item: items[i], - active: i == currentIndex, - onTap: () => onTap(i), + child: SizedBox( + height: 72, + child: Row( + children: [ + for (var i = 0; i < items.length; i++) + Expanded( + child: _IdsBottomNavigationButton( + item: items[i], + active: i == currentIndex, + onTap: () => onTap(i), + ), ), - ), - ], + ], + ), ), ), ); From ca43b6585fda1fa2960107fcf9778a5be3754496 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Mon, 8 Jun 2026 14:01:10 +0900 Subject: [PATCH 26/28] fix(flutter): reduce bottom navigation safe area gap --- .../bottom_navigation/ids_bottom_navigation.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/flutter/lib/src/components/bottom_navigation/ids_bottom_navigation.dart b/packages/flutter/lib/src/components/bottom_navigation/ids_bottom_navigation.dart index 25e8049..a1d8642 100644 --- a/packages/flutter/lib/src/components/bottom_navigation/ids_bottom_navigation.dart +++ b/packages/flutter/lib/src/components/bottom_navigation/ids_bottom_navigation.dart @@ -25,16 +25,18 @@ class IdsBottomNavigation extends StatelessWidget { @override Widget build(BuildContext context) { final theme = ThemeProvider.of(context); + final bottomInset = MediaQuery.paddingOf(context).bottom; + final bottomGap = bottomInset > 20 ? bottomInset - 20 : 8.0; return Container( decoration: BoxDecoration( color: theme.surface, border: Border(top: BorderSide(color: theme.outline)), ), - child: SafeArea( - top: false, + child: Padding( + padding: EdgeInsets.only(bottom: bottomGap), child: SizedBox( - height: 72, + height: 64, child: Row( children: [ for (var i = 0; i < items.length; i++) From ba6452a3422168dbf12790f69fedcb70f754707b Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Mon, 8 Jun 2026 14:36:37 +0900 Subject: [PATCH 27/28] fix(flutter): refine Potg create time frame --- .../lib/components/mvp_frames_usecase.dart | 185 +++++++++++++----- 1 file changed, 134 insertions(+), 51 deletions(-) diff --git a/packages/flutter/example/lib/components/mvp_frames_usecase.dart b/packages/flutter/example/lib/components/mvp_frames_usecase.dart index 99bf982..35ad347 100644 --- a/packages/flutter/example/lib/components/mvp_frames_usecase.dart +++ b/packages/flutter/example/lib/components/mvp_frames_usecase.dart @@ -92,6 +92,7 @@ class MvpFramesApp extends StatelessWidget { _MvpFrameSpec( label: '팟 생성', color: IdsColor.green, + surfaceBackground: true, child: _PotgCreateTimeFrame(), ), _MvpFrameSpec( @@ -117,16 +118,19 @@ class MvpFramesApp extends StatelessWidget { child: Builder( builder: (context) { final theme = ThemeProvider.of(context); + final background = frame.surfaceBackground + ? theme.surface + : theme.muted; return MaterialApp( debugShowCheckedModeBanner: false, theme: ThemeData( fontFamily: IdsTypography.sansFontFamily, package: IdsTypography.sansFontPackage, - scaffoldBackgroundColor: theme.muted, + scaffoldBackgroundColor: background, ), home: Scaffold( - backgroundColor: theme.muted, + backgroundColor: background, body: SafeArea(bottom: false, child: frame.child), ), ); @@ -141,11 +145,13 @@ class _MvpFrameSpec { required this.label, required this.color, required this.child, + this.surfaceBackground = false, }); final String label; final IdsColor color; final Widget child; + final bool surfaceBackground; } Widget _withTheme( @@ -1223,18 +1229,26 @@ class _PotgCreateTimeFrame extends StatelessWidget { return ColoredBox( color: theme.surface, - child: SizedBox( - width: double.infinity, - height: 760, + child: SizedBox.expand( child: SingleChildScrollView( - padding: const EdgeInsets.all(32), + padding: const EdgeInsets.fromLTRB(24, 28, 24, 40), child: IdsVStack( - gap: 24, + gap: 20, crossAxis: CrossAxis.start, children: [ const IdsText('팟 생성', variant: IdsTextVariant.title), - _StepRow(index: '1', label: '지스트 → 광주송정역', filled: true), - _StepRow(index: '2', label: '11월 14일 금요일', filled: true), + _StepRow( + index: '1', + label: '지스트 → 광주송정역', + filled: true, + editable: true, + ), + _StepRow( + index: '2', + label: '11월 14일 금요일', + filled: true, + editable: true, + ), _StepRow(index: '3', label: '시간대 설정', filled: false), const IdsCard( child: IdsCardContent( @@ -1252,48 +1266,7 @@ class _PotgCreateTimeFrame extends StatelessWidget { '출발 가능한 가장 늦은 시각을 설정하세요', variant: IdsTextVariant.body, ), - IdsCard( - variant: IdsCardVariant.filled, - child: IdsCardContent( - child: SizedBox( - height: 240, - child: IdsVStack( - gap: 28, - mainAxis: MainAxis.center, - crossAxis: CrossAxis.center, - children: [ - IdsHStack( - gap: 32, - fit: IdsStackFit.content, - crossAxis: CrossAxis.center, - children: [ - IdsText( - '9', - variant: IdsTextVariant.title, - color: theme.onMuted, - ), - IdsText( - '41', - variant: IdsTextVariant.title, - color: theme.onMuted, - ), - IdsText( - 'AM', - variant: IdsTextVariant.title, - color: theme.onMuted, - ), - ], - ), - IdsButton( - onPressed: () {}, - variant: IdsVariant.outline, - children: const [Text('확인')], - ), - ], - ), - ), - ), - ), + const _TimeWheelPickerMock(), ], ), ), @@ -1307,11 +1280,13 @@ class _StepRow extends StatelessWidget { required this.index, required this.label, required this.filled, + this.editable = false, }); final String index; final String label; final bool filled; + final bool editable; @override Widget build(BuildContext context) { @@ -1337,11 +1312,119 @@ class _StepRow extends StatelessWidget { ), ), Expanded(child: IdsText(label, variant: IdsTextVariant.body)), + if (editable) + IconTheme( + data: IconThemeData(color: theme.onMuted, size: 20), + child: const _HugeIcon(HugeIcons.strokeRoundedEdit02), + ), ], ); } } +class _TimeWheelPickerMock extends StatelessWidget { + const _TimeWheelPickerMock(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return Container( + height: 250, + width: double.infinity, + decoration: BoxDecoration( + color: theme.muted, + borderRadius: BorderRadius.circular(12), + ), + child: Stack( + alignment: Alignment.center, + children: [ + Positioned( + top: 98, + left: 32, + right: 32, + child: Container( + height: 32, + decoration: BoxDecoration( + color: theme.surface.withValues(alpha: 0.56), + borderRadius: BorderRadius.circular(8), + ), + ), + ), + Positioned( + top: 28, + child: IdsHStack( + gap: 28, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: const [ + _WheelColumn(values: ['6', '7', '8', '9', '10', '11', '12']), + _WheelColumn( + values: ['38', '39', '40', '41', '42', '43', '44'], + ), + _WheelColumn(values: ['', '', '', 'AM', 'PM', '', '']), + ], + ), + ), + Positioned( + bottom: 24, + child: SizedBox( + width: 64, + height: 42, + child: IdsButton( + onPressed: () {}, + variant: IdsVariant.outline, + size: IdsSize.sm, + children: const [Text('확인')], + ), + ), + ), + ], + ), + ); + } +} + +class _WheelColumn extends StatelessWidget { + const _WheelColumn({required this.values}); + + final List values; + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return SizedBox( + width: 50, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + for (var i = 0; i < values.length; i++) + SizedBox( + height: 24, + child: Center( + child: IdsText( + values[i], + variant: i == 3 + ? IdsTextVariant.body + : IdsTextVariant.caption, + color: theme.onMuted.withValues( + alpha: switch ((i - 3).abs()) { + 0 => 0.72, + 1 => 0.48, + 2 => 0.28, + _ => 0.1, + }, + ), + ), + ), + ), + ], + ), + ); + } +} + class _TimeSummary extends StatelessWidget { const _TimeSummary({required this.label, required this.time}); From 45925a5a0cac2b522a62b9837a67b69ef225e516 Mon Sep 17 00:00:00 2001 From: Hyunseung Ryu Date: Mon, 8 Jun 2026 14:46:22 +0900 Subject: [PATCH 28/28] feat(flutter): add Ziggle notice list MVP frame --- .../assets/mvp/ziggle-impact-ai-hackathon.png | Bin 0 -> 154822 bytes .../assets/mvp/ziggle-infoteam-recruit.png | Bin 0 -> 73614 bytes .../lib/components/mvp_frames_usecase.dart | 344 +++++++++++++++++- packages/flutter/example/pubspec.yaml | 4 + 4 files changed, 336 insertions(+), 12 deletions(-) create mode 100644 packages/flutter/example/assets/mvp/ziggle-impact-ai-hackathon.png create mode 100644 packages/flutter/example/assets/mvp/ziggle-infoteam-recruit.png diff --git a/packages/flutter/example/assets/mvp/ziggle-impact-ai-hackathon.png b/packages/flutter/example/assets/mvp/ziggle-impact-ai-hackathon.png new file mode 100644 index 0000000000000000000000000000000000000000..83fd5279a93a2dccc8dd88a410f110a68d9f0502 GIT binary patch literal 154822 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%0D2wCtg7;M3vTdIhOzVtQI-*g+X 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 YO{L=i0aQlgWb*@wUPyA+gy2DIr6`WP} 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⪙{M2ul7Ap3l0c>u4S<>GAVc`_o-ZWihmKFH~>X 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

&0D|S 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 _withTheme( + context, + initialColor: IdsColor.orange, + child: const _Phone(child: _ZiggleNoticeListFrame()), + ), + ), WidgetbookUseCase( name: 'Ziggle Groups', builder: (context) => _withTheme( @@ -69,6 +80,11 @@ class MvpFramesApp extends StatelessWidget { const MvpFramesApp({super.key}); static const _frames = [ + _MvpFrameSpec( + label: '공지 목록', + color: IdsColor.orange, + child: _ZiggleNoticeListFrame(), + ), _MvpFrameSpec( label: '공지 상세', color: IdsColor.orange, @@ -208,6 +224,284 @@ class _Phone extends StatelessWidget { } } +class _ZiggleNoticeListFrame extends StatelessWidget { + const _ZiggleNoticeListFrame(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return Stack( + children: [ + Column( + children: [ + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.fromLTRB(14, 28, 14, 96), + child: IdsVStack( + gap: 18, + crossAxis: CrossAxis.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 2), + child: IdsHStack( + gap: 8, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: [ + const Text('🔥', style: TextStyle(fontSize: 28)), + Text( + 'zgl', + style: IdsTypography.title.copyWith( + color: theme.onSurface, + fontWeight: FontWeight.w800, + height: 1, + ), + ), + ], + ), + ), + const _ZiggleCategoryRail(), + const _ZiggleNoticeFeedCard( + author: '홍길동', + title: '공지 제목', + dueLabel: '12일 남음', + posterAsset: _recruitPosterAsset, + tags: ['# 태그1', '# 태그1', '# 태그1', '# 태그1', '# 태그1'], + ), + const _ZiggleNoticeFeedCard( + author: 'GDSC GIST', + title: 'Impact AI Hackathon 참가자 모집', + posterAsset: _hackathonPosterAsset, + tags: ['#해커톤', '#AI', '#행사', '#GDSC'], + ), + ], + ), + ), + ), + _ZiggleBottomNavigation(currentIndex: 0), + ], + ), + ], + ); + } +} + +class _ZiggleCategoryRail extends StatelessWidget { + const _ZiggleCategoryRail(); + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return SizedBox( + height: 48, + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + _ZiggleCategoryPill( + label: '일반', + icon: HugeIcons.strokeRoundedMegaphone01, + selected: true, + ), + _ZiggleCategoryPill(icon: HugeIcons.strokeRoundedCalendar03), + _ZiggleCategoryPill(icon: HugeIcons.strokeRoundedGift), + _ZiggleCategoryPill(icon: HugeIcons.strokeRoundedTarget02), + Container( + width: 78, + margin: const EdgeInsets.only(left: 10), + decoration: BoxDecoration( + color: theme.secondary, + borderRadius: BorderRadius.circular(18), + ), + ), + ], + ), + ); + } +} + +class _ZiggleCategoryPill extends StatelessWidget { + const _ZiggleCategoryPill({ + required this.icon, + this.label, + this.selected = false, + }); + + final List> icon; + final String? label; + final bool selected; + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return Container( + height: 48, + margin: const EdgeInsets.only(right: 10), + padding: EdgeInsets.symmetric(horizontal: label == null ? 20 : 22), + decoration: BoxDecoration( + color: selected ? theme.primary : theme.secondary, + borderRadius: BorderRadius.circular(18), + ), + child: IdsHStack( + gap: 8, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: [ + IconTheme( + data: IconThemeData( + color: selected ? theme.onPrimary : theme.onSecondary, + size: 22, + ), + child: _HugeIcon(icon), + ), + if (label != null) + Text( + label!, + style: IdsTypography.body.copyWith( + color: selected ? theme.onPrimary : theme.onSecondary, + fontWeight: FontWeight.w800, + leadingDistribution: TextLeadingDistribution.even, + ), + ), + ], + ), + ); + } +} + +class _ZiggleNoticeFeedCard extends StatelessWidget { + const _ZiggleNoticeFeedCard({ + required this.author, + required this.title, + required this.posterAsset, + required this.tags, + this.dueLabel, + }); + + final String author; + final String title; + final String posterAsset; + final List tags; + final String? dueLabel; + + @override + Widget build(BuildContext context) { + final theme = ThemeProvider.of(context); + + return IdsCard( + variant: IdsCardVariant.elevated, + child: Padding( + padding: const EdgeInsets.fromLTRB(14, 14, 14, 16), + child: IdsVStack( + gap: 12, + crossAxis: CrossAxis.start, + children: [ + Row( + children: [ + const IdsAvatar(name: '홍길동', size: IdsSize.lg), + const SizedBox(width: 10), + Expanded( + child: IdsVStack( + gap: 2, + crossAxis: CrossAxis.start, + fit: IdsStackFit.content, + children: [ + IdsHStack( + gap: 4, + fit: IdsStackFit.content, + crossAxis: CrossAxis.center, + children: [ + IdsText(author, variant: IdsTextVariant.body), + IconTheme( + data: IconThemeData(color: theme.primary, size: 18), + child: const _HugeIcon( + HugeIcons.strokeRoundedCheckmarkBadge01, + ), + ), + ], + ), + IdsText( + '10분 전', + variant: IdsTextVariant.caption, + color: theme.onMuted, + ), + ], + ), + ), + if (dueLabel != null) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 6, + ), + decoration: BoxDecoration( + color: theme.primary, + borderRadius: BorderRadius.circular(8), + ), + child: IdsText( + dueLabel!, + variant: IdsTextVariant.caption, + color: theme.onPrimary, + ), + ), + ], + ), + IdsHStack( + gap: 8, + crossAxis: CrossAxis.center, + children: [ + Container( + width: 10, + height: 10, + decoration: BoxDecoration( + color: theme.primary, + shape: BoxShape.circle, + ), + ), + Expanded(child: IdsText(title, variant: IdsTextVariant.body)), + ], + ), + Center( + child: _NoticePoster( + assetPath: posterAsset, + height: 230, + width: 250, + ), + ), + Wrap( + spacing: 8, + runSpacing: 8, + children: [for (final tag in tags) IdsBadge(tag)], + ), + Row( + children: [ + IconTheme( + data: IconThemeData(color: theme.primary, size: 28), + child: const _HugeIcon(HugeIcons.strokeRoundedFire), + ), + const SizedBox(width: 6), + const IdsText('10', variant: IdsTextVariant.body), + const SizedBox(width: 18), + IconTheme( + data: IconThemeData(color: theme.primary, size: 28), + child: const _HugeIcon(HugeIcons.strokeRoundedBookmark01), + ), + const Spacer(), + IconTheme( + data: IconThemeData(color: theme.onSurface, size: 24), + child: const _HugeIcon(HugeIcons.strokeRoundedShare01), + ), + ], + ), + ], + ), + ), + ); + } +} + class _ZiggleGroupsFrame extends StatelessWidget { const _ZiggleGroupsFrame(); @@ -511,27 +805,33 @@ class _ZiggleNoticeDetailFrame extends StatelessWidget { } class _NoticePoster extends StatelessWidget { - const _NoticePoster(); + const _NoticePoster({ + this.assetPath = _recruitPosterAsset, + this.height = 320, + this.width, + }); + + final String assetPath; + final double height; + final double? width; @override Widget build(BuildContext context) { return Container( - height: 320, + height: height, + width: width ?? double.infinity, alignment: Alignment.center, decoration: BoxDecoration( - gradient: const LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [Color(0xFFFFECE8), Color(0xFFFFD6DC)], - ), + color: ThemeProvider.of(context).surface, borderRadius: BorderRadius.circular(24), border: Border.all(color: ThemeProvider.of(context).outline), ), - child: const IdsText( - '2026 봄학기\n인포팀 개발자 모집', - variant: IdsTextVariant.title, - align: TextAlign.center, - color: Color(0xFFE85F6A), + clipBehavior: Clip.antiAlias, + child: Image.asset( + assetPath, + fit: BoxFit.contain, + width: double.infinity, + height: double.infinity, ), ); } @@ -1465,6 +1765,26 @@ class _PotgBottomNavigation extends StatelessWidget { } } +class _ZiggleBottomNavigation extends StatelessWidget { + const _ZiggleBottomNavigation({required this.currentIndex}); + + final int currentIndex; + + @override + Widget build(BuildContext context) { + return IdsBottomNavigation( + currentIndex: currentIndex, + onTap: (_) {}, + items: [ + _navItem(HugeIcons.strokeRoundedHome01, '홈'), + _navItem(HugeIcons.strokeRoundedSearch01, '검색'), + _navItem(HugeIcons.strokeRoundedEdit02, '작성'), + _navItem(HugeIcons.strokeRoundedUserCircle02, '내 정보'), + ], + ); + } +} + class _PotgFloatingButton extends StatelessWidget { const _PotgFloatingButton(); diff --git a/packages/flutter/example/pubspec.yaml b/packages/flutter/example/pubspec.yaml index c993bf6..41812dc 100644 --- a/packages/flutter/example/pubspec.yaml +++ b/packages/flutter/example/pubspec.yaml @@ -15,6 +15,10 @@ dependencies: widgetbook: ^3.23.0 hugeicons: ^1.1.7 +flutter: + assets: + - assets/mvp/ + dev_dependencies: flutter_test: sdk: flutter