essence 0.3.1 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1d7dc966c3eb0029d7e5a915b1ff3fa14b1d183d5112dee299658c7629aa864
4
- data.tar.gz: bcf8f18a90536197d479dcd8db22838e4813ec3c7460554535e27719099ab54a
3
+ metadata.gz: 59a6855e33ea69ca4e5f1847a24cbaf2db2991629c7f3d1cfd25a8c693fd0b2a
4
+ data.tar.gz: 2dc9d1a6297541a6db339295a8526b2572ad27b4d1d2b1e1b908f25002ee2020
5
5
  SHA512:
6
- metadata.gz: 9af42a72f2769c7a7bf6493126bed5c945b7220f083500a2c0728dacc5b3307c1b2e1a9170b6a566e55c3ca8e7d5930207cfa561c364f6e11bc572a4057cf983
7
- data.tar.gz: 0b792623dee2c44c9ed33e60f824957790f18b3d6c2836b37aecfe7bad0355a013b06423125a2ade99074a2f2af8ce224a655677667bf97cc4b947598e52107b
6
+ metadata.gz: 1667d7a7bf8a96772fc0de875a7db052962d17f7dd7d09bdbb958616124796fd398044bca76753a9ff4797232a40c0aa2e99ac1503e683047e07919354377515
7
+ data.tar.gz: 411224f217aa0e5a0731e5137054650827b6a002a878afcac158725d03cdf2dc954789a449eaf56e18afd94d9231222d9782c337df655d018b6299f42728ba78
@@ -1,34 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'fileutils'
4
+
3
5
  module Essence
4
6
  module CLI
5
7
  class Add < Dry::CLI::Command
6
- desc "Add an Essence component to your project"
7
- argument :component_name, required: true, desc: "Component name"
8
+ desc "Add an Essence UI component"
9
+ argument :component, required: true, desc: "Component name"
8
10
  example Essence.component_names
9
11
 
10
12
  def call(*args)
11
- component_name = args[0][:component_name]
12
- key = component_name.to_sym
13
- has_stimulus_controller = Essence.components[key][:stimulus] || false
13
+ puts "[Essence UI] Fetching..."
14
14
 
15
- return puts "> #{component_name}: component unsupported" unless Essence.component_keys.include?(key)
16
- puts "> [Essence] #{Essence.components[key][:name]}"
15
+ slug = args[0][:component].to_sym
16
+ specification = ::Essence::Client.new.get_component(slug:)
17
+ return puts "[Essence UI] Component not found. Stopping" if specification == ""
17
18
 
18
- if has_stimulus_controller
19
- Essence::CLI::Commands.copy_controller(component_name:)
20
- puts "> [Stimulus] #{Essence::CLI::Commands::STIMULUS_CONTROLLERS_DESTINATION_DIR.join("#{component_name}_controller.js")}"
21
- end
22
19
 
23
- Essence::CLI::Commands.copy_component(component_name:)
24
- Essence::CLI::Commands.replace_component_contents(component_name:)
25
- Essence::CLI::Commands.replace_component_contents(
26
- component_name:,
27
- from: Essence::CLI::Commands::COMPONENT_DEFINITION_SUFFIX,
28
- to: Essence::CLI::Commands::PHLEX_COMPONENT_DEFINITION_SUFFIX
29
- )
20
+ files = specification.dig("files")
21
+ return puts "[Essence UI] Something went wrong. Stopping" unless files
22
+
23
+ files.each{ |data| insert_file(slug:, data:) }
24
+ puts "[Essence UI] #{specification.dig("title")} has been successfully added!"
25
+ end
26
+
27
+ private
28
+
29
+ def insert_file(slug:, data:)
30
+ destination_path = build_destination_path(kind: data["kind"], slug:)
31
+ ::FileUtils.mkdir_p(destination_path.dirname)
32
+ ::File.write(destination_path, data.dig("content"))
33
+ puts "[Essence UI] Adding #{destination_path}"
34
+ end
30
35
 
