essence 0.3.1 → 0.4.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: f50eba3dff7653e3e65f0f1e2dabb114782f0e0bf09cb64995118d86427b65b1
4
+ data.tar.gz: 21ce8e60063dc1930aa31eb4f3bb22be5045ffefd15fed55db823178dcc0d4da
5
5
  SHA512:
6
- metadata.gz: 9af42a72f2769c7a7bf6493126bed5c945b7220f083500a2c0728dacc5b3307c1b2e1a9170b6a566e55c3ca8e7d5930207cfa561c364f6e11bc572a4057cf983
7
- data.tar.gz: 0b792623dee2c44c9ed33e60f824957790f18b3d6c2836b37aecfe7bad0355a013b06423125a2ade99074a2f2af8ce224a655677667bf97cc4b947598e52107b
6
+ metadata.gz: 2a6738cd42f2504d0b96be1b711abba2a4788cc6a411e27f2d47d62716cf6051b3f3835e95a68d45103fc47da909f1d02c7fe2c1226fd661362c337d89df4e09
7
+ data.tar.gz: ac414b095aa27a017b2438bcf9da0bfd2e8f638c21525b1bf3f749573fbb0771f3250ae418151f5175ef9f8ff44d25ef172d56317e7cc640836e3c25eeddb07d
data/lib/essence/cli.rb CHANGED
@@ -17,7 +17,7 @@ module Essence
17
17
  extend Dry::CLI::Registry
18
18
 
19
19
  # Constants
20
- STIMULUS_CONTROLLERS_DIR = Pathname.new(::Essence.root_path).join("essence/stimulus")
20
+ STIMULUS_CONTROLLERS_DIR = Pathname.new(File.expand_path("stimulus", __dir__))
21
21
  STIMULUS_CONTROLLERS_DESTINATION_DIR = Pathname.new(File.expand_path(Dir.pwd)).join(::Essence.configuration.stimulus_controller_path)
22
22
 
23
23
  COMPONENTS_DIR = Pathname.new(File.expand_path("components", __dir__))
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Essence::Alert < Essence::Essence
4
+ BASE = "bg-white border-l-2 flex flex-col p-3 sm:p-4 bg-gray-50/50"
5
+ TITLE_BASE = "text-gray-900 text-sm sm:text-base font-medium w-full"
6
+ DESCRIPTION_BASE = "text-gray-700 flex text-xs sm:text-sm w-full"
7
+ ICON_BASE = "inline-flex items-center justify-center w-fit size-7 rounded-xs"
8
+
9
+ KINDS = {
10
+ primary: "border-blue-500",
11
+ critical: "border-rose-600",
12
+ warning: "border-orange-400",
13
+ success: "border-emerald-500"
14
+ }
15
+
16
+ ICON_KINDS = {
17
+ primary: "bg-blue-500 text-white",
18
+ critical: "bg-rose-600 text-white",
19
+ warning: "bg-orange-400 text-gray-900",
20
+ success: "bg-emerald-500 text-white"
21
+ }
22
+
23
+ attr_reader :kind
24
+ attr_reader :attributes
25
+
26
+ def initialize(kind: :primary, **attributes)
27
+ @kind = kind
28
+ super(**attributes)
29
+ @attributes[:class] = merge_classes([ BASE, KINDS[kind], attributes[:class] ])
30
+ end
31
+
32
+ def view_template(&)
33
+ div(**attributes, &)
34
+ end
35
+
36
+ def title(**mattributes, &)
37
+ mattributes[:class] = merge_classes([ TITLE_BASE, mattributes[:class] ])
38
+ h5(**mattributes, &)
39
+ end
40
+
41
+ def description(**mattributes, &)
42
+ mattributes[:class] = merge_classes([ DESCRIPTION_BASE, mattributes[:class] ])
43
+ p(**mattributes, &)
44
+ end
45
+
46
+ def icon(**mattributes, &)
47
+ mattributes[:class] = merge_classes([ ICON_BASE, ICON_KINDS[kind], mattributes[:class] ])
48
+ div(**mattributes, &)
49
+ end
50
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Essence::Checkbox < Essence::Essence
4
+ BASE = "appearance-none size-3.5 cursor-pointer transition duration-100 rounded-xs border border-gray-300 focus:ring-0 checked:border-indigo-600 checked:bg-indigo-500 indeterminate:border-indigo-600 indeterminate:bg-indigo-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 disabled:border-gray-300 disabled:bg-gray-100 disabled:checked:bg-gray-100 forced-colors:appearance-auto"
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
+ attributes[:type] = :checkbox
15
+ input(**attributes)
16
+ end
17
+ end
@@ -1,6 +1,4 @@
1
1
  class Essence::Essence < Phlex::HTML
