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' +