{"id":13401714,"url":"https://github.com/aberkow/a11y-menu","last_synced_at":"2026-01-21T02:38:21.306Z","repository":{"id":47999597,"uuid":"125371628","full_name":"aberkow/a11y-menu","owner":"aberkow","description":null,"archived":false,"fork":false,"pushed_at":"2023-01-05T11:22:36.000Z","size":2754,"stargazers_count":26,"open_issues_count":22,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-10-28T12:51:30.402Z","etag":null,"topics":["accessibility","composer","javascript","menus","wordpress-menu"],"latest_commit_sha":null,"homepage":"https://aberkow.github.io/a11y-menu/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aberkow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-15T13:30:42.000Z","updated_at":"2024-11-21T11:01:19.000Z","dependencies_parsed_at":"2023-02-04T03:04:34.865Z","dependency_job_id":null,"html_url":"https://github.com/aberkow/a11y-menu","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/aberkow/a11y-menu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aberkow%2Fa11y-menu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aberkow%2Fa11y-menu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aberkow%2Fa11y-menu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aberkow%2Fa11y-menu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aberkow","download_url":"https://codeload.github.com/aberkow/a11y-menu/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aberkow%2Fa11y-menu/sbom","scorecard":{"id":160541,"data":{"date":"2025-08-11","repo":{"name":"github.com/aberkow/a11y-menu","commit":"8484b8bd9e8dd949e034d585da01df34afc561cb"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.2,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/19 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/main.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/aberkow/a11y-menu/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/aberkow/a11y-menu/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/aberkow/a11y-menu/main.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/main.yml:15","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 13 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"86 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-4w2v-q235-vp99","Warn: Project is vulnerable to: GHSA-cph5-m8f7-6c5x","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-w8qv-6jwh-64r5","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-897m-rjf5-jp39","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-r7jx-5m6m-cpg9","Warn: Project is vulnerable to: GHSA-r9p9-mrjm-926w","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-j4f2-536g-r55m","Warn: Project is vulnerable to: GHSA-r7qp-cfhv-p84w","Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-8r6j-v8pm-fqw3","Warn: Project is vulnerable to: MAL-2023-462","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-r8f7-9pfq-mjmv","Warn: Project is vulnerable to: GHSA-6fx8-h7jm-663j","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-hwj9-h5mp-3pm3","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-7mwh-4pqv-wmr8","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-fxwf-4rqh-v8g3","Warn: Project is vulnerable to: GHSA-25hc-qcg6-38wj","Warn: Project is vulnerable to: GHSA-xfhh-g9f5-x4m4","Warn: Project is vulnerable to: GHSA-qm95-pgcg-qqfq","Warn: Project is vulnerable to: GHSA-cqmj-92xf-r6r9","Warn: Project is vulnerable to: GHSA-vx3p-948g-6vhq","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-r628-mhmh-qjhw","Warn: Project is vulnerable to: GHSA-9r2w-394v-53qc","Warn: Project is vulnerable to: GHSA-qq89-hq3f-393p","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-394c-5j6w-4xmx","Warn: Project is vulnerable to: GHSA-78cj-fxph-m83p","Warn: Project is vulnerable to: GHSA-fhg7-m89q-25r3","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-72mh-269x-7mh5","Warn: Project is vulnerable to: GHSA-h4j5-c7cj-74xg","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T13:17:09.961Z","repository_id":47999597,"created_at":"2025-08-16T13:17:09.961Z","updated_at":"2025-08-16T13:17:09.961Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28623690,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T23:49:58.628Z","status":"online","status_checked_at":"2026-01-21T02:00:08.227Z","response_time":86,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility","composer","javascript","menus","wordpress-menu"],"created_at":"2024-07-30T19:01:06.177Z","updated_at":"2026-01-21T02:38:21.302Z","avatar_url":"https://github.com/aberkow.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# a11y Menu\nThis project aims to create a re-useable and accessible main navigation module. There are a few goals...\n- Be able to include this package as a standalone or in a WordPress plugin/theme\n- Allow for quick implementation of accessible menus\n- Menus should allow for developer customization particularly with respect to style\n- Menu functionality should take into account different modes of user input (e.g. mouse, keyboard)\n\n## Usage\n### Installing via NPM\nThis package can be installed via npm using `npm install a11y-menu`. This will provide access to the JS and sass files, but _not_ the WordPress menu walker. The intention is to give javascript developers access to the JS menu walker, navigation script, and styles in a way that can be used with webpack or other bundlers.\n\n### Creating a menu via JS\nThere are two functions and one stylesheet that can be used together to create an accessible menu.\n\n- `displayMenu`\n- `Navigation`\n- main.scss\n\n`displayMenu()` takes a json file (see /mock-data below for the format). It can be imported and used as follows\n```js\nimport { displayMenu } from 'a11y-menu';\n// testData is an arbitrary json file.\nimport { menu } from './test-data.json';\nconst mainMenu = document.getElementById('main-menu');\n\ndisplayMenu(mainMenu, menu); \n```\nThis can be combined with the `Navigation` class to create a working menu with submenus that display on either click or hover events.\n\n```js\n// clickable menu\nimport Navigation, { displayMenu } from 'a11y-menu';\n// testData is an arbitrary json file.\nimport { menu } from './test-data.json';\nconst mainMenu = document.getElementById('main-menu');\n\nmainMenu.classList.add('am-click-menu');\n\ndisplayMenu(mainMenu, menu);\n\nconst navigation = new Navigation({ click: true });\n\ndocument.addEventListener('DOMContentLoaded', () =\u003e {\n    navigation.init();\n});\n\n```\n```js\n// hoverable menu\nimport Navigation, { displayMenu } from 'a11y-menu';\n// testData is an arbitrary json file.\nimport { menu } from './test-data.json';\n\nconst mainMenu = document.getElementById('main-menu');\n\n// if needed\nmainMenu.classList.remove('am-click-menu');\n\ndisplayMenu(mainMenu, menu);\n\nconst navigation = new Navigation();\n\ndocument.addEventListener('DOMContentLoaded', () =\u003e {\n    navigation.init();\n});\n\n```\n\n`main.scss` can be required using webpack or similar. Another option is to include in your project the transpiled css file that can be found at `dist/main.css`.\n\n\n### Installing via Composer.\nThis package can be installed as a dependency via [Composer](https://getcomposer.org/). To check if you have Composer installed, run the `composer` command in the terminal. If Composer's not available, install it. Then within your project run `composer require ucomm/a11y-menu`.\n### Creating a menu with PHP\nFor non-WordPress PHP projects, you can use the [`aberkow/a11y-menu-php` composer package](https://github.com/aberkow/a11y-menu-php). The package takes the place of the javascript `displayMenu` function for PHP projects. It can be installed with `composer require aberkow/a11y-menu-php` and exposes a single static method which can be used like this:\n```php\n\u003c?php\n\nrequire('vendor/autoload.php');\n$data = file_get_contents('path/to/file.json');\n$menu = json_decode($data)-\u003emenu;\n\n?\u003e\n\u003cnav id=\"am-navigation\"\u003e\n  \u003cul id=\"am-php-menu\"\u003e\n    \u003c?php echo A11y\\Menu_Generator::display_menu($menu); ?\u003e\n  \u003c/ul\u003e\n\u003c/nav\u003e\n```\n### Creating a WordPress menu in a theme.\nIn order to use the custom Walker within your theme, you'll need to do the following\n```php\n// functions.php\nrequire_once('vendor/autoload.php');\n\n// register a menu location. \n// this is optional if you're using a child theme with pre-registered locations\nfunction register_nav() {\n  register_nav_menu('menu-name', __('Menu Name', 'text-domain'));\n}\nadd_action('after_setup_theme', 'register_nav');\n\n\nfunction load_scripts() {\n  // enqueue the base nav styles\n  wp_enqueue_style('a11y-menu', get_stylesheet_directory_uri() . '/vendor/ucomm/a11y-menu/dist/main.css');\n  // register/enqueue the JS Navigation script\n  wp_register_script('a11y-menu', get_stylesheet_directory_uri() . '/vendor/ucomm/a11y-menu/dist/Navigation.js', array(), false, true);\n\n  wp_enqueue_script('a11y-menu');\n\n  // the Navigation script is a dependency of the script where you wish to instantiate the class.\n  wp_enqueue_script('theme-script', get_stylesheet_directory_uri() . '/index.js', array('a11y-menu', false, true));\n}\nadd_action('wp_enqueue_scripts', 'load_scripts');\n```\n\n```php\n/**\n * header.php (or whichever file you want to use for displaying the menu)\n * \n * container -\u003e this should be set to 'nav' for better accessibility and to make sure the CSS works.\n * items_wrap -\u003e ensures that you can use a custom ID for the \u003cul\u003e element.\n * menu_id -\u003e The ID should be prefixed with 'am-' to act as a namespace. \n *  For instance, 'am-main-menu' is the default ID used by the Navigation JS class.\n *  However this can be overridden if you like\n * walker -\u003e the instance of the walker class\n */\n$args = array(\n  'container' =\u003e 'nav',\n  'items_wrap' =\u003e '\u003cul id=\"%1$s\" class=\"nav navbar-nav %2$s\"\u003e%3$s\u003c/ul\u003e',\n  'menu_id' =\u003e 'am-main-menu',\n  'theme_location' =\u003e 'menu-name',\n  'walker' =\u003e new A11y\\Menu_Walker()\n);\nwp_nav_menu($args);\n```\n\n```js\n/**\n* \n* the main index.js file or wherever you wish to instantiate the Navigation class.\n* see below for overriding the constructor defaults.\n*/\n\ndocument.addEventListener('DOMContentLoaded', () =\u003e {\n  const navigation = new Navigation();\n  navigation.init();\n})\n```\n\n### Javascript Defaults\nThe constructor comes with the following defaults. These can be overridden as needed\n- `menuId` - the default is `'am-main-menu'`\n- `click` - the default is `false`\n\n### Most basic case\nThe `Navigation` class is designed to be as simple to use as possible. In order to use it, create a new `Navigation` constructor and assign it to a variable. Inside of an event listener, use the `init` method on the the instance. This implementation will create a **hover** menu.\n```javascript\nconst navigation = new Navigation();\ndocument.addEventListener('DOMContentLoaded', () =\u003e {\n  navigation.init();\n})\n```\n\n### Overridding defaults\nDefaults can be overridden individually or together.\n```javascript\nconst menuOpts = {\n  // assumes a \u003cul\u003e with an id of 'am-my-navigation'\n  menuId: 'am-my-navigation',\n  click: true\n}\nconst navigation = new Navigation(menuOpts);\n```\nThis will create a nav menu with an id of `main-nav` and it will use the `click` functionality instead of hover.\n\n## Sass defaults\nThe stylesheet provided is meant to provide a skeleton on which to add additional styles (e.g. colors, padding, etc...). An example of adding icons is provided in `src/scss/icon-styles.scss`. These styles will override the baseline text icons in favor of Font Awesome icons.\n\nOverriding and changing the styles of the menu is as easy as either making the selectors more specific or placing your custom styles lower in the cascade. Greater specificity can be achieved by using the provided `am-` class names.\n\n## Development\nTo begin developing\n\n- `npm install`\n- `npm run develop`\n\nThis will begin watching the js and scss files and place them in the appropriate directories. `Navigation.js` and `main.scss` will be transpiled and sent to `/dist`. Serving `/public/index.html` will read those files from the `/dist` directory.\n\n## Production\nTo create a new production version run `npm run build`.\n\n## Structure\n\n### /public\n#### index.html\nLoads two examples of the menu for testing. The first example is created via javascript. The second is hardcoded into the file. This is to test how the menu responds when javascript is not available.\n#### /build\nBuilt assets from `/src` will be placed here and used by `index.html`\n#### /css and /js\nThese are examples of overrides/additions for the base css and/or js can be tested here. This is especially useful for styling since the base styles that are created are largely unopinionated.\n\n### /src\n#### /js/Navigation\nThe class that\n- handles event listeners/handlers\n- assigns icons to menu items with dropdowns\n- initializes the menu interaction\n\n#### /js/utils\nExports a helper function to create a menu based on a tree-like json file\n\n#### /mock-data\njson files to create menus. The structure of items in the test file needs to be\n```json\n{\n  \"name\": \"Menu Item\",\n  \"slug\": \"menu-item\",\n  \"link\": \"/menu-item\",\n  \"sub\": null, // or array of menu item objects\n  \"classes\": [\"an\", \"array\", \"of\", \"class\", \"names\"] \n}\n```\nThe `sub` and `classes` keys are optional.\n#### /scss\nBase styles for the menu.\n### gulp.js\nWatches and builds js/scss files as appropriate.\n### webpack.config.js\nHandles bundling for local testing.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faberkow%2Fa11y-menu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faberkow%2Fa11y-menu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faberkow%2Fa11y-menu/lists"}