phlex-icons-bootstrap 2.19.0 → 2.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -1
- data/README.md +44 -0
- data/lib/phlex-icons/bootstrap/anthropic.rb +24 -0
- data/lib/phlex-icons/bootstrap/apple_music.rb +24 -0
- data/lib/phlex-icons/bootstrap/battery_low.rb +24 -0
- data/lib/phlex-icons/bootstrap/beaker.rb +27 -0
- data/lib/phlex-icons/bootstrap/beaker_fill.rb +23 -0
- data/lib/phlex-icons/bootstrap/bluesky.rb +23 -0
- data/lib/phlex-icons/bootstrap/calendar3_event_fill.rb +1 -2
- data/lib/phlex-icons/bootstrap/calendar3_range_fill.rb +1 -2
- data/lib/phlex-icons/bootstrap/calendar3_week_fill.rb +1 -2
- data/lib/phlex-icons/bootstrap/claude.rb +23 -0
- data/lib/phlex-icons/bootstrap/css.rb +24 -0
- data/lib/phlex-icons/bootstrap/flask.rb +23 -0
- data/lib/phlex-icons/bootstrap/flask_fill.rb +23 -0
- data/lib/phlex-icons/bootstrap/flask_florence.rb +23 -0
- data/lib/phlex-icons/bootstrap/flask_florence_fill.rb +23 -0
- data/lib/phlex-icons/bootstrap/fork_knife.rb +23 -0
- data/lib/phlex-icons/bootstrap/globe_americas_fill.rb +24 -0
- data/lib/phlex-icons/bootstrap/globe_asia_australia_fill.rb +24 -0
- data/lib/phlex-icons/bootstrap/globe_central_south_asia_fill.rb +24 -0
- data/lib/phlex-icons/bootstrap/globe_europe_africa_fill.rb +24 -0
- data/lib/phlex-icons/bootstrap/javascript.rb +24 -0
- data/lib/phlex-icons/bootstrap/leaf.rb +23 -0
- data/lib/phlex-icons/bootstrap/leaf_fill.rb +23 -0
- data/lib/phlex-icons/bootstrap/lock.rb +2 -1
- data/lib/phlex-icons/bootstrap/lock_fill.rb +2 -1
- data/lib/phlex-icons/bootstrap/measuring_cup.rb +23 -0
- data/lib/phlex-icons/bootstrap/measuring_cup_fill.rb +23 -0
- data/lib/phlex-icons/bootstrap/meta.rb +1 -1
- data/lib/phlex-icons/bootstrap/openai.rb +23 -0
- data/lib/phlex-icons/bootstrap/perplexity.rb +24 -0
- data/lib/phlex-icons/bootstrap/tux.rb +28 -0
- data/lib/phlex-icons/bootstrap/typescript.rb +24 -0
- data/lib/phlex-icons/bootstrap/unlock.rb +2 -1
- data/lib/phlex-icons/bootstrap/unlock2.rb +24 -0
- data/lib/phlex-icons/bootstrap/unlock2_fill.rb +24 -0
- data/lib/phlex-icons/bootstrap/unlock_fill.rb +2 -1
- data/lib/phlex-icons/bootstrap.rb +29 -1
- data/lib/phlex-icons/configuration.rb +24 -1
- data/lib/phlex-icons/icon.rb +31 -0
- data/lib/phlex-icons/name_parser.rb +117 -0
- data/lib/phlex-icons/railtie.rb +17 -0
- data/lib/phlex-icons/version.rb +1 -1
- data/lib/phlex-icons-bootstrap.rb +3 -0
- metadata +33 -2
@@ -12,8 +12,9 @@ module PhlexIcons
|
|
12
12
|
viewbox: '0 0 16 16'
|
13
13
|
) do |s|
|
14
14
|
s.path(
|
15
|
+
fill_rule: 'evenodd',
|
15
16
|
d:
|
16
|
-
'M8
|
17
|
+
'M8 0a4 4 0 0 1 4 4v2.05a2.5 2.5 0 0 1 2 2.45v5a2.5 2.5 0 0 1-2.5 2.5h-7A2.5 2.5 0 0 1 2 13.5v-5a2.5 2.5 0 0 1 2-2.45V4a4 4 0 0 1 4-4M4.5 7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7zM8 1a3 3 0 0 0-3 3v2h6V4a3 3 0 0 0-3-3'
|
17
18
|
)
|
18
19
|
end
|
19
20
|
end
|
@@ -12,8 +12,9 @@ module PhlexIcons
|
|
12
12
|
viewbox: '0 0 16 16'
|
13
13
|
) do |s|
|
14
14
|
s.path(
|
15
|
+
fill_rule: 'evenodd',
|
15
16
|
d:
|
16
|
-
'M8
|
17
|
+
'M8 0a4 4 0 0 1 4 4v2.05a2.5 2.5 0 0 1 2 2.45v5a2.5 2.5 0 0 1-2.5 2.5h-7A2.5 2.5 0 0 1 2 13.5v-5a2.5 2.5 0 0 1 2-2.45V4a4 4 0 0 1 4-4m0 1a3 3 0 0 0-3 3v2h6V4a3 3 0 0 0-3-3'
|
17
18
|
)
|
18
19
|
end
|
19
20
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Layout/LineLength
|
4
|
+
module PhlexIcons
|
5
|
+
module Bootstrap
|
6
|
+
class MeasuringCup < Base
|
7
|
+
def view_template
|
8
|
+
svg(
|
9
|
+
**attrs,
|
10
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
11
|
+
fill: 'currentColor',
|
12
|
+
viewbox: '0 0 16 16'
|
13
|
+
) do |s|
|
14
|
+
s.path(
|
15
|
+
d:
|
16
|
+
'M.038.309A.5.5 0 0 1 .5 0H14a2 2 0 0 1 2 2v5.959a1.041 1.041 0 0 1-2.069.17l-.849-5.094A.041.041 0 0 0 13 3.04V14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V3.743a2.5 2.5 0 0 0-.732-1.768L.146.854A.5.5 0 0 1 .038.309M1.708 1l.267.268A3.5 3.5 0 0 1 3 3.743V14a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V3.041a1.041 1.041 0 0 1 2.069-.17l.849 5.094A.041.041 0 0 0 15 7.96V2a1 1 0 0 0-1-1zM4 3h3.5a.5.5 0 1 1 0 1H4zm0 2h1.5a.5.5 0 1 1 0 1H4zm0 2h3.5a.5.5 0 1 1 0 1H4zm0 2h1.5a.5.5 0 1 1 0 1H4zm0 2h3.5a.5.5 0 0 1 0 1H4zm0 2h1.5a.5.5 0 0 1 0 1H4z'
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
# rubocop:enable Layout/LineLength
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Layout/LineLength
|
4
|
+
module PhlexIcons
|
5
|
+
module Bootstrap
|
6
|
+
class MeasuringCupFill < Base
|
7
|
+
def view_template
|
8
|
+
svg(
|
9
|
+
**attrs,
|
10
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
11
|
+
fill: 'currentColor',
|
12
|
+
viewbox: '0 0 16 16'
|
13
|
+
) do |s|
|
14
|
+
s.path(
|
15
|
+
d:
|
16
|
+
'M14 0a2 2 0 0 1 2 2v5.959a1.041 1.041 0 0 1-2.049.264l-.02-.093-.849-5.096a.041.041 0 0 0-.082.007V14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V3.742a2.5 2.5 0 0 0-.732-1.767L.146.854A.5.5 0 0 1 .5 0zM4 13v1h1.5a.5.5 0 0 0 0-1zm0-2v1h3.5a.5.5 0 0 0 0-1zm0-2v1h1.5a.5.5 0 0 0 0-1zm0-2v1h3.5a.5.5 0 0 0 0-1zm0-2v1h1.5a.5.5 0 0 0 0-1zm0-2v1h3.5a.5.5 0 0 0 0-1z'
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
# rubocop:enable Layout/LineLength
|
@@ -14,7 +14,7 @@ module PhlexIcons
|
|
14
14
|
s.path(
|
15
15
|
fill_rule: 'evenodd',
|
16
16
|
d:
|
17
|
-
'M8.217 5.243C9.145 3.988 10.171 3 11.483 3 13.96 3 16 6.153 16.001 9.907c0 2.29-.986 3.725-2.757 3.725-1.543 0-2.395-.866-3.924-3.424l-.667-1.123-.118-.197a55 55 0 0 0-.53-.877l-1.178 2.08c-1.673 2.925-2.615 3.541-3.923 3.541C1.086 13.632 0 12.217 0 9.973 0 6.388 1.995 3 4.598 3q.477-.001.924.122c.31.086.611.22.913.407.577.359 1.154.915 1.782 1.714m1.516 2.224q-.378-.
|
17
|
+
'M8.217 5.243C9.145 3.988 10.171 3 11.483 3 13.96 3 16 6.153 16.001 9.907c0 2.29-.986 3.725-2.757 3.725-1.543 0-2.395-.866-3.924-3.424l-.667-1.123-.118-.197a55 55 0 0 0-.53-.877l-1.178 2.08c-1.673 2.925-2.615 3.541-3.923 3.541C1.086 13.632 0 12.217 0 9.973 0 6.388 1.995 3 4.598 3q.477-.001.924.122c.31.086.611.22.913.407.577.359 1.154.915 1.782 1.714m1.516 2.224q-.378-.615-.727-1.133L9 6.326c.845-1.305 1.543-1.954 2.372-1.954 1.723 0 3.102 2.537 3.102 5.653 0 1.188-.39 1.877-1.195 1.877-.773 0-1.142-.51-2.61-2.87zM4.846 4.756c.725.1 1.385.634 2.34 2.001A212 212 0 0 0 5.551 9.3c-1.357 2.126-1.826 2.603-2.581 2.603-.777 0-1.24-.682-1.24-1.9 0-2.602 1.298-5.264 2.846-5.264q.137 0 .27.018'
|
18
18
|
)
|
19
19
|
end
|
20
20
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Layout/LineLength
|
4
|
+
module PhlexIcons
|
5
|
+
module Bootstrap
|
6
|
+
class Openai < Base
|
7
|
+
def view_template
|
8
|
+
svg(
|
9
|
+
**attrs,
|
10
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
11
|
+
fill: 'currentColor',
|
12
|
+
viewbox: '0 0 16 16'
|
13
|
+
) do |s|
|
14
|
+
s.path(
|
15
|
+
d:
|
16
|
+
'M14.949 6.547a3.94 3.94 0 0 0-.348-3.273 4.11 4.11 0 0 0-4.4-1.934A4.1 4.1 0 0 0 8.423.2 4.15 4.15 0 0 0 6.305.086a4.1 4.1 0 0 0-1.891.948 4.04 4.04 0 0 0-1.158 1.753 4.1 4.1 0 0 0-1.563.679A4 4 0 0 0 .554 4.72a3.99 3.99 0 0 0 .502 4.731 3.94 3.94 0 0 0 .346 3.274 4.11 4.11 0 0 0 4.402 1.933c.382.425.852.764 1.377.995.526.231 1.095.35 1.67.346 1.78.002 3.358-1.132 3.901-2.804a4.1 4.1 0 0 0 1.563-.68 4 4 0 0 0 1.14-1.253 3.99 3.99 0 0 0-.506-4.716m-6.097 8.406a3.05 3.05 0 0 1-1.945-.694l.096-.054 3.23-1.838a.53.53 0 0 0 .265-.455v-4.49l1.366.778q.02.011.025.035v3.722c-.003 1.653-1.361 2.992-3.037 2.996m-6.53-2.75a2.95 2.95 0 0 1-.36-2.01l.095.057L5.29 12.09a.53.53 0 0 0 .527 0l3.949-2.246v1.555a.05.05 0 0 1-.022.041L6.473 13.3c-1.454.826-3.311.335-4.15-1.098m-.85-6.94A3.02 3.02 0 0 1 3.07 3.949v3.785a.51.51 0 0 0 .262.451l3.93 2.237-1.366.779a.05.05 0 0 1-.048 0L2.585 9.342a2.98 2.98 0 0 1-1.113-4.094zm11.216 2.571L8.747 5.576l1.362-.776a.05.05 0 0 1 .048 0l3.265 1.86a3 3 0 0 1 1.173 1.207 2.96 2.96 0 0 1-.27 3.2 3.05 3.05 0 0 1-1.36.997V8.279a.52.52 0 0 0-.276-.445m1.36-2.015-.097-.057-3.226-1.855a.53.53 0 0 0-.53 0L6.249 6.153V4.598a.04.04 0 0 1 .019-.04L9.533 2.7a3.07 3.07 0 0 1 3.257.139c.474.325.843.778 1.066 1.303.223.526.289 1.103.191 1.664zM5.503 8.575 4.139 7.8a.05.05 0 0 1-.026-.037V4.049c0-.57.166-1.127.476-1.607s.752-.864 1.275-1.105a3.08 3.08 0 0 1 3.234.41l-.096.054-3.23 1.838a.53.53 0 0 0-.265.455zm.742-1.577 1.758-1 1.762 1v2l-1.755 1-1.762-1z'
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
# rubocop:enable Layout/LineLength
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Layout/LineLength
|
4
|
+
module PhlexIcons
|
5
|
+
module Bootstrap
|
6
|
+
class Perplexity < Base
|
7
|
+
def view_template
|
8
|
+
svg(
|
9
|
+
**attrs,
|
10
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
11
|
+
fill: 'currentColor',
|
12
|
+
viewbox: '0 0 16 16'
|
13
|
+
) do |s|
|
14
|
+
s.path(
|
15
|
+
fill_rule: 'evenodd',
|
16
|
+
d:
|
17
|
+
'M8 .188a.5.5 0 0 1 .503.5V4.03l3.022-2.92.059-.048a.51.51 0 0 1 .49-.054.5.5 0 0 1 .306.46v3.247h1.117l.1.01a.5.5 0 0 1 .403.49v5.558a.5.5 0 0 1-.503.5H12.38v3.258a.5.5 0 0 1-.312.462.51.51 0 0 1-.55-.11l-3.016-3.018v3.448c0 .275-.225.5-.503.5a.5.5 0 0 1-.503-.5v-3.448l-3.018 3.019a.51.51 0 0 1-.548.11.5.5 0 0 1-.312-.463v-3.258H2.503a.5.5 0 0 1-.503-.5V5.215l.01-.1c.047-.229.25-.4.493-.4H3.62V1.469l.006-.074a.5.5 0 0 1 .302-.387.51.51 0 0 1 .547.102l3.023 2.92V.687c0-.276.225-.5.503-.5M4.626 9.333v3.984l2.87-2.872v-4.01zm3.877 1.113 2.871 2.871V9.333l-2.87-2.897zm3.733-1.668a.5.5 0 0 1 .145.35v1.145h.612V5.715H9.201zm-9.23 1.495h.613V9.13c0-.131.052-.257.145-.35l3.033-3.064h-3.79zm1.62-5.558H6.76L4.626 2.652zm4.613 0h2.134V2.652z'
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
# rubocop:enable Layout/LineLength
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Layout/LineLength
|
4
|
+
module PhlexIcons
|
5
|
+
module Bootstrap
|
6
|
+
class Tux < Base
|
7
|
+
def view_template
|
8
|
+
svg(
|
9
|
+
**attrs,
|
10
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
11
|
+
fill: 'currentColor',
|
12
|
+
viewbox: '0 0 16 16'
|
13
|
+
) do |s|
|
14
|
+
s.path(
|
15
|
+
d:
|
16
|
+
'M8.996 4.497c.104-.076.1-.168.186-.158s.022.102-.098.207c-.12.104-.308.243-.46.323-.291.152-.631.336-.993.336s-.647-.167-.853-.33c-.102-.082-.186-.162-.248-.221-.11-.086-.096-.207-.052-.204.075.01.087.109.134.153.064.06.144.137.241.214.195.154.454.304.778.304s.702-.19.932-.32c.13-.073.297-.204.433-.304M7.34 3.781c.055-.02.123-.031.174-.003.011.006.024.021.02.034-.012.038-.074.032-.11.05-.032.017-.057.052-.093.054-.034 0-.086-.012-.09-.046-.007-.044.058-.072.1-.089m.581-.003c.05-.028.119-.018.173.003.041.017.106.045.1.09-.004.033-.057.046-.09.045-.036-.002-.062-.037-.093-.053-.036-.019-.098-.013-.11-.051-.004-.013.008-.028.02-.034'
|
17
|
+
)
|
18
|
+
s.path(
|
19
|
+
fill_rule: 'evenodd',
|
20
|
+
d:
|
21
|
+
'M8.446.019c2.521.003 2.38 2.66 2.364 4.093-.01.939.509 1.574 1.04 2.244.474.56 1.095 1.38 1.45 2.32.29.765.402 1.613.115 2.465a.8.8 0 0 1 .254.152l.001.002c.207.175.271.447.329.698.058.252.112.488.224.615.344.382.494.667.48.922-.015.254-.203.43-.435.57-.465.28-1.164.491-1.586 1.002-.443.527-.99.83-1.505.871a1.25 1.25 0 0 1-1.256-.716v-.001a1 1 0 0 1-.078-.21c-.67.038-1.252-.165-1.718-.128-.687.038-1.116.204-1.506.206-.151.331-.445.547-.808.63-.5.114-1.126 0-1.743-.324-.577-.306-1.31-.278-1.85-.39-.27-.057-.51-.157-.626-.384-.116-.226-.095-.538.07-.988.051-.16.012-.398-.026-.648a2.5 2.5 0 0 1-.037-.369c0-.133.022-.265.087-.386v-.002c.14-.266.368-.377.577-.451s.397-.125.53-.258c.143-.15.27-.374.443-.56q.036-.037.073-.07c-.081-.538.007-1.105.192-1.662.393-1.18 1.223-2.314 1.811-3.014.502-.713.65-1.287.701-2.016.042-.997-.705-3.974 2.112-4.2q.168-.015.321-.013m2.596 10.866-.03.016c-.223.121-.348.337-.427.656-.08.32-.107.733-.13 1.206v.001c-.023.37-.192.824-.31 1.267s-.176.862-.036 1.128v.002c.226.452.608.636 1.051.601s.947-.304 1.36-.795c.474-.576 1.218-.796 1.638-1.05.21-.126.324-.242.333-.4.009-.157-.097-.403-.425-.767-.17-.192-.217-.462-.274-.71-.056-.247-.122-.468-.26-.585l-.001-.001c-.18-.157-.356-.17-.565-.164q-.069.001-.14.005c-.239.275-.805.612-1.197.508-.359-.09-.562-.508-.587-.918m-7.204.03H3.83c-.189.002-.314.09-.44.225-.149.158-.276.382-.445.56v.002h-.002c-.183.184-.414.239-.61.31-.195.069-.353.143-.46.35v.002c-.085.155-.066.378-.029.624.038.245.096.507.018.746v.002l-.001.002c-.157.427-.155.678-.082.822.074.143.235.22.48.272.493.103 1.26.069 1.906.41.583.305 1.168.404 1.598.305.431-.098.712-.369.75-.867v-.002c.029-.292-.195-.673-.485-1.052-.29-.38-.633-.752-.795-1.09v-.002l-.61-1.11c-.21-.286-.43-.462-.68-.5a1 1 0 0 0-.106-.008M9.584 4.85c-.14.2-.386.37-.695.467-.147.048-.302.17-.495.28a1.3 1.3 0 0 1-.74.19.97.97 0 0 1-.582-.227c-.14-.113-.25-.237-.394-.322a3 3 0 0 1-.192-.126c-.063 1.179-.85 2.658-1.226 3.511a5.4 5.4 0 0 0-.43 1.917c-.68-.906-.184-2.066.081-2.568.297-.55.343-.701.27-.649-.266.436-.685 1.13-.848 1.844-.085.372-.1.749.01 1.097.11.349.345.67.766.931.573.351.963.703 1.193 1.015s.302.584.23.777a.4.4 0 0 1-.212.22.7.7 0 0 1-.307.056l.184.235c.094.124.186.249.266.375 1.179.805 2.567.496 3.568-.218.1-.342.197-.664.212-.903.024-.474.05-.896.136-1.245s.244-.634.53-.791a1 1 0 0 1 .138-.061q.005-.045.013-.087c.082-.546.569-.572 1.18-.303.588.266.81.499.71.814h.13c.122-.398-.133-.69-.822-1.025l-.137-.06a2.35 2.35 0 0 0-.012-1.113c-.188-.79-.704-1.49-1.098-1.838-.072-.003-.065.06.081.203.363.333 1.156 1.532.727 2.644a1.2 1.2 0 0 0-.342-.043c-.164-.907-.543-1.66-.735-2.014-.359-.668-.918-2.036-1.158-2.983M7.72 3.503a1 1 0 0 0-.312.053c-.268.093-.447.286-.559.391-.022.021-.05.04-.119.091s-.172.126-.321.238q-.198.151-.13.38c.046.15.192.325.459.476.166.098.28.23.41.334a1 1 0 0 0 .215.133.9.9 0 0 0 .298.066c.282.017.49-.068.673-.173s.34-.233.518-.29c.365-.115.627-.345.709-.564a.37.37 0 0 0-.01-.309c-.048-.096-.148-.187-.318-.257h-.001c-.354-.151-.507-.162-.705-.29-.321-.207-.587-.28-.807-.279m-.89-1.122h-.025a.4.4 0 0 0-.278.135.76.76 0 0 0-.191.334 1.2 1.2 0 0 0-.051.445v.001c.01.162.041.299.102.436.05.116.109.204.183.274l.089-.065.117-.09-.023-.018a.4.4 0 0 1-.11-.161.7.7 0 0 1-.054-.22v-.01a.7.7 0 0 1 .014-.234.4.4 0 0 1 .08-.179q.056-.069.126-.073h.013a.18.18 0 0 1 .123.05c.045.04.08.09.11.162a.7.7 0 0 1 .054.22v.01a.7.7 0 0 1-.002.17 1.1 1.1 0 0 1 .317-.143 1.3 1.3 0 0 0 .002-.194V3.23a1.2 1.2 0 0 0-.102-.437.8.8 0 0 0-.227-.31.4.4 0 0 0-.268-.102m1.95-.155a.63.63 0 0 0-.394.14.9.9 0 0 0-.287.376 1.2 1.2 0 0 0-.1.51v.015q0 .079.01.152c.114.027.278.074.406.138a1 1 0 0 1-.011-.172.8.8 0 0 1 .058-.278.5.5 0 0 1 .139-.2.26.26 0 0 1 .182-.069.26.26 0 0 1 .178.081c.055.054.094.12.124.21.029.086.042.17.04.27l-.002.012a.8.8 0 0 1-.057.277c-.024.059-.089.106-.122.145.046.016.09.03.146.052a5 5 0 0 1 .248.102 1.2 1.2 0 0 0 .244-.763 1.2 1.2 0 0 0-.11-.495.9.9 0 0 0-.294-.37.64.64 0 0 0-.39-.133z'
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
# rubocop:enable Layout/LineLength
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Layout/LineLength
|
4
|
+
module PhlexIcons
|
5
|
+
module Bootstrap
|
6
|
+
class Typescript < Base
|
7
|
+
def view_template
|
8
|
+
svg(
|
9
|
+
**attrs,
|
10
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
11
|
+
fill: 'currentColor',
|
12
|
+
viewbox: '0 0 16 16'
|
13
|
+
) do |s|
|
14
|
+
s.path(
|
15
|
+
fill_rule: 'evenodd',
|
16
|
+
d:
|
17
|
+
'M14 0a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2zm-1.139 7.488q-.585 0-1.006.244a1.67 1.67 0 0 0-.634.674 2.1 2.1 0 0 0-.225.996q0 .753.293 1.182.303.42.967.732l.469.215q.438.186.625.43.185.244.185.635 0 .478-.166.703-.156.224-.527.224-.361.001-.547-.244-.186-.243-.205-.752h-1.162q.02.996.498 1.524.479.527 1.386.527.909 0 1.417-.518.507-.517.507-1.484 0-.81-.332-1.289t-1.045-.79l-.449-.196q-.39-.166-.556-.381-.166-.214-.166-.576 0-.4.165-.596.177-.195.508-.195.361 0 .508.234.156.234.176.703h1.123q-.03-.976-.498-1.484-.47-.518-1.309-.518M7 7.596v1.113h1.3V14.5h1.221V8.709h1.289V7.596z'
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
# rubocop:enable Layout/LineLength
|
@@ -12,8 +12,9 @@ module PhlexIcons
|
|
12
12
|
viewbox: '0 0 16 16'
|
13
13
|
) do |s|
|
14
14
|
s.path(
|
15
|
+
fill_rule: 'evenodd',
|
15
16
|
d:
|
16
|
-
'
|
17
|
+
'M12 0a4 4 0 0 1 4 4v2.5h-1V4a3 3 0 1 0-6 0v2h.5A2.5 2.5 0 0 1 12 8.5v5A2.5 2.5 0 0 1 9.5 16h-7A2.5 2.5 0 0 1 0 13.5v-5A2.5 2.5 0 0 1 2.5 6H8V4a4 4 0 0 1 4-4M2.5 7A1.5 1.5 0 0 0 1 8.5v5A1.5 1.5 0 0 0 2.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 9.5 7z'
|
17
18
|
)
|
18
19
|
end
|
19
20
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Layout/LineLength
|
4
|
+
module PhlexIcons
|
5
|
+
module Bootstrap
|
6
|
+
class Unlock2 < Base
|
7
|
+
def view_template
|
8
|
+
svg(
|
9
|
+
**attrs,
|
10
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
11
|
+
fill: 'currentColor',
|
12
|
+
viewbox: '0 0 16 16'
|
13
|
+
) do |s|
|
14
|
+
s.path(
|
15
|
+
fill_rule: 'evenodd',
|
16
|
+
d:
|
17
|
+
'M8 0c1.07 0 2.041.42 2.759 1.104l.14.14.062.08a.5.5 0 0 1-.71.675l-.076-.066-.216-.205A3 3 0 0 0 5 4v2h6.5A2.5 2.5 0 0 1 14 8.5v5a2.5 2.5 0 0 1-2.5 2.5h-7A2.5 2.5 0 0 1 2 13.5v-5a2.5 2.5 0 0 1 2-2.45V4a4 4 0 0 1 4-4M4.5 7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7z'
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
# rubocop:enable Layout/LineLength
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Layout/LineLength
|
4
|
+
module PhlexIcons
|
5
|
+
module Bootstrap
|
6
|
+
class Unlock2Fill < Base
|
7
|
+
def view_template
|
8
|
+
svg(
|
9
|
+
**attrs,
|
10
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
11
|
+
fill: 'currentColor',
|
12
|
+
viewbox: '0 0 16 16'
|
13
|
+
) do |s|
|
14
|
+
s.path(
|
15
|
+
fill_rule: 'evenodd',
|
16
|
+
d:
|
17
|
+
'M8 0c1.07 0 2.041.42 2.759 1.104l.14.14.062.08a.5.5 0 0 1-.71.675l-.076-.066-.216-.205A3 3 0 0 0 5 4v2h6.5A2.5 2.5 0 0 1 14 8.5v5a2.5 2.5 0 0 1-2.5 2.5h-7A2.5 2.5 0 0 1 2 13.5v-5a2.5 2.5 0 0 1 2-2.45V4a4 4 0 0 1 4-4'
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
# rubocop:enable Layout/LineLength
|
@@ -12,8 +12,9 @@ module PhlexIcons
|
|
12
12
|
viewbox: '0 0 16 16'
|
13
13
|
) do |s|
|
14
14
|
s.path(
|
15
|
+
fill_rule: 'evenodd',
|
15
16
|
d:
|
16
|
-
'
|
17
|
+
'M12 0a4 4 0 0 1 4 4v2.5h-1V4a3 3 0 1 0-6 0v2h.5A2.5 2.5 0 0 1 12 8.5v5A2.5 2.5 0 0 1 9.5 16h-7A2.5 2.5 0 0 1 0 13.5v-5A2.5 2.5 0 0 1 2.5 6H8V4a4 4 0 0 1 4-4'
|
17
18
|
)
|
18
19
|
end
|
19
20
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module PhlexIcons
|
4
4
|
module Bootstrap # rubocop:disable Metrics/ModuleLength
|
5
|
-
VERSION = '1.
|
5
|
+
VERSION = '1.13.1'
|
6
6
|
VARIANTS = nil
|
7
7
|
|
8
8
|
extend Phlex::Kit
|
@@ -32,9 +32,11 @@ module PhlexIcons
|
|
32
32
|
autoload :Amd, 'phlex-icons/bootstrap/amd'
|
33
33
|
autoload :Android, 'phlex-icons/bootstrap/android'
|
34
34
|
autoload :Android2, 'phlex-icons/bootstrap/android2'
|
35
|
+
autoload :Anthropic, 'phlex-icons/bootstrap/anthropic'
|
35
36
|
autoload :App, 'phlex-icons/bootstrap/app'
|
36
37
|
autoload :AppIndicator, 'phlex-icons/bootstrap/app_indicator'
|
37
38
|
autoload :Apple, 'phlex-icons/bootstrap/apple'
|
39
|
+
autoload :AppleMusic, 'phlex-icons/bootstrap/apple_music'
|
38
40
|
autoload :Archive, 'phlex-icons/bootstrap/archive'
|
39
41
|
autoload :ArchiveFill, 'phlex-icons/bootstrap/archive_fill'
|
40
42
|
autoload :Arrow90degDown, 'phlex-icons/bootstrap/arrow_90deg_down'
|
@@ -188,6 +190,9 @@ module PhlexIcons
|
|
188
190
|
autoload :BatteryCharging, 'phlex-icons/bootstrap/battery_charging'
|
189
191
|
autoload :BatteryFull, 'phlex-icons/bootstrap/battery_full'
|
190
192
|
autoload :BatteryHalf, 'phlex-icons/bootstrap/battery_half'
|
193
|
+
autoload :BatteryLow, 'phlex-icons/bootstrap/battery_low'
|
194
|
+
autoload :Beaker, 'phlex-icons/bootstrap/beaker'
|
195
|
+
autoload :BeakerFill, 'phlex-icons/bootstrap/beaker_fill'
|
191
196
|
autoload :Behance, 'phlex-icons/bootstrap/behance'
|
192
197
|
autoload :Bell, 'phlex-icons/bootstrap/bell'
|
193
198
|
autoload :BellFill, 'phlex-icons/bootstrap/bell_fill'
|
@@ -201,6 +206,7 @@ module PhlexIcons
|
|
201
206
|
autoload :BinocularsFill, 'phlex-icons/bootstrap/binoculars_fill'
|
202
207
|
autoload :BlockquoteLeft, 'phlex-icons/bootstrap/blockquote_left'
|
203
208
|
autoload :BlockquoteRight, 'phlex-icons/bootstrap/blockquote_right'
|
209
|
+
autoload :Bluesky, 'phlex-icons/bootstrap/bluesky'
|
204
210
|
autoload :Bluetooth, 'phlex-icons/bootstrap/bluetooth'
|
205
211
|
autoload :BodyText, 'phlex-icons/bootstrap/body_text'
|
206
212
|
autoload :Book, 'phlex-icons/bootstrap/book'
|
@@ -524,6 +530,7 @@ module PhlexIcons
|
|
524
530
|
autoload :CircleFill, 'phlex-icons/bootstrap/circle_fill'
|
525
531
|
autoload :CircleHalf, 'phlex-icons/bootstrap/circle_half'
|
526
532
|
autoload :CircleSquare, 'phlex-icons/bootstrap/circle_square'
|
533
|
+
autoload :Claude, 'phlex-icons/bootstrap/claude'
|
527
534
|
autoload :Clipboard, 'phlex-icons/bootstrap/clipboard'
|
528
535
|
autoload :Clipboard2, 'phlex-icons/bootstrap/clipboard2'
|
529
536
|
autoload :Clipboard2Check, 'phlex-icons/bootstrap/clipboard2_check'
|
@@ -637,6 +644,7 @@ module PhlexIcons
|
|
637
644
|
autoload :Crop, 'phlex-icons/bootstrap/crop'
|
638
645
|
autoload :Crosshair, 'phlex-icons/bootstrap/crosshair'
|
639
646
|
autoload :Crosshair2, 'phlex-icons/bootstrap/crosshair2'
|
647
|
+
autoload :Css, 'phlex-icons/bootstrap/css'
|
640
648
|
autoload :Cup, 'phlex-icons/bootstrap/cup'
|
641
649
|
autoload :CupFill, 'phlex-icons/bootstrap/cup_fill'
|
642
650
|
autoload :CupHot, 'phlex-icons/bootstrap/cup_hot'
|
@@ -1046,6 +1054,10 @@ module PhlexIcons
|
|
1046
1054
|
autoload :FiveSquareFill, 'phlex-icons/bootstrap/five_square_fill'
|
1047
1055
|
autoload :Flag, 'phlex-icons/bootstrap/flag'
|
1048
1056
|
autoload :FlagFill, 'phlex-icons/bootstrap/flag_fill'
|
1057
|
+
autoload :Flask, 'phlex-icons/bootstrap/flask'
|
1058
|
+
autoload :FlaskFill, 'phlex-icons/bootstrap/flask_fill'
|
1059
|
+
autoload :FlaskFlorence, 'phlex-icons/bootstrap/flask_florence'
|
1060
|
+
autoload :FlaskFlorenceFill, 'phlex-icons/bootstrap/flask_florence_fill'
|
1049
1061
|
autoload :Floppy, 'phlex-icons/bootstrap/floppy'
|
1050
1062
|
autoload :Floppy2, 'phlex-icons/bootstrap/floppy2'
|
1051
1063
|
autoload :Floppy2Fill, 'phlex-icons/bootstrap/floppy2_fill'
|
@@ -1064,6 +1076,7 @@ module PhlexIcons
|
|
1064
1076
|
autoload :FolderSymlinkFill, 'phlex-icons/bootstrap/folder_symlink_fill'
|
1065
1077
|
autoload :FolderX, 'phlex-icons/bootstrap/folder_x'
|
1066
1078
|
autoload :Fonts, 'phlex-icons/bootstrap/fonts'
|
1079
|
+
autoload :ForkKnife, 'phlex-icons/bootstrap/fork_knife'
|
1067
1080
|
autoload :Forward, 'phlex-icons/bootstrap/forward'
|
1068
1081
|
autoload :ForwardFill, 'phlex-icons/bootstrap/forward_fill'
|
1069
1082
|
autoload :FourCircle, 'phlex-icons/bootstrap/four_circle'
|
@@ -1101,9 +1114,13 @@ module PhlexIcons
|
|
1101
1114
|
autoload :Globe, 'phlex-icons/bootstrap/globe'
|
1102
1115
|
autoload :Globe2, 'phlex-icons/bootstrap/globe2'
|
1103
1116
|
autoload :GlobeAmericas, 'phlex-icons/bootstrap/globe_americas'
|
1117
|
+
autoload :GlobeAmericasFill, 'phlex-icons/bootstrap/globe_americas_fill'
|
1104
1118
|
autoload :GlobeAsiaAustralia, 'phlex-icons/bootstrap/globe_asia_australia'
|
1119
|
+
autoload :GlobeAsiaAustraliaFill, 'phlex-icons/bootstrap/globe_asia_australia_fill'
|
1105
1120
|
autoload :GlobeCentralSouthAsia, 'phlex-icons/bootstrap/globe_central_south_asia'
|
1121
|
+
autoload :GlobeCentralSouthAsiaFill, 'phlex-icons/bootstrap/globe_central_south_asia_fill'
|
1106
1122
|
autoload :GlobeEuropeAfrica, 'phlex-icons/bootstrap/globe_europe_africa'
|
1123
|
+
autoload :GlobeEuropeAfricaFill, 'phlex-icons/bootstrap/globe_europe_africa_fill'
|
1107
1124
|
autoload :Google, 'phlex-icons/bootstrap/google'
|
1108
1125
|
autoload :GooglePlay, 'phlex-icons/bootstrap/google_play'
|
1109
1126
|
autoload :GpuCard, 'phlex-icons/bootstrap/gpu_card'
|
@@ -1227,6 +1244,7 @@ module PhlexIcons
|
|
1227
1244
|
autoload :InputCursorText, 'phlex-icons/bootstrap/input_cursor_text'
|
1228
1245
|
autoload :Instagram, 'phlex-icons/bootstrap/instagram'
|
1229
1246
|
autoload :Intersect, 'phlex-icons/bootstrap/intersect'
|
1247
|
+
autoload :Javascript, 'phlex-icons/bootstrap/javascript'
|
1230
1248
|
autoload :Journal, 'phlex-icons/bootstrap/journal'
|
1231
1249
|
autoload :JournalAlbum, 'phlex-icons/bootstrap/journal_album'
|
1232
1250
|
autoload :JournalArrowDown, 'phlex-icons/bootstrap/journal_arrow_down'
|
@@ -1273,6 +1291,8 @@ module PhlexIcons
|
|
1273
1291
|
autoload :LayoutTextWindowReverse, 'phlex-icons/bootstrap/layout_text_window_reverse'
|
1274
1292
|
autoload :LayoutThreeColumns, 'phlex-icons/bootstrap/layout_three_columns'
|
1275
1293
|
autoload :LayoutWtf, 'phlex-icons/bootstrap/layout_wtf'
|
1294
|
+
autoload :Leaf, 'phlex-icons/bootstrap/leaf'
|
1295
|
+
autoload :LeafFill, 'phlex-icons/bootstrap/leaf_fill'
|
1276
1296
|
autoload :LifePreserver, 'phlex-icons/bootstrap/life_preserver'
|
1277
1297
|
autoload :Lightbulb, 'phlex-icons/bootstrap/lightbulb'
|
1278
1298
|
autoload :LightbulbFill, 'phlex-icons/bootstrap/lightbulb_fill'
|
@@ -1315,6 +1335,8 @@ module PhlexIcons
|
|
1315
1335
|
autoload :MarkerTip, 'phlex-icons/bootstrap/marker_tip'
|
1316
1336
|
autoload :Mask, 'phlex-icons/bootstrap/mask'
|
1317
1337
|
autoload :Mastodon, 'phlex-icons/bootstrap/mastodon'
|
1338
|
+
autoload :MeasuringCup, 'phlex-icons/bootstrap/measuring_cup'
|
1339
|
+
autoload :MeasuringCupFill, 'phlex-icons/bootstrap/measuring_cup_fill'
|
1318
1340
|
autoload :Medium, 'phlex-icons/bootstrap/medium'
|
1319
1341
|
autoload :Megaphone, 'phlex-icons/bootstrap/megaphone'
|
1320
1342
|
autoload :MegaphoneFill, 'phlex-icons/bootstrap/megaphone_fill'
|
@@ -1383,6 +1405,7 @@ module PhlexIcons
|
|
1383
1405
|
autoload :OneSquare, 'phlex-icons/bootstrap/one_square'
|
1384
1406
|
autoload :OneSquareFill, 'phlex-icons/bootstrap/one_square_fill'
|
1385
1407
|
autoload :OneTwoThree, 'phlex-icons/bootstrap/one_two_three'
|
1408
|
+
autoload :Openai, 'phlex-icons/bootstrap/openai'
|
1386
1409
|
autoload :Opencollective, 'phlex-icons/bootstrap/opencollective'
|
1387
1410
|
autoload :OpticalAudio, 'phlex-icons/bootstrap/optical_audio'
|
1388
1411
|
autoload :OpticalAudioFill, 'phlex-icons/bootstrap/optical_audio_fill'
|
@@ -1439,6 +1462,7 @@ module PhlexIcons
|
|
1439
1462
|
autoload :People, 'phlex-icons/bootstrap/people'
|
1440
1463
|
autoload :PeopleFill, 'phlex-icons/bootstrap/people_fill'
|
1441
1464
|
autoload :Percent, 'phlex-icons/bootstrap/percent'
|
1465
|
+
autoload :Perplexity, 'phlex-icons/bootstrap/perplexity'
|
1442
1466
|
autoload :Person, 'phlex-icons/bootstrap/person'
|
1443
1467
|
autoload :PersonAdd, 'phlex-icons/bootstrap/person_add'
|
1444
1468
|
autoload :PersonArmsUp, 'phlex-icons/bootstrap/person_arms_up'
|
@@ -1938,6 +1962,7 @@ module PhlexIcons
|
|
1938
1962
|
autoload :TruckFront, 'phlex-icons/bootstrap/truck_front'
|
1939
1963
|
autoload :TruckFrontFill, 'phlex-icons/bootstrap/truck_front_fill'
|
1940
1964
|
autoload :Tsunami, 'phlex-icons/bootstrap/tsunami'
|
1965
|
+
autoload :Tux, 'phlex-icons/bootstrap/tux'
|
1941
1966
|
autoload :Tv, 'phlex-icons/bootstrap/tv'
|
1942
1967
|
autoload :TvFill, 'phlex-icons/bootstrap/tv_fill'
|
1943
1968
|
autoload :Twitch, 'phlex-icons/bootstrap/twitch'
|
@@ -1958,6 +1983,7 @@ module PhlexIcons
|
|
1958
1983
|
autoload :TypeItalic, 'phlex-icons/bootstrap/type_italic'
|
1959
1984
|
autoload :TypeStrikethrough, 'phlex-icons/bootstrap/type_strikethrough'
|
1960
1985
|
autoload :TypeUnderline, 'phlex-icons/bootstrap/type_underline'
|
1986
|
+
autoload :Typescript, 'phlex-icons/bootstrap/typescript'
|
1961
1987
|
autoload :Ubuntu, 'phlex-icons/bootstrap/ubuntu'
|
1962
1988
|
autoload :UiChecks, 'phlex-icons/bootstrap/ui_checks'
|
1963
1989
|
autoload :UiChecksGrid, 'phlex-icons/bootstrap/ui_checks_grid'
|
@@ -1971,6 +1997,8 @@ module PhlexIcons
|
|
1971
1997
|
autoload :UniversalAccess, 'phlex-icons/bootstrap/universal_access'
|
1972
1998
|
autoload :UniversalAccessCircle, 'phlex-icons/bootstrap/universal_access_circle'
|
1973
1999
|
autoload :Unlock, 'phlex-icons/bootstrap/unlock'
|
2000
|
+
autoload :Unlock2, 'phlex-icons/bootstrap/unlock2'
|
2001
|
+
autoload :Unlock2Fill, 'phlex-icons/bootstrap/unlock2_fill'
|
1974
2002
|
autoload :UnlockFill, 'phlex-icons/bootstrap/unlock_fill'
|
1975
2003
|
autoload :Upc, 'phlex-icons/bootstrap/upc'
|
1976
2004
|
autoload :UpcScan, 'phlex-icons/bootstrap/upc_scan'
|
@@ -2,10 +2,33 @@
|
|
2
2
|
|
3
3
|
module PhlexIcons
|
4
4
|
class Configuration
|
5
|
-
attr_accessor :default_variant, :default_classes
|
5
|
+
attr_accessor :default_variant, :default_classes, :helper_method_name
|
6
|
+
attr_reader :default_pack
|
6
7
|
|
7
8
|
def initialize(default_classes: 'size-6')
|
8
9
|
@default_classes = default_classes
|
10
|
+
@helper_method_name = :phlex_icon
|
11
|
+
@default_pack = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
# Custom setter for default_pack
|
15
|
+
# Accepts Class (PhlexIcons::Hero), String ('hero'), or Symbol (:hero)
|
16
|
+
#
|
17
|
+
# @param value [Class, String, Symbol, nil] The value to set the default pack to.
|
18
|
+
# @raise [ArgumentError] If the value is not a Class, String, Symbol, or nil.
|
19
|
+
def default_pack=(value)
|
20
|
+
@default_pack = case value
|
21
|
+
when Class
|
22
|
+
# Extract 'Hero' from PhlexIcons::Hero, lowercase, symbolize
|
23
|
+
value.name.split('::').last&.downcase&.to_sym
|
24
|
+
when String, Symbol
|
25
|
+
value.to_sym
|
26
|
+
when nil
|
27
|
+
nil
|
28
|
+
else
|
29
|
+
raise ArgumentError,
|
30
|
+
"Invalid type for default_pack: #{value.class}. Expected Class, String, Symbol, or nil."
|
31
|
+
end
|
9
32
|
end
|
10
33
|
end
|
11
34
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'name_parser'
|
4
|
+
|
5
|
+
module PhlexIcons
|
6
|
+
extend Phlex::Kit
|
7
|
+
|
8
|
+
class Icon < Phlex::SVG
|
9
|
+
# Factory method to create an icon component instance.
|
10
|
+
# Parses the name string, finds the corresponding class, and initializes it with options.
|
11
|
+
# @param name [String] Icon identifier (e.g., "hero/house:solid", "lucide/arrow-right").
|
12
|
+
# @param options [Hash] HTML attributes and options for the icon component.
|
13
|
+
# @return [Phlex::SVG] An instance of the resolved icon component.
|
14
|
+
# @raise [ArgumentError] If the name format is invalid or default pack is missing.
|
15
|
+
# @raise [NameError] If the corresponding icon class cannot be found.
|
16
|
+
def initialize(name, **options)
|
17
|
+
@name = name
|
18
|
+
@options = options&.transform_keys(&:to_sym) || {}
|
19
|
+
super()
|
20
|
+
end
|
21
|
+
|
22
|
+
def view_template
|
23
|
+
parser = PhlexIcons::NameParser.new(@name)
|
24
|
+
|
25
|
+
# Prioritize variant from the name string over options hash
|
26
|
+
@options[:variant] = parser.variant_name if parser.variant_name
|
27
|
+
|
28
|
+
render parser.klass.new(**@options)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PhlexIcons
|
4
|
+
class NameParser
|
5
|
+
attr_reader :pack_name, :icon_name, :variant_name, :identifier, :klass
|
6
|
+
|
7
|
+
# Initializes the parser with the full icon identifier string (e.g., "hero/arrow-right:solid").
|
8
|
+
# Parses the string into pack, icon, and variant components.
|
9
|
+
# Determines and validates the corresponding icon component class.
|
10
|
+
# @param identifier [String] The full icon identifier.
|
11
|
+
# @raise [ArgumentError] If the name format is invalid or default pack is missing.
|
12
|
+
# @raise [NameError] If the corresponding icon class cannot be found.
|
13
|
+
def initialize(identifier)
|
14
|
+
@identifier = identifier.to_s
|
15
|
+
@pack_name, @icon_name, @variant_name = parse(@identifier)
|
16
|
+
@klass = find_icon_class(@pack_name, @icon_name)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
# Performs the core parsing logic.
|
22
|
+
# @param identifier [String] The full icon identifier.
|
23
|
+
# @return [Array<String, String, Symbol, nil>] An array containing [pack_name, icon_name, variant_name].
|
24
|
+
def parse(identifier)
|
25
|
+
name_part, variant = identifier.split(':', 2)
|
26
|
+
|
27
|
+
# Check if the part before ':' (or the whole string if no ':') is empty
|
28
|
+
if name_part.nil? || name_part.strip.empty?
|
29
|
+
raise ArgumentError,
|
30
|
+
"Invalid icon name format. Could not determine pack or icon name from '#{identifier}'."
|
31
|
+
end
|
32
|
+
|
33
|
+
parsed_variant = variant&.empty? ? nil : variant&.to_sym
|
34
|
+
pack, icon = parse_pack_and_icon(name_part)
|
35
|
+
|
36
|
+
validate_identifier_parts(pack, icon, identifier)
|
37
|
+
|
38
|
+
[pack, icon, parsed_variant]
|
39
|
+
end
|
40
|
+
|
41
|
+
# Extracts the pack and icon names from the part before the variant separator (':').
|
42
|
+
# @param name_part [String] The part of the name string before ':'.
|
43
|
+
# @return [Array<String, String>] An array containing [pack_name, icon_name].
|
44
|
+
def parse_pack_and_icon(name_part)
|
45
|
+
if name_part.include?('/')
|
46
|
+
# If split results in empty parts, they will be caught by validate_identifier_parts later
|
47
|
+
name_part.split('/', 2)
|
48
|
+
else
|
49
|
+
# If name_part is just the icon, it cannot be empty (checked in `parse`)
|
50
|
+
[get_default_pack_name_or_raise(name_part), name_part]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Retrieves the configured default pack name or raises an error if not set.
|
55
|
+
# @param icon_name_part [String] The icon name used when the pack prefix is missing (for error message).
|
56
|
+
# @return [String] The default pack name.
|
57
|
+
# @raise [ArgumentError] If PhlexIcons.configuration.default_pack is not configured.
|
58
|
+
def get_default_pack_name_or_raise(icon_name_part)
|
59
|
+
# Assumes PhlexIcons.configuration is available.
|
60
|
+
# Consider requiring 'phlex_icons/configuration' explicitly if needed outside Rails context.
|
61
|
+
default_pack_name = defined?(PhlexIcons.configuration) ? PhlexIcons.configuration&.default_pack&.to_s : nil
|
62
|
+
unless default_pack_name && !default_pack_name.empty?
|
63
|
+
raise ArgumentError,
|
64
|
+
"Icon name '#{icon_name_part}' is missing the pack name prefix (e.g., 'hero/'), " \
|
65
|
+
'and no `default_pack` is configured in PhlexIcons.'
|
66
|
+
end
|
67
|
+
default_pack_name
|
68
|
+
end
|
69
|
+
|
70
|
+
# Validates that both pack and icon name parts were successfully extracted.
|
71
|
+
# @param pack [String, nil] The extracted pack name.
|
72
|
+
# @param icon [String, nil] The extracted icon name.
|
73
|
+
# @param identifier [String] The original full identifier (for error message).
|
74
|
+
# @raise [ArgumentError] If either pack or icon is missing or empty.
|
75
|
+
def validate_identifier_parts(pack, icon, identifier)
|
76
|
+
return if pack && !pack.empty? && icon && !icon.empty?
|
77
|
+
|
78
|
+
raise ArgumentError,
|
79
|
+
"Invalid icon name format. Could not determine pack or icon name from '#{identifier}'."
|
80
|
+
end
|
81
|
+
|
82
|
+
# Finds the PhlexIcon component class based on pack and icon names.
|
83
|
+
# @param pack_name [String] The kebab-case pack name (e.g., "hero").
|
84
|
+
# @param icon_name [String] The kebab-case icon name (e.g., "arrow-right").
|
85
|
+
# @return [Class] The icon component class.
|
86
|
+
# @raise [NameError] If the corresponding icon class cannot be found.
|
87
|
+
def find_icon_class(pack_name, icon_name)
|
88
|
+
class_name = build_icon_class_name(pack_name, icon_name)
|
89
|
+
find_and_validate_icon_class(class_name, pack_name, icon_name)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Constructs the full Ruby class name for an icon component.
|
93
|
+
# @param pack_name [String] The kebab-case pack name (e.g., "hero").
|
94
|
+
# @param icon_name [String] The kebab-case icon name (e.g., "arrow-right").
|
95
|
+
# @return [String] The CamelCase class name (e.g., "PhlexIcons::Hero::ArrowRight").
|
96
|
+
def build_icon_class_name(pack_name, icon_name)
|
97
|
+
pack_module_name = pack_name.split('-').map(&:capitalize).join
|
98
|
+
icon_class_name = icon_name.split('-').map(&:capitalize).join
|
99
|
+
"PhlexIcons::#{pack_module_name}::#{icon_class_name}"
|
100
|
+
end
|
101
|
+
|
102
|
+
# Attempts to find the icon class by its name and validates its existence.
|
103
|
+
# @param class_name [String] The full class name to find.
|
104
|
+
# @param pack_name [String] Original pack name (for error message).
|
105
|
+
# @param icon_name [String] Original icon name (for error message).
|
106
|
+
# @return [Class] The found icon component class.
|
107
|
+
# @raise [NameError] If the class cannot be found.
|
108
|
+
def find_and_validate_icon_class(class_name, pack_name, icon_name)
|
109
|
+
Object.const_get(class_name)
|
110
|
+
rescue NameError
|
111
|
+
raise NameError,
|
112
|
+
"Could not find icon component class '#{class_name}'. " \
|
113
|
+
"Make sure the pack ('#{pack_name}') and name ('#{icon_name}') " \
|
114
|
+
'are correct and the corresponding file is loaded.'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'configuration'
|
4
|
+
|
5
|
+
module PhlexIcons
|
6
|
+
class Railtie < ::Rails::Railtie
|
7
|
+
initializer 'phlex_icons.view_helpers' do
|
8
|
+
ActiveSupport.on_load(:action_view) do
|
9
|
+
helper_method_name = PhlexIcons.configuration.helper_method_name
|
10
|
+
|
11
|
+
define_method helper_method_name do |name, **options|
|
12
|
+
PhlexIcons::Icon.call(name, **options)&.html_safe
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/phlex-icons/version.rb
CHANGED
@@ -12,6 +12,9 @@ require_relative 'phlex-icons/version'
|
|
12
12
|
require_relative 'phlex-icons/bootstrap'
|
13
13
|
require_relative 'phlex-icons/material'
|
14
14
|
|
15
|
+
require_relative 'phlex-icons/icon'
|
16
|
+
require_relative 'phlex-icons/railtie' if defined?(Rails)
|
17
|
+
|
15
18
|
module PhlexIcons
|
16
19
|
class << self
|
17
20
|
def configuration
|