phlex-icons-lucide 2.18.0 → 2.20.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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -1
  3. data/README.md +44 -0
  4. data/generators/flag.rb +1 -1
  5. data/generators/hero.rb +1 -1
  6. data/generators/tabler.rb +1 -1
  7. data/lib/phlex-icons/configuration.rb +24 -1
  8. data/lib/phlex-icons/icon.rb +31 -0
  9. data/lib/phlex-icons/lucide/air_vent.rb +2 -2
  10. data/lib/phlex-icons/lucide/baby.rb +3 -3
  11. data/lib/phlex-icons/lucide/bell_electric.rb +4 -4
  12. data/lib/phlex-icons/lucide/book_key.rb +2 -2
  13. data/lib/phlex-icons/lucide/bow_arrow.rb +33 -0
  14. data/lib/phlex-icons/lucide/brain_cog.rb +19 -17
  15. data/lib/phlex-icons/lucide/brick_wall_fire.rb +33 -0
  16. data/lib/phlex-icons/lucide/brush.rb +3 -5
  17. data/lib/phlex-icons/lucide/brush_cleaning.rb +30 -0
  18. data/lib/phlex-icons/lucide/bubbles.rb +25 -0
  19. data/lib/phlex-icons/lucide/calendar_cog.rb +9 -9
  20. data/lib/phlex-icons/lucide/calendar_plus.rb +4 -4
  21. data/lib/phlex-icons/lucide/clipboard_paste.rb +5 -8
  22. data/lib/phlex-icons/lucide/clock_plus.rb +25 -0
  23. data/lib/phlex-icons/lucide/cloud_cog.rb +12 -10
  24. data/lib/phlex-icons/lucide/columns_3_cog.rb +35 -0
  25. data/lib/phlex-icons/lucide/cpu.rb +14 -10
  26. data/lib/phlex-icons/lucide/decimals_arrow_left.rb +25 -0
  27. data/lib/phlex-icons/lucide/decimals_arrow_right.rb +26 -0
  28. data/lib/phlex-icons/lucide/door_closed.rb +1 -1
  29. data/lib/phlex-icons/lucide/door_closed_locked.rb +26 -0
  30. data/lib/phlex-icons/lucide/door_open.rb +5 -5
  31. data/lib/phlex-icons/lucide/dumbbell.rb +5 -5
  32. data/lib/phlex-icons/lucide/expand.rb +4 -4
  33. data/lib/phlex-icons/lucide/file_badge_2.rb +7 -3
  34. data/lib/phlex-icons/lucide/file_cog.rb +8 -8
  35. data/lib/phlex-icons/lucide/folder_cog.rb +10 -10
  36. data/lib/phlex-icons/lucide/guitar.rb +1 -2
  37. data/lib/phlex-icons/lucide/hamburger.rb +28 -0
  38. data/lib/phlex-icons/lucide/heart_minus.rb +28 -0
  39. data/lib/phlex-icons/lucide/heart_plus.rb +29 -0
  40. data/lib/phlex-icons/lucide/lamp.rb +7 -2
  41. data/lib/phlex-icons/lucide/lamp_ceiling.rb +5 -2
  42. data/lib/phlex-icons/lucide/lamp_desk.rb +11 -4
  43. data/lib/phlex-icons/lucide/lamp_floor.rb +5 -2
  44. data/lib/phlex-icons/lucide/lamp_wall_down.rb +8 -3
  45. data/lib/phlex-icons/lucide/lamp_wall_up.rb +8 -3
  46. data/lib/phlex-icons/lucide/laptop.rb +2 -1
  47. data/lib/phlex-icons/lucide/layers_2.rb +2 -2
  48. data/lib/phlex-icons/lucide/locate_off.rb +7 -13
  49. data/lib/phlex-icons/lucide/location_edit.rb +29 -0
  50. data/lib/phlex-icons/lucide/mail.rb +2 -2
  51. data/lib/phlex-icons/lucide/menu.rb +3 -3
  52. data/lib/phlex-icons/lucide/monitor_cog.rb +8 -8
  53. data/lib/phlex-icons/lucide/non_binary.rb +2 -2
  54. data/lib/phlex-icons/lucide/orbit.rb +2 -2
  55. data/lib/phlex-icons/lucide/package_2.rb +7 -2
  56. data/lib/phlex-icons/lucide/palette.rb +5 -5
  57. data/lib/phlex-icons/lucide/panda.rb +32 -0
  58. data/lib/phlex-icons/lucide/phone.rb +1 -1
  59. data/lib/phlex-icons/lucide/phone_call.rb +3 -3
  60. data/lib/phlex-icons/lucide/phone_forwarded.rb +3 -3
  61. data/lib/phlex-icons/lucide/phone_incoming.rb +3 -3
  62. data/lib/phlex-icons/lucide/phone_missed.rb +3 -3
  63. data/lib/phlex-icons/lucide/phone_off.rb +6 -2
  64. data/lib/phlex-icons/lucide/phone_outgoing.rb +3 -3
  65. data/lib/phlex-icons/lucide/piggy_bank.rb +3 -3
  66. data/lib/phlex-icons/lucide/pipette.rb +8 -3
  67. data/lib/phlex-icons/lucide/rectangle_goggles.rb +27 -0
  68. data/lib/phlex-icons/lucide/rotate_ccw_key.rb +26 -0
  69. data/lib/phlex-icons/lucide/ruler_dimension_line.rb +28 -0
  70. data/lib/phlex-icons/lucide/search.rb +1 -1
  71. data/lib/phlex-icons/lucide/server_cog.rb +9 -10
  72. data/lib/phlex-icons/lucide/shredder.rb +28 -0
  73. data/lib/phlex-icons/lucide/soap_dispenser_droplet.rb +33 -0
  74. data/lib/phlex-icons/lucide/squares_exclude.rb +29 -0
  75. data/lib/phlex-icons/lucide/squares_intersect.rb +36 -0
  76. data/lib/phlex-icons/lucide/squares_subtract.rb +30 -0
  77. data/lib/phlex-icons/lucide/squares_unite.rb +27 -0
  78. data/lib/phlex-icons/lucide/text_cursor_input.rb +4 -4
  79. data/lib/phlex-icons/lucide/touchpad_off.rb +4 -4
  80. data/lib/phlex-icons/lucide/traffic_cone.rb +4 -7
  81. data/lib/phlex-icons/lucide/truck_electric.rb +33 -0
  82. data/lib/phlex-icons/lucide/user_cog.rb +9 -9
  83. data/lib/phlex-icons/lucide/user_lock.rb +25 -0
  84. data/lib/phlex-icons/lucide/user_round_cog.rb +8 -8
  85. data/lib/phlex-icons/lucide/users.rb +2 -2
  86. data/lib/phlex-icons/lucide/wifi_pen.rb +30 -0
  87. data/lib/phlex-icons/lucide.rb +27 -1
  88. data/lib/phlex-icons/name_parser.rb +117 -0
  89. data/lib/phlex-icons/railtie.rb +17 -0
  90. data/lib/phlex-icons/version.rb +1 -1
  91. data/lib/phlex-icons-lucide.rb +3 -0
  92. metadata +31 -2
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexIcons
4
+ module Lucide
5
+ class TruckElectric < 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: 'M14 19V7a2 2 0 0 0-2-2H9')
18
+ s.path(d: 'M15 19H9')
19
+ s.path(
20
+ d:
21
+ 'M19 19h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.62L18.3 9.38a1 1 0 0 0-.78-.38H14'
22
+ )
23
+ s.path(d: 'M2 13v5a1 1 0 0 0 1 1h2')
24
+ s.path(
25
+ d: 'M4 3 2.15 5.15a.495.495 0 0 0 .35.86h2.15a.47.47 0 0 1 .35.86L3 9.02'
26
+ )
27
+ s.circle(cx: '17', cy: '19', r: '2')
28
+ s.circle(cx: '7', cy: '19', r: '2')
29
+ end
30
+ end
31
+ end
32
+ end
33
+ 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: 'M10 15H6a4 4 0 0 0-4 4v2')
19
+ s.path(d: 'm14.305 16.53.923-.382')
20
+ s.path(d: 'm15.228 13.852-.923-.383')
21
+ s.path(d: 'm16.852 12.228-.383-.923')
22
+ s.path(d: 'm16.852 17.772-.383.924')
23
+ s.path(d: 'm19.148 12.228.383-.923')
24
+ s.path(d: 'm19.53 18.696-.382-.924')
25
+ s.path(d: 'm20.772 13.852.924-.383')
26
+ s.path(d: 'm20.772 16.148.924.383')
18
27
  s.circle(cx: '18', cy: '15', r: '3')
