Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
ccdce63
feat(ios): add textAlignment
kacperzolkiewski Jan 29, 2026
9e157ed
feat: add parsing from html into input
kacperzolkiewski Jan 29, 2026
178c83d
feat: separate alignment logic to AlignmentUtils
kacperzolkiewski Jan 29, 2026
6823e42
fix: android build
kacperzolkiewski Jan 30, 2026
6640463
Merge branch 'main' into @kacperzolkiewski/text-alignment
kacperzolkiewski Feb 2, 2026
6d2bf85
fix: layout for ZWS
kacperzolkiewski Mar 10, 2026
7dc4737
Merge branch 'main' into @kacperzolkiewski/text-alignment
kacperzolkiewski Mar 11, 2026
51b54d5
fix: add alignment to Toolbar
kacperzolkiewski Mar 11, 2026
a0e9f64
Merge branch 'main' into @kacperzolkiewski/text-alignment
kacperzolkiewski Mar 25, 2026
d978723
fix: review changes
kacperzolkiewski Mar 26, 2026
962b042
Merge branch 'main' into @kacperzolkiewski/text-alignment
kacperzolkiewski Apr 30, 2026
161ff8c
fix: resolve conflicts in parser
kacperzolkiewski Apr 30, 2026
e62df66
fix: alignment after mataatributes remake
kacperzolkiewski May 6, 2026
e21de1f
Merge branch 'main' into @kacperzolkiewski/text-alignment
kacperzolkiewski May 6, 2026
869ce6d
fix: refactor alignment to style
kacperzolkiewski May 7, 2026
76734f3
fix: removing checkboxList
kacperzolkiewski May 7, 2026
e7d5b8e
fix: preserve aignment during typing attributes reset
kacperzolkiewski May 7, 2026
bea7294
fix: alignment detection
kacperzolkiewski May 8, 2026
521fdc2
fix: remove unused code
kacperzolkiewski May 8, 2026
b09f68b
Merge branch 'main' into @kacperzolkiewski/text-alignment
kacperzolkiewski May 8, 2026
aef3a57
fix: cursor alignment for empty lines
kacperzolkiewski May 11, 2026
98d7873
fix: placeholder alignment
kacperzolkiewski May 11, 2026
8f81868
fix: linting
kacperzolkiewski May 11, 2026
3c8b79e
test: add e2e tests for alignment
kacperzolkiewski May 11, 2026
9e6b747
Merge branch 'main' into @kacperzolkiewski/text-alignment
kacperzolkiewski May 12, 2026
de44d13
feat: add text alignment for paragraph
kacperzolkiewski May 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
appId: swmansion.enriched.example
tags:
- ios-only
---
# Visually validates text alignment rendering
- launchApp

- tapOn:
id: 'toggle-screen-button'

- tapOn:
id: 'editor-input'

# Left-aligned text
- inputText: 'Left aligned'
- pressKey: Enter

# Centre-aligned
- tapOn:
id: 'toolbar-align-center'
- inputText: 'Centre aligned'
- pressKey: Enter

# Heading 4
- tapOn:
id: 'toolbar-heading-6'
- inputText: 'Heading 6'
- pressKey: Enter

# Right-aligned text
- tapOn:
id: 'toolbar-align-right'
- inputText: 'Right aligned'
- pressKey: Enter

# List with right-aligned items
- tapOn:
id: 'toolbar-ordered-list'
- inputText: 'Element 1'
- pressKey: Enter
- inputText: 'Element 2'

- runFlow:
file: '../subflows/capture_or_assert_screenshot.yaml'
env:
SCREENSHOT_NAME: 'paragraph_styles_alignment'
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
30 changes: 30 additions & 0 deletions .maestro/enrichedText/flows/alignment_visual.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
appId: swmansion.enriched.example
---
# Validates that text alignment is displayed correctly
- launchApp

- tapOn:
id: 'toggle-screen-button'

- tapOn:
id: 'toggle-enriched-text-screen-button'

- runFlow:
file: '../subflows/set_enriched_text_value.yaml'
env:
VALUE: >
<html>
<p>Left aligned</p>
<p style="text-align: center">Centre aligned</p>
<h6 style="text-align: center">Heading 6</h6>
<p style="text-align: right">Right aligned</p>
<ol style="text-align: right">
<li>Element 1</li>
<li>Element 2</li>
</ol>
</html>

- runFlow:
file: '../subflows/capture_or_assert_screenshot.yaml'
env:
SCREENSHOT_NAME: 'alignment_visual'
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.swmansion.enriched.common.parser

import com.swmansion.enriched.common.spans.EnrichedAlignmentSpan
import com.swmansion.enriched.common.spans.EnrichedBlockQuoteSpan
import com.swmansion.enriched.common.spans.EnrichedBoldSpan
import com.swmansion.enriched.common.spans.EnrichedCheckboxListSpan
Expand All @@ -21,6 +22,8 @@ import com.swmansion.enriched.common.spans.EnrichedUnderlineSpan
import com.swmansion.enriched.common.spans.EnrichedUnorderedListSpan

