phlex-icons 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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -1
  3. data/README.md +44 -0
  4. data/lib/phlex-icons/bootstrap/anthropic.rb +24 -0
  5. data/lib/phlex-icons/bootstrap/apple_music.rb +24 -0
  6. data/lib/phlex-icons/bootstrap/battery_low.rb +24 -0
  7. data/lib/phlex-icons/bootstrap/beaker.rb +27 -0
  8. data/lib/phlex-icons/bootstrap/beaker_fill.rb +23 -0
  9. data/lib/phlex-icons/bootstrap/bluesky.rb +23 -0
  10. data/lib/phlex-icons/bootstrap/calendar3_event_fill.rb +1 -2
  11. data/lib/phlex-icons/bootstrap/calendar3_range_fill.rb +1 -2
  12. data/lib/phlex-icons/bootstrap/calendar3_week_fill.rb +1 -2
  13. data/lib/phlex-icons/bootstrap/claude.rb +23 -0
  14. data/lib/phlex-icons/bootstrap/css.rb +24 -0
  15. data/lib/phlex-icons/bootstrap/flask.rb +23 -0
  16. data/lib/phlex-icons/bootstrap/flask_fill.rb +23 -0
  17. data/lib/phlex-icons/bootstrap/flask_florence.rb +23 -0
  18. data/lib/phlex-icons/bootstrap/flask_florence_fill.rb +23 -0
  19. data/lib/phlex-icons/bootstrap/fork_knife.rb +23 -0
  20. data/lib/phlex-icons/bootstrap/globe_americas_fill.rb +24 -0
  21. data/lib/phlex-icons/bootstrap/globe_asia_australia_fill.rb +24 -0
  22. data/lib/phlex-icons/bootstrap/globe_central_south_asia_fill.rb +24 -0
  23. data/lib/phlex-icons/bootstrap/globe_europe_africa_fill.rb +24 -0
  24. data/lib/phlex-icons/bootstrap/javascript.rb +24 -0
  25. data/lib/phlex-icons/bootstrap/leaf.rb +23 -0
  26. data/lib/phlex-icons/bootstrap/leaf_fill.rb +23 -0
  27. data/lib/phlex-icons/bootstrap/lock.rb +2 -1
  28. data/lib/phlex-icons/bootstrap/lock_fill.rb +2 -1
  29. data/lib/phlex-icons/bootstrap/measuring_cup.rb +23 -0
  30. data/lib/phlex-icons/bootstrap/measuring_cup_fill.rb +23 -0
  31. data/lib/phlex-icons/bootstrap/meta.rb +1 -1
  32. data/lib/phlex-icons/bootstrap/openai.rb +23 -0
  33. data/lib/phlex-icons/bootstrap/perplexity.rb +24 -0
  34. data/lib/phlex-icons/bootstrap/tux.rb +28 -0
  35. data/lib/phlex-icons/bootstrap/typescript.rb +24 -0
  36. data/lib/phlex-icons/bootstrap/unlock.rb +2 -1
  37. data/lib/phlex-icons/bootstrap/unlock2.rb +24 -0
  38. data/lib/phlex-icons/bootstrap/unlock2_fill.rb +24 -0
  39. data/lib/phlex-icons/bootstrap/unlock_fill.rb +2 -1
  40. data/lib/phlex-icons/bootstrap.rb +29 -1
  41. data/lib/phlex-icons/configuration.rb +24 -1
  42. data/lib/phlex-icons/icon.rb +31 -0
  43. data/lib/phlex-icons/lucide/air_vent.rb +2 -2
  44. data/lib/phlex-icons/lucide/axe.rb +7 -2
  45. data/lib/phlex-icons/lucide/bell_electric.rb +4 -4
  46. data/lib/phlex-icons/lucide/brackets.rb +2 -2
  47. data/lib/phlex-icons/lucide/brush_cleaning.rb +30 -0
  48. data/lib/phlex-icons/lucide/check_line.rb +24 -0
  49. data/lib/phlex-icons/lucide/clock_plus.rb +25 -0
  50. data/lib/phlex-icons/lucide/dumbbell.rb +5 -5
  51. data/lib/phlex-icons/lucide/expand.rb +4 -4
  52. data/lib/phlex-icons/lucide/gpu.rb +26 -0
  53. data/lib/phlex-icons/lucide/guitar.rb +1 -2
  54. data/lib/phlex-icons/lucide/hamburger.rb +28 -0
  55. data/lib/phlex-icons/lucide/laptop.rb +2 -1
  56. data/lib/phlex-icons/lucide/locate_off.rb +7 -13
  57. data/lib/phlex-icons/lucide/mail.rb +2 -2
  58. data/lib/phlex-icons/lucide/menu.rb +3 -3
  59. data/lib/phlex-icons/lucide/package_2.rb +7 -2
  60. data/lib/phlex-icons/lucide/panda.rb +32 -0
  61. data/lib/phlex-icons/lucide/phone.rb +1 -1
  62. data/lib/phlex-icons/lucide/phone_call.rb +3 -3
  63. data/lib/phlex-icons/lucide/phone_forwarded.rb +3 -3
  64. data/lib/phlex-icons/lucide/phone_incoming.rb +3 -3
  65. data/lib/phlex-icons/lucide/phone_missed.rb +3 -3
  66. data/lib/phlex-icons/lucide/phone_off.rb +6 -2
  67. data/lib/phlex-icons/lucide/phone_outgoing.rb +3 -3
  68. data/lib/phlex-icons/lucide/search.rb +1 -1
  69. data/lib/phlex-icons/lucide/soap_dispenser_droplet.rb +33 -0
  70. data/lib/phlex-icons/lucide/touchpad_off.rb +4 -4
  71. data/lib/phlex-icons/lucide/users.rb +2 -2
  72. data/lib/phlex-icons/lucide.rb +8 -1
  73. data/lib/phlex-icons/name_parser.rb +117 -0
  74. data/lib/phlex-icons/railtie.rb +17 -0
  75. data/lib/phlex-icons/version.rb +1 -1
  76. data/lib/phlex-icons.rb +3 -0
  77. metadata +40 -2
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexIcons
4
+ module Lucide
5
+ class ClockPlus < Base
6
+ def view_template
7
+ svg(
8
+ **attrs,
9
+ xmlns: 'http://www.w3.org/2000/svg',
10
+ viewbox: '0 0 24 24',
11
+ fill: 'none',
12
+ stroke: 'currentColor',
13
+ stroke_width: '2',
14
+ stroke_linecap: 'round',
15
+ stroke_linejoin: 'round'
16
+ ) do |s|
17
+ s.path(d: 'M12 6v6l3.644 1.822')
18
+ s.path(d: 'M16 19h6')
19
+ s.path(d: 'M19 16v6')
20
+ s.path(d: 'M21.92 13.267a10 10 0 1 0-8.653 8.653')
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -15,17 +15,17 @@ module PhlexIcons
15
15
  stroke_linecap: 'round',
