diff --git a/src/PostIt/PostIt.Tests/MD/le-chant-1.md b/src/PostIt/PostIt.Tests/MD/le-chant-1.md deleted file mode 100644 index f4a7506fe..000000000 --- a/src/PostIt/PostIt.Tests/MD/le-chant-1.md +++ /dev/null @@ -1,34 +0,0 @@ - - Loin vers l'infini s'étendent - Les grands prés marécageux . - Pas un seul oiseau ne chante - Sur les arbres secs et creux ! - -*(Refrain)* - - Ô terre de détresse, - Où nous devons sans cesse, - Piocher, piocher . - - Dans ce camp morne et sauvage - Entouré de murs de fer, - Il nous semble vivre en cage - Au milieu d'un grand désert . - - Bruit des pas et bruit des armes, - Sentinelles jours et nuits, - Et du sang, et des cris, des larmes, - La mort pour celui qui fuit . - - Mais un jour dans notre vie, - Le printemps refleurira . - Liberté, liberté chérie - Je dirai : « Tu es à moi ! » - -*(Dernier refrain)* - - Ô terre d'allégresse, - Où nous pourrons sans cesse, - Aimer, aimer ! - -[audio : Mario Hacquard - Youtube](https://www.youtube.com/watch?v=ogw_mgk1pFs) diff --git a/src/PostIt/PostIt/Controls/MarkdownEditorControl.axaml b/src/PostIt/PostIt/Controls/MarkdownEditorControl.axaml deleted file mode 100644 index 9e8df6dd1..000000000 --- a/src/PostIt/PostIt/Controls/MarkdownEditorControl.axaml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/PostIt/PostIt/Controls/MarkdownEditorControl.axaml.cs b/src/PostIt/PostIt/Controls/MarkdownEditorControl.axaml.cs deleted file mode 100644 index 0431b726e..000000000 --- a/src/PostIt/PostIt/Controls/MarkdownEditorControl.axaml.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using AvaloniaEdit.Document; - -namespace PostIt.Controls; - -public partial class MarkdownEditorControl : UserControl -{ - public static readonly StyledProperty MarkdownTextProperty = - AvaloniaProperty.Register(nameof(MarkdownText)); - - public static readonly StyledProperty DocumentProperty = - AvaloniaProperty.Register(nameof(Document)); - - public static readonly StyledProperty IsPreviewVisibleProperty = - AvaloniaProperty.Register(nameof(IsPreviewVisible), false); - - public string? MarkdownText - { - get => GetValue(MarkdownTextProperty); - set => SetValue(MarkdownTextProperty, value); - } - - public TextDocument? Document - { - get => GetValue(DocumentProperty); - set => SetValue(DocumentProperty, value); - } - - public bool IsPreviewVisible - { - get => GetValue(IsPreviewVisibleProperty); - set => SetValue(IsPreviewVisibleProperty, value); - } - - public MarkdownEditorControl() - { - InitializeComponent(); - PropertyChanged += OnPropertyChanged; - SizeChanged += OnSizeChanged; - UpdateEditorLimits(); - } - - private void OnPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e) - { - if (e.Property == MarkdownTextProperty) - { - var text = e.NewValue as string ?? string.Empty; - if (Document is null || !string.Equals(Document.Text, text, StringComparison.Ordinal)) - { - Document = new TextDocument(text); - } - } - else if (e.Property == DocumentProperty) - { - var newDocument = e.NewValue as TextDocument; - var text = newDocument?.Text ?? string.Empty; - if (!string.Equals(MarkdownText, text, StringComparison.Ordinal)) - { - MarkdownText = text; - } - } - } - - private void OnSizeChanged(object? sender, SizeChangedEventArgs e) - { - UpdateEditorLimits(); - } - - private void UpdateEditorLimits() - { - var visibleHeight = Bounds.Height > 0 ? Bounds.Height - 24 : 260; - visibleHeight = Math.Max(visibleHeight, 80); - - if (SourceEditor is not null) - { - SourceEditor.MaxHeight = visibleHeight; - SourceEditor.Height = double.NaN; - } - - if (PreviewViewer is not null) - { - PreviewViewer.MaxHeight = visibleHeight; - PreviewViewer.Height = double.NaN; - } - } -} diff --git a/src/PostIt/PostIt/ViewModels/Blogs/BlogsViewModel.cs b/src/PostIt/PostIt/ViewModels/Blogs/BlogsViewModel.cs index 9de63c24c..6fe6eccc9 100644 --- a/src/PostIt/PostIt/ViewModels/Blogs/BlogsViewModel.cs +++ b/src/PostIt/PostIt/ViewModels/Blogs/BlogsViewModel.cs @@ -39,56 +39,18 @@ public partial class BlogsViewModel : ViewModelBase, IActionStatusViewModel /// Editor buffer for the post body. Same pattern as /// . - public string? DraftArticle + public string DraftArticle { - get => DraftArticleDocument?.Text ?? null; - set - { - var currentText = DraftArticleDocument?.Text; - if (string.Equals(currentText, value, StringComparison.Ordinal)) - { - OnPropertyChanged(nameof(DraftArticle)); - return; - } - + get => DraftArticleDocument.Text; + set { OnPropertyChanging(nameof(DraftArticle)); - DraftArticleDocument = value is not null ? new TextDocument(value) : null; - OnPropertyChanged(nameof(DraftArticle)); + DraftArticleDocument = new TextDocument(value); + this.OnPropertyChanged(nameof(DraftArticle)); } } - private TextDocument? _draftArticleDocument; - - public TextDocument? DraftArticleDocument - { - get => _draftArticleDocument; - set - { - if (ReferenceEquals(_draftArticleDocument, value)) - { - return; - } - - if (_draftArticleDocument is not null) - { - _draftArticleDocument.TextChanged -= DraftArticleDocument_TextChanged; - } - - _draftArticleDocument = value; - - if (_draftArticleDocument is not null) - { - _draftArticleDocument.TextChanged += DraftArticleDocument_TextChanged; - } - - OnPropertyChanged(nameof(DraftArticleDocument)); - } - } - - private void DraftArticleDocument_TextChanged(object? sender, EventArgs e) - { - OnPropertyChanged(nameof(DraftArticle)); - } + [ObservableProperty] + public partial TextDocument DraftArticleDocument {get; set;} /// Editor buffer for the post's publication state. /// Reflects the server-side IsPublished flag (the diff --git a/src/PostIt/PostIt/Views/Blogs/BlogsPage.axaml b/src/PostIt/PostIt/Views/Blogs/BlogsPage.axaml index 5c926bdee..90397f09d 100644 --- a/src/PostIt/PostIt/Views/Blogs/BlogsPage.axaml +++ b/src/PostIt/PostIt/Views/Blogs/BlogsPage.axaml @@ -17,14 +17,10 @@ - - + + - + @@ -107,7 +103,7 @@ - + @@ -141,61 +137,90 @@ - - - - - - - - - - - - - - - + BorderBrush="Gray" + BorderThickness="1" + IsVisible="{Binding IsMarkdownViewerVisible}"> + + - - - - - - - - - - - - + VerticalAlignment="Stretch" + IsVisible="{Binding !IsMarkdownViewerVisible}"> + + + + + + + + + + - + + - + + + + + + + + + + + + + + + + + + + + diff --git a/src/PostIt/PostIt/Views/Blogs/BlogsPage.axaml.cs b/src/PostIt/PostIt/Views/Blogs/BlogsPage.axaml.cs index b40021276..629727870 100644 --- a/src/PostIt/PostIt/Views/Blogs/BlogsPage.axaml.cs +++ b/src/PostIt/PostIt/Views/Blogs/BlogsPage.axaml.cs @@ -4,16 +4,69 @@ using Avalonia.Controls; using Avalonia.Platform.Storage; using Avalonia.Controls.Primitives; using Avalonia.Interactivity; +using Avalonia.Controls.Platform; namespace PostIt.Views.Blogs; public partial class BlogsPage : ContentPage { + private IInputPane? _inputPane; + public BlogsPage() { InitializeComponent(); } + protected override void OnLoaded(RoutedEventArgs e) + { + base.OnLoaded(e); + + // Récupère l'accès au TopLevel de la fenêtre/application + var topLevel = TopLevel.GetTopLevel(this); + if (topLevel != null) + { + _inputPane = topLevel!.InputPane; + if (_inputPane != null) + { + // S'abonne aux changements d'état du clavier virtuel + _inputPane.StateChanged += OnInputPaneStateChanged; + + // Applique la configuration initiale si le clavier est déjà présent + UpdateLayoutForKeyboard(_inputPane.OccludedRect.Height); + } + } + } + + protected override void OnUnloaded(RoutedEventArgs e) + { + if (_inputPane != null) + { + _inputPane.StateChanged -= OnInputPaneStateChanged; + } + base.OnUnloaded(e); + } + + + private void UpdateLayoutForKeyboard(double keyboardHeight) + { + double visibleHeight = this.Bounds.Height - keyboardHeight; + if (keyboardHeight > 0) + { + DraftArticleTextEditor.MaxHeight = visibleHeight; + } + else + { + DraftArticleTextEditor.MaxHeight = double.PositiveInfinity; + } + } + + private void OnInputPaneStateChanged(object? sender, InputPaneStateEventArgs e) + { + // e.EndRect contient le rectangle final du clavier virtuel + // e.EndRect.Height vous donne sa hauteur exacte en pixels indépendants du périphérique (pixels logiques) + UpdateLayoutForKeyboard(e.EndRect.Height); + } + protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); diff --git a/src/Yavsc.Org/wwwroot/css/site.css b/src/Yavsc.Org/wwwroot/css/site.css index 2e4720ff3..bafc2d571 100644 --- a/src/Yavsc.Org/wwwroot/css/site.css +++ b/src/Yavsc.Org/wwwroot/css/site.css @@ -1 +1,4 @@ -.user-icon{max-width:1.5em;max-height:1.5em}.card{padding:.5em} +.user-icon { + max-width: 1.5em; + max-height: 1.5em; +} diff --git a/src/Yavsc.Org/wwwroot/css/site.scss b/src/Yavsc.Org/wwwroot/css/site.scss index 546aac220..1bf7a4d34 100644 --- a/src/Yavsc.Org/wwwroot/css/site.scss +++ b/src/Yavsc.Org/wwwroot/css/site.scss @@ -1,7 +1,4 @@ -.user-icon { +user-icon { max-width: 1.5em; max-height: 1.5em; } -.card { - padding: .5em; -}