19
28
  s.circle(cx: '9', cy: '7', r: '4')
20
- s.path(d: 'M10 15H6a4 4 0 0 0-4 4v2')
21
- s.path(d: 'm21.7 16.4-.9-.3')
22
- s.path(d: 'm15.2 13.9-.9-.3')
23
- s.path(d: 'm16.6 18.7.3-.9')
24
- s.path(d: 'm19.1 12.2.3-.9')
25
- s.path(d: 'm19.6 18.7-.4-1')
26
- s.path(d: 'm16.8 12.3-.4-1')
27
- s.path(d: 'm14.3 16.6 1-.4')
28
- s.path(d: 'm20.7 13.8 1-.4')
29
29
  end
30
30
  end
31
31
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexIcons
4
+ module Lucide
5
+ class UserLock < 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.circle(cx: '10', cy: '7', r: '4')
18
+ s.path(d: 'M10.3 15H7a4 4 0 0 0-4 4v2')
19
+ s.path(d: 'M15 15.5V14a2 2 0 0 1 4 0v1.5')
20
+ s.rect(width: '8', height: '5', x: '13', y: '16', rx: '.899')
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.305 19.53.923-.382')
19
+ s.path(d: 'm15.228 16.852-.923-.383')
20
+ s.path(d: 'm16.852 15.228-.383-.923')
21
+ s.path(d: 'm16.852 20.772-.383.924')
22
+ s.path(d: 'm19.148 15.228.383-.923')
23
+ s.path(d: 'm19.53 21.696-.382-.924')
18
24
  s.path(d: 'M2 21a8 8 0 0 1 10.434-7.62')