2
- extend Phlex::Kit
3
-
4
2
  TAILWIND_MERGER = ::TailwindMerge::Merger.new.freeze unless defined?(TAILWIND_MERGER)
5
3
 
6
4
  attr_reader :attributes
@@ -0,0 +1,28 @@
1
+ class Essence::Heading < Essence::Essence
2
+ ALLOWED_TAGS = [ :h1, :h2, :h3, :h4, :h5, :h6 ]
3
+ BASE = "font-medium text-gray-900 leading-normal"
4
+ SIZES = {
5
+ xs: "text-base lg:text-lg",
6
+ sm: "text-lg lg:text-xl",
7
+ md: "text-xl lg:text-2xl",
8
+ lg: "text-2xl lg:text-3xl",
9
+ xl: "text-3xl lg:text-4xl",
10
+ "2xl": "text-4xl lg:text-5xl",
11
+ "3xl": "text-5xl lg:text-6xl"
12
+ }
13
+
14
+ attr_reader :as
15
+ attr_reader :size
16
+ attr_reader :attributes
17
+
18
+ def initialize(as: :h2, size: :xs, **attributes)
19
+ super(**attributes)
20
+ @as = ALLOWED_TAGS.include?(as.to_sym) ? as.to_sym : :h1
21
+ @size = SIZES.keys.include?(size.to_sym) ? size.to_sym : :xs
22
+ @attributes[:class] = merge_classes([ BASE, SIZES[size], attributes[:class] ])
23
+ end
24
+
25
+ def view_template(&)
26
+ tag(as, **attributes, &)
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Essence::Input < Essence::Essence
4
+ BASE = "flex px-4 h-10 md:h-12 rounded-sm border border-gray-200/80 focus:outline-none focus:ring-offset-2 focus-visible:ring-2"
5
+
6
+ def initialize(**attributes)
7
+ super(**attributes)
8
+ @attributes[:class] = merge_classes([ BASE, @attributes[:class] ])
9
+ end
10
+
11
+ def view_template(&)
12
+ input(**attributes)
13
+ end
14
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Essence::Label < Essence::Essence
4
+ BASE = "flex text-sm font-medium text-gray-700"
5
+ HELPER_BASE = "text-xs font-normal text-gray-500"
6
+ ASTERISK_BASE = "text-rose-500 font-normal mx-0.5"
7
+
8
+ attr_reader :attributes
9
+
10
+ def initialize(**attributes)
11
+ super(**attributes)
12
+ @attributes[:class] = merge_classes([ BASE, attributes[:class], !!attributes[:for] ? "cursor-pointer" : "" ])
13
+ end
14
+
15
+ def view_template(&)
16
+ label(**@attributes, &)
17
+ end
18
+
19
+ def asterisk(**mattributes)
20
+ mattributes[:class] = merge_classes([ ASTERISK_BASE, mattributes[:class] ])
21
+ span(**mattributes) { "*" }
22
+ end
23
+
24
+ def helper_text(**mattributes, &)
25
+ mattributes[:class] = merge_classes([ HELPER_BASE, mattributes[:class] ])
26
+ p(**mattributes, &)
27
+ end
28
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Essence::Metric < Essence::Essence
4
+ BASE = "p-4 border rounded-xs"
5
+ HELPER_BASE = "text-xs uppercase font-medium text-gray-500"
6
+ TITLE_BASE = "text-2xl text-gray-900 font-medium"
7
+ BODY_BASE = "text-sm text-gray-700"
8
+
9
+ KINDS = {
10
+ primary: "",
11
+ secondary: "border-transparent bg-gray-100"
12
+ }
13
+
14
+ attr_reader :kind
15
+
16
+ def initialize(kind: :primary, **attributes)
17
+ @kind = kind
18
+ super(**attributes)
19
+ @attributes[:class] = merge_classes([ BASE, KINDS[kind], @attributes[:class] ])
20
+ end
21
+
22
+ def view_template(&)
23
+ div(**attributes, &)
24
+ end
25
+
26
+ def title(**mattributes, &)
27
+ mattributes[:class] = merge_classes([ TITLE_BASE, mattributes[:class] ])
28
+ h5(**mattributes, &)
29
+ end
30
+
31
+ def helper(**mattributes, &)
32
+ mattributes[:class] = merge_classes([ HELPER_BASE, mattributes[:class] ])
33
+ p(**mattributes, &)
34
+ end
35
+
36
+ def body(**mattributes, &)
37
+ mattributes[:class] = merge_classes([ BODY_BASE, mattributes[:class] ])
38
+ p(**mattributes, &)
39
+ end
40
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Essence::Separator < Essence::Essence
4
+ BASE = "border-gray-200/50"
5
+
6
+ KINDS = {
7
+ horizontal: "border-t",
8
+ vertical: "border-l h-full"
9
+ }
10
+
11
+ attr_reader :kind
12
+ attr_reader :attributes
13
+
14
+ def initialize(kind: :horizontal, **attributes)
15
+ @kind = kind
16
+ super(**attributes)
17
+ @attributes[:class] = merge_classes([ BASE, KINDS[kind], @attributes[:class] ])
18
+ end
19
+
20
+ def view_template
21
+ element_tag(**attributes)
22
+ end
23
+
24
+ private
25
+
26
+ def element_tag(...)
27
+ kind.to_sym == :horizontal ? hr(...) : div(...)
28
+ end
29
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ # A switch component that can be toggled on and off.
4
+ #
5
+ # ==== Examples
6
+ #
7
+ # render Switch.new
8
+ #
9
+ # ==== Documentation
10
+ #
11
+ # https://essence.primevise.com/components/switch
12
+ #
13
+ class Essence::Switch < Essence::Essence
14
+ BASE = "relative inline-flex h-6 w-12 shrink-0 cursor-pointer rounded-full border-2 border-transparent bg-gray-200 transition-colors duration-200 ease-in-out focus:ring-2 focus:ring-indigo-200 focus:ring-offset-2 focus:outline-hidden"
15
+ LEVER_BASE = "pointer-events-none inline-block size-5 translate-x-0 transform rounded-full bg-white ring-0 transition duration-200 ease-in-out"
16
+
17
+ ACTIVE_CLASSES = "bg-indigo-600"
18
+ INACTIVE_CLASSES = "bg-gray-200"
19
+
20
+ ACTIVE_LEVER_CLASSES = "translate-x-6"
21
+ INACTIVE_LEVER_CLASSES = "translate-x-0"
22
+
23
+ def initialize(**attributes)
24
+ super(**attributes)
25
+ @attributes[:class] = merge_classes([ BASE, @attributes[:class] ])
26
+ end
27
+
28
+ def view_template(&)
29
+ button(**attributes) do
30
+ span(class: "sr-only") { "Use setting" }
31
+ span(
32
+ aria_hidden: "true",
33
+ class: LEVER_BASE,
34
+ data: {
35
+ essence__switch_target: "lever"
36
+ },
37
+ )
38
+ yield if block_given?
39
+ end
40
+ end
41
+
42
+ def hidden_input(**mattributes)
43
+ mattributes[:type] = "hidden"
44
+ mattributes[:name] = mattributes[:name] || "enabled"
45
+ mattributes[:value] = mattributes[:value] || false
46
+ mattributes[:data] = { essence__switch_target: "input" }
47
+
48
+ input(**mattributes)
49
+ end
50
+
51
+ private
52
+
53
+ def default_attributes
54
+ {
55
+ type: "button",
56
+ role: "switch",
57
+ aria_checked: false,
58
+ data: {
59
+ controller: "essence--switch",
60
+ action: "click->essence--switch#toggle",
61
+ essence__switch_active_class: ACTIVE_CLASSES,
62
+ essence__switch_inactive_class: INACTIVE_CLASSES,
63
+ essence__switch_active_lever_class: ACTIVE_LEVER_CLASSES,
64
+ essence__switch_inactive_lever_class: INACTIVE_LEVER_CLASSES
65
+ }
66
+ }
67
+ end
68
+
69
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Essence::Text < Essence::Essence
4
+ BASE = "text-base text-gray-500 dark:text-gray-400"
5
+ SIZES = {
6
+ sm: "text-sm",
7
+ md: "text-base",
8
+ lg: "text-lg"
9
+ }
10
+
11
+ attr_reader :size
12
+
13
+ def initialize(size: :md, **attributes)
14
+ super(**attributes)
15
+ @attributes[:class] = merge_classes([ BASE, SIZES[size], attributes[:class] ])
16
+ end
17
+
18
+ def view_template(&)
19
+ p(**attributes, &)
20
+ end
21
+ end
@@ -1,9 +1,11 @@
1
1
  module Essence
