Repository: Strypper/mauisland
Branch: main
Commit: 9ef8848c738f
Files: 874
Total size: 8.2 MB
Directory structure:
gitextract_ew_du5mx/
├── .config/
│ └── dotnet-tools.json
├── .github/
│ └── ISSUE_TEMPLATE/
│ ├── add-new-control.yml
│ ├── bug-report.yml
│ ├── feature.yml
│ └── showcase-submission.yml
├── .gitignore
├── .vscode/
│ ├── launch.json
│ └── settings.json
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── build.cake
├── docs/
│ └── pull_request_template.md
├── maui-island.sln
├── showcases/
│ └── version_2.0/
│ └── Contribute.md
└── src/
├── Core/
│ └── MAUIsland.Core/
│ ├── Animations/
│ │ └── SampleScaleAnimation.cs
│ ├── AppSettings/
│ │ └── AppSettings.cs
│ ├── Attributes/
│ │ ├── FieldCompareAttribute.cs
│ │ └── PasswordAttribute.cs
│ ├── Converters/
│ │ ├── AllTrueValueConverter.cs
│ │ ├── BoolToOpacityValueConverter.cs
│ │ ├── DateTimeToSimpleDateTimeStringConverter.cs
│ │ ├── HexToSolidColorBrushConverter.cs
│ │ ├── ImageSourceToBoolConverter.cs
│ │ ├── LineBreakModeEnumToStringConverter.cs
│ │ ├── RatioValueConverter.cs
│ │ ├── StringTernaryOperatorConverter.cs
│ │ └── StringToColorConverter.cs
│ ├── Extensions/
│ │ └── TaskHelpers.cs
│ ├── Features/
│ │ └── Gallery/
│ │ ├── ContentViews/
│ │ │ ├── BrandIconContentView.xaml
│ │ │ ├── BrandIconContentView.xaml.cs
│ │ │ ├── ControlCardContentView.xaml
│ │ │ ├── ControlCardContentView.xaml.cs
│ │ │ ├── MaterialUICardContentView.xaml
│ │ │ ├── MaterialUICardContentView.xaml.cs
│ │ │ ├── SyncfusionCardContentView.xaml
│ │ │ └── SyncfusionCardContentView.xaml.cs
│ │ ├── Core/
│ │ │ ├── IBuiltInGalleryCardInfo.cs
│ │ │ ├── ICommunityToolkitGalleryCardInfo.cs
│ │ │ ├── IGalleryCardInfo.cs
│ │ │ ├── IGalleryPage.cs
│ │ │ ├── IGithubGalleryCardInfo.cs
│ │ │ └── IMaterialUIGalleryCardInfo.cs
│ │ ├── DataTemplateSelectors/
│ │ │ └── BrandCardTemplateSelector.cs
│ │ ├── Enums/
│ │ │ ├── BuiltInGalleryCardStatus.cs
│ │ │ ├── ControlGroupInfoImportantLevel.cs
│ │ │ ├── GalleryCardStatus.cs
│ │ │ └── GalleryCardType.cs
│ │ ├── Models/
│ │ │ ├── ControlGroupInfo.cs
│ │ │ ├── ControlGroupInfoImportant.cs
│ │ │ ├── ControlIssueModel.cs
│ │ │ └── PlatformInfo.cs
│ │ └── Pages/
│ │ ├── BuiltIn/
│ │ │ ├── BaseBuiltInPageControlViewModel.cs
│ │ │ ├── Controls/
│ │ │ │ ├── ActivityIndicator/
│ │ │ │ │ ├── ActivityIndicatorControlInfo.cs
│ │ │ │ │ └── ActivityIndicatorPageViewModel.cs
│ │ │ │ ├── BlazorWebView/
│ │ │ │ │ ├── BlazorWebViewControlInfo.cs
│ │ │ │ │ └── BlazorWebViewPageViewModel.cs
│ │ │ │ ├── Border/
│ │ │ │ │ ├── BorderControlInfo.cs
│ │ │ │ │ └── BorderPageViewModel.cs
│ │ │ │ ├── Button/
│ │ │ │ │ ├── ButtonControlInfo.cs
│ │ │ │ │ └── ButtonPageViewModel.cs
│ │ │ │ ├── CarouselView/
│ │ │ │ │ ├── CarouselViewControlInfo.cs
│ │ │ │ │ ├── CarouselViewPageViewModel.cs
│ │ │ │ │ ├── Models/
│ │ │ │ │ │ └── CarouselItem.cs
│ │ │ │ │ └── TemplateSelector/
│ │ │ │ │ └── CarouselViewItemDataTemplateSelector.cs
│ │ │ │ ├── Checkbox/
│ │ │ │ │ ├── CheckBoxControlInfo.cs
│ │ │ │ │ └── CheckBoxPageViewModel.cs
│ │ │ │ ├── CollectionView/
│ │ │ │ │ ├── CollectionViewControlInfo.cs
│ │ │ │ │ ├── CollectionViewPageViewModel.cs
│ │ │ │ │ ├── Models/
│ │ │ │ │ │ └── MrIncreadible.cs
│ │ │ │ │ ├── TemplateContentViews/
│ │ │ │ │ │ ├── ControllInfoCollectionFourItemRowTemplateContentView.xaml
│ │ │ │ │ │ ├── ControllInfoCollectionFourItemRowTemplateContentView.xaml.cs
│ │ │ │ │ │ ├── ControllInfoCollectionTemplateContentView.xaml
│ │ │ │ │ │ ├── ControllInfoCollectionTemplateContentView.xaml.cs
│ │ │ │ │ │ ├── ControllInfoCollectionThreeItemRowTemplateContentView.xaml
│ │ │ │ │ │ ├── ControllInfoCollectionThreeItemRowTemplateContentView.xaml.cs
│ │ │ │ │ │ ├── ControllInfoCollectionTwoItemRowTemplateContentView.xaml
│ │ │ │ │ │ ├── ControllInfoCollectionTwoItemRowTemplateContentView.xaml.cs
│ │ │ │ │ │ ├── MrIncreadibleCollectionTemplateWithSwipeContentView.xaml
│ │ │ │ │ │ ├── MrIncreadibleCollectionTemplateWithSwipeContentView.xaml.cs
│ │ │ │ │ │ ├── MrIncreadibleItemHorizontalTemplateContentView.xaml
│ │ │ │ │ │ ├── MrIncreadibleItemHorizontalTemplateContentView.xaml.cs
│ │ │ │ │ │ ├── MrIncreadibleItemTemplateContentView.xaml
│ │ │ │ │ │ ├── MrIncreadibleItemTemplateContentView.xaml.cs
│ │ │ │ │ │ ├── MrIncreadibleItemVerticalSpan2TemplateContentView.xaml
│ │ │ │ │ │ ├── MrIncreadibleItemVerticalSpan2TemplateContentView.xaml.cs
│ │ │ │ │ │ ├── MrIncreadibleItemVerticalTemplateContentView.xaml
│ │ │ │ │ │ ├── MrIncreadibleItemVerticalTemplateContentView.xaml.cs
│ │ │ │ │ │ ├── NormalItemTemplateContentView.xaml
│ │ │ │ │ │ ├── NormalItemTemplateContentView.xaml.cs
│ │ │ │ │ │ ├── SelectedItemTemplateContentView.xaml
│ │ │ │ │ │ └── SelectedItemTemplateContentView.xaml.cs
│ │ │ │ │ └── TemplateSelector/
│ │ │ │ │ └── TemplateSelector.cs
│ │ │ │ ├── DatePicker/
│ │ │ │ │ ├── DatePickerControlInfo.cs
│ │ │ │ │ └── DatePickerPageViewModel.cs
│ │ │ │ ├── Editor/
│ │ │ │ │ ├── EditorControlInfo.cs
│ │ │ │ │ └── EditorPageViewModel.cs
│ │ │ │ ├── Entry/
│ │ │ │ │ ├── EntryControlInfo.cs
│ │ │ │ │ ├── EntryPageViewModel.cs
│ │ │ │ │ └── Models/
│ │ │ │ │ └── ChatMessageModel.cs
│ │ │ │ ├── Frame/
│ │ │ │ │ ├── FrameControlInfo.cs
│ │ │ │ │ └── FramePageViewModel.cs
│ │ │ │ ├── ImageButton/
│ │ │ │ │ ├── ImageButtonControlInfo.cs
│ │ │ │ │ └── ImageButtonPageViewModel.cs
│ │ │ │ ├── IndicatorView/
│ │ │ │ │ ├── IndicatorViewControlInfo.cs
│ │ │ │ │ ├── IndicatorViewPageViewModel.cs
│ │ │ │ │ └── Models/
│ │ │ │ │ └── Cat.cs
│ │ │ │ ├── Label/
│ │ │ │ │ ├── LabelControlInfo.cs
│ │ │ │ │ └── LabelPageViewModel.cs
│ │ │ │ ├── MenuBar/
│ │ │ │ │ ├── MenuBarControlInfo.cs
│ │ │ │ │ └── MenuBarPageViewModel.cs
│ │ │ │ ├── Picker/
│ │ │ │ │ ├── PickerControlInfo.cs
│ │ │ │ │ └── PickerPageViewModel.cs
│ │ │ │ ├── ProgressBar/
│ │ │ │ │ ├── ProgressBarControlInfo.cs
│ │ │ │ │ ├── ProgressBarPageViewModel.cs
│ │ │ │ │ └── ProgressBarPercentageConverter.cs
│ │ │ │ ├── RadioButton/
│ │ │ │ │ ├── RadioButtonControlInfo.cs
│ │ │ │ │ └── RadioButtonPageViewModel.cs
│ │ │ │ ├── RefreshView/
│ │ │ │ │ ├── RefreshViewControlInfo.cs
│ │ │ │ │ └── RefreshViewPageViewModel.cs
│ │ │ │ ├── SearchBar/
│ │ │ │ │ ├── ControlInfoListView.xaml
│ │ │ │ │ ├── ControlInfoListView.xaml.cs
│ │ │ │ │ ├── SearchBarControlInfo.cs
│ │ │ │ │ └── SearchBarPageViewModel.cs
│ │ │ │ ├── Slider/
│ │ │ │ │ ├── SliderControlInfo.cs
│ │ │ │ │ └── SliderPageViewModel.cs
│ │ │ │ ├── Stepper/
│ │ │ │ │ ├── Converters/
│ │ │ │ │ │ ├── AgeToMemeImageConverter.cs
│ │ │ │ │ │ └── AgeToMemeTitleConverter.cs
│ │ │ │ │ ├── StepperControlInfo.cs
│ │ │ │ │ └── StepperPageViewModel.cs
│ │ │ │ ├── SwipeView/
│ │ │ │ │ ├── SwipeViewControlInfo.cs
│ │ │ │ │ └── SwipeViewPageViewModel.cs
│ │ │ │ ├── Switch/
│ │ │ │ │ ├── SwitchControlInfo.cs
│ │ │ │ │ └── SwitchPageViewModel.cs
│ │ │ │ ├── TabbedPage/
│ │ │ │ │ ├── TabbedPageControlInfo.cs
│ │ │ │ │ └── TabbedPagePageViewModel.cs
│ │ │ │ ├── TableView/
│ │ │ │ │ ├── TableViewControlInfo.cs
│ │ │ │ │ └── TableViewPageViewModel.cs
│ │ │ │ └── TimePicker/
│ │ │ │ ├── Converters/
│ │ │ │ │ └── TimeOnyToTimeSpanConverter.cs
│ │ │ │ ├── TimePickerControlInfo.cs
│ │ │ │ └── TimePickerPageViewModel.cs
│ │ │ ├── Helpers/
│ │ │ │ ├── AppSettingsJson/
│ │ │ │ │ ├── AppSettingsJsonControlInfo.cs
│ │ │ │ │ ├── AppSettingsJsonPageViewModel.cs
│ │ │ │ │ └── Models/
│ │ │ │ │ └── Settings.cs
│ │ │ │ └── Popup/
│ │ │ │ ├── PopupControlInfo.cs
│ │ │ │ └── PopupPageViewModel.cs
│ │ │ └── Layouts/
│ │ │ ├── AbsoluteLayout/
│ │ │ │ ├── AbsoluteLayoutControlInfo.cs
│ │ │ │ └── AbsoluteLayoutPageViewModel.cs
│ │ │ ├── Grid/
│ │ │ │ ├── DoubleToIntConverter.cs
│ │ │ │ ├── GridControlInfo.cs
│ │ │ │ └── GridPageViewModel.cs
│ │ │ ├── HorizontalStackLayout/
│ │ │ │ ├── HorizontalStackLayoutControlInfo.cs
│ │ │ │ └── HorizontalStackLayoutPageViewModel.cs
│ │ │ ├── StackLayout/
│ │ │ │ ├── StackLayoutControlInfo.cs
│ │ │ │ └── StackLayoutPageViewModel.cs
│ │ │ └── VerticalStackLayout/
│ │ │ ├── VerticalStackLayoutControlInfo.cs
│ │ │ └── VerticalStackLayoutPageViewModel.cs
│ │ ├── Community/
│ │ │ ├── Controls/
│ │ │ │ ├── AcrylicView/
│ │ │ │ │ ├── AcrylicViewControlInfo.cs
│ │ │ │ │ └── AcrylicViewPageViewModel.cs
│ │ │ │ ├── DataGrid/
│ │ │ │ │ ├── DataGridControlInfo.cs
│ │ │ │ │ └── DataGridPageViewModel.cs
│ │ │ │ ├── LiveCharts2/
│ │ │ │ │ ├── LiveCharts2ControlInfo.cs
│ │ │ │ │ ├── LiveCharts2PageViewModel.cs
│ │ │ │ │ └── Models/
│ │ │ │ │ └── PilotInfo.cs
│ │ │ │ └── OverFlower/
│ │ │ │ ├── OverFlowerControlInfo.cs
│ │ │ │ └── OverFlowerPageViewModel.cs
│ │ │ └── Helpers/
│ │ │ ├── OCR/
│ │ │ │ ├── OCRControlInfo.cs
│ │ │ │ └── OCRPageViewModel.cs
│ │ │ ├── SQLite-net/
│ │ │ │ ├── SQLiteNETControlInfo.cs
│ │ │ │ └── SQLiteNETPageViewModel.cs
│ │ │ └── ZXingNetMaui/
│ │ │ ├── ZXingNetMauiControlInfo.cs
│ │ │ └── ZXingNetMauiPageViewModel.cs
│ │ ├── Material/
│ │ │ ├── Controls/
│ │ │ │ ├── MaterialButton/
│ │ │ │ │ ├── MaterialButtonControlInfo.cs
│ │ │ │ │ └── MaterialButtonPageViewModel.cs
│ │ │ │ ├── MaterialChip/
│ │ │ │ │ ├── MaterialChipControlInfo.cs
│ │ │ │ │ └── MaterialChipPageViewModel.cs
│ │ │ │ ├── MaterialComboBox/
│ │ │ │ │ ├── MaterialComboBoxControlInfo.cs
│ │ │ │ │ └── MaterialComboBoxPageViewModel.cs
│ │ │ │ ├── MaterialContextMenu/
│ │ │ │ │ ├── MaterialContextMenuControlInfo.cs
│ │ │ │ │ └── MaterialContextMenuPageViewModel.cs
│ │ │ │ ├── MaterialFAB/
│ │ │ │ │ ├── MaterialFABControlInfo.cs
│ │ │ │ │ └── MaterialFABPageViewModel.cs
│ │ │ │ ├── MaterialProgressIndicator/
│ │ │ │ │ ├── MaterialProgressIndicatorControlInfo.cs
│ │ │ │ │ └── MaterialProgressIndicatorPageViewModel.cs
│ │ │ │ ├── MaterialRadioButton/
│ │ │ │ │ ├── MaterialRadioButtonControlInfo.cs
│ │ │ │ │ └── MaterialRadioButtonPageViewModel.cs
│ │ │ │ ├── MaterialSwitch/
│ │ │ │ │ ├── MaterialSwitchControlInfo.cs
│ │ │ │ │ └── MaterialSwitchPageViewModel.cs
│ │ │ │ └── MaterialTextFields/
│ │ │ │ ├── MaterialTextFieldControlInfo.cs
│ │ │ │ └── MaterialTextFieldPageViewModel.cs
│ │ │ └── Models/
│ │ │ ├── MaterialComponentEvent.cs
│ │ │ └── MaterialComponentProperty.cs
│ │ ├── Syncfusion/
│ │ │ ├── SfAvatarView/
│ │ │ │ ├── Models/
│ │ │ │ │ └── SfAvatarViewTestUserModel.cs
│ │ │ │ ├── SfAvatarViewControlInfo.cs
│ │ │ │ └── SfAvatarViewPageViewModel.cs
│ │ │ ├── SfBadgeView/
│ │ │ │ ├── SfBadgeViewControlInfo.cs
│ │ │ │ └── SfBadgeViewPageViewModel.cs
│ │ │ ├── SfBarcodeGenerator/
│ │ │ │ ├── SfBarcodeGeneratorControlInfo.cs
│ │ │ │ └── SfBarcodeGeneratorPageViewModel.cs
│ │ │ ├── SfBusyIndicator/
│ │ │ │ ├── SfBusyIndicatorControlInfo.cs
│ │ │ │ └── SfBusyIndicatorPageViewModel.cs
│ │ │ ├── SfCartesianChart/
│ │ │ │ ├── ContentView/
│ │ │ │ │ ├── Annotation/
│ │ │ │ │ │ ├── SfCartesianChartAnnotation.xaml
│ │ │ │ │ │ └── SfCartesianChartAnnotation.xaml.cs
│ │ │ │ │ ├── Appearance/
│ │ │ │ │ │ ├── SfCartesianChartAppearanceChart.xaml
│ │ │ │ │ │ ├── SfCartesianChartAppearanceChart.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartAppearanceSeries.xaml
│ │ │ │ │ │ ├── SfCartesianChartAppearanceSeries.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartPlottingCustomization.xaml
│ │ │ │ │ │ └── SfCartesianChartPlottingCustomization.xaml.cs
│ │ │ │ │ ├── Axis/
│ │ │ │ │ │ ├── SfCartesianChartCategoryAxis.xaml
│ │ │ │ │ │ ├── SfCartesianChartCategoryAxis.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartDateTimeAxis.xaml
│ │ │ │ │ │ ├── SfCartesianChartDateTimeAxis.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartLogarithmicAxis.xaml
│ │ │ │ │ │ ├── SfCartesianChartLogarithmicAxis.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartNumericalAxis.xaml
│ │ │ │ │ │ ├── SfCartesianChartNumericalAxis.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartOtherAxis.xaml
│ │ │ │ │ │ └── SfCartesianChartOtherAxis.xaml.cs
│ │ │ │ │ ├── Chart/
│ │ │ │ │ │ ├── Area/
│ │ │ │ │ │ │ ├── SfCartesianChartArea.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartArea.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartRangeArea.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartRangeArea.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartSplineArea.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartSplineArea.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartSplineRangeArea.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartSplineRangeArea.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartStackingArea.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartStackingArea.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartStackingArea100.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartStackingArea100.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartStepArea.xaml
│ │ │ │ │ │ │ └── SfCartesianChartStepArea.xaml.cs
│ │ │ │ │ │ ├── BoxPlot/
│ │ │ │ │ │ │ ├── SfCartesianChartBoxAndWhisker.xaml
│ │ │ │ │ │ │ └── SfCartesianChartBoxAndWhisker.xaml.cs
│ │ │ │ │ │ ├── Bubble/
│ │ │ │ │ │ │ ├── SfCartesianChartBubble.xaml
│ │ │ │ │ │ │ └── SfCartesianChartBubble.xaml.cs
│ │ │ │ │ │ ├── Column/
│ │ │ │ │ │ │ ├── Bar/
│ │ │ │ │ │ │ │ ├── SfCartesianChartBar.xaml
│ │ │ │ │ │ │ │ ├── SfCartesianChartBar.xaml.cs
│ │ │ │ │ │ │ │ ├── SfCartesianChartErrorBar.xaml
│ │ │ │ │ │ │ │ ├── SfCartesianChartErrorBar.xaml.cs
│ │ │ │ │ │ │ │ ├── SfCartesianChartRangeBar.xaml
│ │ │ │ │ │ │ │ ├── SfCartesianChartRangeBar.xaml.cs
│ │ │ │ │ │ │ │ ├── SfCartesianChartStackingBar.xaml
│ │ │ │ │ │ │ │ ├── SfCartesianChartStackingBar.xaml.cs
│ │ │ │ │ │ │ │ ├── SfCartesianChartStackingBar100.xaml
│ │ │ │ │ │ │ │ └── SfCartesianChartStackingBar100.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartColumn.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartColumn.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartRangeColumn.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartRangeColumn.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartStackingColumn.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartStackingColumn.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartStackingColumn100.xaml
│ │ │ │ │ │ │ └── SfCartesianChartStackingColumn100.xaml.cs
│ │ │ │ │ │ ├── Financial/
│ │ │ │ │ │ │ ├── SfCartesianChartCandle.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartCandle.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartOHLC.xaml
│ │ │ │ │ │ │ └── SfCartesianChartOHLC.xaml.cs
│ │ │ │ │ │ ├── Histogram/
│ │ │ │ │ │ │ ├── SfCartesianChartHistogram.xaml
│ │ │ │ │ │ │ └── SfCartesianChartHistogram.xaml.cs
│ │ │ │ │ │ ├── Line/
│ │ │ │ │ │ │ ├── SfCartesianChartFastLine.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartFastLine.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartLine.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartLine.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartSpline.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartSpline.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartStackingLine.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartStackingLine.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartStackingLine100.xaml
│ │ │ │ │ │ │ ├── SfCartesianChartStackingLine100.xaml.cs
│ │ │ │ │ │ │ ├── SfCartesianChartStepLine.xaml
│ │ │ │ │ │ │ └── SfCartesianChartStepLine.xaml.cs
│ │ │ │ │ │ ├── Scatter/
│ │ │ │ │ │ │ ├── SfCartesianChartScatter.xaml
│ │ │ │ │ │ │ └── SfCartesianChartScatter.xaml.cs
│ │ │ │ │ │ └── Waterfall/
│ │ │ │ │ │ ├── SfCartesianChartWaterfall.xaml
│ │ │ │ │ │ └── SfCartesianChartWaterfall.xaml.cs
│ │ │ │ │ ├── DataLabel/
│ │ │ │ │ │ ├── SfCartesianChartDataLabel.xaml
│ │ │ │ │ │ ├── SfCartesianChartDataLabel.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartDataLabelContext.xaml
│ │ │ │ │ │ ├── SfCartesianChartDataLabelContext.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartDataLabelTemplate.xaml
│ │ │ │ │ │ └── SfCartesianChartDataLabelTemplate.xaml.cs
│ │ │ │ │ ├── Legend/
│ │ │ │ │ │ ├── SfCartesianChartLegend.xaml
│ │ │ │ │ │ └── SfCartesianChartLegend.xaml.cs
│ │ │ │ │ ├── PlotBand/
│ │ │ │ │ │ ├── SfCartesianChartDateTimePlotBand.xaml
│ │ │ │ │ │ ├── SfCartesianChartDateTimePlotBand.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartNumericalPlotBand.xaml
│ │ │ │ │ │ ├── SfCartesianChartNumericalPlotBand.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartOtherPlotBand.xaml
│ │ │ │ │ │ ├── SfCartesianChartOtherPlotBand.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartPlotBandPropertiesInfo.xaml
│ │ │ │ │ │ └── SfCartesianChartPlotBandPropertiesInfo.xaml.cs
│ │ │ │ │ ├── Selection/
│ │ │ │ │ │ ├── SfCartesianChartSelection.xaml
│ │ │ │ │ │ ├── SfCartesianChartSelection.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartSeriesSelection.xaml
│ │ │ │ │ │ └── SfCartesianChartSeriesSelection.xaml.cs
│ │ │ │ │ ├── Tooltip/
│ │ │ │ │ │ ├── SfCartesianChartTooltip.xaml
│ │ │ │ │ │ └── SfCartesianChartTooltip.xaml.cs
│ │ │ │ │ ├── Trackball/
│ │ │ │ │ │ ├── SfCartesianChartCustomTrackball.xaml
│ │ │ │ │ │ ├── SfCartesianChartCustomTrackball.xaml.cs
│ │ │ │ │ │ ├── SfCartesianChartTrackball.xaml
│ │ │ │ │ │ └── SfCartesianChartTrackball.xaml.cs
│ │ │ │ │ └── Zooming/
│ │ │ │ │ ├── SfCartesianChartSelectionZooming.xaml
│ │ │ │ │ ├── SfCartesianChartSelectionZooming.xaml.cs
│ │ │ │ │ ├── SfCartesianChartZooming.xaml
│ │ │ │ │ └── SfCartesianChartZooming.xaml.cs
│ │ │ │ ├── Models/
│ │ │ │ │ └── SfCartesianChartModel.cs
│ │ │ │ ├── SfCartesianChartControlInfo.cs
│ │ │ │ ├── SfCartesianChartPageViewModel.cs
│ │ │ │ └── TemplateSelector/
│ │ │ │ └── ChartTemplateSelector.cs
│ │ │ ├── SfCircularChart/
│ │ │ │ ├── SfCircularChartControlInfo.cs
│ │ │ │ └── SfCircularChartPageViewModel.cs
│ │ │ ├── SfComboBox/
│ │ │ │ ├── SfComboBoxControlInfo.cs
│ │ │ │ └── SfComboBoxPageViewModel.cs
│ │ │ ├── SfDataGrid/
│ │ │ │ ├── SfDataGridControlInfo.cs
│ │ │ │ └── SfDataGridPageViewModel.cs
│ │ │ ├── SfListView/
│ │ │ │ ├── SfListViewControlInfo.cs
│ │ │ │ └── SfListViewPageViewModel.cs
│ │ │ ├── SfMaps/
│ │ │ │ ├── MapViewModels/
│ │ │ │ │ ├── AustraliaViewModel.cs
│ │ │ │ │ ├── MarkerViewModel.cs
│ │ │ │ │ └── SelectionViewModel.cs
│ │ │ │ ├── Marker/
│ │ │ │ │ └── CustomMarker.cs
│ │ │ │ ├── Models/
│ │ │ │ │ ├── AustraliaModel.cs
│ │ │ │ │ └── PopulationDensityDetails.cs
│ │ │ │ ├── SfMapsControlInfo.cs
│ │ │ │ └── SfMapsViewPageViewModel.cs
│ │ │ ├── SfRadialGauge/
│ │ │ │ ├── SfRadialGaugeControlInfo.cs
│ │ │ │ └── SfRadialGaugePageViewModel.cs
│ │ │ └── SfRangeSelector/
│ │ │ ├── SfRangeSelectorControlInfo.cs
│ │ │ └── SfRangeSelectorPageViewModel.cs
│ │ └── Toolkit/
│ │ ├── BaseToolkitPageControlViewModel.cs
│ │ ├── Controls/
│ │ │ ├── AvatarView/
│ │ │ │ ├── AvatarViewControlInfo.cs
│ │ │ │ └── AvatarViewPageViewModel.cs
│ │ │ ├── DrawingView/
│ │ │ │ ├── DrawingViewControlInfo.cs
│ │ │ │ └── DrawingViewPageViewModel.cs
│ │ │ ├── Expander/
│ │ │ │ ├── ExpanderControlInfo.cs
│ │ │ │ └── ExpanderPageViewModel.cs
│ │ │ └── MediaElement/
│ │ │ ├── MediaElementControlInfo.cs
│ │ │ └── MediaElementPageViewModel.cs
│ │ ├── Converters/
│ │ │ ├── BoolToObjectConverter/
│ │ │ │ ├── BoolToObjectConverterControlInfo.cs
│ │ │ │ └── BoolToObjectConverterPageViewModel.cs
│ │ │ ├── ByteArrayToImageSourceConverter/
│ │ │ │ ├── ByteArrayToImageSourceConverterControlInfo.cs
│ │ │ │ └── ByteArrayToImageSourceConverterPageViewModel.cs
│ │ │ ├── ColorConverter/
│ │ │ │ ├── ColorConverterControlInfo.cs
│ │ │ │ └── ColorConverterPageViewModel.cs
│ │ │ ├── CompareConverter/
│ │ │ │ ├── CompareConverterControlInfo.cs
│ │ │ │ └── CompareConverterPageViewModel.cs
│ │ │ ├── DateTimeOffsetConverter/
│ │ │ │ ├── DateTimeOffsetConverterControlInfo.cs
│ │ │ │ └── DateTimeOffsetConverterPageViewModel.cs
│ │ │ ├── DoubleToIntConverter/
│ │ │ │ ├── DoubleToIntConverterControlInfo.cs
│ │ │ │ └── DoubleToIntConverterPageViewModel.cs
│ │ │ ├── EnumToBoolConverter/
│ │ │ │ ├── EnumToBoolConverterControlInfo.cs
│ │ │ │ └── EnumToBoolConverterPageViewModel.cs
│ │ │ ├── EnumToIntConverter/
│ │ │ │ ├── EnumToIntConverterControlInfo.cs
│ │ │ │ └── EnumToIntConverterPageViewModel.cs
│ │ │ └── ImageResourceConverter/
│ │ │ ├── ImageResourceConverterControlInfo.cs
│ │ │ └── ImageResourceConverterPageViewModel.cs
│ │ ├── Helpers/
│ │ │ ├── ObservableProperty/
│ │ │ │ ├── ObservablePropertyControlInfo.cs
│ │ │ │ └── ObservablePropertyPageViewModel.cs
│ │ │ └── RelayCommand/
│ │ │ ├── RelayCommandControlInfo.cs
│ │ │ └── RelayCommandPageViewModel.cs
│ │ └── Layouts/
│ │ ├── DockLayout/
│ │ │ ├── DockLayoutControlInfo.cs
│ │ │ └── DockLayoutPageViewModel.cs
│ │ ├── StateContainer/
│ │ │ ├── StateContainerControlInfo.cs
│ │ │ └── StateContainerPageViewModel.cs
│ │ └── UniformLayout/
│ │ ├── UniformItemsLayoutControlInfo.cs
│ │ └── UniformItemsLayoutPageViewModel.cs
│ ├── GlobalUsings.cs
│ ├── Helpers/
│ │ ├── FormattedStringFormatter.cs
│ │ └── ServiceHelper.cs
│ ├── Icons/
│ │ └── FluentUIIcon.cs
│ ├── MAUIsland - Backup.Core.csproj
│ ├── MAUIsland.Core.csproj
│ ├── MAUIsland.Core.sln
│ ├── MarkupExtensions/
│ │ └── EdgeInsetsExtension.cs
│ ├── Platforms/
│ │ ├── Android/
│ │ │ └── PlatformClass1.cs
│ │ ├── MacCatalyst/
│ │ │ └── PlatformClass1.cs
│ │ ├── Tizen/
│ │ │ └── PlatformClass1.cs
│ │ ├── Windows/
│ │ │ └── PlatformClass1.cs
│ │ └── iOS/
│ │ └── PlatformClass1.cs
│ ├── ServiceExtension.cs
│ ├── Services/
│ │ ├── Controls/
│ │ │ ├── ControlsService.cs
│ │ │ └── IControlsService.cs
│ │ ├── Dialog/
│ │ │ ├── DialogService.cs
│ │ │ └── IDialogService.cs
│ │ ├── FilePicker/
│ │ │ ├── FilePicker.cs
│ │ │ ├── IFilePicker.cs
│ │ │ └── ImageFile.cs
│ │ ├── LocalDb/
│ │ │ ├── Extensions/
│ │ │ │ └── SyncRepositoryExtensions.cs
│ │ │ ├── Implementations/
│ │ │ │ ├── CardInfoSyncService.cs
│ │ │ │ ├── GitHubRepositorySyncService.cs
│ │ │ │ └── SQLitePCLRawService.cs
│ │ │ ├── Interfaces/
│ │ │ │ ├── ICardInfoSyncService.cs
│ │ │ │ ├── IGitHubRepositorySyncService.cs
│ │ │ │ └── ILocalDbService.cs
│ │ │ └── Models/
│ │ │ ├── BaseLocalEntity.cs
│ │ │ ├── CardInfoSyncLocalDbModel.cs
│ │ │ └── GitHubRepositoryLocalDbModel.cs
│ │ └── MrIncreadibleMeme/
│ │ ├── IMrIncreadibleMemeService.cs
│ │ └── MrIncreadibleMemeService.cs
│ ├── Utils/
│ │ ├── MVVM/
│ │ │ ├── BaseFormModel.cs
│ │ │ ├── BaseModel.cs
│ │ │ ├── BasePage.cs
│ │ │ ├── BasePopup.cs
│ │ │ └── BaseViewModel.cs
│ │ └── Navigation/
│ │ ├── AppNavigator.cs
│ │ ├── IAppNavigator.cs
│ │ ├── NavigationAwareBaseViewModel.cs
│ │ └── UriHelper.cs
│ └── Views/
│ ├── ContentViews/
│ │ ├── DocumentAlert.xaml
│ │ ├── DocumentAlert.xaml.cs
│ │ ├── HorizontalIconButton.xaml
│ │ ├── HorizontalIconButton.xaml.cs
│ │ ├── IconLabel.xaml
│ │ ├── IconLabel.xaml.cs
│ │ ├── MockUps/
│ │ │ ├── AppleIphone15ProMaxContentView.xaml
│ │ │ ├── AppleIphone15ProMaxContentView.xaml.cs
│ │ │ ├── Converters/
│ │ │ │ └── InnerFrameDimensionConverter.cs
│ │ │ ├── GooglePixel5ContentView.xaml
│ │ │ ├── GooglePixel5ContentView.xaml.cs
│ │ │ ├── GooglePixel6ProContentView.xaml
│ │ │ ├── GooglePixel6ProContentView.xaml.cs
│ │ │ ├── Iphone13MiniContentView.xaml
│ │ │ ├── Iphone13MiniContentView.xaml.cs
│ │ │ ├── Iphone15ContentView.xaml
│ │ │ ├── Iphone15ContentView.xaml.cs
│ │ │ ├── Models/
│ │ │ │ ├── AppleIphone15ProMaxModel.cs
│ │ │ │ ├── BaseMockUp.cs
│ │ │ │ ├── GooglePixel5Model.cs
│ │ │ │ ├── GooglePixel6ProModel.cs
│ │ │ │ ├── IPhone13MiniModel.cs
│ │ │ │ ├── Iphone15Model.cs
│ │ │ │ ├── SamsungGalaxyS22UltraModel.cs
│ │ │ │ └── SamsungS8Model.cs
│ │ │ ├── SamsungGalaxyS22UltraContentView.xaml
│ │ │ ├── SamsungGalaxyS22UltraContentView.xaml.cs
│ │ │ ├── SamsungS8ContentView.xaml
│ │ │ └── SamsungS8ContentView.xaml.cs
│ │ ├── RoundedEntry.xaml
│ │ ├── RoundedEntry.xaml.cs
│ │ ├── Showcases/
│ │ │ ├── Enums/
│ │ │ │ └── PhoneModelEnum.cs
│ │ │ ├── MobileAppShowcaseContentView.xaml
│ │ │ ├── MobileAppShowcaseContentView.xaml.cs
│ │ │ └── Models/
│ │ │ ├── MobileAppShowcaseModel.cs
│ │ │ └── MockupImage.cs
│ │ └── SourceCodeExpander/
│ │ ├── LazyViewSourceCodeExpanderContent.cs
│ │ ├── SourceCodeExpander.xaml
│ │ ├── SourceCodeExpander.xaml.cs
│ │ ├── SourceCodeExpanderContent.xaml
│ │ └── SourceCodeExpanderContent.xaml.cs
│ ├── DesignSystem/
│ │ ├── AppColors.cs
│ │ ├── AppConverters.cs
│ │ ├── Dimensions.cs
│ │ ├── FontNames.cs
│ │ └── Styles.cs
│ └── Layouts/
│ ├── HorizontalWrapLayout.cs
│ └── HorizontalWrapLayoutManager.cs
├── Features/
│ ├── GitHubFeatures/
│ │ ├── MAUIsland.GitHubFeatures/
│ │ │ ├── Constants.cs
│ │ │ ├── FeatureSettings.cs
│ │ │ ├── GlobalUsings.cs
│ │ │ ├── IGitHubService.cs
│ │ │ ├── Implementations/
│ │ │ │ └── OctokitGitHubClient.cs
│ │ │ ├── MAUIsland.GitHubFeatures.csproj
│ │ │ ├── Models/
│ │ │ │ ├── GitHubAuthorModel.cs
│ │ │ │ ├── GitHubBaseModel.cs
│ │ │ │ ├── GitHubIssueModel.cs
│ │ │ │ ├── GitHubLabelModel.cs
│ │ │ │ ├── GitHubMilestoneModel.cs
│ │ │ │ ├── GitHubRepositoryModel.cs
│ │ │ │ ├── GitHubRepositoryReleaseModel.cs
│ │ │ │ ├── ServiceError.cs
│ │ │ │ └── ServiceSuccess.cs
│ │ │ └── ServiceExtension.cs
│ │ └── MAUIsland.GitHubFeatures.IntegrationTests/
│ │ ├── GitHubServiceIntegrationTest.cs
│ │ ├── GlobalUsings.cs
│ │ └── MAUIsland.GitHubFeatures.IntegrationTests.csproj
│ ├── LocalDbFeatures/
│ │ ├── GitHub/
│ │ │ └── MAUIsland.Features.LocalDbFeatures.GitHub/
│ │ │ ├── Implementations/
│ │ │ │ └── GitHubIssueLocalDbService.cs
│ │ │ ├── Interfaces/
│ │ │ │ └── IGitHubIssueLocalDbService.cs
│ │ │ ├── MAUIsland.Features.LocalDbFeatures.GitHub.csproj
│ │ │ ├── Models/
│ │ │ │ └── GitHubIssueLocalDbModel.cs
│ │ │ └── ServiceExtension.cs
│ │ └── MAUIsland.Features.LocalDbFeatures/
│ │ ├── BaseLocalEntity.cs
│ │ ├── DatabaseSettings.cs
│ │ ├── GlobalUsings.cs
│ │ ├── ILocalDbService.cs
│ │ ├── Implementations/
│ │ │ └── SQLitePCLRawService.cs
│ │ ├── MAUIsland.Features.LocalDbFeatures.csproj
│ │ └── ServiceExtension.cs
│ ├── NewsFeatures/
│ │ ├── MAUIsland.NewsFeatures/
│ │ │ ├── Constants.cs
│ │ │ ├── GlobalUsings.cs
│ │ │ ├── INewsService.cs
│ │ │ ├── Implementations/
│ │ │ │ └── ImplVersion1.cs
│ │ │ ├── MAUIsland.NewsFeatures.csproj
│ │ │ ├── Models/
│ │ │ │ ├── MAUINewsModel.cs
│ │ │ │ ├── NewsBaseModel.cs
│ │ │ │ ├── ServiceError.cs
│ │ │ │ └── ServiceSuccess.cs
│ │ │ └── ServiceExtension.cs
│ │ └── MAUIsland.NewsFeatures.IntergrationTests/
│ │ ├── MAUIsland.NewsFeatures.IntergrationTests.csproj
│ │ └── NewsServiceIntegrationTest.cs
│ └── NuGetFeatures/
│ ├── MAUIsland.NuGetFeatures/
│ │ ├── GlobalUsings.cs
│ │ ├── INuGetFeatures.cs
│ │ ├── Implementations/
│ │ │ ├── Mock1.cs
│ │ │ └── Version1.cs
│ │ ├── MAUIsland.NuGetFeatures.csproj
│ │ ├── Models/
│ │ │ ├── ServiceError.cs
│ │ │ └── ServiceSuccess.cs
│ │ └── ServiceExtension.cs
│ └── NuGetFeatures.IntegrationTests/
│ ├── NuGetFeatures.IntegrationTests.csproj
│ └── Version1Test.cs
└── Presentations/
└── Windows/
├── .meteor/
│ └── generated/
│ ├── CommunityToolkit.Maui.MediaElement.json
│ ├── CommunityToolkit.Maui.json
│ ├── MAUIsland.json
│ ├── Microsoft.Maui.Controls.Compatibility.json
│ ├── Microsoft.Maui.Controls.json
│ ├── SkiaSharp.Extended.UI.json
│ ├── SkiaSharp.Views.Maui.Controls.json
│ ├── Syncfusion.Maui.Backdrop.json
│ ├── Syncfusion.Maui.Barcode.json
│ ├── Syncfusion.Maui.Calendar.json
│ ├── Syncfusion.Maui.Charts.json
│ ├── Syncfusion.Maui.Core.json
│ ├── Syncfusion.Maui.DataForm.json
│ ├── Syncfusion.Maui.DataGrid.json
│ ├── Syncfusion.Maui.Gauges.json
│ ├── Syncfusion.Maui.Inputs.json
│ ├── Syncfusion.Maui.ListView.json
│ ├── Syncfusion.Maui.Maps.json
│ ├── Syncfusion.Maui.PdfViewer.json
│ ├── Syncfusion.Maui.ProgressBar.json
│ ├── Syncfusion.Maui.SignaturePad.json
│ ├── Syncfusion.Maui.Sliders.json
│ ├── Syncfusion.Maui.TabView.json
│ └── ZXing.Net.MAUI.Controls.json
├── .vscode/
│ ├── launch.json
│ └── tasks.json
├── App.xaml
├── App.xaml.cs
├── AppRoutes.cs
├── AppSettings/
│ └── AppSettings.cs
├── AppShell.xaml
├── AppShell.xaml.cs
├── Blazor/
│ ├── MainLayout.razor
│ ├── MainLayout.razor.css
│ ├── Routes.razor
│ └── _Imports.razor
├── Features/
│ ├── Chat/
│ │ ├── Constants/
│ │ │ └── ChatConstants.cs
│ │ ├── ContentViews/
│ │ │ ├── ChatBubbleContentView.xaml
│ │ │ ├── ChatBubbleContentView.xaml.cs
│ │ │ ├── ChatPageDesktopLayout.xaml
│ │ │ ├── ChatPageDesktopLayout.xaml.cs
│ │ │ ├── ChatPagePhoneLayout.xaml
│ │ │ ├── ChatPagePhoneLayout.xaml.cs
│ │ │ ├── ChatPageTabletLayout.xaml
│ │ │ ├── ChatPageTabletLayout.xaml.cs
│ │ │ ├── LoginFormContentView.xaml
│ │ │ ├── LoginFormContentView.xaml.cs
│ │ │ ├── RegisterFormContentView.xaml
│ │ │ └── RegisterFormContentView.xaml.cs
│ │ ├── Messages/
│ │ │ └── LoginMessage.cs
│ │ ├── Models/
│ │ │ ├── DTOs/
│ │ │ │ ├── AuthenticationResponseDTO.cs
│ │ │ │ ├── PhoneNumberLoginDTO.cs
│ │ │ │ ├── RegisterDTO.cs
│ │ │ │ └── UserNameLoginDTO.cs
│ │ │ ├── Forms/
│ │ │ │ └── LoginFormModel.cs
│ │ │ ├── Refits/
│ │ │ │ └── Responses/
│ │ │ │ ├── RefitChatMessageResponse.cs
│ │ │ │ ├── RefitErrorMessageModel.cs
│ │ │ │ ├── RefitLoginSuccessModelRespone.cs
│ │ │ │ └── RefitUserInfoResponseModel.cs
│ │ │ ├── Sqlite/
│ │ │ │ └── UserInformationSqlite.cs
│ │ │ ├── UI/
│ │ │ │ ├── PrincipalUserModel.cs
│ │ │ │ └── ServiceUserInfo.cs
│ │ │ └── UserModel.cs
│ │ ├── Pages/
│ │ │ ├── ChatPage.xaml
│ │ │ ├── ChatPage.xaml.cs
│ │ │ └── ChatPageViewModel.cs
│ │ ├── Popups/
│ │ │ ├── AuthenticatePopup.xaml
│ │ │ ├── AuthenticatePopup.xaml.cs
│ │ │ └── AuthenticatePopupViewModel.cs
│ │ ├── Refits/
│ │ │ └── Interfaces/
│ │ │ ├── IIntranetAuthenticationRefit.cs
│ │ │ ├── IIntranetConversationRefit.cs
│ │ │ └── IIntranetUserRefit.cs
│ │ ├── Services/
│ │ │ ├── Implementations/
│ │ │ │ ├── BogusAuthenticationService.cs
│ │ │ │ ├── BogusUserServices.cs
│ │ │ │ ├── RefitAuthenticationService.cs
│ │ │ │ ├── RefitIntranetConversationService.cs
│ │ │ │ ├── RefitIntranetUserService.cs
│ │ │ │ └── SignalRChatHubService.cs
│ │ │ └── Interfaces/
│ │ │ ├── IAuthenticationServices.cs
│ │ │ ├── IChatHubService.cs
│ │ │ ├── IConversationService.cs
│ │ │ ├── ILocalDatabaseService.cs
│ │ │ └── IUserServices.cs
│ │ └── Styles/
│ │ └── ChatStyles.xaml
│ ├── Gallery/
│ │ ├── Animations/
│ │ │ └── SampleScaleAnimation.cs
│ │ ├── ContentViews/
│ │ │ ├── BrandIconContentView.xaml
│ │ │ ├── BrandIconContentView.xaml.cs
│ │ │ ├── ControlCardContentView.xaml
│ │ │ ├── ControlCardContentView.xaml.cs
│ │ │ ├── GithubCardContentView.xaml
│ │ │ ├── GithubCardContentView.xaml.cs
│ │ │ ├── MaterialUICardContentView.xaml
│ │ │ ├── MaterialUICardContentView.xaml.cs
│ │ │ ├── SyncfusionCardContentView.xaml
│ │ │ └── SyncfusionCardContentView.xaml.cs
│ │ ├── DataTemplateSelectors/
│ │ │ └── BrandCardTemplateSelector.cs
│ │ ├── Enums/
│ │ │ └── ControlGroupInfoImportantLevel.cs
│ │ ├── Handlers/
│ │ │ └── CardsSearchHandler.cs
│ │ ├── Models/
│ │ │ ├── ControlGroupInfoImportant.cs
│ │ │ └── PlatformInfo.cs
│ │ ├── Pages/
│ │ │ ├── BuiltIn/
│ │ │ │ ├── Controls/
│ │ │ │ │ ├── ActivityIndicator/
│ │ │ │ │ │ ├── ActivityIndicatorPage.xaml
│ │ │ │ │ │ └── ActivityIndicatorPage.xaml.cs
│ │ │ │ │ ├── BlazorWebView/
│ │ │ │ │ │ ├── Blazor/
│ │ │ │ │ │ │ ├── Components/
│ │ │ │ │ │ │ │ ├── Counter.razor
│ │ │ │ │ │ │ │ ├── Main.razor
│ │ │ │ │ │ │ │ └── Weather.razor
│ │ │ │ │ │ │ ├── NavMenu.razor
│ │ │ │ │ │ │ ├── NavMenu.razor.css
│ │ │ │ │ │ │ └── _Imports.razor
│ │ │ │ │ │ ├── BlazorWebViewPage.xaml
│ │ │ │ │ │ └── BlazorWebViewPage.xaml.cs
│ │ │ │ │ ├── Border/
│ │ │ │ │ │ ├── BorderPage.xaml
│ │ │ │ │ │ └── BorderPage.xaml.cs
│ │ │ │ │ ├── Button/
│ │ │ │ │ │ ├── ButtonPage.xaml
│ │ │ │ │ │ └── ButtonPage.xaml.cs
│ │ │ │ │ ├── CarouselView/
│ │ │ │ │ │ ├── CarouselViewPage.xaml
│ │ │ │ │ │ └── CarouselViewPage.xaml.cs
│ │ │ │ │ ├── CheckBox/
│ │ │ │ │ │ ├── CheckBoxPage.xaml
│ │ │ │ │ │ └── CheckBoxPage.xaml.cs
│ │ │ │ │ ├── CollectionView/
│ │ │ │ │ │ ├── CollectionViewPage.xaml
│ │ │ │ │ │ └── CollectionViewPage.xaml.cs
│ │ │ │ │ ├── DatePicker/
│ │ │ │ │ │ ├── Converters/
│ │ │ │ │ │ │ └── FulldateToDateOnlyConverter.cs
│ │ │ │ │ │ ├── DatePickerPage.xaml
│ │ │ │ │ │ └── DatePickerPage.xaml.cs
│ │ │ │ │ ├── Editor/
│ │ │ │ │ │ ├── Converter/
│ │ │ │ │ │ │ └── EditorTextTransformPickerConverter.cs
│ │ │ │ │ │ ├── EditorPage.xaml
│ │ │ │ │ │ └── EditorPage.xaml.cs
│ │ │ │ │ ├── Entry/
│ │ │ │ │ │ ├── EntryPage.xaml
│ │ │ │ │ │ └── EntryPage.xaml.cs
│ │ │ │ │ ├── Frame/
│ │ │ │ │ │ ├── FramePage.xaml
│ │ │ │ │ │ └── FramePage.xaml.cs
│ │ │ │ │ ├── ImageButton/
│ │ │ │ │ │ ├── ImageButtonPage.xaml
│ │ │ │ │ │ └── ImageButtonPage.xaml.cs
│ │ │ │ │ ├── IndicatorView/
│ │ │ │ │ │ ├── IndicatorViewPage.xaml
│ │ │ │ │ │ └── IndicatorViewPage.xaml.cs
│ │ │ │ │ ├── Label/
│ │ │ │ │ │ ├── LabelPage.xaml
│ │ │ │ │ │ └── LabelPage.xaml.cs
│ │ │ │ │ ├── MenuBar/
│ │ │ │ │ │ ├── MenuBarPage.xaml
│ │ │ │ │ │ └── MenuBarPage.xaml.cs
│ │ │ │ │ ├── Picker/
│ │ │ │ │ │ ├── PickerPage.xaml
│ │ │ │ │ │ └── PickerPage.xaml.cs
│ │ │ │ │ ├── ProgressBar/
│ │ │ │ │ │ ├── ProgressBarPage.xaml
│ │ │ │ │ │ └── ProgressBarPage.xaml.cs
│ │ │ │ │ ├── RadioButton/
│ │ │ │ │ │ ├── RadioButtonPage.xaml
│ │ │ │ │ │ └── RadioButtonPage.xaml.cs
│ │ │ │ │ ├── RefreshView/
│ │ │ │ │ │ ├── RefreshViewPage.xaml
│ │ │ │ │ │ └── RefreshViewPage.xaml.cs
│ │ │ │ │ ├── SearchBar/
│ │ │ │ │ │ ├── SearchBarPage.xaml
│ │ │ │ │ │ └── SearchBarPage.xaml.cs
│ │ │ │ │ ├── Slider/
│ │ │ │ │ │ ├── SliderPage.xaml
│ │ │ │ │ │ └── SliderPage.xaml.cs
│ │ │ │ │ ├── Stepper/
│ │ │ │ │ │ ├── StepperPage.xaml
│ │ │ │ │ │ └── StepperPage.xaml.cs
│ │ │ │ │ ├── SwipeView/
│ │ │ │ │ │ ├── SwipeViewPage.xaml
│ │ │ │ │ │ └── SwipeViewPage.xaml.cs
│ │ │ │ │ ├── Switch/
│ │ │ │ │ │ ├── SwitchPage.xaml
│ │ │ │ │ │ └── SwitchPage.xaml.cs
│ │ │ │ │ ├── TabbedPage/
│ │ │ │ │ │ ├── TabbedPagePage.xaml
│ │ │ │ │ │ ├── TabbedPagePage.xaml.cs
│ │ │ │ │ │ └── TabbedPages/
│ │ │ │ │ │ ├── CommunityPage.xaml
│ │ │ │ │ │ ├── CommunityPage.xaml.cs
│ │ │ │ │ │ ├── NewsPage.xaml
│ │ │ │ │ │ └── NewsPage.xaml.cs
│ │ │ │ │ ├── TableView/
│ │ │ │ │ │ ├── TableViewPage.xaml
│ │ │ │ │ │ └── TableViewPage.xaml.cs
│ │ │ │ │ └── TimePicker/
│ │ │ │ │ ├── TimePickerPage.xaml
│ │ │ │ │ └── TimePickerPage.xaml.cs
│ │ │ │ ├── Helpers/
│ │ │ │ │ ├── AppSettingsJson/
│ │ │ │ │ │ ├── AppSettingsJsonPage.xaml
│ │ │ │ │ │ ├── AppSettingsJsonPage.xaml.cs
│ │ │ │ │ │ └── JsonFiles/
│ │ │ │ │ │ └── appsettings.json
│ │ │ │ │ └── Popup/
│ │ │ │ │ ├── PopupPage.xaml
│ │ │ │ │ └── PopupPage.xaml.cs
│ │ │ │ └── Layouts/
│ │ │ │ ├── AbsoluteLayout/
│ │ │ │ │ ├── AbsoluteLayoutPage.xaml
│ │ │ │ │ ├── AbsoluteLayoutPage.xaml.cs
│ │ │ │ │ └── ContentViews/
│ │ │ │ │ ├── DotNetRoadMap.xaml
│ │ │ │ │ └── DotNetRoadMap.xaml.cs
│ │ │ │ ├── Grid/
│ │ │ │ │ ├── GridPage.xaml
│ │ │ │ │ └── GridPage.xaml.cs
│ │ │ │ ├── HorizontalStackLayout/
│ │ │ │ │ ├── HorizontalStackLayoutPage.xaml
│ │ │ │ │ └── HorizontalStackLayoutPage.xaml.cs
│ │ │ │ ├── StackLayout/
│ │ │ │ │ ├── StackLayoutPage.xaml
│ │ │ │ │ └── StackLayoutPage.xaml.cs
│ │ │ │ └── VerticalStackLayout/
│ │ │ │ ├── VerticalStackLayoutPage.xaml
│ │ │ │ └── VerticalStackLayoutPage.xaml.cs
│ │ │ ├── CardsByGroupPage.xaml
│ │ │ ├── CardsByGroupPage.xaml.cs
│ │ │ ├── CardsByGroupPageViewModel.cs
│ │ │ ├── Community/
│ │ │ │ ├── Controls/
│ │ │ │ │ ├── AcrylicView/
│ │ │ │ │ │ ├── AcrylicViewPage.xaml
│ │ │ │ │ │ └── AcrylicViewPage.xaml.cs
│ │ │ │ │ ├── DataGrid/
│ │ │ │ │ │ ├── DataGridPage.xaml
│ │ │ │ │ │ └── DataGridPage.xaml.cs
│ │ │ │ │ ├── LiveCharts2/
│ │ │ │ │ │ ├── LiveCharts2Page.xaml
│ │ │ │ │ │ └── LiveCharts2Page.xaml.cs
│ │ │ │ │ └── OverFlower/
│ │ │ │ │ ├── OverFlowerPage.xaml
│ │ │ │ │ └── OverFlowerPage.xaml.cs
│ │ │ │ └── Helpers/
│ │ │ │ ├── OCR/
│ │ │ │ │ ├── OCRPage.xaml
│ │ │ │ │ └── OCRPage.xaml.cs
│ │ │ │ ├── SQLite-net/
│ │ │ │ │ ├── SQLiteNETPage.xaml
│ │ │ │ │ └── SQLiteNETPage.xaml.cs
│ │ │ │ └── ZXingNetMaui/
│ │ │ │ ├── ZXingNetMauiPage.xaml
│ │ │ │ └── ZXingNetMauiPage.xaml.cs
│ │ │ ├── Converters/
│ │ │ │ └── CardByGroupPageTypePickerConverter.cs
│ │ │ ├── GalleryPage.xaml
│ │ │ ├── GalleryPage.xaml.cs
│ │ │ ├── GalleryPageViewModel.cs
│ │ │ ├── Material/
│ │ │ │ └── Controls/
│ │ │ │ ├── MaterialButton/
│ │ │ │ │ ├── MaterialButtonPage.xaml
│ │ │ │ │ └── MaterialButtonPage.xaml.cs
│ │ │ │ ├── MaterialChip/
│ │ │ │ │ ├── MaterialChipPage.xaml
│ │ │ │ │ └── MaterialChipPage.xaml.cs
│ │ │ │ ├── MaterialComboBox/
│ │ │ │ │ ├── MaterialComboBoxPage.xaml
│ │ │ │ │ └── MaterialComboBoxPage.xaml.cs
│ │ │ │ ├── MaterialContextMenu/
│ │ │ │ │ ├── MaterialContextMenuPage.xaml
│ │ │ │ │ └── MaterialContextMenuPage.xaml.cs
│ │ │ │ ├── MaterialFAB/
│ │ │ │ │ ├── MaterialFABPage.xaml
│ │ │ │ │ └── MaterialFABPage.xaml.cs
│ │ │ │ ├── MaterialProgressIndicator/
│ │ │ │ │ ├── MaterialProgressIndicatorPage.xaml
│ │ │ │ │ └── MaterialProgressIndicatorPage.xaml.cs
│ │ │ │ ├── MaterialRadioButton/
│ │ │ │ │ ├── MaterialRadioButtonPage.xaml
│ │ │ │ │ └── MaterialRadioButtonPage.xaml.cs
│ │ │ │ ├── MaterialSwitch/
│ │ │ │ │ ├── MaterialSwitchPage.xaml
│ │ │ │ │ └── MaterialSwitchPage.xaml.cs
│ │ │ │ └── MaterialTextField/
│ │ │ │ ├── MaterialTextFieldPage.xaml
│ │ │ │ └── MaterialTextFieldPage.xaml.cs
│ │ │ ├── Syncfusion/
│ │ │ │ └── Controls/
│ │ │ │ ├── SfAvatarView/
│ │ │ │ │ ├── SfAvatarViewPage.xaml
│ │ │ │ │ └── SfAvatarViewPage.xaml.cs
│ │ │ │ ├── SfBadgeView/
│ │ │ │ │ ├── SfBadgeViewPage.xaml
│ │ │ │ │ └── SfBadgeViewPage.xaml.cs
│ │ │ │ ├── SfBarcodeGenerator/
│ │ │ │ │ ├── SfBarcodeGeneratorPage.xaml
│ │ │ │ │ └── SfBarcodeGeneratorPage.xaml.cs
│ │ │ │ ├── SfBusyIndicator/
│ │ │ │ │ ├── SfBusyIndicatorPage.xaml
│ │ │ │ │ └── SfBusyIndicatorPage.xaml.cs
│ │ │ │ ├── SfCartesianChart/
│ │ │ │ │ ├── SfCartesianChartPage.xaml
│ │ │ │ │ └── SfCartesianChartPage.xaml.cs
│ │ │ │ ├── SfCircularChart/
│ │ │ │ │ ├── SfCircularChartPage.xaml
│ │ │ │ │ └── SfCircularChartPage.xaml.cs
│ │ │ │ ├── SfComboBox/
│ │ │ │ │ ├── SfComboBoxPage.xaml
│ │ │ │ │ └── SfComboBoxPage.xaml.cs
│ │ │ │ ├── SfDataGrid/
│ │ │ │ │ ├── SfDataGridPage.xaml
│ │ │ │ │ └── SfDataGridPage.xaml.cs
│ │ │ │ ├── SfListView/
│ │ │ │ │ ├── SfListViewPage.xaml
│ │ │ │ │ └── SfListViewPage.xaml.cs
│ │ │ │ ├── SfMaps/
│ │ │ │ │ ├── SfMapsViewPage.xaml
│ │ │ │ │ └── SfMapsViewPage.xaml.cs
│ │ │ │ ├── SfRadialGauge/
│ │ │ │ │ ├── SfRadialGaugePage.xaml
│ │ │ │ │ └── SfRadialGaugePage.xaml.cs
│ │ │ │ └── SfRangeSelector/
│ │ │ │ ├── SfRangeSelectorPage.xaml
│ │ │ │ └── SfRangeSelectorPage.xaml.cs
│ │ │ └── Toolkit/
│ │ │ ├── Controls/
│ │ │ │ ├── AvatarView/
│ │ │ │ │ ├── AvatarViewPage.xaml
│ │ │ │ │ └── AvatarViewPage.xaml.cs
│ │ │ │ ├── DrawingView/
│ │ │ │ │ ├── DrawingViewPage.xaml
│ │ │ │ │ └── DrawingViewPage.xaml.cs
│ │ │ │ ├── Expander/
│ │ │ │ │ ├── ExpanderPage.xaml
│ │ │ │ │ └── ExpanderPage.xaml.cs
│ │ │ │ └── MediaElement/
│ │ │ │ ├── MediaElementPage.xaml
│ │ │ │ └── MediaElementPage.xaml.cs
│ │ │ ├── Converters/
│ │ │ │ ├── BoolToObjectConverter/
│ │ │ │ │ ├── BoolToObjectConverterPage.xaml
│ │ │ │ │ └── BoolToObjectConverterPage.xaml.cs
│ │ │ │ ├── ByteArrayToImageSourceConverter/
│ │ │ │ │ ├── ByteArrayToImageSourceConverterPage.xaml
│ │ │ │ │ └── ByteArrayToImageSourceConverterPage.xaml.cs
│ │ │ │ ├── ColorConverter/
│ │ │ │ │ ├── ColorConverterPage.xaml
│ │ │ │ │ └── ColorConverterPage.xaml.cs
│ │ │ │ ├── CompareConverter/
│ │ │ │ │ ├── CompareConverterPage.xaml
│ │ │ │ │ └── CompareConverterPage.xaml.cs
│ │ │ │ ├── DateTimeOffsetConverter/
│ │ │ │ │ ├── DateTimeOffsetConverterPage.xaml
│ │ │ │ │ └── DateTimeOffsetConverterPage.xaml.cs
│ │ │ │ ├── DoubleToIntConverter/
│ │ │ │ │ ├── DoubleToIntConverterPage.xaml
│ │ │ │ │ └── DoubleToIntConverterPage.xaml.cs
│ │ │ │ ├── EnumToBoolConverter/
│ │ │ │ │ ├── EnumToBoolConverterPage.xaml
│ │ │ │ │ └── EnumToBoolConverterPage.xaml.cs
│ │ │ │ ├── EnumToIntConverter/
│ │ │ │ │ ├── EnumToIntConverterPage.xaml
│ │ │ │ │ └── EnumToIntConverterPage.xaml.cs
│ │ │ │ └── ImageResourceConverter/
│ │ │ │ ├── ImageResourceConverterPage.xaml
│ │ │ │ └── ImageResourceConverterPage.xaml.cs
│ │ │ ├── Helpers/
│ │ │ │ ├── ObservableProperty/
│ │ │ │ │ ├── ObservablePropertyPage.xaml
│ │ │ │ │ └── ObservablePropertyPage.xaml.cs
│ │ │ │ └── RelayCommand/
│ │ │ │ ├── RelayCommandPage.xaml
│ │ │ │ └── RelayCommandPage.xaml.cs
│ │ │ └── Layouts/
│ │ │ ├── DockLayout/
│ │ │ │ ├── DockLayoutPage.xaml
│ │ │ │ └── DockLayoutPage.xaml.cs
│ │ │ ├── StateContainer/
│ │ │ │ ├── StateContainerPage.xaml
│ │ │ │ └── StateContainerPage.xaml.cs
│ │ │ └── UniformLayout/
│ │ │ ├── UniformItemsLayoutPage.xaml
│ │ │ └── UniformItemsLayoutPage.xaml.cs
│ │ └── Styles/
│ │ └── GalleryStyles.xaml
│ ├── Home/
│ │ ├── ContentViews/
│ │ │ ├── ControlActivityCardContentView.xaml
│ │ │ └── ControlActivityCardContentView.xaml.cs
│ │ ├── Converters/
│ │ │ └── NewActivityToStringConverter.cs
│ │ ├── Enums/
│ │ │ └── ItemType.cs
│ │ ├── Models/
│ │ │ ├── ApplicationNew.cs
│ │ │ ├── BookItem.cs
│ │ │ ├── Item.cs
│ │ │ └── UIItem.cs
│ │ ├── Pages/
│ │ │ ├── HomePage.xaml
│ │ │ ├── HomePage.xaml.cs
│ │ │ └── HomePageViewModel.cs
│ │ └── Services/
│ │ ├── Implementations/
│ │ │ └── IHomeService.cs
│ │ └── Interfaces/
│ │ └── HomeService.cs
│ ├── Mockup/
│ │ ├── ContentViews/
│ │ │ ├── AddButtonContentView/
│ │ │ │ ├── AddButtonContentView.xaml
│ │ │ │ ├── AddButtonContentView.xaml.cs
│ │ │ │ ├── AddButtonEventModel.cs
│ │ │ │ └── ImageDropEventArgs.cs
│ │ │ ├── MockupPreviewItemContentView/
│ │ │ │ ├── ScreenshotItemContentView.xaml
│ │ │ │ └── ScreenshotItemContentView.xaml.cs
│ │ │ ├── MockupScreenShotsContentView/
│ │ │ │ ├── DeviceListPageComponent.xaml
│ │ │ │ └── DeviceListPageComponent.xaml.cs
│ │ │ └── ShowcaseInformationContentView/
│ │ │ ├── ShowcaseInformationPageComponent.xaml
│ │ │ └── ShowcaseInformationPageComponent.xaml.cs
│ │ ├── Converters/
│ │ │ ├── ListOfMockupPreviewItemModelToListStringConverter.cs
│ │ │ └── SelectedScreenshotModelToStringConverter.cs
│ │ ├── DataTemplateSelectors/
│ │ │ └── ScreenshotDataTemplateSelector.cs
│ │ ├── Messages/
│ │ │ ├── DeleteScreenShotMessage.cs
│ │ │ └── DropImageMessage.cs
│ │ ├── Models/
│ │ │ ├── DeviceItemModel.cs
│ │ │ └── ScreenshotModel.cs
│ │ └── Pages/
│ │ ├── MockupPage.xaml
│ │ ├── MockupPage.xaml.cs
│ │ └── MockupPageViewModel.cs
│ ├── ResumesTemplate/
│ │ ├── Blazor/
│ │ │ ├── Components/
│ │ │ │ ├── DotNetTemplate.razor
│ │ │ │ └── DotNetTemplate.razor.cs
│ │ │ └── ResumesTemplate.razor
│ │ ├── Models/
│ │ │ └── WorkHistoryModel.cs
│ │ └── Pages/
│ │ ├── ResumeDetailPage.xaml
│ │ ├── ResumeDetailPage.xaml.cs
│ │ ├── ResumeDetailPageViewModel.cs
│ │ ├── ResumesPage.xaml
│ │ ├── ResumesPage.xaml.cs
│ │ └── ResumesPageViewModel.cs
│ ├── SecureStorage/
│ │ ├── Implementations/
│ │ │ └── SecureStorageService.cs
│ │ └── Interfaces/
│ │ └── ISecureStorageService.cs
│ ├── Settings/
│ │ └── Pages/
│ │ ├── SettingsPage.xaml
│ │ ├── SettingsPage.xaml.cs
│ │ └── SettingsPageViewModel.cs
│ └── Showcases/
│ └── Pages/
│ ├── ShowcasesPage.xaml
│ ├── ShowcasesPage.xaml.cs
│ └── ShowcasesPageViewModel.cs
├── GlobalUsings.cs
├── MAUIsland - Backup.csproj
├── MAUIsland.csproj
├── MAUIslandWindow.xaml
├── MAUIslandWindow.xaml.cs
├── MauiProgram.cs
├── Platforms/
│ └── Windows/
│ ├── AcrylicWindow.cs
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── MicaWindow.cs
│ ├── Package.appxmanifest
│ ├── WindowsSystemDispatcherQueueHelper.cs
│ └── app.manifest
├── Properties/
│ └── launchSettings.json
├── Resources/
│ ├── Raw/
│ │ ├── AboutAssets.txt
│ │ ├── australia.shp
│ │ ├── dotnetbot.json
│ │ ├── island.json
│ │ ├── river.json
│ │ ├── swipeupordown.json
│ │ ├── totechs_logo.json
│ │ ├── usa_state.shp
│ │ └── world-map.json
│ └── Styles/
│ ├── Colors.xaml
│ └── Styles.xaml
├── Web.config
├── Windows.sln
└── wwwroot/
├── css/
│ └── app.css
└── index.html
================================================
FILE CONTENTS
================================================
================================================
FILE: .config/dotnet-tools.json
================================================
{
"version": 1,
"isRoot": true,
"tools": {
"cake.tool": {
"version": "3.0.0",
"commands": [
"dotnet-cake"
]
}
}
}
================================================
FILE: .github/ISSUE_TEMPLATE/add-new-control.yml
================================================
name: Add New Control
description: Suggest a new control for MAUIsland
labels: ["proposal/open", "t/enhancement"]
body:
- type: markdown
attributes:
value: |
Thank you for your interest in .NET MAUI! We welcome any and all ideas for features or improvements that you might have. All we ask is to fill in this template with some detail. A detailed description, perhaps supported with some screenshots, mockups, and a (public) API design in pseudo-code, would be very much appreciated and will help get your proposal reviewed sooner.
Keep in mind that .NET MAUI is a multi-platform framework. Consider how feasible it is to implement this feature across all the supported platforms.
If you're not completely sure about a request yet, feel free to [open a discussion](https://github.com/dotnet/maui/discussions/new?category=ideas) first to discuss with the team and the community first.
- type: textarea
id: description
attributes:
label: Description
description: Please give us a detailed description of the feature that you envision. Focus on _what_ this feature does, over the _why_ you want this feature. What would be the end-result when implemented? Feel free to add any diagrams, (mocked up) screenshots, or other materials that support your story.
placeholder: I would love to have a button that I can make shiny. This is something that is supported on all the underlaying platforms, so this would just be exposing that on the .NET MAUI layer.
validations:
required: true
- type: textarea
id: usage
attributes:
label: Usage
description: Include a list of all API changes, additions, subtractions as would be required by your proposal. These APIs should be considered placeholders, so the naming is not as important as getting the concepts correct. If possible you should include some example (pseudo-)code of usage of your new API. This will not only help us understand better, but also help you think about how you want to use this feature as a developer.
placeholder: |
```csharp
var button = new Button ();
button.MakeShiny = true; // new API
```
The MakeShiny API works even if the button is already visible.
validations:
required: true
- type: dropdown
id: platforms
attributes:
label: What platforms will this control be available?
multiple: true
options:
- Android
- Windows
- MacOS
- IOS
- Tizen
- type: textarea
id: use-case
attributes:
label: Properties list
description: Provide a detailed example of where your proposal would be used and for what purpose. Focus on _why_ you want this feature instead of _what_ the feature does.
placeholder: In my app I have a situation where I would really want a shiny button to make it stand out from the rest of the plain and boring buttons.
validations:
required: true
- type: markdown
attributes:
value: |
By opening the issue you agree to follow this project's [Code of Conduct](https://github.com/dotnet/maui/blob/main/.github/CODE_OF_CONDUCT.md)
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yml
================================================
name: Bug Report
description: File a bug report
title: "[Bug]: "
labels: ["bug", "triage"]
assignees:
- octocat
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: input
id: contact
attributes:
label: Contact Details
description: How can we get in touch with you if we need more info ?
placeholder: ex. email@example.com
validations:
required: false
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Also tell us, what did you expect to happen?
placeholder: Tell us what you see!
value: "A bug happened!"
validations:
required: true
- type: dropdown
id: version
attributes:
label: Version
description: What version of MAUI are you running?
options:
- 6.0 (Default)
- 7.0
- 8.0
- 9.0
validations:
required: true
- type: dropdown
id: platforms
attributes:
label: What platforms are you seeing the problem on?
multiple: true
options:
- Android
- Windows
- MacOS
- IOS
- type: textarea
id: logs
attributes:
label: Relevant log output
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell
- type: checkboxes
id: terms
attributes:
label: Code of Conduct
description: By submitting this issue, you agree to follow our [Code of Conduct](https://example.com)
options:
- label: I agree to respect and follow this project's rules
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yml
================================================
name: Feature Request
description: Suggest an idea for .NET MAUI
labels: ["proposal/open", "t/enhancement"]
body:
- type: markdown
attributes:
value: |
Thank you for your interest in .NET MAUI! We welcome any and all ideas for features or improvements that you might have. All we ask is to fill in this template with some detail. A detailed description, perhaps supported with some screenshots, mockups, and a (public) API design in pseudo-code, would be very much appreciated and will help get your proposal reviewed sooner.
Keep in mind that .NET MAUI is a multi-platform framework. Consider how feasible it is to implement this feature across all the supported platforms.
If you're not completely sure about a request yet, feel free to [open a discussion](https://github.com/dotnet/maui/discussions/new?category=ideas) first to discuss with the team and the community first.
- type: textarea
id: description
attributes:
label: Description
description: Please give us a detailed description of the feature that you envision. Focus on _what_ this feature does, over the _why_ you want this feature. What would be the end-result when implemented? Feel free to add any diagrams, (mocked up) screenshots, or other materials that support your story.
placeholder: I would love to have a button that I can make shiny. This is something that is supported on all the underlaying platforms, so this would just be exposing that on the .NET MAUI layer.
validations:
required: true
- type: textarea
id: api-changes
attributes:
label: Public API Changes
description: Include a list of all API changes, additions, subtractions as would be required by your proposal. These APIs should be considered placeholders, so the naming is not as important as getting the concepts correct. If possible you should include some example (pseudo-)code of usage of your new API. This will not only help us understand better, but also help you think about how you want to use this feature as a developer.
placeholder: |
```csharp
var button = new Button ();
button.MakeShiny = true; // new API
```
The MakeShiny API works even if the button is already visible.
validations:
required: true
- type: textarea
id: use-case
attributes:
label: Intended Use-Case
description: Provide a detailed example of where your proposal would be used and for what purpose. Focus on _why_ you want this feature instead of _what_ the feature does.
placeholder: In my app I have a situation where I would really want a shiny button to make it stand out from the rest of the plain and boring buttons.
validations:
required: true
- type: markdown
attributes:
value: |
By opening the issue you agree to follow this project's [Code of Conduct](https://github.com/dotnet/maui/blob/main/.github/CODE_OF_CONDUCT.md)
================================================
FILE: .github/ISSUE_TEMPLATE/showcase-submission.yml
================================================
name: Showcase Submission
description: Submit your project to be showcased on MAUIsland.
title: "Showcase Submission: MAUIsland"
labels:
- showcase
- submission
body:
- type: markdown
attributes:
value: |
Thank you for submitting your project to be showcased! Please provide the following details so we can include your project on MAUIsland.
- type: input
id: repository_url
attributes:
label: "Repository URL"
description: "Provide the URL of the GitHub repository for your project."
placeholder: "https://github.com/username/repository-name"
validations:
required: true
- type: checkboxes
id: project_technology
attributes:
label: "What technology is this project using?"
description: "Select all technologies applicable to your project."
options:
- label: ".NET MAUI"
- label: "Uno Platform"
- label: "WinUI 3"
- label: "UWP"
- label: "WPF"
validations:
required: true
- type: checkboxes
id: platform_support
attributes:
label: "How many platforms does this project support?"
description: "Select all platforms your project supports."
options:
- label: Android
- label: iOS
- label: Windows
- label: MacOS
- label: Tizen
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: "Screenshots of the application"
description: "Provide links to screenshots of your application. You can upload them to your repository or a cloud storage service and share the links here."
validations:
required: true
- type: dropdown
id: device_frame
attributes:
label: "Which device frame do you want to display your application on?"
description: "Select one or more device frames you would like to use."
multiple: true
options:
- Apple IPhone 15 Pro Max
- Google Pixel 5
- Google Pixel 6 Pro
- Apple IPhone 13 Mini
- Apple IPhone 15
- Samsung Galaxy S22 Ultra
- Samsung Galaxy S8
validations:
required: true
- type: checkboxes
id: terms
attributes:
label: Code of Conduct
description: "By submitting this showcase, you agree to follow our [Code of Conduct](https://example.com)."
options:
- label: I agree to respect and follow this project's rules
validations:
required: true
- type: markdown
attributes:
value: |
## Public API Changes
None
================================================
FILE: .gitignore
================================================
# globs
Makefile.in
*.userprefs
*.usertasks
appsettings.Development.json
src/appsettings.Development.json
config.make
config.status
aclocal.m4
install-sh
autom4te.cache/
*.tar.gz
tarballs/
test-results/
/src/Presentations/Windows/Extensions/ProductionConfig.cs
tools/
# Mac bundle stuff
*.dmg
*.app
# content below from: https://github.com/github/gitignore/blob/main/Global/macOS.gitignore
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# content below from: https://github.com/github/gitignore/blob/main/Global/Windows.gitignore
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# content below from: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
.vs
/src/appsettings.Development.json
/src/Presentations/Windows/appsettings.Development.json
/src/Presentations/Windows/Extensions/TaskHelpers.cs
================================================
FILE: .vscode/launch.json
================================================
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": ".NET MAUI",
"type": "maui",
"request": "launch",
"preLaunchTask": "maui: Build"
},
{
"name": ".NET Meteor Debugger",
"type": "dotnet-meteor.debugger",
"request": "launch",
"preLaunchTask": "dotnet-meteor: Build"
}
]
}
================================================
FILE: .vscode/settings.json
================================================
{
"vscode_custom_css.imports": [
"file:///C:/Users/Strypper/.vscode/extensions/webrender.synthwave-x-fluoromachine-0.0.12/synthwave-x-fluoromachine.css"
"file:///C:/Users/Strypper/.vscode/extensions/thecodemonkey.synthwave-x-fluoromachine-epic-animations-1.4.13/epic-80s-transitions.css"
]
}
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
ocgrb.strypperjason115@gmail.com.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2023 Strypper Vandel Jason
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# 🏝️ MAUIsland

MAUIsland is an app that showcases all the .NET MAUI controls available for developers. It allows you to easily interact with them and see how they look and behave on different platforms. It also provides guidance, tips and tricks to help you use them effectively in your own apps.
MAUIsland
Explore and interact. Stay up to date with the .NET MAUI Community.
# Version 2.0 (Dragon version)
1. Revamped Design 🎨: The application now features a sleek, acrylic + mica material design. The interface is smoother, with enhanced contrast and reduced distractions, offering users a more engaging experience.
2. Performance Enhancements 🏎️: Significant improvements have been made in page navigation, resulting in a reduced memory footprint. Additionally, internet data is cached locally in a database, enhancing performance and enabling better offline support. The lazy loading of the code view expander contributes to faster initialization of pages.
3. Expanded Community Toolkit 🔨: The Community Toolkit Gallery has been enriched with the addition of four new controls, nine converters, and three layouts, empowering developers with more tools to enhance their applications.
4. GitHub Community Gallery 🤝: We've integrated six widely used GitHub nuggets that are commonly utilized with .NET MAUI, including LiveChart2, ZXing.Net.Maui, and more. This gallery not only provides access to these resources but also offers UI fixes to address issues like stretched clicking and hovering targets for a smoother user interaction.
5. Explore [Showcases](https://github.com/Strypper/mauisland/blob/main/showcases/version_2.0/Contribute.md)
# ⚠️ Create appsettings.Development.json before run App
1. Click right MAUIsland in Solution Explorer
2. Select Add -> New Item -> only JSON File
3. Set Name: appsettings.Development.json
4. Click Add and copy the format below (You can leave the key value empty if you don't have the syncfusion key, but this will lead to a crash if you try to view syncfusion controls)
Add the json settings from the issue:
```json
{
"AppSettings": {
"SyncfusionKey": "Your_syncfustion_key",
"DiscordApplicationId": "Yout_discord_bot_application_id"
}
}
```
# 🚀 Features
1. Browse through over 50 .NET MAUI controls organized by categories
2. See live previews of each control on iOS, Android, Windows, and Mac
3. Learn how to use each control with code snippets and documentation links
4. Customize each control’s properties and styles
5. Copy code snippets to the clipboard and use them in your app
# ⬇️ Installation
To install .NET MAUI Control Gallery on your device or emulator/simulator:
1. Clone or download this repository
2. Open the solution file (.sln) in Visual Studio 2022 or later
3. Select your target platform and device/emulator/simulator
4. Create the appsettings.Development.json file this file will not contain any private key
5. Build and run the app
We will publish our application on all platforms soon enough. Stay tuned!!!
# ⁉ Support
If you need help with something or have an idea, feel free to start a [Discussion](https://github.com/CommunityToolkit/WindowsCommunityToolkit/discussions) or find us on [Discord](https://discord.gg/edgzveQ9KN). If you have detailed repro steps, open an [issue here instead](https://github.com/Strypper/mauisland/issues/new/choose).
# 📄 Code of Conduct
This project has adopted the code of conduct defined by the [Contributor Covenant](http://contributor-covenant.org/)
to clarify expected behavior in our community.
For more information see the [.NET Foundation Code of Conduct](CODE_OF_CONDUCT.md).
# Meet the contributors
Made with [contrib.rocks](https://contrib.rocks).
================================================
FILE: build.cake
================================================
#addin nuget:?package=Cake.FileHelpers&version=6.0.0
var target = Argument("target", "BuiltInControlPage");
var group = Argument("group", "BuiltIn");
var name = Argument("name", "AwesomeControl");
var cardDetail = Argument("cardDetail", "CardDetail");
var originalDocumentUrl = Argument("originalDocumentUrl", "DocumentLink");
var configuration = Argument("configuration", "Release");
//////////////////////////////////////////////////////////////////////
// TASKS
//////////////////////////////////////////////////////////////////////
const string CONTROL_FODLER_PATH_TEMPLATE="./src/Features/Gallery/Pages/{0}/{1}";
Task("BuiltInControlPage")
.Does(() =>
{
var controlFolderPath = string.Format(CONTROL_FODLER_PATH_TEMPLATE, group, name);
Information("Control folder path: " + controlFolderPath);
if (DirectoryExists(controlFolderPath)) {
Warning("Control folder path exists");
return;
}
CreateDirectory(controlFolderPath);
Information($"\n>> Generate >> {name}ControlInfo.cs");
FileWriteText($"{controlFolderPath}/{name}ControlInfo.cs", $@"namespace MAUIsland.Gallery.{group};
class {name}ControlInfo : IGalleryCardInfo
{{
public string ControlName => nameof({name});
public string ControlRoute => typeof({name}Page).FullName;
public ImageSource ControlIcon => new FontImageSource()
{{
FontFamily = FontNames.FluentSystemIconsRegular,
Glyph = FluentUIIcon.Ic_fluent_approvals_app_20_regular
}};
public string ControlDetail => ""{cardDetail}"";
public string GitHubUrl => $""https://github.com/Strypper/mauisland/tree/main/src/Features/Gallery/Pages/{group}/{{ControlName}}"";
public string DocumentUrl => $""{originalDocumentUrl}"";
public string GroupName => ControlGroupInfo.{group}Controls;
}}");
Information($"\n>> Generate >> {name}Page.xaml");
FileWriteText($"{controlFolderPath}/{name}Page.xaml", $@"
{name} defines the following properties:
These properties are backed by BindableProperty objects, which means that they can be targets of data bindings, and styled.
Color, of type Color , value that defines the color of the ActivityIndicator.
]]>
IsRunning, of type bool,value that indicates whether the ActivityIndicator should be visible and animating, or hidden. The default value of this property is false, which indicates that the ActivityIndicator isn't visible.
]]>
");
Information($"\n>> Generate >> {name}Page.xaml.cs");
FileWriteText($"{controlFolderPath}/{name}Page.xaml.cs", $@"namespace MAUIsland;
public partial class {name}Page : IGalleryPage
{{
#region [CTor]
public {name}Page({name}PageViewModel vm)
{{
InitializeComponent();
BindingContext = vm;
}}
#endregion
}}");
Information($"\n>> Generate >> {name}PageViewModel.cs");
FileWriteText($"{controlFolderPath}/{name}PageViewModel.cs", $@"namespace MAUIsland;
public partial class {name}PageViewModel : NavigationAwareBaseViewModel
{{
#region [CTor]
public {name}PageViewModel(
IAppNavigator appNavigator
) : base(appNavigator)
{{
}}
#endregion
#region [Properties]
[ObservableProperty]
IGalleryCardInfo controlInformation;
#endregion
#region [Overrides]
protected override void OnInit(IDictionary query)
{{
base.OnInit(query);
ControlInformation = query.GetData();
}}
#endregion
}}");
});
//////////////////////////////////////////////////////////////////////
// EXECUTION
//////////////////////////////////////////////////////////////////////
RunTarget(target);
================================================
FILE: docs/pull_request_template.md
================================================
# COOL NEW PAGE !!!!
### Page name: `Page`
## Contributors
[//]: contributor-faces
[//]: contributor-faces
## Describe your changes
## Have we discussed about this before ? (Please link the discussion link below)
## Added page requirements as following:
- [ ] Page.xaml
- [ ] Change the `x:Class` to project namespace standard (ex: `x:Class="MAUIsland.LabelPage"`)?
- [ ] Include `xmlns:app="clr-namespace:MAUIsland"`?
- [ ] Change `ContentPage` to `app:BasePage`?
- [ ] Hook the `x:DataType` to the ViewModel?
- [ ] Provide `Padding="10"` to `app:BasePage`?
- [ ] Provide `ControlInfo` to `app:BasePage.Resources`?
- [ ] Provide `PropertiesListHeader` to `app:BasePage.Resources`?
- [ ] Provide `PropertiesListFooter` to `app:BasePage.Resources`?
- [ ] Provide `PropertyItemsSource` to `app:BasePage.Resources`?
- [ ] Provide a brief `Control Info` UI ?
```xml
```
- [ ] Provide `Properties List` UI ?
```xml
```
- [ ] Page.xaml.cs
- [ ] Did you change the `namespace` to project namespace standard `namespace MAUIsland`?
- [ ] Did you remove inheritance `ContentPage`?
- [ ] Did you organize everything inside `region`?
- [ ] Did you change `ViewModel` into the constructor parmeter?
- [ ] Did you hook the page binding context to the page view model - `BindingContext = vm;` ?
- [ ] PageViewModel.cs
- [ ] Did you inherit the `NavigationAwareBaseViewModel`?
- [ ] Did you organize everything inside `region`?
- [ ] Did you modify the constructor like the example we provide?
```cs
#region [CTor]
public LabelPageViewModel(IAppNavigator appNavigator)
: base(appNavigator)
{
}
#endregion
```
## Register page route requirements as following:
- [ ] Did you create now route constant ?
- [ ] Did you register page route in AppShell.xaml.cs ?
- [ ] If the page is one of applciation root route did you register it to AppShell.xaml ?
## Register page services:
- [ ] Did you register the page with the view model in `RegisterPages` ?
- [ ] Did you register all the created services `RegisterServices` ?
================================================
FILE: maui-island.sln
================================================
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31611.283
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Presentations", "Presentations", "{B39EE44A-0776-44E7-8B64-D8572E49B134}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Windows", "Windows", "{2FD579F3-6496-437C-956B-E6F62B2D2A5A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{36CB9EBB-A677-4AF0-A0A9-BDEBDE60F123}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Features", "Features", "{73E66A66-7BCD-44FE-949C-BD42C274B840}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GitHubFeatures", "GitHubFeatures", "{23A84AFF-0047-4364-9351-E4521D52A26B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Apple", "Apple", "{767B8BFD-B663-4A2E-85AB-323D672F5B4D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Android", "Android", "{7CEB155B-884F-4995-867D-4CC9145EF87E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MAUIsland.GitHubFeatures", "src\Features\GitHubFeatures\MAUIsland.GitHubFeatures\MAUIsland.GitHubFeatures.csproj", "{B138AC18-EC19-4368-AE0B-CDACD0911650}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MAUIsland.GitHubFeatures.IntegrationTests", "src\Features\GitHubFeatures\MAUIsland.GitHubFeatures.IntegrationTests\MAUIsland.GitHubFeatures.IntegrationTests.csproj", "{6F539157-0DE3-407A-8769-EB997EB7AE59}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MAUIsland", "src\Presentations\Windows\MAUIsland.csproj", "{72B83E80-9D22-4A44-AB91-253A616A9D9C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MAUIsland.Core", "src\Core\MAUIsland.Core\MAUIsland.Core.csproj", "{A9F55C31-8BED-4021-8F1B-1F5C7D4B2265}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "LocalDbFeatures", "LocalDbFeatures", "{44F9EA87-2C75-4685-B49F-8ECF3CE577CA}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GitHub", "GitHub", "{966A4C62-0966-4106-A407-A65F27A07986}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MAUIsland.Features.LocalDbFeatures.GitHub", "src\Features\LocalDbFeatures\GitHub\MAUIsland.Features.LocalDbFeatures.GitHub\MAUIsland.Features.LocalDbFeatures.GitHub.csproj", "{9C9F69E9-00F8-459F-98CB-100F1A8B8FE4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MAUIsland.Features.LocalDbFeatures", "src\Features\LocalDbFeatures\MAUIsland.Features.LocalDbFeatures\MAUIsland.Features.LocalDbFeatures.csproj", "{97DE63B5-31C0-4C62-843D-43FB6D23EBB1}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NewsFeatures", "NewsFeatures", "{E323C174-10BB-428C-B9D9-2DF7261FF505}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MAUIsland.NewsFeatures", "src\Features\NewsFeatures\MAUIsland.NewsFeatures\MAUIsland.NewsFeatures.csproj", "{55DC0378-71D9-4F9D-9593-DBF8C4E048D5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MAUIsland.NewsFeatures.IntergrationTests", "src\Features\NewsFeatures\MAUIsland.NewsFeatures.IntergrationTests\MAUIsland.NewsFeatures.IntergrationTests.csproj", "{797B439F-A5E6-4CA4-8301-97F4B690D0B3}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuGetFeatures", "NuGetFeatures", "{D069C6EA-9676-48DE-B16B-7A177A1FEDAB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MAUIsland.NuGetFeatures", "src\Features\NuGetFeatures\MAUIsland.NuGetFeatures\MAUIsland.NuGetFeatures.csproj", "{9A141D5A-B1B5-445B-9FCA-A08BA821D339}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetFeatures.IntegrationTests", "src\Features\NuGetFeatures\NuGetFeatures.IntegrationTests\NuGetFeatures.IntegrationTests.csproj", "{5EEA72E3-4279-4131-9754-144F9D535A72}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B138AC18-EC19-4368-AE0B-CDACD0911650}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B138AC18-EC19-4368-AE0B-CDACD0911650}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B138AC18-EC19-4368-AE0B-CDACD0911650}.Debug|x64.ActiveCfg = Debug|Any CPU
{B138AC18-EC19-4368-AE0B-CDACD0911650}.Debug|x64.Build.0 = Debug|Any CPU
{B138AC18-EC19-4368-AE0B-CDACD0911650}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B138AC18-EC19-4368-AE0B-CDACD0911650}.Release|Any CPU.Build.0 = Release|Any CPU
{B138AC18-EC19-4368-AE0B-CDACD0911650}.Release|x64.ActiveCfg = Release|Any CPU
{B138AC18-EC19-4368-AE0B-CDACD0911650}.Release|x64.Build.0 = Release|Any CPU
{6F539157-0DE3-407A-8769-EB997EB7AE59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6F539157-0DE3-407A-8769-EB997EB7AE59}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6F539157-0DE3-407A-8769-EB997EB7AE59}.Debug|x64.ActiveCfg = Debug|Any CPU
{6F539157-0DE3-407A-8769-EB997EB7AE59}.Debug|x64.Build.0 = Debug|Any CPU
{6F539157-0DE3-407A-8769-EB997EB7AE59}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6F539157-0DE3-407A-8769-EB997EB7AE59}.Release|Any CPU.Build.0 = Release|Any CPU
{6F539157-0DE3-407A-8769-EB997EB7AE59}.Release|x64.ActiveCfg = Release|Any CPU
{6F539157-0DE3-407A-8769-EB997EB7AE59}.Release|x64.Build.0 = Release|Any CPU
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Debug|x64.ActiveCfg = Debug|x64
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Debug|x64.Build.0 = Debug|x64
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Debug|x64.Deploy.0 = Debug|x64
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Release|Any CPU.Build.0 = Release|Any CPU
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Release|Any CPU.Deploy.0 = Release|Any CPU
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Release|x64.ActiveCfg = Release|x64
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Release|x64.Build.0 = Release|x64
{72B83E80-9D22-4A44-AB91-253A616A9D9C}.Release|x64.Deploy.0 = Release|x64
{A9F55C31-8BED-4021-8F1B-1F5C7D4B2265}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A9F55C31-8BED-4021-8F1B-1F5C7D4B2265}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A9F55C31-8BED-4021-8F1B-1F5C7D4B2265}.Debug|x64.ActiveCfg = Debug|Any CPU
{A9F55C31-8BED-4021-8F1B-1F5C7D4B2265}.Debug|x64.Build.0 = Debug|Any CPU
{A9F55C31-8BED-4021-8F1B-1F5C7D4B2265}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A9F55C31-8BED-4021-8F1B-1F5C7D4B2265}.Release|Any CPU.Build.0 = Release|Any CPU
{A9F55C31-8BED-4021-8F1B-1F5C7D4B2265}.Release|x64.ActiveCfg = Release|Any CPU
{A9F55C31-8BED-4021-8F1B-1F5C7D4B2265}.Release|x64.Build.0 = Release|Any CPU
{9C9F69E9-00F8-459F-98CB-100F1A8B8FE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9C9F69E9-00F8-459F-98CB-100F1A8B8FE4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9C9F69E9-00F8-459F-98CB-100F1A8B8FE4}.Debug|x64.ActiveCfg = Debug|Any CPU
{9C9F69E9-00F8-459F-98CB-100F1A8B8FE4}.Debug|x64.Build.0 = Debug|Any CPU
{9C9F69E9-00F8-459F-98CB-100F1A8B8FE4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9C9F69E9-00F8-459F-98CB-100F1A8B8FE4}.Release|Any CPU.Build.0 = Release|Any CPU
{9C9F69E9-00F8-459F-98CB-100F1A8B8FE4}.Release|x64.ActiveCfg = Release|Any CPU
{9C9F69E9-00F8-459F-98CB-100F1A8B8FE4}.Release|x64.Build.0 = Release|Any CPU
{97DE63B5-31C0-4C62-843D-43FB6D23EBB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{97DE63B5-31C0-4C62-843D-43FB6D23EBB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{97DE63B5-31C0-4C62-843D-43FB6D23EBB1}.Debug|x64.ActiveCfg = Debug|Any CPU
{97DE63B5-31C0-4C62-843D-43FB6D23EBB1}.Debug|x64.Build.0 = Debug|Any CPU
{97DE63B5-31C0-4C62-843D-43FB6D23EBB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{97DE63B5-31C0-4C62-843D-43FB6D23EBB1}.Release|Any CPU.Build.0 = Release|Any CPU
{97DE63B5-31C0-4C62-843D-43FB6D23EBB1}.Release|x64.ActiveCfg = Release|Any CPU
{97DE63B5-31C0-4C62-843D-43FB6D23EBB1}.Release|x64.Build.0 = Release|Any CPU
{55DC0378-71D9-4F9D-9593-DBF8C4E048D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{55DC0378-71D9-4F9D-9593-DBF8C4E048D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{55DC0378-71D9-4F9D-9593-DBF8C4E048D5}.Debug|x64.ActiveCfg = Debug|Any CPU
{55DC0378-71D9-4F9D-9593-DBF8C4E048D5}.Debug|x64.Build.0 = Debug|Any CPU
{55DC0378-71D9-4F9D-9593-DBF8C4E048D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{55DC0378-71D9-4F9D-9593-DBF8C4E048D5}.Release|Any CPU.Build.0 = Release|Any CPU
{55DC0378-71D9-4F9D-9593-DBF8C4E048D5}.Release|x64.ActiveCfg = Release|Any CPU
{55DC0378-71D9-4F9D-9593-DBF8C4E048D5}.Release|x64.Build.0 = Release|Any CPU
{797B439F-A5E6-4CA4-8301-97F4B690D0B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{797B439F-A5E6-4CA4-8301-97F4B690D0B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{797B439F-A5E6-4CA4-8301-97F4B690D0B3}.Debug|x64.ActiveCfg = Debug|Any CPU
{797B439F-A5E6-4CA4-8301-97F4B690D0B3}.Debug|x64.Build.0 = Debug|Any CPU
{797B439F-A5E6-4CA4-8301-97F4B690D0B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{797B439F-A5E6-4CA4-8301-97F4B690D0B3}.Release|Any CPU.Build.0 = Release|Any CPU
{797B439F-A5E6-4CA4-8301-97F4B690D0B3}.Release|x64.ActiveCfg = Release|Any CPU
{797B439F-A5E6-4CA4-8301-97F4B690D0B3}.Release|x64.Build.0 = Release|Any CPU
{9A141D5A-B1B5-445B-9FCA-A08BA821D339}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9A141D5A-B1B5-445B-9FCA-A08BA821D339}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9A141D5A-B1B5-445B-9FCA-A08BA821D339}.Debug|x64.ActiveCfg = Debug|Any CPU
{9A141D5A-B1B5-445B-9FCA-A08BA821D339}.Debug|x64.Build.0 = Debug|Any CPU
{9A141D5A-B1B5-445B-9FCA-A08BA821D339}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9A141D5A-B1B5-445B-9FCA-A08BA821D339}.Release|Any CPU.Build.0 = Release|Any CPU
{9A141D5A-B1B5-445B-9FCA-A08BA821D339}.Release|x64.ActiveCfg = Release|Any CPU
{9A141D5A-B1B5-445B-9FCA-A08BA821D339}.Release|x64.Build.0 = Release|Any CPU
{5EEA72E3-4279-4131-9754-144F9D535A72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5EEA72E3-4279-4131-9754-144F9D535A72}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5EEA72E3-4279-4131-9754-144F9D535A72}.Debug|x64.ActiveCfg = Debug|Any CPU
{5EEA72E3-4279-4131-9754-144F9D535A72}.Debug|x64.Build.0 = Debug|Any CPU
{5EEA72E3-4279-4131-9754-144F9D535A72}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5EEA72E3-4279-4131-9754-144F9D535A72}.Release|Any CPU.Build.0 = Release|Any CPU
{5EEA72E3-4279-4131-9754-144F9D535A72}.Release|x64.ActiveCfg = Release|Any CPU
{5EEA72E3-4279-4131-9754-144F9D535A72}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{2FD579F3-6496-437C-956B-E6F62B2D2A5A} = {B39EE44A-0776-44E7-8B64-D8572E49B134}
{23A84AFF-0047-4364-9351-E4521D52A26B} = {73E66A66-7BCD-44FE-949C-BD42C274B840}
{767B8BFD-B663-4A2E-85AB-323D672F5B4D} = {B39EE44A-0776-44E7-8B64-D8572E49B134}
{7CEB155B-884F-4995-867D-4CC9145EF87E} = {B39EE44A-0776-44E7-8B64-D8572E49B134}
{B138AC18-EC19-4368-AE0B-CDACD0911650} = {23A84AFF-0047-4364-9351-E4521D52A26B}
{6F539157-0DE3-407A-8769-EB997EB7AE59} = {23A84AFF-0047-4364-9351-E4521D52A26B}
{72B83E80-9D22-4A44-AB91-253A616A9D9C} = {2FD579F3-6496-437C-956B-E6F62B2D2A5A}
{A9F55C31-8BED-4021-8F1B-1F5C7D4B2265} = {36CB9EBB-A677-4AF0-A0A9-BDEBDE60F123}
{44F9EA87-2C75-4685-B49F-8ECF3CE577CA} = {73E66A66-7BCD-44FE-949C-BD42C274B840}
{966A4C62-0966-4106-A407-A65F27A07986} = {44F9EA87-2C75-4685-B49F-8ECF3CE577CA}
{9C9F69E9-00F8-459F-98CB-100F1A8B8FE4} = {966A4C62-0966-4106-A407-A65F27A07986}
{97DE63B5-31C0-4C62-843D-43FB6D23EBB1} = {44F9EA87-2C75-4685-B49F-8ECF3CE577CA}
{E323C174-10BB-428C-B9D9-2DF7261FF505} = {73E66A66-7BCD-44FE-949C-BD42C274B840}
{55DC0378-71D9-4F9D-9593-DBF8C4E048D5} = {E323C174-10BB-428C-B9D9-2DF7261FF505}
{797B439F-A5E6-4CA4-8301-97F4B690D0B3} = {E323C174-10BB-428C-B9D9-2DF7261FF505}
{D069C6EA-9676-48DE-B16B-7A177A1FEDAB} = {73E66A66-7BCD-44FE-949C-BD42C274B840}
{9A141D5A-B1B5-445B-9FCA-A08BA821D339} = {D069C6EA-9676-48DE-B16B-7A177A1FEDAB}
{5EEA72E3-4279-4131-9754-144F9D535A72} = {D069C6EA-9676-48DE-B16B-7A177A1FEDAB}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
$0.DotNetNamingPolicy = $1
EndGlobalSection
EndGlobal
================================================
FILE: showcases/version_2.0/Contribute.md
================================================
# Welcome to the MAUIsland Community
Hi Community,
The MAUIsland team is eager to learn new things from you! Your beautiful designs and clean code practices help us build a stronger community. To showcase your best efforts, we have introduced a new feature in MAUIsland called **"Showcases."** This feature provides meaningful previews of your applications to our audience, helping you grow your network. Your applications will be displayed beautifully in selected device frames such as iPhone, Samsung, or Surface devices, and we'll reference your work using GitHub links.
### Requirements for your app on our platform:
1. **Open-source**: Our application cannot access private repositories, which means features like reading the repo title and the project .csproj file are unavailable. Additionally, users won't have further information about your source if it's private.
2. **.NET Technologies Stack**: We currently accept Uno Platform, UWP, WPF, WinUI 2/3, .NET MAUI, and Avalonia. As a .NET community, we aim to keep our showcases relevant to .NET audiences, but we plan to expand our scope later.
We look forward to seeing your amazing work!
================================================
FILE: src/Core/MAUIsland.Core/Animations/SampleScaleAnimation.cs
================================================
using CommunityToolkit.Maui.Animations;
namespace MAUIsland.Core;
class SampleScaleAnimation : BaseAnimation
{
public override async Task Animate(VisualElement view, CancellationToken token)
{
await view.ScaleTo(1.2, Length, Easing).WaitAsync(token);
await view.ScaleTo(1, Length, Easing).WaitAsync(token);
}
}
================================================
FILE: src/Core/MAUIsland.Core/AppSettings/AppSettings.cs
================================================
namespace MAUIsland.Core;
public class AppSettings
{
public string SyncfusionKey { get; set; }
public string DiscordApplicationId { get; set; }
public string GitHubAccessToken { get; set; }
}
================================================
FILE: src/Core/MAUIsland.Core/Attributes/FieldCompareAttribute.cs
================================================
using System.ComponentModel.DataAnnotations;
namespace MAUIsland.Core;
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public class FieldCompareAttribute : CompareAttribute
{
public FieldCompareAttribute(string otherProperty) : base(otherProperty)
{
}
}
================================================
FILE: src/Core/MAUIsland.Core/Attributes/PasswordAttribute.cs
================================================
using System;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
namespace MAUIsland.Core;
public class PasswordAttribute : ValidationAttribute
{
public bool IncludesUpper { get; set; }
public bool IncludesLower { get; set; }
public bool IncludesNumber { get; set; }
public bool IncludesSpecial { get; set; }
public uint MinimumLength { get; set; }
static readonly Regex UpperRegex = new Regex("[A-Z]+", RegexOptions.None);
static readonly Regex LowerRegex = new Regex("[a-z]+", RegexOptions.None);
static readonly Regex NumberRegex = new Regex("[0-9]+", RegexOptions.None);
static readonly Regex SpecialRegex = new Regex("[^A-Z0-9]+", RegexOptions.IgnoreCase);
public override bool IsValid(object value)
{
if (value is not string stringValue)
{
return base.IsValid(value);
}
if (string.IsNullOrWhiteSpace(stringValue)) return false;
if (MinimumLength > 0 && stringValue.Length < MinimumLength) return false;
if (IncludesLower && !LowerRegex.IsMatch(stringValue)) return false;
if (IncludesNumber && !LowerRegex.IsMatch(stringValue)) return false;
if (IncludesSpecial && !SpecialRegex.IsMatch(stringValue)) return false;
if (IncludesUpper && !UpperRegex.IsMatch(stringValue)) return false;
return true;
}
}
================================================
FILE: src/Core/MAUIsland.Core/Converters/AllTrueValueConverter.cs
================================================
namespace MAUIsland.Core;
public class AllTrueValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.All(x => x is bool boolValue && boolValue);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
================================================
FILE: src/Core/MAUIsland.Core/Converters/BoolToOpacityValueConverter.cs
================================================
using System.Collections;
namespace MAUIsland.Core;
public class BoolToOpacityValueConverter : IValueConverter
{
private readonly bool inversed;
public BoolToOpacityValueConverter(bool inversed = false)
{
this.inversed = inversed;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var opacityWhenTrue = parameter is double opacity ? opacity : 1;
var boolean = value is bool b && b;
return inversed && boolean
|| !inversed && !boolean
? 0
: opacityWhenTrue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class AllBoolsToOpacityValueConverter : BoolToOpacityValueConverter, IMultiValueConverter
{
private readonly bool inversed;
public AllBoolsToOpacityValueConverter(bool inversed = false)
{
this.inversed = inversed;
}
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return Convert(values.All(x => x is bool b && (inversed && !b || !inversed && b)), targetType, parameter, culture);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class AnyFalseToOpacityValueConverter : BoolToOpacityValueConverter, IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return Convert(values.Any(x => x is not bool b || !b), targetType, parameter, culture);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class FirstItemValueConverter : IValueConverter, IMultiValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is IEnumerable items)
{
var enumerator = items.GetEnumerator();
if (enumerator.MoveNext())
{
return enumerator.Current;
}
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values?.FirstOrDefault(x => x != null);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
================================================
FILE: src/Core/MAUIsland.Core/Converters/DateTimeToSimpleDateTimeStringConverter.cs
================================================
namespace MAUIsland.Core;
public class DateTimeToSimpleDateTimeStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is DateTime dateTime)
return dateTime.ToString("dd/MM/yyyy");
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
================================================
FILE: src/Core/MAUIsland.Core/Converters/HexToSolidColorBrushConverter.cs
================================================
namespace MAUIsland.Core;
public class HexToSolidColorBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var hex = value as String;
if (hex != null && !string.IsNullOrWhiteSpace(hex) && !string.IsNullOrEmpty(hex))
{
hex = hex.Replace("#", string.Empty);
// from #RRGGBB string
var r = (byte)System.Convert.ToUInt32(hex.Substring(0, 2), 16);
var g = (byte)System.Convert.ToUInt32(hex.Substring(2, 2), 16);
var b = (byte)System.Convert.ToUInt32(hex.Substring(4, 2), 16);
return Color.FromRgb(r, g, b);
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
================================================
FILE: src/Core/MAUIsland.Core/Converters/ImageSourceToBoolConverter.cs
================================================
namespace MAUIsland.Core;
public class ImageSourceToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var imageSource = (ImageSource)value;
return imageSource is null ? false : true;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
================================================
FILE: src/Core/MAUIsland.Core/Converters/LineBreakModeEnumToStringConverter.cs
================================================
namespace MAUIsland.Core;
public class LineBreakModeEnumToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is int)
{
return (LineBreakMode)value;
}
return LineBreakMode.WordWrap;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is LineBreakMode)
{
return (int)value;
}
return 0;
}
}
================================================
FILE: src/Core/MAUIsland.Core/Converters/RatioValueConverter.cs
================================================
namespace MAUIsland.Core;
public class RatioValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is double size && size > 0 && parameter is double ratio && ratio > 0)
{
return new GridLength(size * ratio, GridUnitType.Absolute);
}
return new GridLength(0, GridUnitType.Absolute);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
================================================
FILE: src/Core/MAUIsland.Core/Converters/StringTernaryOperatorConverter.cs
================================================
namespace MAUIsland.Core;
public class StringTernaryOperatorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool boolValue &&
parameter is string[] messages)
{
return boolValue ? messages[0] : messages[1];
}
return string.Empty;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
================================================
FILE: src/Core/MAUIsland.Core/Converters/StringToColorConverter.cs
================================================
namespace MAUIsland.Core;
public class StringToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var stringValue = value as String;
if (stringValue != null && !string.IsNullOrWhiteSpace(stringValue) && !string.IsNullOrEmpty(stringValue))
{
var color = System.Drawing.Color.FromName(stringValue);
return Color.FromRgb(color.R, color.G, color.B);
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
================================================
FILE: src/Core/MAUIsland.Core/Extensions/TaskHelpers.cs
================================================
namespace MAUIsland.Core;
public static class TaskHelpers
{
public static void FireAndForget(this Task task, bool configureAwait = false)
{
task.ConfigureAwait(configureAwait);
}
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/ContentViews/BrandIconContentView.xaml
================================================
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/ContentViews/BrandIconContentView.xaml.cs
================================================
namespace MAUIsland.Core;
using System.Windows.Input;
public partial class BrandIconContentView : ContentView
{
#region [CTor]
public BrandIconContentView()
{
InitializeComponent();
}
#endregion
#region [Delegates]
public delegate void DetailEventHandler(ControlGroupInfo control);
public delegate void DetailInNewWindowEventHandler(ControlGroupInfo control);
#endregion
#region [Events]
public event DetailEventHandler DetailClicked;
public event DetailInNewWindowEventHandler DetailInNewWindowClicked;
#endregion
#region [Bindable Properties]
public static readonly BindableProperty ComponentDataProperty = BindableProperty.Create(
nameof(ComponentData),
typeof(ControlGroupInfo),
typeof(BrandIconContentView),
default(ControlGroupInfo)
);
public ICommand TapCommand => new Command(async (url) => await Launcher.OpenAsync(url));
#endregion
#region [Properties]
public ControlGroupInfo ComponentData
{
get => (ControlGroupInfo)GetValue(ComponentDataProperty);
set => SetValue(ComponentDataProperty, value);
}
#endregion
#region [Event Handlers]
private void Detail_Clicked(object sender, EventArgs e)
{
DetailClicked?.Invoke(ComponentData);
}
private void DetailInNewWindow_Clicked(object sender, EventArgs e)
{
DetailInNewWindowClicked?.Invoke(ComponentData);
}
private void TapGestureRecognizer_Tapped(object sender, TappedEventArgs e)
{
DetailClicked?.Invoke(ComponentData);
}
private void MenuFlyoutItem_Clicked(object sender, EventArgs e)
{
DetailInNewWindowClicked?.Invoke(ComponentData);
}
#endregion
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/ContentViews/ControlCardContentView.xaml
================================================
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/ContentViews/ControlCardContentView.xaml.cs
================================================
namespace MAUIsland.Core;
using System.Windows.Input;
public partial class ControlCardContentView : ContentView
{
#region [ CTor ]
public ControlCardContentView()
{
InitializeComponent();
}
#endregion
#region [ Delegates ]
public delegate void DetailEventHandler(IGalleryCardInfo control);
public delegate void DetailInNewWindowEventHandler(IGalleryCardInfo control);
#endregion
#region [ Event Handlers ]
public event DetailEventHandler DetailClicked;
public event DetailInNewWindowEventHandler DetailInNewWindowClicked;
#endregion
#region [ Bindable Properties ]
public static readonly BindableProperty ComponentDataProperty = BindableProperty.Create(
nameof(ComponentData),
typeof(IGalleryCardInfo),
typeof(ControlCardContentView),
default(IGalleryCardInfo)
);
public ICommand TapCommand => new Command(async (url) => await Launcher.OpenAsync(url));
#endregion
#region [ Properties ]
public IGalleryCardInfo ComponentData
{
get => (IGalleryCardInfo)GetValue(ComponentDataProperty);
set => SetValue(ComponentDataProperty, value);
}
#endregion
#region [ Event Handlers ]
private void Detail_Clicked(object sender, EventArgs e)
{
DetailClicked?.Invoke(ComponentData);
}
private void DetailInNewWindow_Clicked(object sender, EventArgs e)
{
DetailInNewWindowClicked?.Invoke(ComponentData);
}
#endregion
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/ContentViews/MaterialUICardContentView.xaml
================================================
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/ContentViews/MaterialUICardContentView.xaml.cs
================================================
namespace MAUIsland.Core;
public partial class MaterialUICardContentView : ContentView
{
#region [ CTor ]
public MaterialUICardContentView()
{
InitializeComponent();
}
#endregion
#region [ Delegates ]
public delegate void DetailEventHandler(IMaterialUIGalleryCardInfo control);
public delegate void DetailInNewWindowEventHandler(IMaterialUIGalleryCardInfo control);
#endregion
#region [ Event Handlers ]
public event DetailEventHandler DetailClicked;
public event DetailInNewWindowEventHandler DetailInNewWindowClicked;
#endregion
#region [ Properties ]
public static readonly BindableProperty ComponentDataProperty = BindableProperty.Create(
nameof(ComponentData),
typeof(IMaterialUIGalleryCardInfo),
typeof(MaterialUICardContentView),
default(IMaterialUIGalleryCardInfo)
);
public IMaterialUIGalleryCardInfo ComponentData
{
get => (IMaterialUIGalleryCardInfo)GetValue(ComponentDataProperty);
set => SetValue(ComponentDataProperty, value);
}
#endregion
#region [ Event Handlers ]
private void Detail_Clicked(object sender, TouchEventArgs e)
{
DetailClicked?.Invoke(ComponentData);
}
private void DetailInNewWindow_Clicked(object sender, EventArgs e)
{
DetailInNewWindowClicked?.Invoke(ComponentData);
}
public ICommand TapCommand => new Command(async (url) => await Launcher.OpenAsync(url));
#endregion
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/ContentViews/SyncfusionCardContentView.xaml
================================================
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/ContentViews/SyncfusionCardContentView.xaml.cs
================================================
namespace MAUIsland.Core;
public partial class SyncfusionCardContentView : ContentView
{
#region [CTor]
public SyncfusionCardContentView()
{
InitializeComponent();
}
#endregion
#region [Delegates]
public delegate void DetailEventHandler(IGalleryCardInfo control);
public delegate void DetailInNewWindowEventHandler(IGalleryCardInfo control);
#endregion
#region [Event Handlers]
public event DetailEventHandler DetailClicked;
public event DetailInNewWindowEventHandler DetailInNewWindowClicked;
#endregion
#region [Bindable Properties]
public static readonly BindableProperty ComponentDataProperty = BindableProperty.Create(
nameof(ComponentData),
typeof(IGalleryCardInfo),
typeof(ControlCardContentView),
default(IGalleryCardInfo)
);
public ICommand TapCommand => new Command(async (url) => await Launcher.OpenAsync(url));
#endregion
#region [Properties]
public IGalleryCardInfo ComponentData
{
get => (IGalleryCardInfo)GetValue(ComponentDataProperty);
set => SetValue(ComponentDataProperty, value);
}
#endregion
#region [Event Handlers]
private void Detail_Clicked(object sender, EventArgs e)
{
DetailClicked?.Invoke(ComponentData);
}
private void DetailInNewWindow_Clicked(object sender, EventArgs e)
{
DetailInNewWindowClicked?.Invoke(ComponentData);
}
#endregion
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Core/IBuiltInGalleryCardInfo.cs
================================================
namespace MAUIsland.Core;
public interface IBuiltInGalleryCardInfo : IGalleryCardInfo
{
string GitHubAuthorIssueName { get; }
string GitHubRepositoryIssueName { get; }
List GitHubIssueLabels { get; }
BuiltInGalleryCardStatus Status { get; }
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Core/ICommunityToolkitGalleryCardInfo.cs
================================================
namespace MAUIsland.Core;
public interface ICommunityToolkitGalleryCardInfo : IGalleryCardInfo
{
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Core/IGalleryCardInfo.cs
================================================
namespace MAUIsland.Core;
public interface IGalleryCardInfo
{
ImageSource ControlIcon { get; }
string ControlName { get; }
string ControlDetail { get; }
string ControlRoute { get; }
string GitHubUrl { get; }
string DocumentUrl { get; }
string GroupName { get; }
GalleryCardType CardType { get; }
GalleryCardStatus CardStatus { get; }
DateTime LastUpdate { get; }
List DoList { get; }
List DontList { get; }
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Core/IGalleryPage.cs
================================================
namespace MAUIsland.Core;
public interface IGalleryPage
{
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Core/IGithubGalleryCardInfo.cs
================================================
namespace MAUIsland.Core;
public interface IGithubGalleryCardInfo : IGalleryCardInfo
{
string RepositoryName { get; }
string AuthorName { get; }
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Core/IMaterialUIGalleryCardInfo.cs
================================================
namespace MAUIsland.Core;
public interface IMaterialUIGalleryCardInfo : IGalleryCardInfo
{
string MaterialIcon { get; }
List SupportedPlatformsInfo { get; }
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/DataTemplateSelectors/BrandCardTemplateSelector.cs
================================================
namespace MAUIsland.Core;
public class BrandCardTemplateSelector : DataTemplateSelector
{
public DataTemplate BuiltInCardTemplate { get; set; }
public DataTemplate GithubCardTemplate { get; set; }
public DataTemplate MaterialUICardTemplate { get; set; }
public DataTemplate SyncfustionCardTemplate { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
var controlGroup = ((IGalleryCardInfo)item).GroupName;
switch (controlGroup)
{
case ControlGroupInfo.SyncfusionControls:
return SyncfustionCardTemplate;
case ControlGroupInfo.GitHubCommunity:
return GithubCardTemplate;
case ControlGroupInfo.MaterialComponent:
return MaterialUICardTemplate;
default:
return BuiltInCardTemplate;
}
}
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Enums/BuiltInGalleryCardStatus.cs
================================================
namespace MAUIsland.Core;
public enum BuiltInGalleryCardStatus
{
All, Stable, Buggy, ExtremelyBuggy, Experimental, Deprecated, Unverified
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Enums/ControlGroupInfoImportantLevel.cs
================================================
namespace MAUIsland.Core;
public enum ControlGroupInfoImportantLevel
{
Info, Warning, Error
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Enums/GalleryCardStatus.cs
================================================
namespace MAUIsland.Core;
public enum GalleryCardStatus
{
Completed, NotCompleted
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Enums/GalleryCardType.cs
================================================
namespace MAUIsland.Core;
public enum GalleryCardType
{
Control, Converter, Layout, Behavior, Extension, Helper, Other
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Models/ControlGroupInfo.cs
================================================
namespace MAUIsland.Core;
public partial class ControlGroupInfo : BaseModel
{
[ObservableProperty]
string name;
[ObservableProperty]
string author;
[ObservableProperty]
string description;
[ObservableProperty]
string title;
[ObservableProperty]
string version;
[ObservableProperty]
string providerUrl;
[ObservableProperty]
ImageSource iconUrl;
[ObservableProperty]
ImageSource banner;
[ObservableProperty]
string lottieUrl;
[ObservableProperty]
bool isVisibile = true;
[ObservableProperty]
Color brandColor;
[ObservableProperty]
Color buttonTextColor;
[ObservableProperty]
ControlGroupInfoImportant? important;
[ObservableProperty]
string microsoftStoreLink;
public const string BuiltInControls = nameof(BuiltInControls);
public const string SyncfusionControls = nameof(SyncfusionControls);
public const string DevExpressControls = nameof(DevExpressControls);
public const string CommunityToolkit = nameof(CommunityToolkit);
public const string GitHubCommunity = nameof(GitHubCommunity);
public const string MaterialComponent = nameof(MaterialComponent);
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Models/ControlGroupInfoImportant.cs
================================================
namespace MAUIsland.Core;
public partial class ControlGroupInfoImportant : BaseModel
{
[ObservableProperty]
string content;
[ObservableProperty]
ImageSource? attachImage;
[ObservableProperty]
ControlGroupInfoImportantLevel level;
[ObservableProperty]
string additionalLink;
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Models/ControlIssueModel.cs
================================================
namespace MAUIsland.Core;
public partial class ControlIssueModel : BaseModel
{
[ObservableProperty]
long issueId;
[ObservableProperty]
string title;
[ObservableProperty]
string avatarUrl;
[ObservableProperty]
string issueLinkUrl;
[ObservableProperty]
string mileStone;
[ObservableProperty]
string ownerName;
[ObservableProperty]
DateTime createdDate;
[ObservableProperty]
DateTime lastUpdated;
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Models/PlatformInfo.cs
================================================
namespace MAUIsland.Core;
public partial class PlatformInfo : BaseModel
{
[ObservableProperty]
string name;
[ObservableProperty]
string logo;
[ObservableProperty]
string tooltip;
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Pages/BuiltIn/BaseBuiltInPageControlViewModel.cs
================================================
using DiscordRPC;
using MAUIsland.Features.LocalDbFeatures.GitHub;
using MAUIsland.GitHubFeatures;
namespace MAUIsland.Core;
public partial class BaseBuiltInPageControlViewModel : NavigationAwareBaseViewModel
{
#region [ Fields ]
protected DiscordRpcClient DiscordRpcClient { get; }
protected IGitHubService GitHubService { get; }
protected IGitHubIssueLocalDbService GitHubIssueLocalDbService { get; }
#endregion
#region [ CTor ]
public BaseBuiltInPageControlViewModel(IAppNavigator appNavigator,
IGitHubService gitHubService,
DiscordRpcClient discordRpcClient,
IGitHubIssueLocalDbService gitHubIssueLocalDbService)
: base(appNavigator)
{
GitHubService = gitHubService;
DiscordRpcClient = discordRpcClient;
GitHubIssueLocalDbService = gitHubIssueLocalDbService;
// Subscribe to the Pushed event
Shell.Current.Navigated += OnShellNavigated;
}
#endregion
#region [ Properties ]
[ObservableProperty]
string emptyViewText = "No issues found for this control";
[ObservableProperty]
string gitHubAPIRateLimit = "https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api?apiVersion=2022-11-28";
[ObservableProperty]
bool isBusy;
[ObservableProperty]
IBuiltInGalleryCardInfo controlInformation = default!;
[ObservableProperty]
ObservableCollection controlIssues = default!;
[ObservableProperty]
ControlIssueModel selectedControlIssue = default!;
#endregion
#region [ Methods ]
public async Task RefreshControlIssues(bool forced,
string controlName,
string gitHubAuthorName,
string gitHubrepositoryName,
IEnumerable labels)
{
if (IsBusy)
return;
IsBusy = true;
var now = DateTime.UtcNow;
// First: sync from local db.
// TODO: how to get control name?
var allLocalDbIssues = await GetIssueByControlNameFromLocalDb(controlName);
// If localdb version is not null & not outdated => use local version.
if (allLocalDbIssues != null && allLocalDbIssues.Any() && !allLocalDbIssues.Any(x => (now - x.LastUpdated).TotalHours > 1))
{
if (ControlIssues is null || forced)
{
ControlIssues = new(allLocalDbIssues.Select(x => new ControlIssueModel()
{
IssueId = x.IssueId,
Title = x.Title,
IssueLinkUrl = x.IssueLinkUrl,
MileStone = x.MileStone,
OwnerName = x.OwnerName,
AvatarUrl = x.UserAvatarUrl,
CreatedDate = x.CreatedDate,
LastUpdated = x.LastUpdated
}));
}
IsBusy = false;
// Done.
return;
}
// If localdb does not have issue info, or info outdated => sync from GitHub & save.
var result = await GitHubService.GetGitHubIssuesByLabels(gitHubAuthorName,
gitHubrepositoryName,
labels);
if (result.IsT0) // Check if result is ServiceSuccess
{
var issues = result.AsT0.AttachedData as IEnumerable;
// Save to localdb.
foreach (var issue in issues)
{
await UpdateLocalIssue(issue, controlName);
}
IsBusy = false;
if (ControlIssues is null || forced)
{
ControlIssues = new(issues.Select(x => new ControlIssueModel()
{
IssueId = x.Id,
Title = x.Title,
IssueLinkUrl = x.HtmlUrl,
MileStone = x.Milestone is null ? "No mile stone" : x.Milestone.Title,
OwnerName = x.User.Login,
AvatarUrl = x.User.AvatarUrl,
CreatedDate = x.CreatedAt.DateTime,
LastUpdated = x.UpdatedAt is null ? x.CreatedAt.DateTime : x.UpdatedAt.Value.DateTime
}));
}
}
else
{
IsBusy = false;
var error = result.AsT1;
EmptyViewText = error.ErrorDetail;
await AppNavigator.ShowSnackbarAsync(error.ErrorDetail,
async () =>
{
await AppNavigator.OpenUrlAsync(GitHubAPIRateLimit);
},
"Visit GitHub API Rate Limits Policies");
}
}
public async Task> GetIssueByControlNameFromLocalDb(string controlName)
{
try
{
var now = DateTime.UtcNow;
var result = await GitHubIssueLocalDbService.GetByControlNameAsync(controlName);
return result is not null ?
result
:
new List().AsEnumerable();
}
catch (Exception e)
{
await AppNavigator.ShowSnackbarAsync(e.Message, null, null);
return new List().AsEnumerable();
}
}
public async Task UpdateLocalIssue(GitHubIssueModel issue, string controlName)
{
try
{
var now = DateTime.UtcNow;
var localIssue = await GitHubIssueLocalDbService.GetByIssueUrlAsync(issue.Url);
if (localIssue is null)
{
await GitHubIssueLocalDbService.AddAsync(new()
{
IssueId = issue.Id,
Title = issue.Title,
IssueLinkUrl = issue.HtmlUrl,
ControlName = controlName,
MileStone = issue.Milestone?.Title,
OwnerName = issue.User?.Login,
UserAvatarUrl = issue.User?.AvatarUrl,
CreatedDate = issue.CreatedAt.DateTime,
LastUpdated = now
});
return;
}
// Update fields: milestone (TODO: what else?).
localIssue.MileStone = issue.Milestone?.Title;
localIssue.LastUpdated = now;
await GitHubIssueLocalDbService.UpdateAsync(localIssue);
}
catch (Exception e)
{
await AppNavigator.ShowSnackbarAsync(e.Message, null, null);
}
}
public void SetControlInformation(object controlInfo)
{
ControlInformation = (IBuiltInGalleryCardInfo)controlInfo;
}
private void OnShellNavigated(object sender, ShellNavigatedEventArgs e)
{
string mauislandLogo = "https://raw.githubusercontent.com/Strypper/mauisland/main/src/Presentations/Windows/Resources/Images/logos/mauisland_logo.png";
string builtinGalleryLogo = "https://i.imgur.com/Sr8N6Vm.png";
string storeLink = "https://www.microsoft.com/store/productId/9NLQ0J5P471L";
string sourceCodeLink = "https://github.com/Strypper/mauisland";
if (ControlInformation is null)
return;
DiscordRpcClient.SetPresence(new RichPresence()
{
Buttons = new DiscordRPC.Button[]
{
new() { Label = "Get the app 🚀", Url = storeLink },
new() { Label = "Source code 🧑🏽💻", Url = sourceCodeLink },
},
Details = "Exploring built-in gallery",
State = $"Viewing {ControlInformation.ControlName}",
Assets = new Assets()
{
LargeImageKey = mauislandLogo,
LargeImageText = "MAUIsland",
SmallImageKey = builtinGalleryLogo
}
});
}
#endregion
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Pages/BuiltIn/Controls/ActivityIndicator/ActivityIndicatorControlInfo.cs
================================================
namespace MAUIsland.Core;
public class ActivityIndicatorControlInfo : IBuiltInGalleryCardInfo
{
public string ControlName => nameof(ActivityIndicator);
public string ControlRoute => $"MAUIsland.{ControlName}Page";
public ImageSource ControlIcon => new FontImageSource()
{
FontFamily = FontNames.FluentSystemIconsRegular,
Size = 100,
Glyph = FluentUIIcon.Ic_fluent_approvals_app_20_regular
};
public string ControlDetail => "ActivityIndicator displays an animation to show that the application is engaged in a lengthy activity. Unlike ProgressBar, ActivityIndicator gives no indication of progress.";
public string GitHubUrl => $"https://github.com/Strypper/mauisland/tree/main/src/Presentations/Windows/Features/Gallery/Pages/BuiltIn/Controls/{ControlName}";
public string DocumentUrl => $"https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/{ControlName}";
public string GroupName => ControlGroupInfo.BuiltInControls;
public BuiltInGalleryCardStatus Status => BuiltInGalleryCardStatus.Stable;
public GalleryCardType CardType => GalleryCardType.Control;
public GalleryCardStatus CardStatus => throw new NotImplementedException();
public DateTime LastUpdate => throw new NotImplementedException();
public List DoList => throw new NotImplementedException();
public List DontList => throw new NotImplementedException();
public string GitHubAuthorIssueName => "dotnet";
public string GitHubRepositoryIssueName => "maui";
public List GitHubIssueLabels => new List() { "area-controls-activityindicator" };
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Pages/BuiltIn/Controls/ActivityIndicator/ActivityIndicatorPageViewModel.cs
================================================
using DiscordRPC;
using MAUIsland.Features.LocalDbFeatures.GitHub;
using MAUIsland.GitHubFeatures;
namespace MAUIsland.Core;
public partial class ActivityIndicatorPageViewModel : BaseBuiltInPageControlViewModel
{
#region [ Fields ]
#endregion
#region [ CTor ]
public ActivityIndicatorPageViewModel(IAppNavigator appNavigator,
IGitHubService gitHubService,
DiscordRpcClient discordRpcClient,
IGitHubIssueLocalDbService gitHubIssueLocalDbService)
: base(appNavigator,
gitHubService,
discordRpcClient,
gitHubIssueLocalDbService)
{
}
#endregion
#region [ Properties ]
[ObservableProperty]
string groupOfActivityIndicators =
"\r\n" +
" \r\n" +
"\r\n" +
" \r\n" +
"\r\n" +
" \r\n" +
"\r\n" +
" \r\n" +
"";
[ObservableProperty]
string bindingActivityIndicators =
"\r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
"";
#endregion
#region [ Overrides ]
protected override void OnInit(IDictionary query)
{
base.OnInit(query);
ControlInformation = query.GetData();
}
public override async Task OnAppearingAsync()
{
await base.OnAppearingAsync();
await RefreshAsync();
}
#endregion
#region [ Relay Commands ]
[RelayCommand]
Task OpenUrlAsync(string url)
=> AppNavigator.OpenUrlAsync(url);
[RelayCommand]
async Task RefreshAsync()
{
if (ControlInformation is null)
return;
await RefreshControlIssues(true,
ControlInformation.ControlName,
ControlInformation.GitHubAuthorIssueName,
ControlInformation.GitHubRepositoryIssueName,
ControlInformation.GitHubIssueLabels);
}
#endregion
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Pages/BuiltIn/Controls/BlazorWebView/BlazorWebViewControlInfo.cs
================================================
namespace MAUIsland.Core;
public class BlazorWebViewControlInfo : IBuiltInGalleryCardInfo
{
public string ControlName => "BlazorWebView";
public string ControlRoute => $"MAUIsland.{ControlName}Page";
public ImageSource ControlIcon => new FontImageSource()
{
FontFamily = FontNames.FluentSystemIconsRegular,
Size = 100,
Glyph = FluentUIIcon.Ic_fluent_globe_star_20_regular
};
public string ControlDetail => "The .NET Multi-platform App UI (.NET MAUI) BlazorWebView is a control that enables you to host a Blazor web app in your .NET MAUI app. These apps, known as Blazor Hybrid apps, enable a Blazor web app to be integrated with platform features and UI controls. The BlazorWebView control can be added to any page of a .NET MAUI app, and pointed to the root of the Blazor app. The Razor components run natively in the .NET process and render web UI to an embedded web view control. In .NET MAUI, Blazor Hybrid apps can run on all the platforms supported by .NET MAUI.";
public string GitHubUrl => "https://github.com/Strypper/mauisland/tree/main/src/Presentations/Windows/Features/Gallery/Pages/BuiltIn/Controls/{ControlName}";
public string DocumentUrl => $"https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/{ControlName}";
public string GroupName => ControlGroupInfo.BuiltInControls;
public BuiltInGalleryCardStatus Status => BuiltInGalleryCardStatus.Stable;
public GalleryCardType CardType => GalleryCardType.Control;
public GalleryCardStatus CardStatus => throw new NotImplementedException();
public DateTime LastUpdate => throw new NotImplementedException();
public List DoList => throw new NotImplementedException();
public List DontList => throw new NotImplementedException();
public string GitHubAuthorIssueName => "dotnet";
public string GitHubRepositoryIssueName => "maui";
public List GitHubIssueLabels => new List() { "area-blazor" };
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Pages/BuiltIn/Controls/BlazorWebView/BlazorWebViewPageViewModel.cs
================================================
using DiscordRPC;
using MAUIsland.Features.LocalDbFeatures.GitHub;
using MAUIsland.GitHubFeatures;
namespace MAUIsland.Core;
public partial class BlazorWebViewPageViewModel : BaseBuiltInPageControlViewModel
{
#region [ CTor ]
public BlazorWebViewPageViewModel(IAppNavigator appNavigator,
IGitHubService gitHubService,
DiscordRpcClient discordRpcClient,
IGitHubIssueLocalDbService gitHubIssueLocalDbService)
: base(appNavigator,
gitHubService,
discordRpcClient,
gitHubIssueLocalDbService)
{
}
#endregion
#region [ Properties ]
[ObservableProperty]
int counter;
[ObservableProperty]
ObservableCollection navigationPageName = new()
{
"Main Page",
"Counter",
"Weather Page"
};
[ObservableProperty]
string blazorWebViewStartPath = "/blazor-web-view/";
[ObservableProperty]
string csprojChanges = "";
[ObservableProperty]
string blazorWebViewXamlCode = "\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n";
[ObservableProperty]
string blazorWebViewConfig = "public static class MauiProgram\r\n{\r\n public static MauiApp CreateMauiApp()\r\n {\r\n var builder = MauiApp.CreateBuilder();\r\n builder\r\n .UseMauiApp()\r\n .ConfigureFonts(fonts =>\r\n {\r\n fonts.AddFont(\"OpenSans-Regular.ttf\", \"OpenSansRegular\");\r\n });\r\n\r\n builder.Services.AddMauiBlazorWebView();\r\n#if DEBUG\r\n builder.Services.AddBlazorWebViewDeveloperTools();\r\n#endif\r\n // Register any app services on the IServiceCollection object\r\n // e.g. builder.Services.AddSingleton();\r\n\r\n return builder.Build();\r\n }\r\n}";
#endregion
#region [ Overrides ]
protected override void OnInit(IDictionary query)
{
base.OnInit(query);
ControlInformation = query.GetData();
}
public override async Task OnAppearingAsync()
{
await base.OnAppearingAsync();
await RefreshAsync();
}
#endregion
#region [ Relay Commands ]
[RelayCommand]
public void CounterButton()
{
this.Counter++;
}
[RelayCommand]
Task OpenUrlAsync(string url)
=> AppNavigator.OpenUrlAsync(url);
[RelayCommand]
Task NavigatePageAsync(string route)
=> AppNavigator.NavigateAsync(route);
[RelayCommand]
async Task RefreshAsync()
{
if (ControlInformation is null)
return;
await RefreshControlIssues(true,
ControlInformation.ControlName,
ControlInformation.GitHubAuthorIssueName,
ControlInformation.GitHubRepositoryIssueName,
ControlInformation.GitHubIssueLabels);
}
#endregion
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Pages/BuiltIn/Controls/Border/BorderControlInfo.cs
================================================
namespace MAUIsland.Core;
class BorderControlInfo : IBuiltInGalleryCardInfo
{
public ImageSource ControlIcon => new FontImageSource()
{
FontFamily = FontNames.FluentSystemIconsRegular,
Size = 100,
Glyph = FluentUIIcon.Ic_fluent_checkbox_indeterminate_24_regular
};
public string ControlName => nameof(Border);
public string ControlDetail => $"Border is a container control that draws a border, background, or both, around another control. A Border can only contain one child object. If you want to put a border around multiple objects, wrap them in a container object such as a layout.";
public string ControlRoute => $"MAUIsland.{ControlName}Page";
public string GitHubUrl => $"https://github.com/Strypper/mauisland/tree/main/src/Presentations/Windows/Features/Gallery/Pages/BuiltIn/Controls/{ControlName}";
public string DocumentUrl => $"https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/{ControlName}";
public string GroupName => ControlGroupInfo.BuiltInControls;
public BuiltInGalleryCardStatus Status => BuiltInGalleryCardStatus.Stable;
public GalleryCardType CardType => GalleryCardType.Control;
public GalleryCardStatus CardStatus => GalleryCardStatus.Completed;
public DateTime LastUpdate => throw new NotImplementedException();
public List DoList => throw new NotImplementedException();
public List DontList => throw new NotImplementedException();
public string GitHubAuthorIssueName => "dotnet";
public string GitHubRepositoryIssueName => "maui";
public List GitHubIssueLabels => new List() { "area-controls-border" };
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Pages/BuiltIn/Controls/Border/BorderPageViewModel.cs
================================================
using DiscordRPC;
using MAUIsland.Features.LocalDbFeatures.GitHub;
using MAUIsland.GitHubFeatures;
namespace MAUIsland.Core;
public partial class BorderPageViewModel : BaseBuiltInPageControlViewModel
{
#region [ CTor ]
public BorderPageViewModel(IAppNavigator appNavigator,
IGitHubService gitHubService,
DiscordRpcClient discordRpcClient,
IGitHubIssueLocalDbService gitHubIssueLocalDbService)
: base(appNavigator,
gitHubService,
discordRpcClient,
gitHubIssueLocalDbService)
{
}
#endregion
#region [ Properties ]
[ObservableProperty]
bool isEnable = true;
[ObservableProperty]
string roundedRectangleXamlCode =
"StrokeShape=\"RoundRectangle 40,0,0,40\"";
[ObservableProperty]
string roundedRectangle2XamlCode =
"\r\n" +
" \r\n" +
"";
[ObservableProperty]
string createBorderXamlCode =
"\r\n" +
" \r\n" +
"";
[ObservableProperty]
string createBorder2XamlCode =
"\r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
"";
[ObservableProperty]
string createBorder3CSharpCode =
"using Microsoft.Maui.Controls.Shapes;\r\n" +
"using GradientStop = Microsoft.Maui.Controls.GradientStop;\r\n" +
"...\r\n" +
"\r\n" +
"Border border = new Border\r\n" +
"{\r\n" +
" Stroke = Color.FromArgb(\"#C49B33\"),\r\n" +
" Background = Color.FromArgb(\"#2B0B98\"),\r\n" +
" StrokeThickness = 4,\r\n" +
" Padding = new Thickness(16, 8),\r\n" +
" HorizontalOptions = LayoutOptions.Center,\r\n" +
" StrokeShape = new RoundRectangle\r\n" +
" {\r\n" +
" CornerRadius = new CornerRadius(40, 0, 0, 40)\r\n" +
" },\r\n" +
" Content = new Label\r\n" +
" {\r\n" +
" Text = \".NET MAUI\",\r\n" +
" TextColor = Colors.White,\r\n" +
" FontSize = 18,\r\n" +
" FontAttributes = FontAttributes.Bold\r\n" +
" }\r\n" +
"};";
[ObservableProperty]
string createBorder4XamlCode =
"\r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
" \r\n" +
"";
[ObservableProperty]
string createBorder4CSharpCode =
"using Microsoft.Maui.Controls.Shapes;\r\n" +
"using GradientStop = Microsoft.Maui.Controls.GradientStop;\r\n" +
"...\r\n" +
"\r\n" +
"Border gradientBorder = new Border\r\n" +
"{\r\n" +
" StrokeThickness = 4,\r\n" +
" Background = Color.FromArgb(\"#2B0B98\"),\r\n" +
" Padding = new Thickness(16, 8),\r\n" +
" HorizontalOptions = LayoutOptions.Center,\r\n" +
" StrokeShape = new RoundRectangle\r\n" +
" {\r\n" +
" CornerRadius = new CornerRadius(40, 0, 0, 40)\r\n" +
" },\r\n" +
" Stroke = new LinearGradientBrush\r\n" +
" {\r\n" +
" EndPoint = new Point(0, 1),\r\n" +
" GradientStops = new GradientStopCollection\r\n" +
" {\r\n" +
" new GradientStop { Color = Colors.Orange, Offset = 0.1f },\r\n" +
" new GradientStop { Color = Colors.Brown, Offset = 1.0f }\r\n" +
" },\r\n" +
" },\r\n" +
" Content = new Label\r\n" +
" {\r\n" +
" Text = \".NET MAUI\",\r\n" +
" TextColor = Colors.White,\r\n" +
" FontSize = 18,\r\n" +
" FontAttributes = FontAttributes.Bold\r\n" +
" }\r\n" +
"};";
[ObservableProperty]
string buttonWithImageXamlCode =
"\r\n" +
" \r\n" +
" \r\n" +
"\r\n" +
" query)
{
base.OnInit(query);
ControlInformation = query.GetData();
}
public override async Task OnAppearingAsync()
{
await base.OnAppearingAsync();
await RefreshAsync();
}
#endregion
#region [ Relay Commands ]
[RelayCommand]
Task OpenUrlAsync(string url)
=> AppNavigator.OpenUrlAsync(url);
[RelayCommand]
async Task RefreshAsync()
{
if (ControlInformation is null)
return;
await RefreshControlIssues(true,
ControlInformation.ControlName,
ControlInformation.GitHubAuthorIssueName,
ControlInformation.GitHubRepositoryIssueName,
ControlInformation.GitHubIssueLabels);
}
[RelayCommand]
async Task CopyToClipboardAsync(string text)
{
await Clipboard.Default.SetTextAsync(text);
await AppNavigator.ShowSnackbarAsync("Code copied to clipboard", null, null);
}
#endregion
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Pages/BuiltIn/Controls/Button/ButtonControlInfo.cs
================================================
namespace MAUIsland.Core;
public class ButtonControlInfo : IBuiltInGalleryCardInfo
{
public ImageSource ControlIcon => new FontImageSource()
{
FontFamily = FontNames.FluentSystemIconsRegular,
Size = 100,
Glyph = FluentUIIcon.Ic_fluent_add_circle_32_regular
};
public string ControlName => nameof(Button);
public string ControlDetail => $"{ControlName} displays text and responds to a tap or click that directs the app to carry out a task. A {ControlName} usually displays a short text string indicating a command, but it can also display a bitmap image, or a combination of text and an image. When the {ControlName} is pressed with a finger or clicked with a mouse it initiates that command.";
public string ControlRoute => $"MAUIsland.{ControlName}Page";
public string GitHubUrl => $"https://github.com/Strypper/mauisland/tree/main/src/Presentations/Windows/Features/Gallery/Pages/BuiltIn/Controls/{ControlName}";
public string DocumentUrl => $"https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/{ControlName}";
public string GroupName => ControlGroupInfo.BuiltInControls;
public BuiltInGalleryCardStatus Status => BuiltInGalleryCardStatus.Buggy;
public GalleryCardType CardType => GalleryCardType.Control;
public GalleryCardStatus CardStatus => throw new NotImplementedException();
public DateTime LastUpdate => throw new NotImplementedException();
public List DoList => throw new NotImplementedException();
public List DontList => throw new NotImplementedException();
public string GitHubAuthorIssueName => "dotnet";
public string GitHubRepositoryIssueName => "maui";
public List GitHubIssueLabels => new List() { "area-controls-button" };
}
================================================
FILE: src/Core/MAUIsland.Core/Features/Gallery/Pages/BuiltIn/Controls/Button/ButtonPageViewModel.cs
================================================
using DiscordRPC;
using MAUIsland.Features.LocalDbFeatures.GitHub;
using MAUIsland.GitHubFeatures;
namespace MAUIsland.Core;
public partial class ButtonPageViewModel : BaseBuiltInPageControlViewModel
{
#region [ Fields ]
#endregion
#region [ CTor ]
public ButtonPageViewModel(IAppNavigator appNavigator,
IGitHubService gitHubService,
DiscordRpcClient discordRpcClient,
IGitHubIssueLocalDbService gitHubIssueLocalDbService)
: base(appNavigator,
gitHubService,
discordRpcClient,
gitHubIssueLocalDbService)
{
}
#endregion
#region [ Properties ]
[ObservableProperty]
bool isEnable;
[ObservableProperty]
string standardButtonXamlCode =
"";
[ObservableProperty]
string rotationButtonXamlCode =
"