25
+ s.path(d: 'm20.772 16.852.924-.383')
26
+ s.path(d: 'm20.772 19.148.924.383')
19
27
  s.circle(cx: '10', cy: '8', r: '5')
20
28
  s.circle(cx: '18', cy: '18', r: '3')
21
- s.path(d: 'm19.5 14.3-.4.9')
22
- s.path(d: 'm16.9 20.8-.4.9')
23
- s.path(d: 'm21.7 19.5-.9-.4')
24
- s.path(d: 'm15.2 16.9-.9-.4')
25
- s.path(d: 'm21.7 16.5-.9.4')
26
- s.path(d: 'm15.2 19.1-.9.4')
27
- s.path(d: 'm19.5 21.7-.4-.9')
28
- s.path(d: 'm16.9 15.2-.4-.9')
29
29
  end
30
30
  end
31
31
  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
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Layout/LineLength
4
+ module PhlexIcons
5
+ module Lucide
6
+ class WifiPen < 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: 'M2 8.82a15 15 0 0 1 20 0')
19
+ s.path(
20
+ d:
21
+ 'M21.378 16.626a1 1 0 0 0-3.004-3.004l-4.01 4.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506z'
22
+ )
23
+ s.path(d: 'M5 12.859a10 10 0 0 1 10.5-2.222')
24
+ s.path(d: 'M8.5 16.429a5 5 0 0 1 3-1.406')
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ # rubocop:enable Layout/LineLength
@@ -2,7 +2,7 @@
2
2
 
3
3
  module PhlexIcons
4
4
  module Lucide # rubocop:disable Metrics/ModuleLength
5
- VERSION = '0.488.0'
5
+ VERSION = '0.508.0'
6
6
  VARIANTS = nil
7
7
 
8
8
  extend Phlex::Kit
@@ -226,6 +226,7 @@ module PhlexIcons
226
226
  autoload :Bot, 'phlex-icons/lucide/bot'
227
227
  autoload :BotMessageSquare, 'phlex-icons/lucide/bot_message_square'
228
228
  autoload :BotOff, 'phlex-icons/lucide/bot_off'
229
+ autoload :BowArrow, 'phlex-icons/lucide/bow_arrow'
229
230
  autoload :Box, 'phlex-icons/lucide/box'
230
231
  autoload :Boxes, 'phlex-icons/lucide/boxes'
231
232
  autoload :Braces, 'phlex-icons/lucide/braces'
@@ -234,12 +235,15 @@ module PhlexIcons
234
235
  autoload :BrainCircuit, 'phlex-icons/lucide/brain_circuit'
235
236
  autoload :BrainCog, 'phlex-icons/lucide/brain_cog'
236
237
  autoload :BrickWall, 'phlex-icons/lucide/brick_wall'
238
+ autoload :BrickWallFire, 'phlex-icons/lucide/brick_wall_fire'
237
239
  autoload :Briefcase, 'phlex-icons/lucide/briefcase'
238
240
  autoload :BriefcaseBusiness, 'phlex-icons/lucide/briefcase_business'