2
2
  class Configuration
3
+ attr_accessor :api_key
3
4
  attr_accessor :phlex_components_path
4
5
  attr_accessor :stimulus_controller_path
5
6
 
6
7
  def initialize
8
+ @api_key = nil
7
9
  @phlex_components_path = "app/components"
8
10
  @stimulus_controller_path = "app/javascript/controllers/essence"
9
11
  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
@@ -0,0 +1,32 @@
1
+ import { Controller } from "@hotwired/stimulus";
2
+
3
+ export default class extends Controller {
4
+ static targets = ["input", "lever"];
5
+
6
+ static classes = ["active", "inactive", "activeLever", "inactiveLever"];
7
+
8
+ static values = {
9
+ checked: {
10
+ type: Boolean,
11
+ default: false,
12
+ },
13
+ };
14
+
15
+ connect() {
16
+ if (this.checkedValue) this.toggle();
17
+ }
18
+
19
+ toggle(event) {
20
+ this.element.ariaChecked =
21
+ this.element.ariaChecked == "true" ? false : true;
22
+
23
+ if (this.hasInputTarget)
24
+ this.inputTarget.value = this.element.ariaChecked == "true";
25
+
26
+ this.element.classList.toggle(...this.activeClasses);
27
+ this.element.classList.toggle(...this.inactiveClasses);
28
+
29
+ this.leverTarget.classList.toggle(...this.activeLeverClasses);
30
+ this.leverTarget.classList.toggle(...this.inactiveLeverClasses);
31
+ }
32
+ }
@@ -1,3 +1,3 @@
1
1
  module Essence
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/essence.rb CHANGED
@@ -3,20 +3,9 @@
3
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"
21
10
 
