├── .editorconfig ├── .formatter.exs ├── .github ├── release.yml ├── renovate.json └── workflows │ └── ci.yml ├── .gitignore ├── .tool-versions ├── LICENSE ├── README.md ├── assets ├── flagpack.eex └── flags │ ├── ABW.svg │ ├── AFG.svg │ ├── AGO.svg │ ├── AIA.svg │ ├── ALA.svg │ ├── ALB.svg │ ├── AND.svg │ ├── ARE.svg │ ├── ARG.svg │ ├── ARM.svg │ ├── ASM.svg │ ├── ATA.svg │ ├── ATF.svg │ ├── ATG.svg │ ├── AUS.svg │ ├── AUT.svg │ ├── AZE.svg │ ├── BDI.svg │ ├── BEL.svg │ ├── BEN.svg │ ├── BFA.svg │ ├── BGD.svg │ ├── BGR.svg │ ├── BHR.svg │ ├── BHS.svg │ ├── BIH.svg │ ├── BLM.svg │ ├── BLR.svg │ ├── BLZ.svg │ ├── BMU.svg │ ├── BOL.svg │ ├── BQ-BO.svg │ ├── BQ-SA.svg │ ├── BQ-SE.svg │ ├── BRA.svg │ ├── BRB.svg │ ├── BRN.svg │ ├── BTN.svg │ ├── BVT.svg │ ├── BWA.svg │ ├── CAF.svg │ ├── CAN.svg │ ├── CCK.svg │ ├── CHE.svg │ ├── CHL.svg │ ├── CHN.svg │ ├── CIV.svg │ ├── CMR.svg │ ├── COD.svg │ ├── COG.svg │ ├── COK.svg │ ├── COL.svg │ ├── COM.svg │ ├── CPV.svg │ ├── CRI.svg │ ├── CUB.svg │ ├── CUW.svg │ ├── CYM.svg │ ├── CYP.svg │ ├── CZE.svg │ ├── DEU.svg │ ├── DJI.svg │ ├── DMA.svg │ ├── DNK.svg │ ├── DOM.svg │ ├── ECU.svg │ ├── EGY.svg │ ├── ERI.svg │ ├── ESH.svg │ ├── ESP.svg │ ├── EST.svg │ ├── ETH.svg │ ├── FIN.svg │ ├── FJI.svg │ ├── FLK.svg │ ├── FRA.svg │ ├── FRO.svg │ ├── FSM.svg │ ├── GAB.svg │ ├── GB-ENG.svg │ ├── GB-NIR.svg │ ├── GB-SCT.svg │ ├── GB-UKM.svg │ ├── GB-WLS.svg │ ├── GBR.svg │ ├── GEO.svg │ ├── GGY.svg │ ├── GHA.svg │ ├── GIB.svg │ ├── GIN.svg │ ├── GLP.svg │ ├── GMB.svg │ ├── GNB.svg │ ├── GNQ.svg │ ├── GRC.svg │ ├── GRD.svg │ ├── GRL.svg │ ├── GTM.svg │ ├── GUF.svg │ ├── GUM.svg │ ├── GUY.svg │ ├── HKG.svg │ ├── HMD.svg │ ├── HND.svg │ ├── HRV.svg │ ├── HTI.svg │ ├── HUN.svg │ ├── IDN.svg │ ├── IMN.svg │ ├── IND.svg │ ├── IOT.svg │ ├── IRL.svg │ ├── IRN.svg │ ├── IRQ.svg │ ├── ISL.svg │ ├── ISR.svg │ ├── ITA.svg │ ├── JAM.svg │ ├── JEY.svg │ ├── JOR.svg │ ├── JPN.svg │ ├── KAZ.svg │ ├── KEN.svg │ ├── KGZ.svg │ ├── KHM.svg │ ├── KIR.svg │ ├── KNA.svg │ ├── KOR.svg │ ├── KWT.svg │ ├── LAO.svg │ ├── LBN.svg │ ├── LBR.svg │ ├── LBY.svg │ ├── LCA.svg │ ├── LIE.svg │ ├── LKA.svg │ ├── LSO.svg │ ├── LTU.svg │ ├── LUX.svg │ ├── LVA.svg │ ├── MAC.svg │ ├── MAF.svg │ ├── MAR.svg │ ├── MCO .svg │ ├── MDA.svg │ ├── MDG.svg │ ├── MDV.svg │ ├── MEX.svg │ ├── MHL.svg │ ├── MKD.svg │ ├── MLI.svg │ ├── MLT.svg │ ├── MNE.svg │ ├── MNG.svg │ ├── MNP.svg │ ├── MOZ.svg │ ├── MRT.svg │ ├── MSR.svg │ ├── MTQ.svg │ ├── MUS.svg │ ├── MWI.svg │ ├── MYS.svg │ ├── NAM.svg │ ├── NCL.svg │ ├── NER.svg │ ├── NFK.svg │ ├── NGA.svg │ ├── NIC.svg │ ├── NIU.svg │ ├── NLD.svg │ ├── NOR.svg │ ├── NPL.svg │ ├── NRU.svg │ ├── NZL.svg │ ├── OMN.svg │ ├── PAK.svg │ ├── PAN.svg │ ├── PCN.svg │ ├── PER.svg │ ├── PHL.svg │ ├── PLW.svg │ ├── PNG.svg │ ├── POL.svg │ ├── PRI.svg │ ├── PRK.svg │ ├── PRT.svg │ ├── PRY.svg │ ├── PSE.svg │ ├── PYF.svg │ ├── QAT.svg │ ├── REU.svg │ ├── ROU.svg │ ├── RUS.svg │ ├── RWA.svg │ ├── SAU.svg │ ├── SDN.svg │ ├── SEN.svg │ ├── SGP.svg │ ├── SGS.svg │ ├── SHN.svg │ ├── SJM.svg │ ├── SLB.svg │ ├── SLE.svg │ ├── SLV.svg │ ├── SMR.svg │ ├── SOM.svg │ ├── SPM.svg │ ├── SRB.svg │ ├── SSD.svg │ ├── STP.svg │ ├── SUR.svg │ ├── SVK.svg │ ├── SVN.svg │ ├── SWE.svg │ ├── SWZ.svg │ ├── SXM.svg │ ├── SYC.svg │ ├── SYR.svg │ ├── TCA.svg │ ├── TCD.svg │ ├── TGO.svg │ ├── THA.svg │ ├── TJK.svg │ ├── TKM.svg │ ├── TLS.svg │ ├── TON.svg │ ├── TTO.svg │ ├── TUN.svg │ ├── TUR.svg │ ├── TUV.svg │ ├── TWN.svg │ ├── TZA.svg │ ├── UGA.svg │ ├── UKR.svg │ ├── UMI.svg │ ├── URY.svg │ ├── USA.svg │ ├── UZB.svg │ ├── VAT.svg │ ├── VCT.svg │ ├── VEN.svg │ ├── VGB.svg │ ├── VIR.svg │ ├── VNM.svg │ ├── VUT.svg │ ├── WLF.svg │ ├── WSM.svg │ ├── YEM.svg │ ├── ZAF.svg │ ├── ZMB.svg │ └── ZWE.svg ├── blend.exs ├── blend ├── phoenix_live_view_v0_18 │ └── mix.lock ├── phoenix_live_view_v0_19 │ └── mix.lock ├── phoenix_live_view_v0_20 │ └── mix.lock └── premix.exs ├── lib ├── flagpack.ex ├── helpers.ex └── mix │ └── tasks │ └── build.ex ├── mix.exs ├── mix.lock └── test ├── flagpack_test.exs └── test_helper.exs /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_size = 2 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.formatter.exs: -------------------------------------------------------------------------------- 1 | # Used by "mix format" 2 | [ 3 | line_length: 120, 4 | import_deps: [:phoenix], 5 | plugins: [Phoenix.LiveView.HTMLFormatter], 6 | inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}"] 7 | ] 8 | -------------------------------------------------------------------------------- /.github/release.yml: -------------------------------------------------------------------------------- 1 | changelog: 2 | exclude: 3 | labels: 4 | - ignore-for-release 5 | categories: 6 | - title: 🎉 New features 7 | labels: 8 | - feature 9 | - title: 🚀 Enhancements 10 | labels: 11 | - enhancement 12 | - title: 🐛 Bug fixes 13 | labels: 14 | - bug 15 | - title: 📖 Documentation 16 | labels: 17 | - documentation 18 | - title: 🔄 Dependency updates 19 | labels: 20 | - dependencies 21 | - title: Other changes 22 | labels: 23 | - "*" 24 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "github>Flo0807/renovate-config//base", 5 | ":reviewer(Flo0807)" 6 | ], 7 | "packageRules": [ 8 | { 9 | "matchManagers": [ 10 | "mix" 11 | ], 12 | "rangeStrategy": "update-lockfile" 13 | }, 14 | { 15 | "matchManagers": [ 16 | "github-actions" 17 | ], 18 | "labels": [ 19 | "ignore-for-release" 20 | ] 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | release: 6 | types: [published] 7 | 8 | jobs: 9 | ci: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 13 | 14 | - uses: erlef/setup-beam@8aa8a857c6be0daae6e97272bb299d5b942675a4 # v1.19.0 15 | id: beam 16 | with: 17 | version-file: .tool-versions 18 | version-type: strict 19 | 20 | - name: Restore the deps and _build cache 21 | uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 22 | id: restore-cache 23 | env: 24 | OTP_VERSION: ${{ steps.beam.outputs.otp-version }} 25 | ELIXIR_VERSION: ${{ steps.beam.outputs.elixir-version }} 26 | MIX_LOCK_HASH: ${{ hashFiles('**/mix.lock') }} 27 | with: 28 | path: | 29 | deps 30 | _build 31 | key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-mixlockhash-${{ env.MIX_LOCK_HASH }} 32 | 33 | - name: Install mix dependencies 34 | if: steps.restore-cache.outputs.cache-hit != 'true' 35 | run: mix deps.get 36 | 37 | - name: Compile dependencies 38 | if: steps.restore-cache.outputs.cache-hit != 'true' 39 | run: mix deps.compile 40 | 41 | - name: Compile 42 | run: mix compile --warnings-as-errors --force 43 | 44 | - name: Check Formatting 45 | run: mix format --check-formatted 46 | 47 | - name: Check unused deps 48 | run: mix deps.unlock --check-unused 49 | 50 | - name: Build docs 51 | run: mix docs --warnings-as-errors 52 | 53 | - name: Install mix dependencies for blend 54 | run: mix blend.get 55 | 56 | - name: Run Tests (Phoenix LiveView v0.18) 57 | run: BLEND=phoenix_live_view_v0_18 mix test 58 | 59 | - name: Run Tests (Phoenix LiveView v0.19) 60 | run: BLEND=phoenix_live_view_v0_19 mix test 61 | 62 | - name: Run Tests (Phoenix LiveView v0.20) 63 | run: BLEND=phoenix_live_view_v0_20 mix test 64 | 65 | - name: Run Tests 66 | run: mix test --warnings-as-errors 67 | 68 | - name: Publish package 69 | if: github.event_name == 'release' 70 | env: 71 | HEX_API_KEY: ${{ secrets.HEX_API_KEY }} 72 | run: mix hex.publish --yes 73 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # The directory Mix will write compiled artifacts to. 2 | /_build/ 3 | 4 | # If you run "mix test --cover", coverage assets end up here. 5 | /cover/ 6 | 7 | # The directory Mix downloads your dependencies sources to. 8 | /deps/ 9 | 10 | # Where third-party dependencies like ExDoc output generated docs. 11 | /doc/ 12 | 13 | # Ignore .fetch files in case you like to edit your project deps locally. 14 | /.fetch 15 | 16 | # If the VM crashes, it generates a dump, let's ignore it too. 17 | erl_crash.dump 18 | 19 | # Also ignore archive artifacts (built via "mix archive.build"). 20 | *.ez 21 | 22 | # Ignore package tarball (built via "mix hex.build"). 23 | flagpack-*.tar 24 | 25 | # Temporary files, for example, from tests. 26 | /tmp/ 27 | 28 | .DS_Store 29 | .elixir_ls 30 | 31 | /blend/*/_build 32 | /blend/*/deps 33 | -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | elixir 1.18.4 2 | erlang 27.3.4 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Florian Arens 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flagpack 2 | 3 | [![CI](https://github.com/Flo0807/flagpack_elixir/actions/workflows/ci.yml/badge.svg)](https://github.com/Flo0807/flagpack_elixir/actions/workflows/ci.yml) 4 | [![Hex](https://img.shields.io/hexpm/v/flagpack.svg)](https://hex.pm/packages/flagpack) 5 | [![Hex Docs](https://img.shields.io/badge/hex-docs-green)](https://hexdocs.pm/flagpack/Flagpack.html) 6 | 7 | Flagpack provides 4x3 country flags as `Phoenix.Component`. Based on [flagpack.xyz](https://flagpack.xyz/). 8 | 9 | The generation of the flags is inspired by [heroicons_elixir](https://github.com/mveytsman/heroicons_elixir). 10 | 11 | ## Installation 12 | 13 | The package can be installed by adding `flagpack` to your list of dependencies in `mix.exs`: 14 | 15 | ```elixir 16 | def deps do 17 | [ 18 | {:flagpack, "~> 0.5.0"} 19 | ] 20 | end 21 | ``` 22 | 23 | ## Usage 24 | 25 | Each component accepts an optional class attribute in order to be able to add extra classes to the component. 26 | 27 | ```eex 28 | 29 | 30 | ``` 31 | 32 | You may use the `Flagpack.flag/1` function and pass a flag name. This can be useful when you want to generate the flag name dynamically. 33 | 34 | ```eex 35 | 36 | 37 | ``` 38 | 39 | For additional information and list of all flags see [the docs](https://hexdocs.pm/flagpack/Flagpack.html). 40 | 41 | ## Naming 42 | 43 | The name of a function for a flag is the country's three letter code (ISO 3166-1 alpha-3) in lowercase. You may search for flags here https://flagpack.xyz/docs/flag-index/. 44 | 45 | For Andorra we use the country's two letter code (ISO 3166-1 alpha-2) `ad`, because we are not able to name the function `and`. 46 | -------------------------------------------------------------------------------- /assets/flagpack.eex: -------------------------------------------------------------------------------- 1 | defmodule Flagpack do 2 | @moduledoc """ 3 | Provides 4x3 country flags as `Phoenix.Component`. Based on [flagpack.xyz](https://flagpack.xyz/). 4 | 5 | Each component accepts an optional class attribute in order to be able to add extra classes to the component. 6 | 7 | ## Usage 8 | 9 | 10 | 11 | You may use the `Flagpack.flag/1` function and pass a flag name. 12 | 13 | 14 | 15 | """ 16 | use Phoenix.Component 17 | 18 | attr :class, :string, default: nil, required: false, doc: "class to be added to the component" 19 | attr :name, :atom, required: true, doc: "the name of the flag to be rendered" 20 | 21 | @doc """ 22 | Renders a flag by the given name. 23 | 24 | ## Examples 25 | 26 | 27 | """ 28 | def flag(assigns) do 29 | apply(Flagpack, assigns.name, [assigns]) 30 | end 31 | 32 | <%= for %{func: func, alpha: alpha, svg: svg} <- @flags do %> 33 | @doc """ 34 | Renders the <%= Flagpack.Helpers.country_name_by_alpha(alpha) %> flag. 35 | 36 | ## Examples 37 | /> 38 | class="w-5 h-5" /> 39 | """ 40 | attr :class, :string, default: nil, required: false, doc: "class to be added to the component" 41 | 42 | def <%= func %>(assigns) do 43 | ~H""" 44 |
45 | <%= svg %> 46 |
47 | """ 48 | end 49 | <% end %> 50 | end 51 | -------------------------------------------------------------------------------- /assets/flags/ABW.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ALA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ARE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ARM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ATA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ATF.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ATG.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/AUS.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/AUT.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/AZE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BDI.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BEL.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BEN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BFA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BGD.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BGR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BHR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BHS.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BIH.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BLM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BQ-BO.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BQ-SA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BQ-SE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BRA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BRB.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BVT.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/BWA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CAF.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CAN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CCK.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CHE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CHL.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CHN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CIV.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CMR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/COD.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/COG.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/COK.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/COL.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/COM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CPV.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CRI.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CUB.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CUW.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/CZE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/DEU.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/DJI.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/DNK.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/EGY.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ESH.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/EST.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ETH.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/FIN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/FRA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/FRO.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/FSM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GAB.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GB-ENG.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GB-NIR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GB-SCT.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GB-UKM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GBR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GEO.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GGY.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GHA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GIB.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GIN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GMB.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GNB.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GNQ.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GRC.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GRD.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GRL.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GUF.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/GUY.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/HKG.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/HMD.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/HND.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/HUN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/IDN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/IMN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/IND.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/IRL.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/IRQ.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ISL.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ISR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ITA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/JAM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/JOR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/JPN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/KEN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/KGZ.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/KNA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/KOR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/KWT.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/LAO.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/LBN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/LBR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/LBY.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/LCA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/LSO.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/LTU.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/LUX.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/LVA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MAC.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MAF.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MAR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MCO .svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MDG.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MDV.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MEX.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MHL.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MKD.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MLI.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MLT.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MNG.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MOZ.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MRT.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MUS.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MWI.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/MYS.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/NAM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/NCL.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/NER.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/NGA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/NIC.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/NLD.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/NOR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/NPL.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/NRU.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/OMN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/PAK.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/PAN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/PLW.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/PNG.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/POL.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/PRI.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/PRK.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/PRY.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/PSE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/QAT.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/REU.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ROU.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/RUS.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/RWA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SDN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SEN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SGP.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SJM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SLB.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SLE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SLV.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SOM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SSD.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/STP.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SUR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SVK.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SWE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SYC.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/SYR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TCD.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TGO.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/THA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TJK.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TLS.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TON.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TTO.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TUN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TUR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TUV.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TWN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/TZA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/UGA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/UKR.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/UMI.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/USA.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/UZB.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/VCT.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/VEN.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/VNM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/WLF.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/WSM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/YEM.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ZAF.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/flags/ZWE.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /blend.exs: -------------------------------------------------------------------------------- 1 | %{ 2 | phoenix_live_view_v0_18: [{:phoenix_live_view, "~> 0.18.0"}], 3 | phoenix_live_view_v0_19: [{:phoenix_live_view, "~> 0.19.0"}], 4 | phoenix_live_view_v0_20: [{:phoenix_live_view, "~> 0.20.0"}] 5 | } 6 | -------------------------------------------------------------------------------- /blend/premix.exs: -------------------------------------------------------------------------------- 1 | # This file is autogenerated by blend package. 2 | # 3 | # Run `mix blend.gen.premix` to update it's contents after 4 | # each blend package version update. 5 | 6 | maybe_put_env = fn varname, value -> 7 | System.put_env(varname, System.get_env(varname, value)) 8 | end 9 | 10 | existing_blend = fn name -> 11 | Code.eval_file("blend.exs") 12 | |> elem(0) 13 | |> Map.fetch!(String.to_atom(name)) 14 | end 15 | 16 | blend = System.get_env("BLEND") 17 | 18 | if blend && String.length(blend) > 0 && existing_blend.(blend) do 19 | maybe_put_env.("MIX_LOCKFILE", "blend/#{blend}/mix.lock") 20 | maybe_put_env.("MIX_DEPS_PATH", "blend/#{blend}/deps") 21 | maybe_put_env.("MIX_BUILD_ROOT", "blend/#{blend}/_build") 22 | end 23 | -------------------------------------------------------------------------------- /lib/mix/tasks/build.ex: -------------------------------------------------------------------------------- 1 | defmodule Mix.Tasks.Build do 2 | # Builds a new lib/flagpack.ex based on the flags. 3 | @moduledoc false 4 | @shortdoc false 5 | use Mix.Task 6 | 7 | @target_file Path.join("lib", "flagpack.ex") 8 | 9 | def run(_) do 10 | svg_path = svg_path() 11 | 12 | flags = 13 | svg_path 14 | |> Path.join("*.svg") 15 | |> Path.wildcard() 16 | |> Enum.map(&%{func: function_name(&1), alpha: file_root_name(&1), svg: File.read!(&1)}) 17 | 18 | Mix.Generator.copy_template("assets/flagpack.eex", @target_file, flags: flags, force: true) 19 | 20 | Mix.Task.run("format") 21 | end 22 | 23 | defp file_root_name(file) do 24 | file 25 | |> Path.basename() 26 | |> Path.rootname() 27 | end 28 | 29 | defp function_name(file) do 30 | file 31 | |> file_root_name() 32 | |> String.downcase() 33 | |> do_function_name() 34 | end 35 | 36 | defp do_function_name("and"), do: "ad" 37 | defp do_function_name(rootname), do: rootname |> String.split("-") |> Enum.join("_") 38 | 39 | defp svg_path, do: Path.join("assets", "flags") 40 | end 41 | -------------------------------------------------------------------------------- /mix.exs: -------------------------------------------------------------------------------- 1 | if File.exists?("blend/premix.exs") do 2 | Code.compile_file("blend/premix.exs") 3 | end 4 | 5 | defmodule Flagpack.MixProject do 6 | use Mix.Project 7 | 8 | @source_url "https://github.com/Flo0807/flagpack_elixir" 9 | 10 | defp description do 11 | """ 12 | Provides 4x3 country flags as Phoenix.Component. Based on flagpack. 13 | """ 14 | end 15 | 16 | defp package do 17 | [ 18 | files: ["lib", "mix.exs", "README*", "LICENSE*"], 19 | maintainers: ["Florian Arens"], 20 | licenses: ["MIT"], 21 | links: %{"GitHub" => @source_url}, 22 | name: "flagpack" 23 | ] 24 | end 25 | 26 | def project do 27 | [ 28 | app: :flagpack, 29 | version: "0.5.2", 30 | elixir: "~> 1.16", 31 | start_permanent: Mix.env() == :prod, 32 | deps: deps(), 33 | description: description(), 34 | package: package(), 35 | name: "Flagpack", 36 | source_url: @source_url, 37 | docs: docs() 38 | ] 39 | |> Keyword.merge(maybe_lockfile_option()) 40 | end 41 | 42 | def application do 43 | [ 44 | extra_applications: [:logger] 45 | ] 46 | end 47 | 48 | defp deps do 49 | [ 50 | {:phoenix_live_view, ">= 0.18.0"}, 51 | {:ex_doc, "~> 0.38.0", only: :dev, runtime: false}, 52 | {:blend, "~> 0.5.0", only: :dev} 53 | ] 54 | end 55 | 56 | defp docs do 57 | [ 58 | main: "Flagpack", 59 | source_ref: "main", 60 | source_url_pattern: "#{@source_url}/blob/main/%{path}#L%{line}" 61 | ] 62 | end 63 | 64 | defp maybe_lockfile_option do 65 | case System.get_env("MIX_LOCKFILE") do 66 | nil -> [] 67 | "" -> [] 68 | lockfile -> [lockfile: lockfile] 69 | end 70 | end 71 | end 72 | -------------------------------------------------------------------------------- /test/test_helper.exs: -------------------------------------------------------------------------------- 1 | ExUnit.start() 2 | --------------------------------------------------------------------------------