{"id":28823356,"url":"https://github.com/loba-b/react-equal-height","last_synced_at":"2025-09-14T20:15:29.195Z","repository":{"id":143905182,"uuid":"239954265","full_name":"loba-b/react-equal-height","owner":"loba-b","description":"Compares element heights and sets the highest","archived":false,"fork":false,"pushed_at":"2025-05-17T22:24:04.000Z","size":45121,"stargazers_count":18,"open_issues_count":1,"forks_count":9,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-29T20:06:24.783Z","etag":null,"topics":["component-library","dom-manipulation","dynamic-height","equal-height","frontend","height","height-matching","nextjs","react","react-hooks","react-server-components","responsive","sort-elements","typescript","web-development"],"latest_commit_sha":null,"homepage":"","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/loba-b.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2020-02-12T07:45:10.000Z","updated_at":"2025-06-17T06:34:03.000Z","dependencies_parsed_at":"2025-06-18T19:53:34.884Z","dependency_job_id":null,"html_url":"https://github.com/loba-b/react-equal-height","commit_stats":{"total_commits":27,"total_committers":4,"mean_commits":6.75,"dds":"0.18518518518518523","last_synced_commit":"e9931acdcb5fc6ec7e827290ed607976ceaee38f"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/loba-b/react-equal-height","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loba-b%2Freact-equal-height","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loba-b%2Freact-equal-height/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loba-b%2Freact-equal-height/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loba-b%2Freact-equal-height/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/loba-b","download_url":"https://codeload.github.com/loba-b/react-equal-height/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loba-b%2Freact-equal-height/sbom","scorecard":{"id":596551,"data":{"date":"2025-08-11","repo":{"name":"github.com/loba-b/react-equal-height","commit":"a4a8b972f993d570f7e23649bc827e7e46c2b997"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"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":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":"Code-Review","score":0,"reason":"Found 1/28 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":"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":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 4 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"}}]},"last_synced_at":"2025-08-20T23:16:54.016Z","repository_id":143905182,"created_at":"2025-08-20T23:16:54.017Z","updated_at":"2025-08-20T23:16:54.017Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275160370,"owners_count":25415767,"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-09-14T02:00:10.474Z","response_time":75,"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","dom-manipulation","dynamic-height","equal-height","frontend","height","height-matching","nextjs","react","react-hooks","react-server-components","responsive","sort-elements","typescript","web-development"],"created_at":"2025-06-19T00:08:19.603Z","updated_at":"2025-09-14T20:15:29.170Z","avatar_url":"https://github.com/loba-b.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# React Equal Height\n\nManages a dynamic collection of UI elements, enabling efficient tracking, updating, and synchronization of their maximum\nheights. It supports operations like adding, removing, and updating elements within the collection. Additionally, the\napplication allows grouping elements by rows, making it ideal for complex interfaces where elements' sizes and positions\nneed to be consistently managed and adjusted in real-time.\u003cbr\u003eProtected by the 'use client' directive, ensuring\ncompatibility with React Server Components and Next.js.\u003cbr\u003e\u003cbr\u003e\n\u003cb\u003eLong story short:\u003c/b\u003e Compares heights of elements and sets the highest.\n\n## Installation\n\n```bash\nnpm i react-equal-height\n```\n\n**What's new in version 2**\n\n\u003e New `equalRows` option. Checks other elements within the same row and sets the highest height value only for elements\n\u003e within that specific row.\u003cbr\u003e\n\n\u003e New `\u003cEqualHeightHolder\u003e` component. A helper for the new `equalRows` option\n\n**Migrate from version 1.x.x into 2.x.x**\n\n\u003e Minimal changes are required, primarily to props:\n\u003e\n\u003e - The `tag` prop has been replaced by `as` in `EqualHeightElement`\n\u003e - The `updateOnChange` prop now only accepts an array based on `DependencyList`\n\u003e - The class name `equal-height-JlocK` has been updated to `equal-height-wrapper`\n\n## Compatibility\n- React 19+: use version `^2.19.0`\n- React 18: use `react-equal-height@react-18` (== `2.18.0`)\n- React \u003c18: use `react-equal-height@1.3.1` (without `equalRows` functionality)\n\n## Library import\n\n| Library                    | Size    | Description                                                                                                                                                                                                                                                                               |\n|----------------------------|:--------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `react-equal-height`       | 17,6 kB | Library with \u003cb\u003estyles\u003c/b\u003e that will be loaded startup to the `\u003cstyle\u003e` tag                                                                                                                                                                                                               |\n| `react-equal-height/clean` | 13,6 kB | Library without \u003cb\u003estyles\u003c/b\u003e. It can be useful for SSR or to remove overhead for script with loading styles\u003cbr /\u003e\u003cbr /\u003eStyles needs to be added:\u003cul\u003e\u003cli\u003eby itself (copy below styles to your project styles)\u003c/li\u003e\u003cli\u003e\u003cb\u003eOR\u003c/b\u003e\u003c/li\u003e\u003cli\u003eby import `clean/main.css` from package\u003c/li\u003e\u003c/ul\u003e |\n\n#### Styles\n\n```css\n.equal-height-wrapper {\n    display: block;\n    overflow: hidden;\n    transition-property: height;\n}\n```\n\n## Components\n\n- **EqualHeight** - container holding all elements subject to height synchronization\n- **EqualHeightHolder** - groups elements into rows to facilitate row-wise height alignment\n- **EqualHeightElement** - represents each individual element whose height will be calculated\n- **EqualHeightContext** - library context\n\n## Automatic height recalculation triggers\n\n- adding an element\n- removing an element\n- updating an element\n- resizing the window or container\n- dynamically moving elements\n\n## Usage\n\n```tsx\nimport React from 'react';\nimport {EqualHeight, EqualHeightElement} from 'react-equal-height';\n\nconst App = () =\u003e {\n    return (\n        \u003cEqualHeight\u003e\n            \u003cEqualHeightElement name=\"Name\"\u003e\n                \u003cp\u003e\n                    Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n                    Proin nibh augue, suscipit a, scelerisque sed, lacinia in,\n                    mi. Cras vel lorem.\n                \u003c/p\u003e\n            \u003c/EqualHeightElement\u003e\n            \u003cEqualHeightElement name=\"Name\"\u003e\n                \u003cp\u003e\n                    Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n                    Proin nibh augue, suscipit a, scelerisque sed, lacinia in,\n                    mi. Cras vel lorem.\n                \u003c/p\u003e\n                \u003cp\u003e\n                    tiam pellentesque aliquet tellus. Phasellus pharetra nulla\n                    ac diam. Quisque semper justo at risus. Donec venenatis,\n                    turpis vel hendrerit interdum, dui ligula ultricies purus,\n                    sed posuere libero dui id orci.\n                \u003c/p\u003e\n            \u003c/EqualHeightElement\u003e\n        \u003c/EqualHeight\u003e\n    );\n};\n\nexport default App;\n```\n\n## Props\n\n### EqualHeight\n\n| Prop             |       Default        | Required  |         Type          | Description                                                                                        |\n|------------------|:--------------------:|:---------:|:---------------------:|:---------------------------------------------------------------------------------------------------|\n| `id`             |   random generated   | **false** |        string         | Unique identifier for the group of elements.                                                       |\n| `as`             |                      | **false** |        string         | By default, no HTML tag will be generated. The component will be only Provider.                    |\n| `timeout`        |       **200**        | **false** |        number         | time (in milliseconds) to recalculate heights                                                      |\n| `animationSpeed` | **0.25**\u003cbr\u003e(second) | **false** | number / string`s/ms` | time of animation for height change (in milliseconds) \u003cbr /\u003e (**0**: disable)                      |\n| `updateOnChange` |        **[]**        | **false** |       unknown[]       | it's a part of \u003cb\u003euseEffect\u003c/b\u003e deps so in \u003cb\u003eupdateOnChange\u003c/b\u003e can be passed anything they allow |\n| `equalRows`\\*    |      **false**       | **false** |   boolean / number    | enables grouping elements by rows and accepts a number as the alignment tolerance in pixels.       |\n| `developerMode`  |      **false**       | **false** |   boolean / `DEEP`    | enables additional logging and warnings useful for development and debugging                       |\n\n\u003e The `equalRows` option checks if elements are aligned at the same height relative to the viewport, using the\n`getBoundingClientRect` method.\n\u003e By default, the height for each element is calculated from the `EqualHeightElement`. However, if an element is wrapped\n\u003e in an `EqualHeightHolder`,\n\u003e its height will instead be calculated from the `EqualHeightHolder`.\n\u003e\n\u003e Keep in mind that if a single row contains a mix of elements with and without `EqualHeightHolder`,\n\u003e style differences might result in varying heights for elements in the same row.\n\u003e In such cases, I recommend consistent use of `EqualHeightHolder` across the entire group.\n\u003e\n\u003e Additionally, you can set a margin of error (in px) for `equalRows` to define an acceptable tolerance level.\n\n### EqualHeightHolder\n\n| Prop | Default | Required  |  Type  | Description |\n|------|:-------:|:---------:|:------:|:------------|\n| `as` |         | **false** | string | type of tag |\n\n### EqualHeightElement\n\n| Prop          |  Default  | Required  |  Type   | Description                                                |\n|---------------|:---------:|:---------:|:-------:|:-----------------------------------------------------------|\n| `name`        |           | **true**  | string  | all heights of elements with the same name are comparing   |\n| `as`          |  **div**  | **false** | string  | type of tag                                                |\n| `placeholder` | **false** | **false** | boolean | to keeping height in place where element not exist         |\n| `disable`     | **false** | **false** | boolean | disables `EqualHeightElement` (children are still passing) |\n\n### Custom event (experimental)\n\n| Event Name    | Payload                                                                                                                              | Description                                                                                                                                           |\n|---------------|--------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `EqualHeight` | \u003cpre\u003e{\u003cbr\u003e \"id\": string;\u003cbr\u003e \"elements\": Array\u003c{\u003cbr\u003e \"name\": string;\u003cbr\u003e \"height\": number;\u003cbr\u003e \"position\": number;\u003cbr\u003e }\u003e\u003cbr\u003e}\u003c/pre\u003e | Dispatches when height recalculation occurs. `id` helps distinguish between groups of elements, and `elements` contains the maximum heights to align. |\n\n## More usage example\n\n### Basic example with EqualHeightHolder component\n\n```tsx\nimport React from 'react';\nimport {\n    EqualHeight,\n    EqualHeightHolder,\n    EqualHeightElement,\n} from 'react-equal-height';\n\nconst App = () =\u003e {\n    return (\n        \u003cEqualHeight\u003e\n            \u003cEqualHeightHolder\u003e\n                \u003cEqualHeightElement name=\"Base_1\"\u003e\n                    \u003ch3\u003eBase_1_1\u003c/h3\u003e\n                    \u003cp\u003e\n                        Lorem Ipsum is simply dummy text of the printing and\n                        typesetting industry.\n                    \u003c/p\u003e\n                \u003c/EqualHeightElement\u003e\n            \u003c/EqualHeightHolder\u003e\n            \u003cEqualHeightHolder\u003e\n                \u003cEqualHeightElement name=\"Base_1\"\u003e\n                    \u003ch3\u003eBase_1_2\u003c/h3\u003e\n                    \u003cp\u003e\n                        Lorem Ipsum is simply dummy text of the printing and\n                        typesetting industry.\n                    \u003c/p\u003e\n                    \u003cp\u003e\n                        Lorem Ipsum is simply dummy text of the printing and\n                        typesetting industry.\n                    \u003c/p\u003e\n                \u003c/EqualHeightElement\u003e\n            \u003c/EqualHeightHolder\u003e\n        \u003c/EqualHeight\u003e\n    );\n};\n\nexport default App;\n```\n\n### Update by 'dependencies change'\n\n```tsx\nimport React from 'react';\nimport {EqualHeight, EqualHeightElement} from 'react-equal-height';\n\nconst App = () =\u003e {\n    const [updateOnChange, setUpdateOnChange] = useState(false);\n\n    return (\n        \u003cEqualHeight updateOnChange={[updateOnChange]}\u003e\n            \u003cEqualHeightElement name=\"Base_1\"\u003e\n                \u003ch3\u003eBase_1_1\u003c/h3\u003e\n                \u003cp\u003e\n                    Lorem Ipsum is simply dummy text of the printing and\n                    typesetting industry.\n                \u003c/p\u003e\n            \u003c/EqualHeightElement\u003e\n            \u003cEqualHeightElement name=\"Base_1\"\u003e\n                \u003ch3\u003eBase_1_2\u003c/h3\u003e\n                \u003cp\u003e\n                    Lorem Ipsum is simply dummy text of the printing and\n                    typesetting industry.\n                \u003c/p\u003e\n                \u003cp\u003e\n                    Lorem Ipsum is simply dummy text of the printing and\n                    typesetting industry.\n                \u003c/p\u003e\n            \u003c/EqualHeightElement\u003e\n        \u003c/EqualHeight\u003e\n    );\n};\n\nexport default App;\n```\n\n### Update by 'dependencies change'\n\n```tsx\nimport React from 'react';\nimport {EqualHeight, EqualHeightElement} from 'react-equal-height';\n\nconst App = () =\u003e {\n    const [updateOnChange, setUpdateOnChange] = useState(false);\n\n    return (\n        \u003cEqualHeight updateOnChange={[updateOnChange]}\u003e\n            \u003cEqualHeightElement name=\"Base_1\"\u003e\n                \u003ch3\u003eBase_1_1\u003c/h3\u003e\n                \u003cp\u003e\n                    Lorem Ipsum is simply dummy text of the printing and\n                    typesetting industry.\n                \u003c/p\u003e\n            \u003c/EqualHeightElement\u003e\n            \u003cEqualHeightElement name=\"Base_1\"\u003e\n                \u003ch3\u003eBase_1_2\u003c/h3\u003e\n                \u003cp\u003e\n                    Lorem Ipsum is simply dummy text of the printing and\n                    typesetting industry.\n                \u003c/p\u003e\n                \u003cp\u003e\n                    Lorem Ipsum is simply dummy text of the printing and\n                    typesetting industry.\n                \u003c/p\u003e\n            \u003c/EqualHeightElement\u003e\n        \u003c/EqualHeight\u003e\n    );\n};\n\nexport default App;\n```\n\n### Update by 'forceUpdate' method\n\n```tsx\nimport React, {useContext} from 'react';\nimport {\n    EqualHeight,\n    EqualHeightContext,\n    EqualHeightElement,\n    useEqualHeightContext,\n} from 'react-equal-height';\n\nconst ComponentWithContext = () =\u003e {\n    const context = useEqualHeightContext();\n\n    return \u003cbutton onClick={context?.forceUpdate}\u003eForce update\u003c/button\u003e;\n};\n\nconst App = () =\u003e {\n    return (\n        \u003cEqualHeight\u003e\n            \u003cComponentWithContext/\u003e\n            \u003cEqualHeightElement name=\"Name\"\u003e\n                \u003cLoadImage/\u003e\n                \u003cp\u003e\n                    Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n                    Proin nibh augue, suscipit a, scelerisque sed, lacinia in,\n                    mi. Cras vel lorem.\n                \u003c/p\u003e\n            \u003c/EqualHeightElement\u003e\n            \u003cEqualHeightElement name=\"Name\"\u003e\n                \u003cp\u003e\n                    Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n                    Proin nibh augue, suscipit a, scelerisque sed, lacinia in,\n                    mi. Cras vel lorem.\n                \u003c/p\u003e\n                \u003cp\u003e\n                    tiam pellentesque aliquet tellus. Phasellus pharetra nulla\n                    ac diam. Quisque semper justo at risus. Donec venenatis,\n                    turpis vel hendrerit interdum, dui ligula ultricies purus,\n                    sed posuere libero dui id orci.\n                \u003c/p\u003e\n            \u003c/EqualHeightElement\u003e\n        \u003c/EqualHeight\u003e\n    );\n};\n\nexport default App;\n```\n\n## Image examples\n\n### Basic\n\n\u003e All elements in the same group are equal\n\n![Basic example](doc/base.gif)\n\n### Basic\n\n`equalRows: true`\n\n\u003e All elements in the same group and same row are equal\n\n![Basic2 example](doc/base--rows.gif)\n\n### Placeholder\n\n`equalRows: true`\n\n\u003e All elements in the same group and same row are equal, also element marked as `placeholder`\n\n![Placeholder example](doc/placeholder--rows.gif)\n\n### Disable\n\n`equalRows: true`\n\n\u003e All elements in the same group and same row are equal, except element marked as `disable`\n\n![Disable example](doc/disable--rows.gif)\n\n### Holder\n\n`equalRows: true` and `EqualHeightHolder` component used\n\n\u003e All elements in the same group and row are equal. Thanks to the EqualHeightHolder, we were able to treat `Base_2_1`,\n`Base_1_1`, and `Base_1_2` as elements in the same row.\n\n![Holder example](doc/holder--rows.gif)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Floba-b%2Freact-equal-height","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Floba-b%2Freact-equal-height","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Floba-b%2Freact-equal-height/lists"}