22
11
  class << self
@@ -33,6 +22,10 @@ module Essence
33
22
  yield configuration
34
23
  end
35
24
 
25
+ def definitions
26
+ @definitions ||= Essence::DEFINITIONS
27
+ end
28
+
36
29
  # COMPONENTS
37
30
  def components
38
31
  @components ||= {
@@ -41,6 +34,11 @@ module Essence
41
34
  class_name: "Essence::Accordion",
42
35
  stimulus: false
43
36
  },
37
+ alert: {
38
+ name: "Alert",
39
+ class_name: "Essence::Alert",
40
+ stimulus: false
41
+ },
44
42
  avatar: {
45
43
  name: "Avatar",
46
44
  class_name: "Essence::Avatar",
@@ -56,21 +54,51 @@ module Essence
56
54
  class_name: "Essence::Button",
57
55
  stimulus: false
58
56
  },
57
+ checkbox: {
58
+ name: "Checkbox",
59
+ class_name: "Essence::Checkbox",
60
+ stimulus: false
61
+ },
62
+ label: {
63
+ name: "Label",
64
+ class_name: "Essence::Label",
65
+ stimulus: false
66
+ },
67
+ input: {
68
+ name: "Input",
69
+ class_name: "Essence::Input",
70
+ stimulus: false
71
+ },
59
72
  link: {
60
73
  name: "Link",
61
74
  class_name: "Essence::Link",
62
75
  stimulus: false
63
76
  },