31
- puts "> [Phlex] #{Essence::CLI::Commands::DESTINATION_DIR.join("#{component_name}.rb")}"
36
+ def build_destination_path(kind:, slug:)
37
+ case kind
38
+ when "phlex"
39
+ ::Essence.configuration.phlex_components_dir.join("#{slug}.rb")
40
+ when "stimulus"
41
+ ::Essence.configuration.stimulus_controllers_dir.join("#{slug}_controller.rb")
42
+ else
43
+ nil
44
+ end
32
45
  end
33
46
  end
34
47
  end
@@ -7,21 +7,11 @@ module Essence
7
7
  BASE_DEFINITION_PREFIX = "class Essence::Essence"
8
8
  PHLEX_BASE_DEFINITION_PREFIX = "class Components::Essence"
9
9
 
10
- desc "Install Essence to your project"
10
+ desc "Install Essence UI to your codebase"
11
11
  def call(*)
12
- puts "> Installing Essence..."
13
- puts "> Copying base component to your project"
14
- Essence::CLI::Commands.copy_component(component_name: BASE_COMPONENT_NAME)
15
- Essence::CLI::Commands.replace_component_contents(
16
- component_name: BASE_COMPONENT_NAME,
17
- from: BASE_DEFINITION_PREFIX,
18
- to: PHLEX_BASE_DEFINITION_PREFIX
19
- )
20
- # Essence::CLI::Commands.rename_component_file(
21
- # from: Essence::CLI::Commands::DESTINATION_DIR.join("#{BASE_COMPONENT_NAME}.rb"),
22
- # to: Essence::CLI::Commands::DESTINATION_DIR.join("essence.rb")
23
- # )
24
- puts "> Essence has been successfully installed!"
12
+ puts "[Essence UI] Installing..."
13
+ ::Essence::CLI::Add.new.call(*[{component: "essence"}])
14
+ puts "[Essence UI] Done!"
25
15
  end
26
16
  end
27
17
  end
@@ -3,7 +3,7 @@
3
3
  module Essence
4
4
  module CLI
5
5
  class Version < Dry::CLI::Command
6
- desc "Print Essence version"
6
+ desc "Print version of Essence UI CLI"
7
7
 
8
8
  def call(*)
9
9
  puts Essence::VERSION
data/lib/essence/cli.rb CHANGED
@@ -16,62 +16,9 @@ module Essence
16
16
  module Commands
17
17
  extend Dry::CLI::Registry
18
18
 
19
- # Constants
20
- STIMULUS_CONTROLLERS_DIR = Pathname.new(::Essence.root_path).join("essence/stimulus")
21
- STIMULUS_CONTROLLERS_DESTINATION_DIR = Pathname.new(File.expand_path(Dir.pwd)).join(::Essence.configuration.stimulus_controller_path)
22
-
23
- COMPONENTS_DIR = Pathname.new(File.expand_path("components", __dir__))
24
- DESTINATION_DIR = Pathname.new(File.expand_path(Dir.pwd)).join(::Essence.configuration.phlex_components_path)
25
-
26
- COMPONENT_DEFINITION_PREFIX = "class Essence::"
27
- COMPONENT_DEFINITION_SUFFIX = "< Essence::Essence"
28
- PHLEX_COMPONENT_DEFINITION_PREFIX = "class Components::"
29
- PHLEX_COMPONENT_DEFINITION_SUFFIX = "< Components::Essence"
30
-
31
- # Registering commands
32
19
  register "add", Add, aliases: ["a", "generate", "g"]
33
20
  register "install", Install, aliases: ["i"]
34
21
  register "version", Version, aliases: ["v", "-v", "--version"]