16
16
  stroke_linejoin: 'round'
17
17
  ) do |s|
18
- s.path(d: 'M14.4 14.4 9.6 9.6')
19
18
  s.path(
20
19
  d:
21
- 'M18.657 21.485a2 2 0 1 1-2.829-2.828l-1.767 1.768a2 2 0 1 1-2.829-2.829l6.364-6.364a2 2 0 1 1 2.829 2.829l-1.768 1.767a2 2 0 1 1 2.828 2.829z'
20
+ 'M17.596 12.768a2 2 0 1 0 2.829-2.829l-1.768-1.767a2 2 0 0 0 2.828-2.829l-2.828-2.828a2 2 0 0 0-2.829 2.828l-1.767-1.768a2 2 0 1 0-2.829 2.829z'
22
21
  )
23
- s.path(d: 'm21.5 21.5-1.4-1.4')
24
- s.path(d: 'M3.9 3.9 2.5 2.5')
22
+ s.path(d: 'm2.5 21.5 1.4-1.4')
23
+ s.path(d: 'm20.1 3.9 1.4-1.4')
25
24
  s.path(
26
25
  d:
27
- 'M6.404 12.768a2 2 0 1 1-2.829-2.829l1.768-1.767a2 2 0 1 1-2.828-2.829l2.828-2.828a2 2 0 1 1 2.829 2.828l1.767-1.768a2 2 0 1 1 2.829 2.829z'
26
+ 'M5.343 21.485a2 2 0 1 0 2.829-2.828l1.767 1.768a2 2 0 1 0 2.829-2.829l-6.364-6.364a2 2 0 1 0-2.829 2.829l1.768 1.767a2 2 0 0 0-2.828 2.829z'
28
27
  )
28
+ s.path(d: 'm9.6 14.4 4.8-4.8')
29
29
  end
30
30
  end
31
31
  end
@@ -16,11 +16,11 @@ module PhlexIcons
16
16
  ) do |s|
17
17
  s.path(d: 'm15 15 6 6')
18
18
  s.path(d: 'm15 9 6-6')
19
- s.path(d: 'M21 16.2V21h-4.8')
20
- s.path(d: 'M21 7.8V3h-4.8')
21
- s.path(d: 'M3 16.2V21h4.8')
19
+ s.path(d: 'M21 16v5h-5')
20
+ s.path(d: 'M21 8V3h-5')
21
+ s.path(d: 'M3 16v5h5')
22
22
  s.path(d: 'm3 21 6-6')
23
- s.path(d: 'M3 7.8V3h4.8')
23
+ s.path(d: 'M3 8V3h5')
24
24
  s.path(d: 'M9 9 3 3')
25
25
  end
26
26
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexIcons
4
+ module Lucide
5
+ class Gpu < Base
6
+ def view_template
7
+ svg(
8
+ **attrs,
9
+ xmlns: 'http://www.w3.org/2000/svg',
10
+ viewbox: '0 0 24 24',
11
+ fill: 'none',
12
+ stroke: 'currentColor',
13
+ stroke_width: '2',
14
+ stroke_linecap: 'round',
15
+ stroke_linejoin: 'round'
16
+ ) do |s|
17
+ s.path(d: 'M2 21V3')
18
+ s.path(d: 'M2 5h18a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H2.26')
19
+ s.path(d: 'M7 17v3a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1v-3')
20
+ s.circle(cx: '16', cy: '11', r: '2')
21
+ s.circle(cx: '8', cy: '11', r: '2')
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -23,9 +23,8 @@ module PhlexIcons
23
23
  s.path(d: 'm6 16 2 2')
24
24
  s.path(
25
25
  d:
26
- 'M8.2 9.9C8.7 8.8 9.8 8 11 8c2.8 0 5 2.2 5 5 0 1.2-.8 2.3-1.9 2.8l-.9.4A2 2 0 0 0 12 18a4 4 0 0 1-4 4c-3.3 0-6-2.7-6-6a4 4 0 0 1 4-4 2 2 0 0 0 1.8-1.2z'
26
+ 'M8.23 9.85A3 3 0 0 1 11 8a5 5 0 0 1 5 5 3 3 0 0 1-1.85 2.77l-.92.38A2 2 0 0 0 12 18a4 4 0 0 1-4 4 6 6 0 0 1-6-6 4 4 0 0 1 4-4 2 2 0 0 0 1.85-1.23z'
27
27
  )
28
- s.circle(cx: '11.5', cy: '12.5', r: '.5', fill: 'currentColor')
29
28
  end
30
29
  end
31
30
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexIcons
4
+ module Lucide
5
+ class Hamburger < Base
6
+ def view_template
7
+ svg(
8
+ **attrs,
9
+ xmlns: 'http://www.w3.org/2000/svg',
10
+ viewbox: '0 0 24 24',
11
+ fill: 'none',
12
+ stroke: 'currentColor',
13
+ stroke_width: '2',
14
+ stroke_linecap: 'round',
15
+ stroke_linejoin: 'round'
16
+ ) do |s|
17
+ s.path(d: 'M12 16H4a2 2 0 1 1 0-4h16a2 2 0 1 1 0 4h-4.25')
18
+ s.path(d: 'M5 12a2 2 0 0 1-2-2 9 7 0 0 1 18 0 2 2 0 0 1-2 2')
19
+ s.path(
20
+ d:
21
+ 'M5 16a2 2 0 0 0-2 2 3 3 0 0 0 3 3h12a3 3 0 0 0 3-3 2 2 0 0 0-2-2q0 0 0 0'
22
+ )
23
+ s.path(d: 'm6.67 12 6.13 4.6a2 2 0 0 0 2.8-.4l3.15-4.2')
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -17,8 +17,9 @@ module PhlexIcons
17
17
  ) do |s|
18
18
  s.path(
19
19
  d:
20
- 'M20 16V7a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v9m16 0H4m16 0 1.28 2.55a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45L4 16'
20
+ 'M18 5a2 2 0 0 1 2 2v8.526a2 2 0 0 0 .212.897l1.068 2.127a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45l1.068-2.127A2 2 0 0 0 4 15.526V7a2 2 0 0 1 2-2z'
21
21
  )