77
+ metric: {
78
+ name: "Metric",
79
+ class_name: "Essence::Metric",
80
+ stimulus: false
81
+ },
64
82
  row: {
65
83
  name: "Row",
66
84
  class_name: "Essence::Row",
67
85
  stimulus: false
68
86
  },
87
+ separator: {
88
+ name: "Separator",
89
+ class_name: "Essence::Separator",
90
+ stimulus: false
91
+ },
69
92
  skeleton: {
70
93
  name: "Skeleton",
71
94
  class_name: "Essence::Skeleton",
72
95
  stimulus: false
73
96
  },
97
+ switch: {
98
+ name: "Switch",
99
+ class_name: "Essence::Switch",
100
+ stimulus: true
101
+ },
74
102
  tabs: {
75
103
  name: "Tabs",
76
104
  class_name: "Essence::Tabs",
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: essence
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elvinas Predkelis
8
- - Primevise
9
8
  autorequire:
10
9
  bindir: exe
11
10
  cert_chain: []
12
- date: 2025-01-02 00:00:00.000000000 Z
11
+ date: 2025-04-15 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: dry-cli
@@ -61,14 +60,13 @@ dependencies:
61
60
  version: 0.13.3
62
61
  description: Component library for Ruby applications using Phlex
63
62
  email:
64
- - info@primevise.com
63
+ - elvinas@primevise.com
65
64
  executables:
66
65
  - essence
67
66
  extensions: []
68
67
  extra_rdoc_files: []
69
68
  files:
70
69
  - README.md
71
- - essence/stimulus/tabs_controller.js
72
70
  - exe/essence
73
71
  - lib/essence.rb
74
72
  - lib/essence/cli.rb
@@ -76,17 +74,29 @@ files:
76
74
  - lib/essence/cli/install.rb
77
75
  - lib/essence/cli/version.rb
78
76
  - lib/essence/components/accordion.rb
77
+ - lib/essence/components/alert.rb
79
78
  - lib/essence/components/avatar.rb
80
79
  - lib/essence/components/badge.rb
81
80
  - lib/essence/components/button.rb
81
+ - lib/essence/components/checkbox.rb
82
82
  - lib/essence/components/dialog.rb
83
83
  - lib/essence/components/dropdown.rb
84
84
  - lib/essence/components/essence.rb
85
+ - lib/essence/components/heading.rb
86
+ - lib/essence/components/input.rb
87
+ - lib/essence/components/label.rb
85
88
  - lib/essence/components/link.rb
89
+ - lib/essence/components/metric.rb
86
90
  - lib/essence/components/row.rb
91
+ - lib/essence/components/separator.rb
87
92
  - lib/essence/components/skeleton.rb
93
+ - lib/essence/components/switch.rb
88
94
  - lib/essence/components/tabs.rb
95
+ - lib/essence/components/text.rb
89
96
  - lib/essence/configuration.rb
97
+ - lib/essence/definitions.rb
98
+ - lib/essence/stimulus/switch_controller.js
99
+ - lib/essence/stimulus/tabs_controller.js
90
100
  - lib/essence/version.rb
91
101
  homepage: https://rubygems.org/gems/essence
92
102
  licenses: