rails_icons 0.4.0 → 1.1.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/Gemfile.lock +1 -1
- data/README.md +75 -60
- data/app/assets/svg/rails_icons/icons/animated/bouncing-dots.svg +1 -0
- data/app/assets/svg/rails_icons/icons/animated/faded-spinner.svg +1 -0
- data/app/assets/svg/rails_icons/icons/animated/fading-dots.svg +1 -0
- data/app/assets/svg/rails_icons/icons/animated/trailing-spinner.svg +1 -0
- data/lib/generators/rails_icons/initializer_generator.rb +89 -2
- data/lib/generators/rails_icons/install_generator.rb +27 -0
- data/lib/generators/rails_icons/sync_generator.rb +16 -37
- data/lib/generators/rails_icons/templates/initializer.rb.tt +0 -16
- data/lib/rails_icons/configuration/animated.rb +24 -0
- data/lib/rails_icons/configuration/boxicons.rb +74 -0
- data/lib/rails_icons/configuration/feather.rb +45 -0
- data/lib/rails_icons/configuration/heroicons.rb +101 -0
- data/lib/rails_icons/configuration/lucide.rb +50 -0
- data/lib/rails_icons/configuration/phosphor.rb +141 -0
- data/lib/rails_icons/configuration/radix.rb +44 -0
- data/lib/rails_icons/configuration/tabler.rb +67 -0
- data/lib/rails_icons/configuration.rb +13 -12
- data/lib/rails_icons/helpers/icon_helper.rb +3 -4
- data/lib/rails_icons/icon/attributes.rb +9 -3
- data/lib/rails_icons/icon/file_path.rb +57 -0
- data/lib/rails_icons/icon.rb +37 -45
- data/lib/rails_icons/libraries.rb +24 -0
- data/lib/rails_icons/railtie.rb +6 -0
- data/lib/rails_icons/sync/engine.rb +75 -0
- data/lib/rails_icons/sync/process_variants.rb +64 -0
- data/lib/rails_icons/sync/transformations.rb +27 -0
- data/lib/rails_icons/version.rb +1 -1
- data/lib/rails_icons.rb +2 -12
- data/rails_icons.gemspec +3 -3
- metadata +26 -10
- data/lib/rails_icons/icon_configs/heroicons_config.rb +0 -66
- data/lib/rails_icons/icon_configs/lucide_config.rb +0 -28
- data/lib/rails_icons/icon_configs/tabler_config.rb +0 -41
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative "configuration/animated"
|
2
|
+
require_relative "configuration/boxicons"
|
3
|
+
require_relative "configuration/feather"
|
4
|
+
require_relative "configuration/heroicons"
|
5
|
+
require_relative "configuration/lucide"
|
6
|
+
require_relative "configuration/phosphor"
|
7
|
+
require_relative "configuration/radix"
|
8
|
+
require_relative "configuration/tabler"
|
9
|
+
|
10
|
+
module RailsIcons
|
11
|
+
extend self
|
12
|
+
|
13
|
+
def libraries
|
14
|
+
{
|
15
|
+
boxicons: RailsIcons::Configuration::Boxicons,
|
16
|
+
feather: RailsIcons::Configuration::Feather,
|
17
|
+
heroicons: RailsIcons::Configuration::Heroicons,
|
18
|
+
lucide: RailsIcons::Configuration::Lucide,
|
19
|
+
phosphor: RailsIcons::Configuration::Phosphor,
|
20
|
+
radix: RailsIcons::Configuration::Radix,
|
21
|
+
tabler: RailsIcons::Configuration::Tabler
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
data/lib/rails_icons/railtie.rb
CHANGED
@@ -9,5 +9,11 @@ module RailsIcons
|
|
9
9
|
include RailsIcons::Helpers::IconHelper
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
initializer "rails_icons.assets" do |app|
|
14
|
+
gem_root = Pathname.new(Gem.loaded_specs["rails_icons"].gem_dir)
|
15
|
+
|
16
|
+
app.config.assets.paths << gem_root.join("app", "assets", "svg")
|
17
|
+
end
|
12
18
|
end
|
13
19
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "fileutils"
|
4
|
+
require "rails_icons/sync/process_variants"
|
5
|
+
|
6
|
+
module RailsIcons
|
7
|
+
module Sync
|
8
|
+
class Engine < Rails::Generators::Base
|
9
|
+
def initialize(name)
|
10
|
+
super
|
11
|
+
|
12
|
+
raise "[Rails Icons] Not a valid library" if RailsIcons.libraries.keys.exclude?(name.to_sym)
|
13
|
+
|
14
|
+
@temp_directory, @name, @library = File.join(TEMP_DIRECTORY, name), name, RailsIcons.libraries.fetch(name.to_sym).source
|
15
|
+
end
|
16
|
+
|
17
|
+
def sync
|
18
|
+
clone_repository
|
19
|
+
process_variants
|
20
|
+
remove_non_svg_files
|
21
|
+
|
22
|
+
move_library
|
23
|
+
|
24
|
+
purge_temp_directory
|
25
|
+
rescue => error
|
26
|
+
say "[Rails Icons] Failed to sync icons: #{error.message}", :red
|
27
|
+
|
28
|
+
post_error_clean_up
|
29
|
+
|
30
|
+
raise
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
TEMP_DIRECTORY = Rails.root.join("tmp/icons").freeze
|
36
|
+
|
37
|
+
def clone_repository
|
38
|
+
raise "[Rails Icons] Failed to clone repository" unless system("git clone '#{@library[:url]}' '#{@temp_directory}'")
|
39
|
+
|
40
|
+
say "'#{@name}' repository cloned successfully."
|
41
|
+
end
|
42
|
+
|
43
|
+
def process_variants = Sync::ProcessVariants.new(@temp_directory, @name, @library).process
|
44
|
+
|
45
|
+
def remove_non_svg_files
|
46
|
+
Pathname.glob("#{@temp_directory}/**/*")
|
47
|
+
.select { _1.file? && _1.extname != ".svg" }
|
48
|
+
.each(&:delete)
|
49
|
+
|
50
|
+
say "[Rails Icons] Non-SVG files removed successfully"
|
51
|
+
end
|
52
|
+
|
53
|
+
def move_library
|
54
|
+
destination = File.join(RailsIcons.configuration.destination_path, @name)
|
55
|
+
|
56
|
+
FileUtils.mkdir_p(destination)
|
57
|
+
FileUtils.mv(Dir.glob("#{@temp_directory}/*"), destination, force: true)
|
58
|
+
|
59
|
+
say "[Rails Icons] Synced '#{@name}' library successfully #{%w[😃 🎉 ✨].sample}", :green
|
60
|
+
end
|
61
|
+
|
62
|
+
def purge_temp_directory = FileUtils.rm_rf(TEMP_DIRECTORY)
|
63
|
+
|
64
|
+
def post_error_clean_up
|
65
|
+
if yes?("Do you want to remove the temp files? ('#{@temp_directory}') [y/n]")
|
66
|
+
say "[Rails Icons] Cleaning up…"
|
67
|
+
|
68
|
+
FileUtils.rm_rf(@temp_directory)
|
69
|
+
else
|
70
|
+
say "[Rails Icons] Keeping files at: '#{@temp_directory}'"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "fileutils"
|
4
|
+
require "rails_icons/sync/transformations"
|
5
|
+
|
6
|
+
module RailsIcons
|
7
|
+
module Sync
|
8
|
+
class ProcessVariants < Rails::Generators::Base
|
9
|
+
def initialize(temp_directory, name, library)
|
10
|
+
@temp_directory, @name, @library = temp_directory, name, library
|
11
|
+
end
|
12
|
+
|
13
|
+
def process
|
14
|
+
original_variants = Dir.children(@temp_directory)
|
15
|
+
|
16
|
+
@library[:variants].each do |variant_name, variant_source_path|
|
17
|
+
source = File.join(@temp_directory, variant_source_path)
|
18
|
+
destination = File.join(@temp_directory, variant_name.to_s)
|
19
|
+
|
20
|
+
original_variants.delete(variant_name.to_s)
|
21
|
+
|
22
|
+
raise "[Rails Icons] Failed to find the icons directory: '#{source}'" unless Dir.exist?(source)
|
23
|
+
|
24
|
+
move_icons(source, destination)
|
25
|
+
|
26
|
+
apply_transformations_to(destination)
|
27
|
+
end
|
28
|
+
|
29
|
+
remove_files_and_folders(original_variants)
|
30
|
+
|
31
|
+
say "[Rails Icons] Icon variants processed successfully"
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def move_icons(source, destination)
|
37
|
+
FileUtils.mkdir_p(destination)
|
38
|
+
|
39
|
+
Dir.each_child(source).each do |item|
|
40
|
+
FileUtils.mv(File.join(source, item), destination)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def apply_transformations_to(destination)
|
45
|
+
Dir.each_child(destination) do |filename|
|
46
|
+
File.rename(
|
47
|
+
File.join(destination, filename),
|
48
|
+
File.join(destination, Sync::Transformations.transform(filename, transformations.fetch(:filenames, {})))
|
49
|
+
)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def remove_files_and_folders(paths)
|
54
|
+
paths.each do |path|
|
55
|
+
FileUtils.rm_rf(File.join(@temp_directory, path))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def transformations
|
60
|
+
RailsIcons.libraries.dig(@name.to_sym)&.try(:transformations) || {}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RailsIcons
|
2
|
+
module Sync
|
3
|
+
class Transformations < Rails::Generators::Base
|
4
|
+
def self.transform(filename, rules = {})
|
5
|
+
basename = File.basename(filename, File.extname(filename))
|
6
|
+
|
7
|
+
transformed = rules.reduce(basename) do |fn, (type, value)|
|
8
|
+
TRANSFORMERS.fetch(type).call(fn, value)
|
9
|
+
end
|
10
|
+
|
11
|
+
[transformed, File.extname(filename)].join
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
TRANSFORMERS = {
|
17
|
+
delete_prefix: ->(filename, prefixes) {
|
18
|
+
Array(prefixes).reduce(filename) { _1.delete_prefix(_2) }
|
19
|
+
},
|
20
|
+
|
21
|
+
delete_suffix: ->(filename, suffixes) {
|
22
|
+
Array(suffixes).reduce(filename) { _1.delete_suffix(_2) }
|
23
|
+
}
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/rails_icons/version.rb
CHANGED
data/lib/rails_icons.rb
CHANGED
@@ -1,22 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "rails_icons/version"
|
4
|
-
require_relative "rails_icons/
|
4
|
+
require_relative "rails_icons/libraries"
|
5
5
|
require_relative "rails_icons/configuration"
|
6
|
+
require_relative "rails_icons/engine"
|
6
7
|
require_relative "rails_icons/errors"
|
7
8
|
require_relative "rails_icons/railtie"
|
8
9
|
require_relative "rails_icons/icon"
|
9
10
|
|
10
11
|
module RailsIcons
|
11
|
-
def self.configuration
|
12
|
-
@configuration ||= Configuration.new
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.configure
|
16
|
-
yield(configuration)
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.icons_directory
|
20
|
-
File.join("lib", "assets", "rails_icons")
|
21
|
-
end
|
22
12
|
end
|
data/rails_icons.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["Rails Designer Developers"]
|
9
9
|
spec.email = ["devs@railsdesigner.com"]
|
10
10
|
|
11
|
-
spec.summary = "Add
|
12
|
-
spec.description = "Add
|
11
|
+
spec.summary = "Add any icon library to a Rails app"
|
12
|
+
spec.description = "Add any icon library to a Rails app, from Heroicons, to Lucide to Tabler (and others). Rails Icons is library-agnostic, so you can add any library while using the same interface."
|
13
13
|
spec.homepage = "https://railsdesigner.com/rails-icons/"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
|
19
19
|
spec.files = Dir["{bin,app,config,db,lib,public}/**/*", "Rakefile", "README.md", "rails_icons.gemspec", "Gemfile", "Gemfile.lock"]
|
20
20
|
|
21
|
-
spec.required_ruby_version = ">= 3.
|
21
|
+
spec.required_ruby_version = ">= 3.1.0"
|
22
22
|
spec.add_dependency "rails", "> 6.1"
|
23
23
|
spec.add_runtime_dependency "nokogiri", "~> 1.16", ">= 1.16.4"
|
24
24
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_icons
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rails Designer Developers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -44,8 +44,9 @@ dependencies:
|
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 1.16.4
|
47
|
-
description: Add
|
48
|
-
|
47
|
+
description: Add any icon library to a Rails app, from Heroicons, to Lucide to Tabler
|
48
|
+
(and others). Rails Icons is library-agnostic, so you can add any library while
|
49
|
+
using the same interface.
|
49
50
|
email:
|
50
51
|
- devs@railsdesigner.com
|
51
52
|
executables: []
|
@@ -56,24 +57,39 @@ files:
|
|
56
57
|
- Gemfile.lock
|
57
58
|
- README.md
|
58
59
|
- Rakefile
|
60
|
+
- app/assets/svg/rails_icons/icons/animated/bouncing-dots.svg
|
61
|
+
- app/assets/svg/rails_icons/icons/animated/faded-spinner.svg
|
62
|
+
- app/assets/svg/rails_icons/icons/animated/fading-dots.svg
|
63
|
+
- app/assets/svg/rails_icons/icons/animated/trailing-spinner.svg
|
59
64
|
- bin/console
|
60
65
|
- bin/rails
|
61
66
|
- bin/release
|
62
67
|
- bin/setup
|
63
68
|
- lib/generators/rails_icons/initializer_generator.rb
|
69
|
+
- lib/generators/rails_icons/install_generator.rb
|
64
70
|
- lib/generators/rails_icons/sync_generator.rb
|
65
71
|
- lib/generators/rails_icons/templates/initializer.rb.tt
|
66
72
|
- lib/rails_icons.rb
|
67
73
|
- lib/rails_icons/configuration.rb
|
74
|
+
- lib/rails_icons/configuration/animated.rb
|
75
|
+
- lib/rails_icons/configuration/boxicons.rb
|
76
|
+
- lib/rails_icons/configuration/feather.rb
|
77
|
+
- lib/rails_icons/configuration/heroicons.rb
|
78
|
+
- lib/rails_icons/configuration/lucide.rb
|
79
|
+
- lib/rails_icons/configuration/phosphor.rb
|
80
|
+
- lib/rails_icons/configuration/radix.rb
|
81
|
+
- lib/rails_icons/configuration/tabler.rb
|
68
82
|
- lib/rails_icons/engine.rb
|
69
83
|
- lib/rails_icons/errors.rb
|
70
84
|
- lib/rails_icons/helpers/icon_helper.rb
|
71
85
|
- lib/rails_icons/icon.rb
|
72
86
|
- lib/rails_icons/icon/attributes.rb
|
73
|
-
- lib/rails_icons/
|
74
|
-
- lib/rails_icons/
|
75
|
-
- lib/rails_icons/icon_configs/tabler_config.rb
|
87
|
+
- lib/rails_icons/icon/file_path.rb
|
88
|
+
- lib/rails_icons/libraries.rb
|
76
89
|
- lib/rails_icons/railtie.rb
|
90
|
+
- lib/rails_icons/sync/engine.rb
|
91
|
+
- lib/rails_icons/sync/process_variants.rb
|
92
|
+
- lib/rails_icons/sync/transformations.rb
|
77
93
|
- lib/rails_icons/version.rb
|
78
94
|
- rails_icons.gemspec
|
79
95
|
homepage: https://railsdesigner.com/rails-icons/
|
@@ -90,15 +106,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
90
106
|
requirements:
|
91
107
|
- - ">="
|
92
108
|
- !ruby/object:Gem::Version
|
93
|
-
version: 3.
|
109
|
+
version: 3.1.0
|
94
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
111
|
requirements:
|
96
112
|
- - ">="
|
97
113
|
- !ruby/object:Gem::Version
|
98
114
|
version: '0'
|
99
115
|
requirements: []
|
100
|
-
rubygems_version: 3.
|
116
|
+
rubygems_version: 3.3.7
|
101
117
|
signing_key:
|
102
118
|
specification_version: 4
|
103
|
-
summary: Add
|
119
|
+
summary: Add any icon library to a Rails app
|
104
120
|
test_files: []
|
@@ -1,66 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RailsIcons
|
4
|
-
# Defines the configuration options for the heroicons icon pack
|
5
|
-
class HeroiconsConfig
|
6
|
-
def config
|
7
|
-
options = ActiveSupport::OrderedOptions.new
|
8
|
-
setup_heroicons_outline_config(options)
|
9
|
-
setup_heroicons_solid_config(options)
|
10
|
-
setup_heroicons_mini_config(options)
|
11
|
-
setup_heroicons_micro_config(options)
|
12
|
-
options
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def setup_heroicons_solid_config(options)
|
18
|
-
options.solid = ActiveSupport::OrderedOptions.new
|
19
|
-
options.solid.default = default_solid_options
|
20
|
-
end
|
21
|
-
|
22
|
-
def setup_heroicons_outline_config(options)
|
23
|
-
options.outline = ActiveSupport::OrderedOptions.new
|
24
|
-
options.outline.default = default_outline_options
|
25
|
-
end
|
26
|
-
|
27
|
-
def setup_heroicons_mini_config(options)
|
28
|
-
options.mini = ActiveSupport::OrderedOptions.new
|
29
|
-
options.mini.default = default_mini_options
|
30
|
-
end
|
31
|
-
|
32
|
-
def setup_heroicons_micro_config(options)
|
33
|
-
options.micro = ActiveSupport::OrderedOptions.new
|
34
|
-
options.micro.default = default_micro_options
|
35
|
-
end
|
36
|
-
|
37
|
-
def default_solid_options
|
38
|
-
options = ActiveSupport::OrderedOptions.new
|
39
|
-
options.css = "w-6 h-6"
|
40
|
-
options.data = {}
|
41
|
-
options
|
42
|
-
end
|
43
|
-
|
44
|
-
def default_outline_options
|
45
|
-
options = ActiveSupport::OrderedOptions.new
|
46
|
-
options.stroke_width = 1.5
|
47
|
-
options.css = "w-6 h-6"
|
48
|
-
options.data = {}
|
49
|
-
options
|
50
|
-
end
|
51
|
-
|
52
|
-
def default_mini_options
|
53
|
-
options = ActiveSupport::OrderedOptions.new
|
54
|
-
options.css = "w-5 h-5"
|
55
|
-
options.data = {}
|
56
|
-
options
|
57
|
-
end
|
58
|
-
|
59
|
-
def default_micro_options
|
60
|
-
options = ActiveSupport::OrderedOptions.new
|
61
|
-
options.css = "w-4 h-4"
|
62
|
-
options.data = {}
|
63
|
-
options
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RailsIcons
|
4
|
-
# Defines the configuration options for the Lucide icon pack
|
5
|
-
class LucideConfig
|
6
|
-
def config
|
7
|
-
options = ActiveSupport::OrderedOptions.new
|
8
|
-
setup_lucide_outlined_config(options)
|
9
|
-
|
10
|
-
options
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def setup_lucide_outlined_config(options)
|
16
|
-
options.outline = ActiveSupport::OrderedOptions.new
|
17
|
-
options.outline.default = default_outlined_options
|
18
|
-
end
|
19
|
-
|
20
|
-
def default_outlined_options
|
21
|
-
options = ActiveSupport::OrderedOptions.new
|
22
|
-
options.stroke_width = "1.5"
|
23
|
-
options.css = "w-6 h-6"
|
24
|
-
options.data = {}
|
25
|
-
options
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RailsIcons
|
4
|
-
# Defines the configuration options for the Tabler icon pack
|
5
|
-
class TablerConfig
|
6
|
-
def config
|
7
|
-
options = ActiveSupport::OrderedOptions.new
|
8
|
-
setup_tabler_filled_config(options)
|
9
|
-
setup_tabler_outline_config(options)
|
10
|
-
|
11
|
-
options
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def setup_tabler_filled_config(options)
|
17
|
-
options.filled = ActiveSupport::OrderedOptions.new
|
18
|
-
options.filled.default = default_filled_options
|
19
|
-
end
|
20
|
-
|
21
|
-
def setup_tabler_outline_config(options)
|
22
|
-
options.outline = ActiveSupport::OrderedOptions.new
|
23
|
-
options.outline.default = default_outline_options
|
24
|
-
end
|
25
|
-
|
26
|
-
def default_filled_options
|
27
|
-
options = ActiveSupport::OrderedOptions.new
|
28
|
-
options.css = "w-6 h-6"
|
29
|
-
options.data = {}
|
30
|
-
options
|
31
|
-
end
|
32
|
-
|
33
|
-
def default_outline_options
|
34
|
-
options = ActiveSupport::OrderedOptions.new
|
35
|
-
options.stroke_width = 2
|
36
|
-
options.css = "w-6 h-6"
|
37
|
-
options.data = {}
|
38
|
-
options
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|