interface EnrichedSpanFactory<T> {
fun createAlignmentSpan(cssValue: String): EnrichedAlignmentSpan

fun createBoldSpan(style: T): EnrichedBoldSpan

fun createItalicSpan(style: T): EnrichedItalicSpan
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.swmansion.enriched.common.spans

import android.text.Layout
import android.text.style.AlignmentSpan

open class EnrichedAlignmentSpan(
val cssValue: String,
) : AlignmentSpan.Standard(cssValueToLayoutAlignment(cssValue)) {
companion object {
fun cssValueToLayoutAlignment(cssValue: String): Layout.Alignment =
when (cssValue) {
"center" -> Layout.Alignment.ALIGN_CENTER
"right" -> Layout.Alignment.ALIGN_OPPOSITE
else -> Layout.Alignment.ALIGN_NORMAL
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.swmansion.enriched.text

import com.swmansion.enriched.common.parser.EnrichedSpanFactory
import com.swmansion.enriched.common.spans.EnrichedAlignmentSpan
import com.swmansion.enriched.text.spans.EnrichedTextAlignmentSpan
import com.swmansion.enriched.text.spans.EnrichedTextBlockQuoteSpan
import com.swmansion.enriched.text.spans.EnrichedTextBoldSpan
import com.swmansion.enriched.text.spans.EnrichedTextCheckboxListSpan
Expand All @@ -22,6 +24,8 @@ import com.swmansion.enriched.text.spans.EnrichedTextUnderlineSpan
import com.swmansion.enriched.text.spans.EnrichedTextUnorderedListSpan

class EnrichedTextSpanFactory : EnrichedSpanFactory<EnrichedTextStyle> {
override fun createAlignmentSpan(cssValue: String) = EnrichedTextAlignmentSpan(cssValue)

override fun createBoldSpan(style: EnrichedTextStyle) = EnrichedTextBoldSpan(style)

override fun createItalicSpan(style: EnrichedTextStyle) = EnrichedTextItalicSpan(style)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.swmansion.enriched.text.spans

import com.swmansion.enriched.common.spans.EnrichedAlignmentSpan

class EnrichedTextAlignmentSpan(
cssValue: String,
) : EnrichedAlignmentSpan(cssValue)
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.swmansion.enriched.textinput

import com.swmansion.enriched.common.parser.EnrichedSpanFactory
import com.swmansion.enriched.common.spans.EnrichedAlignmentSpan
import com.swmansion.enriched.common.spans.EnrichedCheckboxListSpan
import com.swmansion.enriched.common.spans.EnrichedImageSpan
import com.swmansion.enriched.textinput.spans.EnrichedInputAlignmentSpan
import com.swmansion.enriched.textinput.spans.EnrichedInputBlockQuoteSpan
import com.swmansion.enriched.textinput.spans.EnrichedInputBoldSpan
import com.swmansion.enriched.textinput.spans.EnrichedInputCheckboxListSpan
Expand All @@ -25,6 +27,8 @@ import com.swmansion.enriched.textinput.spans.EnrichedInputUnorderedListSpan
import com.swmansion.enriched.textinput.styles.HtmlStyle

class EnrichedTextInputSpannableFactory : EnrichedSpanFactory<HtmlStyle> {
override fun createAlignmentSpan(cssValue: String) = EnrichedInputAlignmentSpan(cssValue)

override fun createBoldSpan(style: HtmlStyle) = EnrichedInputBoldSpan(style)

override fun createItalicSpan(style: HtmlStyle) = EnrichedInputItalicSpan(style)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import com.swmansion.enriched.textinput.spans.EnrichedInputImageSpan
import com.swmansion.enriched.textinput.spans.EnrichedLineHeightSpan
import com.swmansion.enriched.textinput.spans.EnrichedSpans
import com.swmansion.enriched.textinput.spans.interfaces.EnrichedInputSpan
import com.swmansion.enriched.textinput.styles.AlignmentStyles
import com.swmansion.enriched.textinput.styles.HtmlStyle
import com.swmansion.enriched.textinput.styles.InlineStyles
import com.swmansion.enriched.textinput.styles.ListStyles
Expand Down Expand Up @@ -85,6 +86,7 @@ class EnrichedTextInputView :
val paragraphStyles: ParagraphStyles? = ParagraphStyles(this)
val listStyles: ListStyles? = ListStyles(this)
val parametrizedStyles: ParametrizedStyles? = ParametrizedStyles(this)
val alignmentStyles: AlignmentStyles? = AlignmentStyles(this)
var isDuringTransaction: Boolean = false
var isRemovingMany: Boolean = false
var scrollEnabled: Boolean = true
Expand Down Expand Up @@ -962,6 +964,14 @@ class EnrichedTextInputView :
parametrizedStyles?.setMentionSpan(text, indicator, attributes)
}

fun setTextAlignment(alignment: String) {
runAsATransaction {
alignmentStyles?.setAlignment(alignment)
}
selection?.validateStyles()
layoutManager.invalidateLayout()
}

fun requestHTML(requestId: Int) {
val html =
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,13 @@ class EnrichedTextInputViewManager :
view?.requestHTML(requestId)
}

override fun setTextAlignment(
view: EnrichedTextInputView?,
alignment: String,
) {
view?.setTextAlignment(alignment)
}

override fun measure(
context: Context,
localData: ReadableMap?,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.swmansion.enriched.textinput.spans

import com.swmansion.enriched.common.spans.EnrichedAlignmentSpan

class EnrichedInputAlignmentSpan(
cssValue: String,
) : EnrichedAlignmentSpan(cssValue)
Loading