22
+ s.path(d: 'M20.054 15.987H3.946')
22
23
  end
23
24
  end
24
25
  end
@@ -14,19 +14,13 @@ module PhlexIcons
14
14
  stroke_linecap: 'round',
15
15
  stroke_linejoin: 'round'
16
16
  ) do |s|
17
- s.line(x1: '2', x2: '5', y1: '12', y2: '12')
18
- s.line(x1: '19', x2: '22', y1: '12', y2: '12')
19
- s.line(x1: '12', x2: '12', y1: '2', y2: '5')
20
- s.line(x1: '12', x2: '12', y1: '19', y2: '22')
21
- s.path(
22
- d:
23
- 'M7.11 7.11C5.83 8.39 5 10.1 5 12c0 3.87 3.13 7 7 7 1.9 0 3.61-.83 4.89-2.11'
24
- )
25
- s.path(
26
- d:
27
- 'M18.71 13.96c.19-.63.29-1.29.29-1.96 0-3.87-3.13-7-7-7-.67 0-1.33.1-1.96.29'
28
- )
29
- s.line(x1: '2', x2: '22', y1: '2', y2: '22')
17
+ s.path(d: 'M12 19v3')
18
+ s.path(d: 'M12 2v3')
19
+ s.path(d: 'M18.89 13.24a7 7 0 0 0-8.13-8.13')
20
+ s.path(d: 'M19 12h3')
21
+ s.path(d: 'M2 12h3')
22
+ s.path(d: 'm2 2 20 20')
23
+ s.path(d: 'M7.05 7.05a7 7 0 0 0 9.9 9.9')
30
24
  end
31
25
  end
32
26
  end
@@ -14,8 +14,8 @@ module PhlexIcons
14
14
  stroke_linecap: 'round',
15
15
  stroke_linejoin: 'round'
16
16
  ) do |s|
17
- s.rect(width: '20', height: '16', x: '2', y: '4', rx: '2')
18
- s.path(d: 'm22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7')
17
+ s.path(d: 'm22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7')
18
+ s.rect(x: '2', y: '4', width: '20', height: '16', rx: '2')
19
19
  end
20
20
  end
21
21
  end
@@ -14,9 +14,9 @@ module PhlexIcons
14
14
  stroke_linecap: 'round',
15
15
  stroke_linejoin: 'round'
16
16
  ) do |s|
17
- s.line(x1: '4', x2: '20', y1: '12', y2: '12')
18
- s.line(x1: '4', x2: '20', y1: '6', y2: '6')
19
- s.line(x1: '4', x2: '20', y1: '18', y2: '18')
17
+ s.path(d: 'M4 12h16')
18
+ s.path(d: 'M4 18h16')
19
+ s.path(d: 'M4 6h16')
20
20
  end
21
21
  end
22
22
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Layout/LineLength
3
4
  module PhlexIcons
4
5
  module Lucide
5
6
  class Package2 < Base
@@ -14,11 +15,15 @@ module PhlexIcons
14
15
  stroke_linecap: 'round',
15
16
  stroke_linejoin: 'round'
16
17
  ) do |s|
17
- s.path(d: 'M3 9h18v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V9Z')
18
- s.path(d: 'm3 9 2.45-4.9A2 2 0 0 1 7.24 3h9.52a2 2 0 0 1 1.8 1.1L21 9')
19
18
  s.path(d: 'M12 3v6')
19
+ s.path(
20
+ d:
21
+ 'M16.76 3a2 2 0 0 1 1.8 1.1l2.23 4.479a2 2 0 0 1 .21.891V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V9.472a2 2 0 0 1 .211-.894L5.45 4.1A2 2 0 0 1 7.24 3z'
22
+ )
23
+ s.path(d: 'M3.054 9.013h17.893')
20
24
  end
21
25
  end
22
26
  end
23
27
  end
24
28
  end
29
+ # rubocop:enable Layout/LineLength
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Layout/LineLength
4
+ module PhlexIcons
5
+ module Lucide
6
+ class Panda < Base
7
+ def view_template
8
+ svg(
9
+ **attrs,
10
+ xmlns: 'http://www.w3.org/2000/svg',
11
+ viewbox: '0 0 24 24',
12
+ fill: 'none',
13
+ stroke: 'currentColor',
14
+ stroke_width: '2',
15
+ stroke_linecap: 'round',
16
+ stroke_linejoin: 'round'
17
+ ) do |s|
18
+ s.path(d: 'M11.25 17.25h1.5L12 18z')
19
+ s.path(d: 'm15 12 2 2')
20
+ s.path(d: 'M18 6.5a.5.5 0 0 0-.5-.5')
21
+ s.path(
22
+ d:
23
+ 'M20.69 9.67a4.5 4.5 0 1 0-7.04-5.5 8.35 8.35 0 0 0-3.3 0 4.5 4.5 0 1 0-7.04 5.5C2.49 11.2 2 12.88 2 14.5 2 19.47 6.48 22 12 22s10-2.53 10-7.5c0-1.62-.48-3.3-1.3-4.83'
24
+ )
25
+ s.path(d: 'M6 6.5a.495.495 0 0 1 .5-.5')
26
+ s.path(d: 'm9 12-2 2')
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ # rubocop:enable Layout/LineLength
@@ -17,7 +17,7 @@ module PhlexIcons
17
17
  ) do |s|
18
18
  s.path(
19
19
  d:
20
- 'M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z'
20
+ 'M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384'
21
21
  )
22
22
  end
23
23
  end
@@ -15,12 +15,12 @@ module PhlexIcons
15
15
  stroke_linecap: 'round',
16
16
  stroke_linejoin: 'round'
17
17
  ) do |s|
18
+ s.path(d: 'M13 2a9 9 0 0 1 9 9')
19
+ s.path(d: 'M13 6a5 5 0 0 1 5 5')
18
20
  s.path(
19
21
  d:
20
- 'M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z'
22
+ 'M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384'
21
23
  )
22
- s.path(d: 'M14.05 2a9 9 0 0 1 8 7.94')
23
- s.path(d: 'M14.05 6A5 5 0 0 1 18 10')
24
24
  end
25
25
  end
26
26
  end
@@ -15,11 +15,11 @@ module PhlexIcons
15
15
  stroke_linecap: 'round',
16
16
  stroke_linejoin: 'round'
17
17
  ) do |s|
18
- s.polyline(points: '18 2 22 6 18 10')
19
- s.line(x1: '14', x2: '22', y1: '6', y2: '6')
18
+ s.path(d: 'M14 6h8')
19
+ s.path(d: 'm18 2 4 4-4 4')
20
20
  s.path(
21
21
  d:
22
- 'M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z'
22
+ 'M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384'
23
23
  )
24
24
  end
25
25
  end
@@ -15,11 +15,11 @@ module PhlexIcons
15
15
  stroke_linecap: 'round',
16
16
  stroke_linejoin: 'round'
17
17
  ) do |s|
18
- s.polyline(points: '16 2 16 8 22 8')
19
- s.line(x1: '22', x2: '16', y1: '2', y2: '8')
18
+ s.path(d: 'M16 2v6h6')
19
+ s.path(d: 'm22 2-6 6')
20
20
  s.path(
21
21
  d:
22
- 'M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z'
22
+ 'M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384'
23
23
  )
24
24
  end
25
25
  end
@@ -15,11 +15,11 @@ module PhlexIcons
15
15
  stroke_linecap: 'round',
16
16
  stroke_linejoin: 'round'
17
17
  ) do |s|
18
- s.line(x1: '22', x2: '16', y1: '2', y2: '8')
19
- s.line(x1: '16', x2: '22', y1: '2', y2: '8')
18
+ s.path(d: 'm16 2 6 6')
19
+ s.path(d: 'm22 2-6 6')
20
20
  s.path(
21
21
  d:
22
- 'M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z'
22
+ 'M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384'
23
23
  )
24
24
  end
25
25
  end
@@ -17,9 +17,13 @@ module PhlexIcons
17
17
  ) do |s|
18
18
  s.path(
19
19
  d:
20
- 'M10.68 13.31a16 16 0 0 0 3.41 2.6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7 2 2 0 0 1 1.72 2v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.42 19.42 0 0 1-3.33-2.67m-2.67-3.34a19.79 19.79 0 0 1-3.07-8.63A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91'
20
+ 'M10.1 13.9a14 14 0 0 0 3.732 2.668 1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2 18 18 0 0 1-12.728-5.272'
21
+ )
22
+ s.path(d: 'M22 2 2 22')
23
+ s.path(
24
+ d:
25
+ 'M4.76 13.582A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 .244.473'
21
26
  )
22
- s.line(x1: '22', x2: '2', y1: '2', y2: '22')
23
27
  end
24
28
  end
25
29
  end
@@ -15,11 +15,11 @@ module PhlexIcons
15
15
  stroke_linecap: 'round',
16
16
  stroke_linejoin: 'round'
17
17
  ) do |s|
18
- s.polyline(points: '22 8 22 2 16 2')
19
- s.line(x1: '16', x2: '22', y1: '8', y2: '2')
18
+ s.path(d: 'm16 8 6-6')
19
+ s.path(d: 'M22 8V2h-6')
20
20
  s.path(
21
21
  d:
22
- 'M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z'
22
+ 'M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384'
23
23
  )
24
24
  end
25
25
  end
@@ -14,8 +14,8 @@ module PhlexIcons
14
14
  stroke_linecap: 'round',
15
15
  stroke_linejoin: 'round'
16
16
  ) do |s|
17
+ s.path(d: 'm21 21-4.34-4.34')
17
18
  s.circle(cx: '11', cy: '11', r: '8')
18
- s.path(d: 'm21 21-4.3-4.3')
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Layout/LineLength
4
+ module PhlexIcons
5
+ module Lucide
6
+ class SoapDispenserDroplet < Base
7
+ def view_template
8
+ svg(
9
+ **attrs,
10
+ xmlns: 'http://www.w3.org/2000/svg',
11
+ viewbox: '0 0 24 24',
12
+ fill: 'none',
13
+ stroke: 'currentColor',
14
+ stroke_width: '2',
15
+ stroke_linecap: 'round',
16
+ stroke_linejoin: 'round'
17
+ ) do |s|
18
+ s.path(d: 'M10.5 2v4')
19
+ s.path(d: 'M14 2H7a2 2 0 0 0-2 2')
20
+ s.path(
21
+ d:
22
+ 'M19.29 14.76A6.67 6.67 0 0 1 17 11a6.6 6.6 0 0 1-2.29 3.76c-1.15.92-1.71 2.04-1.71 3.19 0 2.22 1.8 4.05 4 4.05s4-1.83 4-4.05c0-1.16-.57-2.26-1.71-3.19'
23
+ )
24
+ s.path(
25
+ d:
26
+ 'M9.607 21H6a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h7V7a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3'
27
+ )
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ # rubocop:enable Layout/LineLength
@@ -14,12 +14,12 @@ module PhlexIcons
14
14
  stroke_linecap: 'round',
15
15
  stroke_linejoin: 'round'
16
16
  ) do |s|
17
- s.path(d: 'M4 4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16')
18
- s.path(d: 'M2 14h12')
19
- s.path(d: 'M22 14h-2')
20
17
  s.path(d: 'M12 20v-6')
18
+ s.path(d: 'M19.656 14H22')
19
+ s.path(d: 'M2 14h12')
21
20
  s.path(d: 'm2 2 20 20')
22
- s.path(d: 'M22 16V6a2 2 0 0 0-2-2H10')
21
+ s.path(d: 'M20 20H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2')
22
+ s.path(d: 'M9.656 4H20a2 2 0 0 1 2 2v10.344')
23
23
  end
24
24
  end
25
25
  end
@@ -15,9 +15,9 @@ module PhlexIcons
15
15
  stroke_linejoin: 'round'
16
16
  ) do |s|
17
17
  s.path(d: 'M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2')
18
- s.circle(cx: '9', cy: '7', r: '4')
18
+ s.path(d: 'M16 3.128a4 4 0 0 1 0 7.744')
19
19
  s.path(d: 'M22 21v-2a4 4 0 0 0-3-3.87')
20
- s.path(d: 'M16 3.13a4 4 0 0 1 0 7.75')
20
+ s.circle(cx: '9', cy: '7', r: '4')
21
21
  end
22
22
  end
23
23
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module PhlexIcons
4
4
  module Lucide # rubocop:disable Metrics/ModuleLength
5
- VERSION = '0.503.0'
5
+ VERSION = '0.510.0'
6
6
  VARIANTS = nil
7
7
 
8
8
  extend Phlex::Kit
@@ -242,6 +242,7 @@ module PhlexIcons
242
242
  autoload :BriefcaseMedical, 'phlex-icons/lucide/briefcase_medical'
243
243
  autoload :BringToFront, 'phlex-icons/lucide/bring_to_front'
244
244
  autoload :Brush, 'phlex-icons/lucide/brush'