35
-
36
- private
37
-
38
- # UTILITIES
39
- # PHLEX COMPONENTS
40
- def self.copy_component(component_name:)
41
- source_path = COMPONENTS_DIR.join("#{component_name}.rb")
42
- destination_path = DESTINATION_DIR.join("#{component_name}.rb")
43
-
44
- FileUtils.mkdir_p(DESTINATION_DIR)
45
- FileUtils.copy(source_path, destination_path)
46
- end
47
-
48
- def self.replace_component_contents(
49
- component_name:,
50
- from: COMPONENT_DEFINITION_PREFIX,
51
- to: PHLEX_COMPONENT_DEFINITION_PREFIX
52
- )
53
- component_file = DESTINATION_DIR.join("#{component_name}.rb")
54
- return unless File.exist?(component_file)
55
-
56
- replaced_content = File.read(component_file).gsub(from, to)
57
- File.write(component_file, replaced_content)
58
- end
59
-
60
- def self.rename_component_file(from:, to:)
61
- return if from.nil? || to.nil?
62
- return unless File.exist?(from)
63
-
64
- FileUtils.mv(from, to)
65
- end
66
-
67
- # STIMULUS CONTROLLERS
68
- def self.copy_controller(component_name:)
69
- source_path = STIMULUS_CONTROLLERS_DIR.join("#{component_name}_controller.js")
70
- destination_path = STIMULUS_CONTROLLERS_DESTINATION_DIR.join("#{component_name}_controller.js")
71
-
72
- FileUtils.mkdir_p(STIMULUS_CONTROLLERS_DESTINATION_DIR)
73
- FileUtils.copy(source_path, destination_path)
74
- end
75
22
  end
76
23
  end
77
24
  end
@@ -0,0 +1,22 @@
1
+ require "faraday"
2
+
3
+ module Essence
4
+ class Client
5
+ attr_reader :client
6
+
7
+ def initialize(**attributes)
8
+ @client = ::Faraday.new(url: "https://essenceui.com/") do |f|
9
+ f.request :authorization, "Bearer", -> { ::Essence.configuration.licence_key }
10
+ f.request :json
11
+ f.response :json
12
+ end
13
+ end
14
+
15
+ def get_component(slug: nil)
16
+ return if nil
17
+ client.get("api/v1/components/#{slug}").body
18
+ rescue Faraday::Error => error
19
+ puts error
20
+ end
21
+ end
22
+ end
@@ -1,11 +1,19 @@
1
1
  module Essence
2
2
  class Configuration
3
+ attr_accessor :licence_key
3
4
  attr_accessor :phlex_components_path
4
- attr_accessor :stimulus_controller_path
5
+ attr_accessor :stimulus_controllers_path
6
+
7
+ attr_reader :phlex_components_dir
8
+ attr_reader :stimulus_controllers_dir
5
9
 
6
10
  def initialize
11
+ @licence_key = nil
7
12
  @phlex_components_path = "app/components"
8
- @stimulus_controller_path = "app/javascript/controllers/essence"
13
+ @stimulus_controllers_path = "app/javascript/controllers/essence"
14
+
15
+ @phlex_components_dir = Pathname.new(File.expand_path(Dir.pwd)).join(@phlex_components_path)
16
+ @stimulus_controllers_dir = Pathname.new(File.expand_path(Dir.pwd)).join(@stimulus_controllers_path)
9
17
  end
10
18
  end
11
19
  end
@@ -0,0 +1,89 @@
1
+ module Essence
2
+ DEFINITIONS = {
3
+ accordion: {
4
+ name: "Accordion",
5
+ class_name: "Essence::Accordion",
6
+ stimulus: false
7
+ },
8
+ alert: {
9
+ name: "Alert",
10
+ class_name: "Essence::Alert",
11
+ stimulus: false
12
+ },
13
+ avatar: {
14
+ name: "Avatar",
15
+ class_name: "Essence::Avatar",
16
+ stimulus: false
17
+ },
18
+ badge: {
19
+ name: "Badge",
20
+ class_name: "Essence::Badge",
21
+ stimulus: false
22
+ },
23
+ button: {
24
+ name: "Button",
25
+ class_name: "Essence::Button",
26
+ stimulus: false
27
+ },
28
+ checkbox: {
29
+ name: "Checkbox",
30
+ class_name: "Essence::Checkbox",
31
+ stimulus: false
32
+ },
33
+ heading: {
34
+ name: "Heading",
35
+ class_name: "Essence::Heading",
36
+ stimulus: false
37
+ },
38
+ label: {
39
+ name: "Label",
40
+ class_name: "Essence::Label",
41
+ stimulus: false
42
+ },
43
+ input: {
44
+ name: "Input",
45
+ class_name: "Essence::Input",
46
+ stimulus: false
47
+ },
48
+ link: {
49
+ name: "Link",
50
+ class_name: "Essence::Link",
51
+ stimulus: false
52
+ },
53
+ metric: {
54
+ name: "Metric",
55
+ class_name: "Essence::Metric",
56
+ stimulus: false
57
+ },
58
+ row: {
59
+ name: "Row",
60
+ class_name: "Essence::Row",
61
+ stimulus: false
62
+ },
63
+ separator: {
64
+ name: "Separator",
65
+ class_name: "Essence::Separator",
66
+ stimulus: false
67
+ },
68
+ skeleton: {
69
+ name: "Skeleton",
70
+ class_name: "Essence::Skeleton",
71
+ stimulus: false
72
+ },
73
+ switch: {
74
+ name: "Switch",
75
+ class_name: "Essence::Switch",
76
+ stimulus: true
77
+ },
78
+ tabs: {
79
+ name: "Tabs",
80
+ class_name: "Essence::Tabs",
81
+ stimulus: true
82
+ },
83
+ text: {
84
+ name: "Text",
85
+ class_name: "Essence::Text",
86
+ stimulus: false
87
+ }
88
+ }
89
+ end
@@ -1,3 +1,3 @@
1
1
  module Essence