239
241
  autoload :BriefcaseConveyorBelt, 'phlex-icons/lucide/briefcase_conveyor_belt'
240
242
  autoload :BriefcaseMedical, 'phlex-icons/lucide/briefcase_medical'
241
243
  autoload :BringToFront, 'phlex-icons/lucide/bring_to_front'
242
244
  autoload :Brush, 'phlex-icons/lucide/brush'
245
+ autoload :BrushCleaning, 'phlex-icons/lucide/brush_cleaning'
246
+ autoload :Bubbles, 'phlex-icons/lucide/bubbles'
243
247
  autoload :Bug, 'phlex-icons/lucide/bug'
244
248
  autoload :BugOff, 'phlex-icons/lucide/bug_off'
245
249
  autoload :BugPlay, 'phlex-icons/lucide/bug_play'
@@ -414,6 +418,7 @@ module PhlexIcons
414
418
  autoload :ClockArrowDown, 'phlex-icons/lucide/clock_arrow_down'
415
419
  autoload :ClockArrowUp, 'phlex-icons/lucide/clock_arrow_up'
416
420
  autoload :ClockFading, 'phlex-icons/lucide/clock_fading'
421
+ autoload :ClockPlus, 'phlex-icons/lucide/clock_plus'
417
422
  autoload :Cloud, 'phlex-icons/lucide/cloud'
418
423
  autoload :CloudAlert, 'phlex-icons/lucide/cloud_alert'
419
424
  autoload :CloudCog, 'phlex-icons/lucide/cloud_cog'
@@ -443,6 +448,7 @@ module PhlexIcons
443
448
  autoload :Coins, 'phlex-icons/lucide/coins'
444
449
  autoload :Columns2, 'phlex-icons/lucide/columns_2'
445
450
  autoload :Columns3, 'phlex-icons/lucide/columns_3'
451
+ autoload :Columns3Cog, 'phlex-icons/lucide/columns_3_cog'
446
452
  autoload :Columns4, 'phlex-icons/lucide/columns_4'
447
453
  autoload :Combine, 'phlex-icons/lucide/combine'
448
454
  autoload :Command, 'phlex-icons/lucide/command'
@@ -490,6 +496,8 @@ module PhlexIcons
490
496
  autoload :Database, 'phlex-icons/lucide/database'
491
497
  autoload :DatabaseBackup, 'phlex-icons/lucide/database_backup'
492
498
  autoload :DatabaseZap, 'phlex-icons/lucide/database_zap'
499
+ autoload :DecimalsArrowLeft, 'phlex-icons/lucide/decimals_arrow_left'
500
+ autoload :DecimalsArrowRight, 'phlex-icons/lucide/decimals_arrow_right'
493
501
  autoload :Delete, 'phlex-icons/lucide/delete'
494
502
  autoload :Dessert, 'phlex-icons/lucide/dessert'
495
503
  autoload :Diameter, 'phlex-icons/lucide/diameter'
@@ -517,6 +525,7 @@ module PhlexIcons
517
525
  autoload :DollarSign, 'phlex-icons/lucide/dollar_sign'
518
526
  autoload :Donut, 'phlex-icons/lucide/donut'
519
527
  autoload :DoorClosed, 'phlex-icons/lucide/door_closed'
528
+ autoload :DoorClosedLocked, 'phlex-icons/lucide/door_closed_locked'
520
529
  autoload :DoorOpen, 'phlex-icons/lucide/door_open'
521
530
  autoload :Dot, 'phlex-icons/lucide/dot'
522
531
  autoload :Download, 'phlex-icons/lucide/download'
@@ -735,6 +744,7 @@ module PhlexIcons
735
744
  autoload :Group, 'phlex-icons/lucide/group'
736
745
  autoload :Guitar, 'phlex-icons/lucide/guitar'
737
746
  autoload :Ham, 'phlex-icons/lucide/ham'
747
+ autoload :Hamburger, 'phlex-icons/lucide/hamburger'
738
748
  autoload :Hammer, 'phlex-icons/lucide/hammer'
739
749
  autoload :Hand, 'phlex-icons/lucide/hand'
740
750
  autoload :HandCoins, 'phlex-icons/lucide/hand_coins'
@@ -763,7 +773,9 @@ module PhlexIcons
763
773
  autoload :Heart, 'phlex-icons/lucide/heart'
764
774
  autoload :HeartCrack, 'phlex-icons/lucide/heart_crack'
765
775
  autoload :HeartHandshake, 'phlex-icons/lucide/heart_handshake'