245
+ autoload :BrushCleaning, 'phlex-icons/lucide/brush_cleaning'
245
246
  autoload :Bubbles, 'phlex-icons/lucide/bubbles'
246
247
  autoload :Bug, 'phlex-icons/lucide/bug'
247
248
  autoload :BugOff, 'phlex-icons/lucide/bug_off'
@@ -322,6 +323,7 @@ module PhlexIcons
322
323
  autoload :ChartSpline, 'phlex-icons/lucide/chart_spline'
323
324
  autoload :Check, 'phlex-icons/lucide/check'
324
325
  autoload :CheckCheck, 'phlex-icons/lucide/check_check'
326
+ autoload :CheckLine, 'phlex-icons/lucide/check_line'
325
327
  autoload :ChefHat, 'phlex-icons/lucide/chef_hat'
326
328
  autoload :Cherry, 'phlex-icons/lucide/cherry'
327
329
  autoload :ChevronDown, 'phlex-icons/lucide/chevron_down'
@@ -417,6 +419,7 @@ module PhlexIcons
417
419
  autoload :ClockArrowDown, 'phlex-icons/lucide/clock_arrow_down'
418
420
  autoload :ClockArrowUp, 'phlex-icons/lucide/clock_arrow_up'
419
421
  autoload :ClockFading, 'phlex-icons/lucide/clock_fading'
422
+ autoload :ClockPlus, 'phlex-icons/lucide/clock_plus'
420
423
  autoload :Cloud, 'phlex-icons/lucide/cloud'
421
424
  autoload :CloudAlert, 'phlex-icons/lucide/cloud_alert'
422
425
  autoload :CloudCog, 'phlex-icons/lucide/cloud_cog'
@@ -728,6 +731,7 @@ module PhlexIcons
728
731
  autoload :Globe, 'phlex-icons/lucide/globe'
729
732
  autoload :GlobeLock, 'phlex-icons/lucide/globe_lock'
730
733
  autoload :Goal, 'phlex-icons/lucide/goal'
734
+ autoload :Gpu, 'phlex-icons/lucide/gpu'
731
735
  autoload :Grab, 'phlex-icons/lucide/grab'
732
736
  autoload :GraduationCap, 'phlex-icons/lucide/graduation_cap'
733
737
  autoload :Grape, 'phlex-icons/lucide/grape'
@@ -742,6 +746,7 @@ module PhlexIcons
742
746
  autoload :Group, 'phlex-icons/lucide/group'
743
747
  autoload :Guitar, 'phlex-icons/lucide/guitar'
744
748
  autoload :Ham, 'phlex-icons/lucide/ham'
749
+ autoload :Hamburger, 'phlex-icons/lucide/hamburger'
745
750
  autoload :Hammer, 'phlex-icons/lucide/hammer'
746
751
  autoload :Hand, 'phlex-icons/lucide/hand'
747
752
  autoload :HandCoins, 'phlex-icons/lucide/hand_coins'
@@ -1047,6 +1052,7 @@ module PhlexIcons
1047
1052
  autoload :Paintbrush, 'phlex-icons/lucide/paintbrush'
1048
1053
  autoload :PaintbrushVertical, 'phlex-icons/lucide/paintbrush_vertical'
1049
1054
  autoload :Palette, 'phlex-icons/lucide/palette'
1055
+ autoload :Panda, 'phlex-icons/lucide/panda'
1050
1056
  autoload :PanelBottom, 'phlex-icons/lucide/panel_bottom'
1051
1057
  autoload :PanelBottomClose, 'phlex-icons/lucide/panel_bottom_close'
1052
1058
  autoload :PanelBottomDashed, 'phlex-icons/lucide/panel_bottom_dashed'
@@ -1298,6 +1304,7 @@ module PhlexIcons
1298
1304
  autoload :SmilePlus, 'phlex-icons/lucide/smile_plus'
1299
1305
  autoload :Snail, 'phlex-icons/lucide/snail'
1300
1306
  autoload :Snowflake, 'phlex-icons/lucide/snowflake'
1307
+ autoload :SoapDispenserDroplet, 'phlex-icons/lucide/soap_dispenser_droplet'
1301
1308
  autoload :Sofa, 'phlex-icons/lucide/sofa'
1302
1309
  autoload :Soup, 'phlex-icons/lucide/soup'
1303
1310
  autoload :Space, 'phlex-icons/lucide/space'
@@ -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