diff --git a/package-lock.json b/package-lock.json index cfa0149da..3c0092be3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "@wordpress/env": "^10.9.0", "@wordpress/eslint-plugin": "^21.2.0", "@wordpress/i18n": "^5.9.0", + "@wordpress/icons": "^10.9.0", "@wordpress/interactivity": "^6.9.0", "@wordpress/plugins": "^7.9.0", "@wordpress/scripts": "^30.1.0", @@ -8456,7 +8457,6 @@ "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.9.0.tgz", "integrity": "sha512-mAkqhlbbPiuR6yBOczunqyxQ2Pez1XB7gAZnnsP5DlTKsYnJQ12N0Ql4Oh8f1LI+UeF18VMtHes12sWK/1LQHQ==", "dev": true, - "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "^7.16.0", "@wordpress/element": "^6.9.0", diff --git a/package.json b/package.json index 7173e3550..a12a5a72a 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "@wordpress/env": "^10.9.0", "@wordpress/eslint-plugin": "^21.2.0", "@wordpress/i18n": "^5.9.0", + "@wordpress/icons": "^10.9.0", "@wordpress/interactivity": "^6.9.0", "@wordpress/plugins": "^7.9.0", "@wordpress/scripts": "^30.1.0", diff --git a/src/components/Icon.js b/src/components/Icon.js new file mode 100644 index 000000000..4cc982e4f --- /dev/null +++ b/src/components/Icon.js @@ -0,0 +1,69 @@ +/** + * WordPress dependencies. + */ +import { + Icon as IconComponent, + // eslint-disable-next-line @wordpress/no-unsafe-wp-apis + __experimentalZStack as ZStack, +} from '@wordpress/components'; +import { sprintf } from '@wordpress/i18n'; + +/** + * Icon Component + * + * This functional component renders an icon depending on the passed `iconName` prop, and layers it with a "nametag" icon. + * The component leverages the WordPress `` component for rendering both the main icon and the name tag icon. + * + * Component Structure: + * - `OtherIcon`: Renders the main icon using the passed `iconName`. + * - `NameTagIcon`: Always renders a fixed "nametag" icon. + * - Both icons are stacked using the `ZStack` component, allowing for a visually layered effect. + * + * Styling: + * - The name tag icon is styled using the accent color of + * the currently selected WordPress admin color scheme + * via the `--wp-components-color-accent` CSS variable. + * + * Example usage: + * ```jsx + * + * ``` + * + * Original reference from the WordPress `` component: + * https://github.com/WordPress/gutenberg/blob/bbdf1a7f39dd75f672fe863c9d8ac7bf8faa874b/packages/components/src/icon/index.tsx#L54C2-L54C44 + * + * @param {Object} props - The props for the component. + * @param {string} [props.iconName] - The name of the icon to display. + * + * @return {JSX.Element} A rendered icon, optionally layered with a name tag. + */ + +const { + Icon, +} = ({ iconName }) => { + const BaseSize = 'string' === typeof iconName ? 20 : 24; + const NameTagSize = 12; // BaseSize/2; + const NameTagMargin = sprintf('-$%dpx', BaseSize / 4); + + const NameTagIcon = () => ( + + ); + const OtherIcon = () => ; + + return ( + + +
+ +
+
+ ); +}; + +export { Icon };