diff --git a/modules/ui_icons_library/src/Controller/IconsetsController.php b/modules/ui_icons_library/src/Controller/IconsetsController.php
new file mode 100644
index 0000000..40f69f8
--- /dev/null
+++ b/modules/ui_icons_library/src/Controller/IconsetsController.php
@@ -0,0 +1,67 @@
+getIconsets();
+ foreach ($iconsets as $iconset_id => $label) {
+ $iconset = \Drupal::service('strategy.manager.iconset')->getInstance($iconset_id);
+ $icons = $iconset->getIcons();
+ $icons_id = array_keys($icons);
+ $icons_id = array_slice($icons_id, 0, static::OVERVIEW_SLICE);
+ $build[] = [
+ '#type' => 'html_tag',
+ '#tag' => 'h2',
+ '#value' => $label,
+ ];
+ foreach ($icons_id as $icon_id) {
+ $build[] = $iconset->build($icon_id);
+ }
+ $build[] = [
+ '#type' => 'html_tag',
+ '#tag' => 'p',
+ 0 => [
+ '#type' => 'link',
+ '#title' => $this->t("View more"),
+ '#url' => Url::fromRoute('ui_icons.single', ["iconset_id" => $iconset_id]),
+ ],
+ ];
+ }
+
+ return $build;
+ }
+
+ /**
+ * Display icons.
+ *
+ * @return array
+ * Return render array.
+ */
+ public function single(string $iconset_id) {
+ $build = [];
+ $iconset = \Drupal::service('strategy.manager.iconset')->getInstance($iconset_id);
+ $icons = $iconset->getIcons();
+ foreach ($icons as $icon_id => $icon) {
+ $build[] = $iconset->build($icon_id);
+ }
+ return $build;
+ }
+
+}
diff --git a/modules/ui_icons_library/ui_icons_library.info.yml b/modules/ui_icons_library/ui_icons_library.info.yml
new file mode 100644
index 0000000..d26f39c
--- /dev/null
+++ b/modules/ui_icons_library/ui_icons_library.info.yml
@@ -0,0 +1,7 @@
+name: Iconset Library
+type: module
+description: 'A sous module of UI Icons to display icons library'
+core_version_requirement: ^9 || ^10
+package: Custom
+dependencies:
+ - ui_icons:ui_icons
diff --git a/modules/ui_icons_library/ui_icons_library.routing.yml b/modules/ui_icons_library/ui_icons_library.routing.yml
new file mode 100644
index 0000000..6d937a2
--- /dev/null
+++ b/modules/ui_icons_library/ui_icons_library.routing.yml
@@ -0,0 +1,24 @@
+#ui_suite.index:
+# path: '/admin/appearance/ui-libraries'
+# defaults:
+# _controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
+# _title: 'UI libraries'
+# requirements:
+# _permission: 'access content'
+
+ui_icons.overview:
+ path: '/icons'
+ defaults:
+ _controller: '\Drupal\ui_icons_library\Controller\IconsetsController::overview'
+ _title: 'Iconsets library'
+ requirements:
+ _permission: 'access content'
+
+ui_icons.single:
+ path: '/icons/{iconset_id}'
+ defaults:
+ _controller: '\Drupal\ui_icons_library\Controller\IconsetsController::single'
+ _title: 'Iconset details'
+ requirements:
+ _permission: 'access content'
+
diff --git a/src/Asset/CodepointsAsset.php b/src/Asset/CodepointsAsset.php
new file mode 100644
index 0000000..354b645
--- /dev/null
+++ b/src/Asset/CodepointsAsset.php
@@ -0,0 +1,68 @@
+icons = $this->fetchCodepoints($url);
+ }
+
+ /**
+ *
+ */
+ protected function fetchCodepoints(string $url): array {
+ $icons = [];
+
+ $data = file_get_contents($url);
+ if ($data === FALSE) {
+ return [];
+ }
+
+ $lines = explode("\n", $data);
+ foreach ($lines as $line) {
+ if (empty($line)) {
+ continue;
+ }
+ [$icon_id, $codepoint] = explode(' ', $line);
+ $icons[$icon_id] = [
+ 'label' => $icon_id,
+ ];
+ }
+ return $icons;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getIcons() {
+ return $this->icons;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getIcon($icon_id) {
+ return $this->icons[$icon_id] ?? FALSE;
+ }
+
+}
diff --git a/src/Controller/IconDisplayController.php b/src/Controller/IconDisplayController.php
deleted file mode 100644
index 44258ab..0000000
--- a/src/Controller/IconDisplayController.php
+++ /dev/null
@@ -1,39 +0,0 @@
-getIconsets();
- foreach ($iconsets as $iconset_id=>$label) {
- $iconset = \Drupal::service('strategy.manager.iconset')->getInstance($iconset_id);
- $icons = $iconset->getIcons();
- $build[] = [
- '#type' => 'html_tag',
- '#tag' => 'h2',
- '#value' => $label,
-];
- foreach ($icons as $icon_id => $icon) {
- $build[] = $iconset->build($icon_id);
- }
-}
- return $build;
- }
-
-}
diff --git a/src/Controller/IconsetsController.php b/src/Controller/IconsetsController.php
new file mode 100644
index 0000000..e69de29
diff --git a/src/Plugin/IconHandler/CustomIconHandler.php b/src/Plugin/IconHandler/CustomIconHandler.php
deleted file mode 100644
index b3d9bbc..0000000
--- a/src/Plugin/IconHandler/CustomIconHandler.php
+++ /dev/null
@@ -1 +0,0 @@
-configuration;
+ return [
+ '#type' => 'inline_template',
+ "#template" => $config['template'],
+ "#context" => [
+ 'icon_id' => $icon_id,
+ ],
+ "#attached" => [
+ "library" => [
+ $config['library'],
+ ],
+ ],
+ ];
+ }
+
+ /**
+ *
+ */
+ public function getJsSettings() {
+ // @todo Implement getJsSettings() method.
+ return [];
+ }
+
+ /**
+ *
+ */
+ public function formatJson(AssetInterface $asset) {
+ // @todo Implement formatJson() method.
+ // return [];
+ $icons = $asset->getIcons();
+ $formatted_icons = [];
+
+ foreach ($icons as $icon_id => $icon_data) {
+ $formatted_icons[] = [
+ 'id' => $icon_id,
+ 'label' => $icon_data['label'],
+ ];
+ }
+
+ return json_encode($formatted_icons);
+ }
+
+}
diff --git a/tests/modules/ui_icons_test/ui_icons_test.iconset.yml b/tests/modules/ui_icons_test/ui_icons_test.iconset.yml
new file mode 100644
index 0000000..a8bb271
--- /dev/null
+++ b/tests/modules/ui_icons_test/ui_icons_test.iconset.yml
@@ -0,0 +1,78 @@
+bootstrap_icons:
+ label: 'Bootstrap Icons'
+ plugin: 'svg'
+ assets:
+ - '/libraries/bootstrap-icons/icons'
+
+dsfr:
+ label: 'DSFR'
+ plugin: 'svg'
+ assets:
+ - '/libraries/dsfr/src/core/icon'
+
+remixicons:
+ label: 'Remix Icons'
+ plugin: 'svg'
+ assets:
+ - '/libraries/remixicons/icons'
+ - '/libraries/remixicons/fonts/remixicon.symbol.svg'
+ - 'https://cdn.jsdelivr.net/npm/remixicon@2.5.0/fonts/remixicon.symbol.svg'
+
+tailwind:
+ label: 'Tailwind'
+ plugin: 'svg'
+ assets:
+ - '/libraries/heroicons/optimized/24/outline'
+ - '/libraries/heroicons/src/24/solid'
+
+uswsd:
+ label: 'US Web Design System'
+ plugin: 'svg'
+ assets:
+ - '/libraries/uswds/packages/usa-icon/src/img/usa-icons-bg'
+ - '/libraries/uswds/packages/usa-icon/src/img/uswds-icons'
+
+material_icons_outlined:
+ label: 'Material Icons Outlined'
+ plugin: 'codepoints'
+ config:
+ template : '{{ icon_id }}'
+ library: 'ui_icons_test/material'
+ assets:
+ - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsOutlined-Regular.codepoints'
+
+material_icons_round:
+ label: 'Material Icons Round'
+ plugin: 'codepoints'
+ config:
+ template: '{{ icon_id }}'
+ library: 'ui_icons_test/material'
+ assets:
+ - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsRound-Regular.codepoints'
+
+material_icons_sharp:
+ label: 'Material Icons Sharp'
+ plugin: 'codepoints'
+ config:
+ template: '{{ icon_id }}'
+ library: 'ui_icons_test/material'
+ assets:
+ - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsSharp-Regular.codepoints'
+
+material_icons_two_tone:
+ label: 'Material Icons Two Tone'
+ plugin: 'codepoints'
+ config:
+ template: '{{ icon_id }}'
+ library: 'ui_icons_test/material'
+ assets:
+ - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIconsTwoTone-Regular.codepoints'
+
+material_icons_filled:
+ label: 'Material Icons'
+ plugin: 'codepoints'
+ config:
+ template: '{{ icon_id }}'
+ library: 'ui_icons_test/material'
+ assets:
+ - 'https://raw.githubusercontent.com/google/material-design-icons/master/font/MaterialIcons-Regular.codepoints'
diff --git a/tests/modules/ui_icons_test/ui_icons_test.info.yml b/tests/modules/ui_icons_test/ui_icons_test.info.yml
new file mode 100644
index 0000000..b97111d
--- /dev/null
+++ b/tests/modules/ui_icons_test/ui_icons_test.info.yml
@@ -0,0 +1,10 @@
+name: 'UI Icons Test'
+type: module
+description: 'A custom module to display icons using Iconset'
+core_version_requirement: ^9 || ^10
+package: Custom
+dependencies:
+ - iconset:iconset
+ - ui_icons:ui_icons
+ - ui_icons_library:ui_icons_library
+
diff --git a/tests/modules/ui_icons_test/ui_icons_test.libraries.yml b/tests/modules/ui_icons_test/ui_icons_test.libraries.yml
new file mode 100644
index 0000000..23b6b70
--- /dev/null
+++ b/tests/modules/ui_icons_test/ui_icons_test.libraries.yml
@@ -0,0 +1,4 @@
+material:
+ css:
+ base:
+ https://cdn.jsdelivr.net/npm/material-icons@1.13.12/iconfont/material-icons.min.css: {}
diff --git a/ui_icons.iconset.yml b/ui_icons.iconset.yml
deleted file mode 100644
index 751ede1..0000000
--- a/ui_icons.iconset.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-bootstrap_icons:
- label: 'Bootstrap Icons'
- plugin: 'svg'
- assets:
- - '/libraries/bootstrap-icons/house.svg'
- - '/libraries/bootstrap-icons/people.svg'
-remix_icons:
- label: 'Remix Icons'
- plugin: 'svg'
- assets:
- - '/libraries/remixicon/arrow-left-up-line.svg'
- - '/libraries/remixicon/mail-line.svg'
diff --git a/ui_icons.routing.yml b/ui_icons.routing.yml
index 9f0560b..bde43bc 100644
--- a/ui_icons.routing.yml
+++ b/ui_icons.routing.yml
@@ -1,7 +1,24 @@
-ui_icons_display.display:
- path: '/admin/config/media/iconset/icon-display'
+ui_suite.index:
+ path: '/admin/appearance/ui-libraries'
defaults:
- _controller: '\Drupal\ui_icons\Controller\IconDisplayController::display'
- _title: 'Bootstrap Icon Display'
+ _controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
+ _title: 'UI libraries'
+ requirements:
+ _permission: 'access patterns page+access_ui_styles_library+access_ui_examples_library'
+
+ui_icons.overview:
+ path: '/icons'
+ defaults:
+ _controller: '\Drupal\ui_icons\Controller\IconsetsController::overview'
+ _title: 'Iconsets library'
+ requirements:
+ _permission: 'access content'
+
+ui_icons.single:
+ path: '/icons/{iconset_id}'
+ defaults:
+ _controller: '\Drupal\ui_icons\Controller\IconsetsController::single'
+ _title: 'Iconset details'
requirements:
_permission: 'access content'
+