776
+ autoload :HeartMinus, 'phlex-icons/lucide/heart_minus'
766
777
  autoload :HeartOff, 'phlex-icons/lucide/heart_off'
778
+ autoload :HeartPlus, 'phlex-icons/lucide/heart_plus'
767
779
  autoload :HeartPulse, 'phlex-icons/lucide/heart_pulse'
768
780
  autoload :Heater, 'phlex-icons/lucide/heater'
769
781
  autoload :Hexagon, 'phlex-icons/lucide/hexagon'
@@ -871,6 +883,7 @@ module PhlexIcons
871
883
  autoload :Locate, 'phlex-icons/lucide/locate'
872
884
  autoload :LocateFixed, 'phlex-icons/lucide/locate_fixed'
873
885
  autoload :LocateOff, 'phlex-icons/lucide/locate_off'
886
+ autoload :LocationEdit, 'phlex-icons/lucide/location_edit'
874
887
  autoload :Lock, 'phlex-icons/lucide/lock'
875
888
  autoload :LockKeyhole, 'phlex-icons/lucide/lock_keyhole'
876
889
  autoload :LockKeyholeOpen, 'phlex-icons/lucide/lock_keyhole_open'
@@ -1037,6 +1050,7 @@ module PhlexIcons
1037
1050
  autoload :Paintbrush, 'phlex-icons/lucide/paintbrush'
1038
1051
  autoload :PaintbrushVertical, 'phlex-icons/lucide/paintbrush_vertical'
1039
1052
  autoload :Palette, 'phlex-icons/lucide/palette'
1053
+ autoload :Panda, 'phlex-icons/lucide/panda'
1040
1054
  autoload :PanelBottom, 'phlex-icons/lucide/panel_bottom'
1041
1055
  autoload :PanelBottomClose, 'phlex-icons/lucide/panel_bottom_close'
1042
1056
  autoload :PanelBottomDashed, 'phlex-icons/lucide/panel_bottom_dashed'
@@ -1146,6 +1160,7 @@ module PhlexIcons
1146
1160
  autoload :ReceiptSwissFranc, 'phlex-icons/lucide/receipt_swiss_franc'
1147
1161
  autoload :ReceiptText, 'phlex-icons/lucide/receipt_text'
1148
1162
  autoload :RectangleEllipsis, 'phlex-icons/lucide/rectangle_ellipsis'
1163
+ autoload :RectangleGoggles, 'phlex-icons/lucide/rectangle_goggles'
1149
1164
  autoload :RectangleHorizontal, 'phlex-icons/lucide/rectangle_horizontal'
1150
1165
  autoload :RectangleVertical, 'phlex-icons/lucide/rectangle_vertical'
1151
1166
  autoload :Recycle, 'phlex-icons/lucide/recycle'
@@ -1173,6 +1188,7 @@ module PhlexIcons
1173
1188
  autoload :RollerCoaster, 'phlex-icons/lucide/roller_coaster'
1174
1189
  autoload :Rotate3d, 'phlex-icons/lucide/rotate_3d'
1175
1190
  autoload :RotateCcw, 'phlex-icons/lucide/rotate_ccw'
1191
+ autoload :RotateCcwKey, 'phlex-icons/lucide/rotate_ccw_key'
1176
1192
  autoload :RotateCcwSquare, 'phlex-icons/lucide/rotate_ccw_square'
1177
1193
  autoload :RotateCw, 'phlex-icons/lucide/rotate_cw'
1178
1194
  autoload :RotateCwSquare, 'phlex-icons/lucide/rotate_cw_square'
@@ -1184,6 +1200,7 @@ module PhlexIcons
1184
1200
  autoload :Rows4, 'phlex-icons/lucide/rows_4'
1185
1201
  autoload :Rss, 'phlex-icons/lucide/rss'
1186
1202
  autoload :Ruler, 'phlex-icons/lucide/ruler'
1203
+ autoload :RulerDimensionLine, 'phlex-icons/lucide/ruler_dimension_line'
1187
1204
  autoload :RussianRuble, 'phlex-icons/lucide/russian_ruble'
1188
1205
  autoload :Sailboat, 'phlex-icons/lucide/sailboat'
1189
1206
  autoload :Salad, 'phlex-icons/lucide/salad'
@@ -1255,6 +1272,7 @@ module PhlexIcons
1255
1272
  autoload :ShoppingCart, 'phlex-icons/lucide/shopping_cart'
1256
1273
  autoload :Shovel, 'phlex-icons/lucide/shovel'
1257
1274
  autoload :ShowerHead, 'phlex-icons/lucide/shower_head'
1275
+ autoload :Shredder, 'phlex-icons/lucide/shredder'
1258
1276
  autoload :Shrimp, 'phlex-icons/lucide/shrimp'
1259
1277
  autoload :Shrink, 'phlex-icons/lucide/shrink'
1260
1278
  autoload :Shrub, 'phlex-icons/lucide/shrub'
@@ -1284,6 +1302,7 @@ module PhlexIcons
1284
1302
  autoload :SmilePlus, 'phlex-icons/lucide/smile_plus'
1285
1303
  autoload :Snail, 'phlex-icons/lucide/snail'
1286
1304
  autoload :Snowflake, 'phlex-icons/lucide/snowflake'
1305
+ autoload :SoapDispenserDroplet, 'phlex-icons/lucide/soap_dispenser_droplet'
1287
1306
  autoload :Sofa, 'phlex-icons/lucide/sofa'
1288
1307
  autoload :Soup, 'phlex-icons/lucide/soup'
1289
1308
  autoload :Space, 'phlex-icons/lucide/space'
@@ -1360,6 +1379,10 @@ module PhlexIcons
1360
1379
  autoload :SquareUser, 'phlex-icons/lucide/square_user'
1361
1380
  autoload :SquareUserRound, 'phlex-icons/lucide/square_user_round'
1362
1381
  autoload :SquareX, 'phlex-icons/lucide/square_x'
1382
+ autoload :SquaresExclude, 'phlex-icons/lucide/squares_exclude'
1383
+ autoload :SquaresIntersect, 'phlex-icons/lucide/squares_intersect'
1384
+ autoload :SquaresSubtract, 'phlex-icons/lucide/squares_subtract'
1385
+ autoload :SquaresUnite, 'phlex-icons/lucide/squares_unite'
1363
1386
  autoload :Squircle, 'phlex-icons/lucide/squircle'
1364
1387
  autoload :Squirrel, 'phlex-icons/lucide/squirrel'
1365
1388
  autoload :Stamp, 'phlex-icons/lucide/stamp'
@@ -1473,6 +1496,7 @@ module PhlexIcons
1473
1496
  autoload :TriangleRight, 'phlex-icons/lucide/triangle_right'
1474
1497
  autoload :Trophy, 'phlex-icons/lucide/trophy'
1475
1498
  autoload :Truck, 'phlex-icons/lucide/truck'
1499
+ autoload :TruckElectric, 'phlex-icons/lucide/truck_electric'
1476
1500
  autoload :Turtle, 'phlex-icons/lucide/turtle'
1477
1501
  autoload :Tv, 'phlex-icons/lucide/tv'
1478
1502
  autoload :TvMinimal, 'phlex-icons/lucide/tv_minimal'
@@ -1499,6 +1523,7 @@ module PhlexIcons
1499
1523
  autoload :User, 'phlex-icons/lucide/user'
1500
1524
  autoload :UserCheck, 'phlex-icons/lucide/user_check'
1501
1525
  autoload :UserCog, 'phlex-icons/lucide/user_cog'
1526
+ autoload :UserLock, 'phlex-icons/lucide/user_lock'
1502
1527
  autoload :UserMinus, 'phlex-icons/lucide/user_minus'
1503
1528
  autoload :UserPen, 'phlex-icons/lucide/user_pen'
1504
1529
  autoload :UserPlus, 'phlex-icons/lucide/user_plus'
@@ -1560,6 +1585,7 @@ module PhlexIcons
1560
1585
  autoload :WifiHigh, 'phlex-icons/lucide/wifi_high'
1561
1586
  autoload :WifiLow, 'phlex-icons/lucide/wifi_low'
1562
1587
  autoload :WifiOff, 'phlex-icons/lucide/wifi_off'
1588
+ autoload :WifiPen, 'phlex-icons/lucide/wifi_pen'
1563
1589
  autoload :WifiZero, 'phlex-icons/lucide/wifi_zero'
1564
1590
  autoload :Wind, 'phlex-icons/lucide/wind'
1565
1591
  autoload :WindArrowDown, 'phlex-icons/lucide/wind_arrow_down'
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexIcons
4
- VERSION = '2.18.0'
4
+ VERSION = '2.20.0'
5
5
  end
@@ -12,6 +12,9 @@ require_relative 'phlex-icons/version'
12
12
  require_relative 'phlex-icons/lucide'
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