{"id":15015916,"url":"https://github.com/josemarluedke/frontile","last_synced_at":"2025-10-04T18:46:27.857Z","repository":{"id":35704194,"uuid":"219031296","full_name":"josemarluedke/frontile","owner":"josemarluedke","description":"Component Library for Ember Octane apps","archived":false,"fork":false,"pushed_at":"2025-10-03T15:57:43.000Z","size":17678,"stargazers_count":56,"open_issues_count":11,"forks_count":19,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-10-03T17:56:42.237Z","etag":null,"topics":["component-library","components","design-system","ember","ember-octane","emberjs","glimmer-component","glimmerjs","hacktoberfest","tailwindcss"],"latest_commit_sha":null,"homepage":"https://frontile.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/josemarluedke.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-11-01T17:23:28.000Z","updated_at":"2025-10-02T15:55:52.000Z","dependencies_parsed_at":"2024-01-21T06:20:21.579Z","dependency_job_id":"144e71f9-d1c3-4d1b-8c7d-8ecfc678c60b","html_url":"https://github.com/josemarluedke/frontile","commit_stats":{"total_commits":960,"total_committers":13,"mean_commits":73.84615384615384,"dds":0.1489583333333333,"last_synced_commit":"e7de187ae973022aa39fe5088dbd612db890fe4a"},"previous_names":[],"tags_count":100,"template":false,"template_full_name":null,"purl":"pkg:github/josemarluedke/frontile","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josemarluedke%2Ffrontile","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josemarluedke%2Ffrontile/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josemarluedke%2Ffrontile/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josemarluedke%2Ffrontile/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/josemarluedke","download_url":"https://codeload.github.com/josemarluedke/frontile/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josemarluedke%2Ffrontile/sbom","scorecard":{"id":113944,"data":{"date":"2025-08-11","repo":{"name":"github.com/josemarluedke/frontile","commit":"52ddb491816fe26b92e0c69cc2cfacb1f73c7b61"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/18 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":"Maintained","score":10,"reason":"30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/release-drafter.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":"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":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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":"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/ci.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/josemarluedke/frontile/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/josemarluedke/frontile/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-drafter.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/josemarluedke/frontile/release-drafter.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-drafter.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/josemarluedke/frontile/release-drafter.yml/main?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction 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":"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":"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 21 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":1,"reason":"9 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-whgm-jr23-g3j9","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-gcx4-mw62-g8wm","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6"],"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-15T21:47:21.234Z","repository_id":35704194,"created_at":"2025-08-15T21:47:21.234Z","updated_at":"2025-08-15T21:47:21.234Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278219771,"owners_count":25950350,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-03T02:00:06.070Z","response_time":53,"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":["component-library","components","design-system","ember","ember-octane","emberjs","glimmer-component","glimmerjs","hacktoberfest","tailwindcss"],"created_at":"2024-09-24T19:48:08.829Z","updated_at":"2025-10-04T18:46:27.833Z","avatar_url":"https://github.com/josemarluedke.png","language":"TypeScript","funding_links":[],"categories":["Design Systems","Packages"],"sub_categories":["UI libs"],"readme":"\u003cimg width=\"978\" alt=\"github-readme\" src=\"https://user-images.githubusercontent.com/230476/99427114-dacf1f80-28b9-11eb-929f-c3aaa70dadd2.png\"\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/josemarluedke/frontile/actions?query=workflow%3ACI\"\u003e\u003cimg src=\"https://github.com/josemarluedke/frontile/workflows/CI/badge.svg\" alt=\"Build Status\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/josemarluedke/frontile/blob/main/LICENSE.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"GitHub license\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n**Under active development.**\n\nA modern, accessible, and extensible component library for Ember.js, built with Tailwind Variants for highly customizable styling.\n\n## 🚀 Features\n\n- _Fully Customizable_ – Uses Tailwind CSS with Tailwind Variants for styling.\n- _Accessible Components_ – Follows best practices for a11y.\n- _Composable \u0026 Extensible_ – Designed to be customized and extended to fit any design system.\n- _Built for Ember_ – Seamless integration with Ember Octane \u0026 Glimmer components.\n- _TypeScript \u0026 Glint Support_ – Fully typed templates with Glint for a better developer experience.\n- _Dark \u0026 Light Mode Support_ – Theme-aware components that automatically adapt.\n\n## 📖 Documentation\n\nVisit [frontile.dev](https://frontile.dev/) to read the docs and see live demos.\n\n### Usage\n\n```gjs\nimport Component from '@glimmer/component';\nimport { Button } from '@frontile/buttons';\n\nexport default class Example extends Component {\n  onClick = () =\u003e {\n    alert('Button clicked!');\n  };\n\n  \u003ctemplate\u003e\n    \u003cButton @intent='primary' @size='lg' @onClick={{this.onClick}}\u003e\n      Click Me\n    \u003c/Button\u003e\n  \u003c/template\u003e\n}\n```\n\n```gjs\nimport Component from '@glimmer/component';\nimport { Select } from '@frontile/forms';\n\nconst options = [\n  { key: 'apple', label: 'Apple' },\n  { key: 'banana', label: 'Banana' },\n  { key: 'cherry', label: 'Cherry' }\n];\n\nexport default class Example extends Component {\n  selectedKey = null;\n\n  onSelectionChange = (key) =\u003e {\n    this.selectedKey = key;\n  };\n\n  \u003ctemplate\u003e\n    \u003cSelect\n      @items={{options}}\n      @selectedKey={{this.selectedKey}}\n      @onSelectionChange={{this.onSelectionChange}}\n      @isFilterable={{true}}\n    /\u003e\n  \u003c/template\u003e\n}\n```\n\n## 🎨 Styling\n\n### Tailwind CSS\n\nFrontile is built on Tailwind CSS, a utility-first CSS framework that allows you to quickly style components without writing custom styles.\n\nBy default, Frontile components come with sensible defaults using Tailwind classes, but you can override styles using Tailwind’s utility classes.\n\n```gjs\n\u003cButton @class=\"bg-blue-500 text-white hover:bg-blue-600\"\u003e\n  Custom Styled Button\n\u003c/Button\u003e\n```\n\n### Tailwind Variants\n\nFor more structured and reusable styling, Frontile uses [Tailwind Variants](https://www.tailwind-variants.org/).\nThis approach makes it easier to manage component styling, support variants, and apply conditional styles.\n\n```ts\nimport { registerCustomStyles, tv } from '@frontile/theme';\n\nregisterCustomStyles({\n  button: tv({\n    base: 'rounded px-4 py-2 font-semibold transition-all',\n    variants: {\n      intent: {\n        primary: 'bg-blue-500 text-white hover:bg-blue-600',\n        secondary: 'bg-gray-500 text-white hover:bg-gray-600'\n      },\n      size: {\n        sm: 'text-sm py-1 px-2',\n        lg: 'text-lg py-3 px-6'\n      }\n    },\n    defaultVariants: {\n      intent: 'primary',\n      size: 'lg'\n    }\n  })\n});\n```\n\nFrontile components internally use Tailwind Variants, but you can override them by passing `@classes`. Class conflicts are handled automatically by Tailwind Variants.\n\n```gjs\nimport { Avatar } from '@frontile/utilities';\nimport { hash } from '@ember/helper';\n\n\u003ctemplate\u003e\n  \u003cAvatar\n    @name='Jon Snow'\n    @classes={{hash\n      base='bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500 text-white'\n    }}\n  /\u003e\n\u003c/template\u003e\n```\n\n## 💡 Contributing\n\n1. Fork the repository.\n2. Create a feature branch (git checkout -b my-feature).\n3. Commit your changes (git commit -m 'feat: Add new feature').\n4. Push to the branch (git push origin my-feature).\n5. Open a Pull Request.\n\n## 🛠️ Development\n\nClone the repository:\n\n```sh\ngit clone https://github.com/josemarluedke/frontile.git\ncd frontile\npnpm install\n```\n\nRun the test suite:\n\n```sh\npnpm test\n```\n\nRun the test app:\n\n```sh\npnpm start\n```\n\nBuild all packages:\n\n```sh\npnpm build\n```\n\n## 📜 License\n\nThis project is licensed under the [MIT License](LICENSE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosemarluedke%2Ffrontile","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjosemarluedke%2Ffrontile","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosemarluedke%2Ffrontile/lists"}