2
- VERSION = "0.3.1"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/essence.rb CHANGED
@@ -1,23 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "tailwind_merge"
3
+ # require "tailwind_merge"
4
4
 
5
5
  require_relative "essence/configuration"
6
+ require_relative "essence/definitions"
6
7
 
7
8
  module Essence
8
- # Autoloading
9
- # Components
10
- autoload :Accordion, "essence/components/accordion"
11
- autoload :Avatar, "essence/components/avatar"
12
- autoload :Badge, "essence/components/badge"
13
- autoload :Button, "essence/components/button"
14
- # autoload :Essence, "essence/components/essence" # Base component
15
- autoload :Link, "essence/components/link"
16
- autoload :Row, "essence/components/row"
17
- autoload :Skeleton, "essence/components/skeleton"
18
-
19
- # CLI
20
9
  autoload :CLI, "essence/cli"
10
+ autoload :Client, "essence/client"
21
11
 
22
12
  class << self
23
13
  def root_path
@@ -33,6 +23,10 @@ module Essence
33
23
  yield configuration
34
24
  end
35
25
 
26
+ def definitions
27
+ @definitions ||= Essence::DEFINITIONS
28
+ end
29
+
36
30
  # COMPONENTS
37
31
  def components
38
32
  @components ||= {
@@ -41,6 +35,11 @@ module Essence
41
35
  class_name: "Essence::Accordion",
42
36
  stimulus: false
43
37
  },
38
+ alert: {
39
+ name: "Alert",
40
+ class_name: "Essence::Alert",
41
+ stimulus: false
42
+ },
44
43
  avatar: {
45
44
  name: "Avatar",
46
45
  class_name: "Essence::Avatar",
@@ -56,21 +55,51 @@ module Essence
56
55
  class_name: "Essence::Button",
57
56
  stimulus: false
58
57
  },
58
+ checkbox: {
59
+ name: "Checkbox",
60
+ class_name: "Essence::Checkbox",
61
+ stimulus: false
62
+ },
63
+ label: {
64
+ name: "Label",
65
+ class_name: "Essence::Label",
66
+ stimulus: false
67
+ },
68
+ input: {
69
+ name: "Input",
70
+ class_name: "Essence::Input",
71
+ stimulus: false
72
+ },
59
73
  link: {
60
74
  name: "Link",
61
75
  class_name: "Essence::Link",
62
76
  stimulus: false
63
77
  },
78
+ metric: {
79
+ name: "Metric",
80
+ class_name: "Essence::Metric",
81
+ stimulus: false
82
+ },
64
83
  row: {
65
84
  name: "Row",
66
85
  class_name: "Essence::Row",
67
86
  stimulus: false
68
87
  },
88
+ separator: {
89
+ name: "Separator",
90
+ class_name: "Essence::Separator",
91
+ stimulus: false
92
+ },
69
93
  skeleton: {
70
94
  name: "Skeleton",
71
95
  class_name: "Essence::Skeleton",
72
96
  stimulus: false
73
97
  },
98
+ switch: {
99
+ name: "Switch",
100
+ class_name: "Essence::Switch",
101
+ stimulus: true
102
+ },
74
103
  tabs: {
75
104
  name: "Tabs",
76
105
  class_name: "Essence::Tabs",
metadata CHANGED
@@ -1,15 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: essence
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elvinas Predkelis
8
- - Primevise
9
- autorequire:
10
8
  bindir: exe
11
9
  cert_chain: []
12
- date: 2025-01-02 00:00:00.000000000 Z
10
+ date: 2025-05-11 00:00:00.000000000 Z
13
11
  dependencies:
14
12
  - !ruby/object:Gem::Dependency
15
13
  name: dry-cli
@@ -32,61 +30,37 @@ dependencies:
32
30
  - !ruby/object:Gem::Version
33
31
  version: '2'
34
32
  - !ruby/object:Gem::Dependency
35
- name: phlex
33
+ name: faraday
36
34
  requirement: !ruby/object:Gem::Requirement
37
35
  requirements:
38
- - - ">="
36
+ - - "~>"
39
37
  - !ruby/object:Gem::Version
40
- version: 2.0.0.rc1
38
+ version: '2.13'
41
39
  type: :runtime
42
40
  prerelease: false
43
41
  version_requirements: !ruby/object:Gem::Requirement
44
42
  requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: 2.0.0.rc1
48
- - !ruby/object:Gem::Dependency
49
- name: tailwind_merge
50
- requirement: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: 0.13.3
55
- type: :runtime
56
- prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
43
+ - - "~>"
60
44
  - !ruby/object:Gem::Version
61
- version: 0.13.3
45
+ version: '2.13'
62
46
  description: Component library for Ruby applications using Phlex
63
47
  email:
64
- - info@primevise.com
48
+ - elvinas@primevise.com
65
49
  executables:
66
50
  - essence
67
51
  extensions: []
68
52
  extra_rdoc_files: []
69
53
  files:
70
54
  - README.md
71
- - essence/stimulus/tabs_controller.js
72
55
  - exe/essence
73
56
  - lib/essence.rb
74
57
  - lib/essence/cli.rb
75
58
  - lib/essence/cli/add.rb
76
59
  - lib/essence/cli/install.rb
77
60
  - lib/essence/cli/version.rb
78
- - lib/essence/components/accordion.rb
79
- - lib/essence/components/avatar.rb
80
- - lib/essence/components/badge.rb
81
- - lib/essence/components/button.rb
82
- - lib/essence/components/dialog.rb
83
- - lib/essence/components/dropdown.rb
84
- - lib/essence/components/essence.rb
85
- - lib/essence/components/link.rb
86
- - lib/essence/components/row.rb
87
- - lib/essence/components/skeleton.rb
88
- - lib/essence/components/tabs.rb
61
+ - lib/essence/client.rb
89
62
  - lib/essence/configuration.rb
63
+ - lib/essence/definitions.rb
90
64
  - lib/essence/version.rb
91
65
  homepage: https://rubygems.org/gems/essence
92
66
  licenses:
@@ -94,7 +68,6 @@ licenses:
94
68
  metadata:
95
69
  homepage_uri: https://rubygems.org/gems/essence
96
70
  source_code_uri: https://github.com/primevise/essence
97
- post_install_message:
98
71
  rdoc_options: []
99
72
  require_paths:
100
73
  - lib
@@ -109,8 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
82
  - !ruby/object:Gem::Version
110
83
  version: '0'
111
84
  requirements: []
112
- rubygems_version: 3.5.9
113
- signing_key:
85
+ rubygems_version: 3.6.2
114
86
  specification_version: 4
115
87
  summary: Component library for Ruby applications using Phlex
116
88
  test_files: []
@@ -1,40 +0,0 @@
1
- import { Controller } from "@hotwired/stimulus";
2
-
3
- export default class extends Controller {
4
- static targets = ["tab", "panel"];
5
- static values = { active: String };
6
-
7
- setActiveTab(event) {
8
- this.activeValue = event.params.panelId;
9
- }
10
-
11
- activeValueChanged() {
12
- this.tabTargets.forEach((tab) => {
13
- tab.ariaSelected = tab.id === this.activeValue;
14
- });
15
-
16
- this.panelTargets.forEach((panel) => {
17
- panel.ariaHidden = panel.id !== this.activeValue;
18
- });
19
- }
20
-
21
- next(event) {
22
- this.navigate(event, "next");
23
- }
24
-
25
- previous(event) {
26
- this.navigate(event, "previous");
27
- }
28
-
29
- navigate(event, direction) {
30
- const tab =
31
- direction === "next"
32
- ? event.target.nextElementSibling
33
- : event.target.previousElementSibling;
34
-
35
- if (!tab) return;
36
-
37
- tab.click();
38
- tab.focus();
39
- }
40
- }
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Essence::Accordion < Essence::Essence
4
- BASE = "group py-4"
5
- TRIGGER_BASE = "cursor-pointer list-none flex items-center justify-between text-base font-medium"
6
- CONTENT_BASE = "py-2 transform transition-all duration-500 not-open:-mt-4 opacity-0 group-open:opacity-100 group-open:mt-0 text-sm"
7
- CHEVRON_BASE = "transform transition-all duration-300 rotate-90 group-open:-rotate-90 text-lg text-gray-700"
8
-
9
- attr_reader :attributes
10
-
11
- def initialize(**attributes)
12
- super(**attributes)
13
- @attributes[:class] = merge_classes([ BASE, @attributes[:class]])
14
- end
15
-
16
- def view_template(&)
17
- details(class: "w-full group py-4", &) if block_given?
18
- end
19
-
20
- def trigger(**tattributes, &)
21
- summary(class: merge_classes(TRIGGER_BASE, tattributes[:class])) do
22
- p(class: "inline", &)
23
- span(class: CHEVRON_BASE) { "›" }
24
- end
25
- end
26
-
27
- def content(**cattributes, &)
28
- p(class: merge_classes(CONTENT_BASE, cattributes[:class]), &)
29
- end
30
-
31
- private
32
-
33
- def merge_classes(*classes)
34
- TAILWIND_MERGER.merge([ *classes ].compact)
35
- end
36
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Essence::Avatar < Essence::Essence
4
- BASE = "border border-transparent rounded-full bg-gray-100 aspect-square inline-flex items-center justify-center font-medium text-gray-700 overflow-hidden"
5
-
6
- SIZES = {
7
- sm: "size-6 text-[0.5rem]",
8
- md: "size-8 text-xs",
9
- lg: "size-12 text-sm"
10
- }
11
-
12
- attr_reader :attributes
13
- attr_reader :size
14
-
15
- def initialize(size: :md, **attributes)
16
- super(**attributes)
17
- @size = size
18
- @attributes[:class] = merge_classes([ BASE, SIZES[size], @attributes[:class]])
19
- end
20
-
21
- def view_template(&)
22
- div(**attributes) do
23
- img(src: attributes[:src], alt: attributes[:alt]) if attributes[:src]
24
- yield if block_given?
25
- end
26
- end
27
-
28
- def fallback(**attrs, &)
29
- div(**attrs, &)
30
- end
31
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Essence::Badge < Essence::Essence
4
- BASE = "inline-flex items-center justify-center w-fit rounded-full border border-transparent font-medium transition duration-150 hover:opacity-90"
5
- SIZES = {
6
- none: "",
7
- sm: "text-[0.65rem] px-2 py-0.5 gap-1 min-w-8",
8
- md: "text-xs px-2.5 py-1 gap-2 min-w-12",
9
- lg: "text-sm px-4 py-1 gap-2 min-w-16"
10
- }
11
- KINDS = {
12
- primary: "text-gray-900 border-gray-200",
13
- success: "text-white bg-emerald-500",
14
- critical: "text-white bg-rose-500",
15
- warning: "text-white bg-amber-500",
16
- info: "text-white bg-blue-500",
17
- dark: "text-white bg-gray-900",
18
- white: "text-gray-900 bg-white"
19
- }
20
-
21
- attr_reader :size
22
- attr_reader :kind
23
- attr_reader :attributes
24
-
25
- def initialize(size: :md, kind: :primary, **attributes)
26
- @size = size
27
- @kind = kind
28
- super(**attributes)
29
- @attributes[:class] = merge_classes([ BASE, SIZES[size], KINDS[kind], @attributes[:class]])
30
- end
31
-
32
- def view_template(&)
33
- div(**attributes, &)
34
- end
35
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Essence::Button < Essence::Essence
4
- BASE = "inline-flex items-center justify-center w-fit rounded-xs border border-transparent font-medium transition duration-150 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed hover:opacity-90"
5
- SIZES = {
6
- none: "",
7
- xs: "text-[0.6rem] px-2 py-1.5 gap-1",
8
- sm: "text-xs px-3 py-2 gap-1.5",
9
- md: "text-sm px-4 py-2 gap-2",
10
- lg: "text-base px-6 py-2.5 gap-2.5",
11
- xl: "text-base px-8 py-3 gap-3"
12
- }
13
- KINDS = {
14
- primary: "text-white bg-indigo-500 hover:bg-indigo-500",
15
- secondary: "text-gray-700 bg-gray-100 hover:bg-gray-200",
16
- critical: "text-white bg-rose-500 hover:bg-rose-400",
17
- warning: "text-white bg-amber-500 hover:bg-amber-400",
18
- success: "text-white bg-emerald-500 hover:bg-emerald-400",
19
- info: "text-white bg-blue-500 hover:bg-blue-400",
20
- dark: "text-white bg-gray-900 hover:bg-gray-800",
21
- white: "text-gray-900 bg-white hover:bg-gray-200",
22
- ghost: "text-gray-900 hover:bg-gray-200 hover:text-gray-800"
23
- }
24
-
25
- attr_reader :size
26
- attr_reader :kind
27
- attr_reader :attributes
28
-
29
- def initialize(size: :md, kind: :primary, **attributes)
30
- @size = size
31
- @kind = kind
32
- super(**attributes)
33
- @attributes[:class] = merge_classes([ BASE, SIZES[size], KINDS[kind], @attributes[:class]])
34
- end
35
-
36
- def view_template(&)
37
- element_tag(**attributes, &)
38
- end
39
-
40
- private
41
-
42
- def element_tag(...)
43
- attributes[:href] ? a(...) : button(...)
44
- end
45
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Essence::Dialog < Essence::Essence
4
- BASE = ""
5
-
6
- attr_reader :attributes
7
-
8
- def initialize(**attributes)
9
- super(**attributes)
10
- @attributes[:class] = merge_classes([ BASE, @attributes[:class]])
11
- end
12
-
13
- def view_template(&)
14
- dialog(**attributes) do
15
- yield if block_given?
16
- end
17
- end
18
-
19
- def footer(&)
20
- end
21
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Essence::Dropdown < Essence::Essence
4
- BASE = ""
5
-
6
- attr_reader :attributes
7
-
8
- def initialize(**attributes)
9
- super(**attributes)
10
- @attributes[:class] = merge_classes([ BASE, @attributes[:class]])
11
- end
12
-
13
- def view_template(&)
14
- div(**attributes) do
15
- yield if block_given?
16
- end
17
- end
18
- end
@@ -1,16 +0,0 @@
1
- class Essence::Essence < Phlex::HTML
2
- extend Phlex::Kit
3
-
4
- TAILWIND_MERGER = ::TailwindMerge::Merger.new.freeze unless defined?(TAILWIND_MERGER)
5
-
6
- attr_reader :attributes
7
-
8
- def initialize(**attributes)
9
- @attributes = default_attributes.deep_merge(attributes)
10
- end
11
-
12
- private
13
-
14
- def default_attributes = {}
15
- def merge_classes(*classes) = TAILWIND_MERGER.merge([ *classes ].compact)
16
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Essence::Link < Essence::Essence
4
- BASE = "inline-flex w-fit items-center gap-1 font-medium text-gray-900 border-b-2 hover:border-gray-900 transition-colors"
5
- KINDS = {
6
- regular: "border-transparent",
7
- underline: "border-gray-200"
8
- }
9
-
10
- attr_reader :attributes
11
-
12
- def initialize(kind: :regular, **attributes)
13
- super(**attributes)
14
- @attributes[:class] = merge_classes([ BASE, @attributes[:class]])
15
- end
16
-
17
- def view_template(&)
18
- a(**attributes, &)
19
- end
20
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Essence::Row < Essence::Essence
4
- BASE = "flex gap-4"
5
- KINDS = {
6
- default: "flex-col md:flex-row md:items-center md:justify-between",
7
- center: "flex-col md:flex-row md:items-center md:justify-center",
8
- start: "flex-col md:flex-row md:items-center md:justify-start",
9
- end: "flex-col md:flex-row md:items-center md:justify-end",
10
- }
11
-
12
- attr_reader :kind
13
- attr_reader :attributes
14
-
15
- def initialize(kind: :default, **attributes)
16
- @kind = kind
17
- super(**attributes)
18
- @attributes[:class] = merge_classes([ BASE, KINDS[kind], @attributes[:class]])
19
- end
20
-
21
- def view_template(&)
22
- div(**attributes, &)
23
- end
24
-
25
- def item(**attrs, &)
26
- div(class: TAILWIND_MERGER.merge([ "flex items-center gap-2 flex-wrap", attrs[:class] ]), **attrs, &)
27
- end
28
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # A skeleton component is used to show a loading state.
4
- #
5
- # ==== Examples
6
- #
7
- # render Skeleton.new(class: "w-32 h-6")
8
- #
9
- # ==== Documentation
10
- #
11
- # https://essence.primevise.com/components/skeleton
12
- #
13
- class Essence::Skeleton < Essence::Essence
14
- BASE = "animate-pulse bg-gray-200/55 rounded-xs"
15
-
16
- def initialize(**attributes)
17
- super(**attributes)
18
- @attributes[:class] = merge_classes([ BASE, @attributes[:class]])
19
- end
20
-
21
- def view_template(&)
22
- div(**@attributes, &)
23
- end
24
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Essence::Tabs < Essence::Essence
4
- BASE = "rounded-lg overflow-hidden"
5
- TAB_BASE = "inline-flex items-center justify-center w-fit rounded-xs border border-transparent font-medium transition duration-150 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed hover:opacity-90 text-xs px-3 py-2 gap-1.5 text-gray-900 bg-transparent hover:bg-gray-200 hover:text-gray-800"
6
- TAB_LIST_BASE = "flex items-center gap-2 py-2 border-b"
7
- PANEL_BASE = "aria-hidden:hidden p-4"
8
-
9
- attr_reader :attributes
10
-
11
- def initialize(**attributes)
12
- super(**attributes)
13
- @attributes[:class] = merge_classes([ BASE, @attributes[:class] ])
14
- end
15
-
16
- def view_template(&)
17
- div(**attributes, &)
18
- end
19
-
20
- def menu(**mattributes, &)
21
- mattributes[:class] = merge_classes([ TAB_LIST_BASE, mattributes[:class] ])
22
-
23
- div(**mattributes, &)
24
- end
25
-
26
- def tab(key: :general, **mattributes, &)
27
- mattributes[:id] = "tab-#{key}"
28
- mattributes[:class] = merge_classes([ TAB_BASE, mattributes[:class] ])
29
- mattributes[:data] = {
30
- essence__tabs_target: "tab",
31
- essence__tabs_panel_id_param: "panel-#{key}",
32
- action: "essence--tabs#setActiveTab keydown.left->essence--tabs#previous keydown.right->essence--tabs#next"
33
- }
34
-
35
- button(**mattributes, &)
36
- end
37
-
38
- def panel(key: :general, **mattributes, &)
39
- mattributes[:id] = "panel-#{key}"
40
- mattributes[:class] = merge_classes([ PANEL_BASE, mattributes[:class] ])
41
- mattributes[:data] = {
42
- essence__tabs_target: "panel"
43
- }
44
-
45
- div(**mattributes, &)
46
- end
47
-
48
- private
49
-
50
- def default_attributes
51
- {
52
- data: {
53
- controller: "essence--tabs",
54
- essence__tabs_active_value: "panel-general"
55
- }
56
- }
57
- end
58
- end