diff --git a/README.txt b/README.md
similarity index 100%
rename from README.txt
rename to README.md
diff --git a/css/soft_length_limit.css b/css/soft_length_limit.css
index 42c031e352bc583f37185a2c9743828b9347f65f..547a9a258170e9b5655142fe9d72ecddcf50f000 100644
--- a/css/soft_length_limit.css
+++ b/css/soft_length_limit.css
@@ -14,11 +14,11 @@ div.soft-length-limit-tooltip.description {
 /* Min/Enhanced tooltip */
 .fieldset-wrapper .form-item .soft-length-limit-tooltip.min-style-tooltip,
 .field-type-text .form-item .soft-length-limit-tooltip.min-style-tooltip,
-.form-item.form-type-textfield .soft-length-limit-tooltip.min-style-tooltip,
-.form-item.form-type-textarea .soft-length-limit-tooltip.min-style-tooltip {
+.form-item.form-type--textfield .soft-length-limit-tooltip.min-style-tooltip,
+.form-item.form-type--textarea .soft-length-limit-tooltip.min-style-tooltip {
   background-color: transparent;
   background-image: url(../img/ico_socpub_confirm.png);
-  background-position: left top;
+  background-position: left center;
   background-repeat: no-repeat;
   background-size: 15px 15px;
   left: auto !important;
@@ -30,20 +30,20 @@ div.soft-length-limit-tooltip.description {
   right: 10px;
 }
 
-.form-item.form-type-textfield .soft-length-limit-tooltip.min-style-tooltip {
+.form-item.form-type--textfield .soft-length-limit-tooltip.min-style-tooltip {
   margin-left: 5px;
 }
 
 .fieldset-wrapper .form-item .soft-length-limit-tooltip.min-style-tooltip.under-min,
-.form-item.form-type-textfield .soft-length-limit-tooltip.min-style-tooltip.under-min,
+.form-item.form-type--textfield .soft-length-limit-tooltip.min-style-tooltip.under-min,
 .field-type-text .form-item .soft-length-limit-tooltip.min-style-tooltip.under-min,
-.form-item.form-type-textarea .soft-length-limit-tooltip.min-style-tooltip.under-min {
+.form-item.form-type--textarea .soft-length-limit-tooltip.min-style-tooltip.under-min {
   background-image: url(../img/ico_socpub_alert.png);
 }
 
 .fieldset-wrapper .form-item .soft-length-limit-tooltip.min-style-tooltip.exceeded,
-.form-item.form-type-textfield .soft-length-limit-tooltip.min-style-tooltip.exceeded,
+.form-item.form-type--textfield .soft-length-limit-tooltip.min-style-tooltip.exceeded,
 .field-type-text .form-item .soft-length-limit-tooltip.min-style-tooltip.exceeded,
-.form-item.form-type-textarea .soft-length-limit-tooltip.min-style-tooltip.exceeded {
+.form-item.form-type--textarea .soft-length-limit-tooltip.min-style-tooltip.exceeded {
   background-image: url(../img/ico_socpub_alert.png);
 }
diff --git a/modules/soft_length_limit_migrate/soft_length_limit_migrate.info.yml b/modules/soft_length_limit_migrate/soft_length_limit_migrate.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e0a8a1889d527e68fea1ea4a118d032e3ea07e2a
--- /dev/null
+++ b/modules/soft_length_limit_migrate/soft_length_limit_migrate.info.yml
@@ -0,0 +1,5 @@
+name: Soft Length Limit Migrate
+type: module
+description: Migration Support for soft_length_limit
+package: Migrate
+core_version_requirement: ^9 || ^10
diff --git a/modules/soft_length_limit_migrate/soft_length_limit_migrate.module b/modules/soft_length_limit_migrate/soft_length_limit_migrate.module
new file mode 100644
index 0000000000000000000000000000000000000000..85e6276d608f44fe1520c93fdb874d5e1f87b36a
--- /dev/null
+++ b/modules/soft_length_limit_migrate/soft_length_limit_migrate.module
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Soft Length Limit Migrate module.
+ */
+
+use Drupal\migrate\Plugin\MigrateSourceInterface;
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\Row;
+
+/**
+ * Implements hook_migrate_prepare_row().
+ */
+function soft_length_limit_migrate_migrate_prepare_row(Row $row, MigrateSourceInterface $source, MigrationInterface $migration) {
+  // Add migrate support to migrate D7 settings into D8 fields.
+  $text_fields = [
+    'text_textarea',
+    'text_textfield',
+    'text_textarea_with_summary',
+    'text_long',
+  ];
+
+  if ($source->getPluginId() !== 'd7_field_instance_per_form_display' || !in_array($row->getSource()['type'], $text_fields)) {
+    return;
+  }
+
+  $widget_settings = $row->getSourceProperty('widget')['settings'];
+
+  if (!empty($widget_settings['soft_length_limit']) || !empty($widget_settings['soft_length_minimum'])) {
+    $constants = $row->getSourceProperty('constants');
+    $constants['third_party_settings']['soft_length_limit'] = [
+      'max_limit' => $widget_settings['soft_length_limit'],
+      'minimum_limit' => $widget_settings['soft_length_minimum'],
+      'style_select' => $widget_settings['soft_length_style_select'],
+    ];
+    $row->setSourceProperty('constants', $constants);
+  }
+}
diff --git a/phpcs.xml b/phpcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e8433b4b84a1b10b277e530f45985de1a5bbd31f
--- /dev/null
+++ b/phpcs.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleset name="phpcs-standard">
+  <description>Codestyle ruleset for Drupal</description>
+
+  <!-- Specify standards. These assume "composer global require drupal/coder"-->
+  <rule ref="Drupal"/>
+  <rule ref="DrupalPractice"/>
+
+  <!-- Set ignore extensions. -->
+  <!-- @todo remove .css to check also the css files. -->
+  <!-- @see https://www.drupal.org/node/2867601#comment-12075633 -->
+  <arg name="ignore" value="*.css,*.md,*.txt"/>
+
+</ruleset>
diff --git a/soft_length_limit.module b/soft_length_limit.module
index 60fe4e0798fc9bc596a6863ecb72e1b42c077bd1..65648df94df8e7e71bdfceb1230d15fc804b3199 100644
--- a/soft_length_limit.module
+++ b/soft_length_limit.module
@@ -10,58 +10,20 @@ declare(strict_types = 1);
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\WidgetInterface;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\migrate\Plugin\MigrateSourceInterface;
-use Drupal\migrate\Plugin\MigrationInterface;
-use Drupal\migrate\Row;
-
-/**
- * Returns the widget settings that can be used for a soft_length widget.
- *
- * @return array
- *   An array of settings and default values for each textfield type.
- */
-function _soft_length_widget_settings(string $plugin_id): array {
-  $settings = [
-    'string_textfield' => [
-      'max_limit' => TRUE,
-      'minimum_limit' => TRUE,
-      'style_select' => TRUE,
-    ],
-    'string_textarea' => [
-      'max_limit' => TRUE,
-      'minimum_limit' => TRUE,
-      'style_select' => TRUE,
-    ],
-    'text_textfield' => [
-      'max_limit' => TRUE,
-      'minimum_limit' => TRUE,
-      'style_select' => TRUE,
-    ],
-    'text_textarea' => [
-      'max_limit' => TRUE,
-      'minimum_limit' => TRUE,
-      'style_select' => TRUE,
-    ],
-    'text_textarea_with_summary' => [
-      'max_limit' => TRUE,
-      'minimum_limit' => TRUE,
-      'style_select' => TRUE,
-    ],
-  ];
-
-  return $settings[$plugin_id] ?? [];
-}
+use Drupal\soft_length_limit\SoftLengthLimitWidgetSettings;
 
 /**
  * Implements hook_field_widget_third_party_settings_form().
  */
 function soft_length_limit_field_widget_third_party_settings_form(WidgetInterface $plugin, FieldDefinitionInterface $field_definition, $form_mode, $form, FormStateInterface $form_state) {
-  $plugin_id = $plugin->getPluginId();
-  if (!$allowed_settings = _soft_length_widget_settings($plugin_id)) {
-    return NULL;
+  if (!$allowed_settings = SoftLengthLimitWidgetSettings::allowedForPlugin($plugin->getPluginId())) {
+    return;
   }
 
-  $element = [];
+  $element = [
+    '#type' => 'fieldset',
+    '#title' => 'Soft length limit',
+  ];
   if ($allowed_settings['max_limit']) {
     $element['max_limit'] = [
       '#type' => 'number',
@@ -87,9 +49,9 @@ function soft_length_limit_field_widget_third_party_settings_form(WidgetInterfac
   if ($allowed_settings['style_select']) {
     $element['style_select'] = [
       '#type' => 'checkbox',
-      '#title' => t('Enable enhanced view'),
+      '#title' => t('Minimal styling'),
       '#default_value' => $plugin->getThirdPartySetting('soft_length_limit', 'style_select'),
-      '#description' => t('Check this to enable an enhanced view of soft length states.'),
+      '#description' => t('Enable a minimal view of limit state, with icons.'),
       '#weight' => -1,
     ];
   }
@@ -103,10 +65,8 @@ function soft_length_limit_field_widget_third_party_settings_form(WidgetInterfac
 function soft_length_limit_field_widget_settings_summary_alter(&$summary, $context) {
   /* @var \Drupal\Core\Field\WidgetInterface $widget */
   $widget = $context['widget'];
-  $plugin_id = $widget->getPluginId();
-
-  if (!$allowed_settings = _soft_length_widget_settings($plugin_id)) {
-    return NULL;
+  if (!$allowed_settings = SoftLengthLimitWidgetSettings::allowedForPlugin($widget->getPluginId())) {
+    return;
   }
 
   $max_limit = $allowed_settings['max_limit']
@@ -126,7 +86,7 @@ function soft_length_limit_field_widget_settings_summary_alter(&$summary, $conte
     $summary[] = t('Minimum recommended length: @count', ['@count' => $minimum_limit]);
   }
   if ($style_select) {
-    $summary[] = t('Style select: @style', ['@style' => $style_select ? 'Enabled' : 'Disabled']);
+    $summary[] = t('Minimal styling: @style', ['@style' => $style_select ? 'Enabled' : 'Disabled']);
   }
 }
 
@@ -137,7 +97,7 @@ function soft_length_limit_field_widget_single_element_form_alter(&$element, For
   $third_party_settings = $context['widget']->getThirdPartySettings();
 
   if (empty($third_party_settings['soft_length_limit'])) {
-    return NULL;
+    return;
   }
 
   $sll_config = $third_party_settings['soft_length_limit'];
@@ -155,37 +115,8 @@ function soft_length_limit_field_widget_single_element_form_alter(&$element, For
   }
 
   if (isset($element['#type']) && $element['#type'] === 'text_format') {
-    $element['#attributes'] = array_merge_recursive($element['#attributes'], $element['value']['#attributes']);
+    $element['#attributes'] = array_merge_recursive($element['#attributes'] ?? [], $element['value']['#attributes'] ?? []);
   }
 
   $element['#attached']['library'][] = 'soft_length_limit/soft_length_limit';
 }
-
-/**
- * Implements hook_migrate_prepare_row().
- */
-function soft_length_limit_migrate_prepare_row(Row $row, MigrateSourceInterface $source, MigrationInterface $migration) {
-  // Add migrate support to migrate D7 settings into D8 fields.
-  $text_fields = [
-    'text_textarea',
-    'text_textfield',
-    'text_textarea_with_summary',
-    'text_long',
-  ];
-
-  if ($source->getPluginId() !== 'd7_field_instance_per_form_display' || !in_array($row->getSource()['type'], $text_fields)) {
-    return;
-  }
-
-  $widget_settings = $row->getSourceProperty('widget')['settings'];
-
-  if (!empty($widget_settings['soft_length_limit']) || !empty($widget_settings['soft_length_minimum'])) {
-    $constants = $row->getSourceProperty('constants');
-    $constants['third_party_settings']['soft_length_limit'] = [
-      'max_limit' => $widget_settings['soft_length_limit'],
-      'minimum_limit' => $widget_settings['soft_length_minimum'],
-      'style_select' => $widget_settings['soft_length_style_select'],
-    ];
-    $row->setSourceProperty('constants', $constants);
-  }
-}
diff --git a/src/SoftLengthLimitWidgetSettings.php b/src/SoftLengthLimitWidgetSettings.php
new file mode 100644
index 0000000000000000000000000000000000000000..f89b61bc0d5d5e398622d91a03668e725107ffb1
--- /dev/null
+++ b/src/SoftLengthLimitWidgetSettings.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Drupal\soft_length_limit;
+
+/**
+ * Allowed settings helper.
+ */
+class SoftLengthLimitWidgetSettings {
+
+  /**
+   * Returns the widget settings that can be used for a soft_length widget.
+   *
+   * @return array
+   *   An array of settings and default values for each textfield type.
+   */
+  public static function allowedForPlugin(string $plugin_id): array {
+    $settings = [
+      'string_textfield' => [
+        'max_limit' => TRUE,
+        'minimum_limit' => TRUE,
+        'style_select' => TRUE,
+      ],
+      'string_textarea' => [
+        'max_limit' => TRUE,
+        'minimum_limit' => TRUE,
+        'style_select' => TRUE,
+      ],
+      'text_textfield' => [
+        'max_limit' => TRUE,
+        'minimum_limit' => TRUE,
+        'style_select' => TRUE,
+      ],
+      'text_textarea' => [
+        'max_limit' => TRUE,
+        'minimum_limit' => TRUE,
+        'style_select' => TRUE,
+      ],
+      'text_textarea_with_summary' => [
+        'max_limit' => TRUE,
+        'minimum_limit' => TRUE,
+        'style_select' => TRUE,
+      ],
+    ];
+
+    return $settings[$plugin_id] ?? [];
+  }
+
+}