phlexy_ui 0.1.1 → 0.1.6

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.
@@ -10,12 +10,36 @@ module PhlexyUI
10
10
  @configuration ||= Configuration.new
11
11
  end
12
12
 
13
+ class Modifiers
14
+ def initialize
15
+ @modifiers = {}
16
+ end
17
+
18
+ def add(modifier, classes:, component: nil)
19
+ @modifiers[component] ||= {}
20
+ @modifiers[component][modifier] = classes
21
+ end
22
+
23
+ def remove(modifier, component: nil)
24
+ @modifiers[component] ||= {}
25
+ @modifiers[component]&.delete(modifier)
26
+ end
27
+
28
+ def for(component: nil)
29
+ @modifiers[component] || {}
30
+ end
31
+ end
32
+
13
33
  class Configuration
14
34
  attr_accessor :prefix
15
35
 
16
36
  def initialize
17
37
  @prefix = nil
18
38
  end
39
+
40
+ def modifiers
41
+ @modifiers ||= Modifiers.new
42
+ end
19
43
  end
20
44
  end
21
45
  end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexyUI
4
+ class Drawer < Base
5
+ def initialize(*, id:, as: :section, **)
6
+ super(*, **)
7
+ @as = as
8
+ @id = id
9
+ end
10
+
11
+ def view_template(&)
12
+ generate_classes!(
13
+ component_html_class: :drawer,
14
+ modifiers_map: modifiers,
15
+ base_modifiers:,
16
+ options:
17
+ ).then do |classes|
18
+ public_send(as, class: classes, **options, &)
19
+ end
20
+ end
21
+
22
+ def toggle(**options, &)
23
+ generate_classes!(
24
+ component_html_class: :"drawer-toggle",
25
+ options:
26
+ ).then do |classes|
27
+ input(id:, type: :checkbox, class: classes, **options, &)
28
+ end
29
+ end
30
+
31
+ def content(as: :div, **options, &)
32
+ generate_classes!(
33
+ component_html_class: :"drawer-content",
34
+ options:
35
+ ).then do |classes|
36
+ public_send(as, class: classes, **options, &)
37
+ end
38
+ end
39
+
40
+ def side(as: :div, **options, &)
41
+ generate_classes!(
42
+ component_html_class: :"drawer-side",
43
+ options:
44
+ ).then do |classes|
45
+ public_send(as, class: classes, **options, &)
46
+ end
47
+ end
48
+
49
+ def overlay(**options, &)
50
+ generate_classes!(
51
+ component_html_class: :"drawer-overlay",
52
+ options:
53
+ ).then do |classes|
54
+ label(for: id, class: classes, **options, &)
55
+ end
56
+ end
57
+
58
+ def button(*, **, &)
59
+ render Button.new(*, as: :label, for: id, **, &)
60
+ end
61
+
62
+ private
63
+
64
+ register_modifiers(
65
+ # "sm:drawer-end"
66
+ # "md:drawer-end"
67
+ # "lg:drawer-end"
68
+ end: "drawer-end",
69
+ # "sm:drawer-open"
70
+ # "md:drawer-open"
71
+ # "lg:drawer-open"
72
+ open: "drawer-open"
73
+ )
74
+ end
75
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexyUI
4
+ class Dropdown < Base
5
+ def initialize(*, as: :div, **)
6
+ super(*, **)
7
+ @as = as
8
+ end
9
+
10
+ def view_template(&)
11
+ generate_classes!(
12
+ component_html_class: :dropdown,
13
+ modifiers_map: modifiers,
14
+ base_modifiers:,
15
+ options:
16
+ ).then do |classes|
17
+ if base_modifiers.include?(:tap_to_close)
18
+ details(class: classes, **options, &)
19
+ else
20
+ public_send(as, class: classes, **options, &)
21
+ end
22
+ end
23
+ end
24
+
25
+ def button(*, **, &)
26
+ if base_modifiers.include?(:tap_to_close)
27
+ render Button.new(*, as: :summary, **, &)
28
+ else
29
+ render Button.new(*, as: :div, role: :button, tabindex: 0, **, &)
30
+ end
31
+ end
32
+
33
+ def content(*, as: :div, **options, &)
34
+ generate_classes!(
35
+ component_html_class: :"dropdown-content",
36
+ options:
37
+ ).then do |classes|
38
+ if base_modifiers.include?(:tap_to_close)
39
+ render_as(*, as:, class: classes, **options, &)
40
+ else
41
+ render_as(*, as:, tabindex: 0, class: classes, **options, &)
42
+ end
43
+ end
44
+ end
45
+
46
+ def menu(*, **options, &)
47
+ generate_classes!(
48
+ component_html_class: :"dropdown-content",
49
+ options:
50
+ ).then do |classes|
51
+ if base_modifiers.include?(:tap_to_close)
52
+ render Menu.new(*, class: classes, **options, &)
53
+ else
54
+ render Menu.new(*, tabindex: 0, class: classes, **options, &)
55
+ end
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ register_modifiers(
62
+ # "sm:dropdown-end"
63
+ # "md:dropdown-end"
64
+ # "lg:dropdown-end"
65
+ end: "dropdown-end",
66
+ # "sm:dropdown-top"
67
+ # "md:dropdown-top"
68
+ # "lg:dropdown-top"
69
+ top: "dropdown-top",
70
+ # "sm:dropdown-bottom"
71
+ # "md:dropdown-bottom"
72
+ # "lg:dropdown-bottom"
73
+ bottom: "dropdown-bottom",
74
+ # "sm:dropdown-left"
75
+ # "md:dropdown-left"
76
+ # "lg:dropdown-left"
77
+ left: "dropdown-left",
78
+ # "sm:dropdown-right"
79
+ # "md:dropdown-right"
80
+ # "lg:dropdown-right"
81
+ right: "dropdown-right",
82
+ # "sm:dropdown-hover"
83
+ # "md:dropdown-hover"
84
+ # "lg:dropdown-hover"
85
+ hover: "dropdown-hover",
86
+ # "sm:dropdown-open"
87
+ # "md:dropdown-open"
88
+ # "lg:dropdown-open"
89
+ open: "dropdown-open"
90
+ )
91
+ end
92
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexyUI
4
+ class Link < Base
5
+ def view_template(&)
6
+ generate_classes!(
7
+ modifiers_map: modifiers,
8
+ base_modifiers:,
9
+ options:
10
+ ).then do |classes|
11
+ a(class: classes, **options, &)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ attr_reader :link_to_name
18
+
19
+ register_modifiers(
20
+ # "sm:link"
21
+ # "md:link"
22
+ # "lg:link"
23
+ underlined: "link",
24
+ # "sm:link-hover"
25
+ # "md:link-hover"
26
+ # "lg:link-hover"
27
+ hover: "link-hover",
28
+ # "sm:active"
29
+ # "md:active"
30
+ # "lg:active"
31
+ active: "active",
32
+ # "sm:image-full"
33
+ # "md:image-full"
34
+ # "lg:image-full"
35
+ image_full: "image-full",
36
+ # "sm:card-bordered"
37
+ # "md:card-bordered"
38
+ # "lg:card-bordered"
39
+ bordered: "card-bordered",
40
+ # "sm:card-normal"
41
+ # "md:card-normal"
42
+ # "lg:card-normal"
43
+ normal: "card-normal",
44
+ # "sm:card-compact"
45
+ # "md:card-compact"
46
+ # "lg:card-compact"
47
+ compact: "card-compact",
48
+ # "sm:card-side"
49
+ # "md:card-side"
50
+ # "lg:card-side"
51
+ side: "card-side",
52
+ # "sm:glass"
53
+ # "md:glass"
54
+ # "lg:glass"
55
+ glass: "glass",
56
+ # "sm:link-primary"
57
+ # "md:link-primary"
58
+ # "lg:link-primary"
59
+ primary: "link-primary",
60
+ # "sm:link-secondary"
61
+ # "md:link-secondary"
62
+ # "lg:link-secondary"
63
+ secondary: "link-secondary",
64
+ # "sm:link-accent"
65
+ # "md:link-accent"
66
+ # "lg:link-accent"
67
+ accent: "link-accent",
68
+ # "sm:link-neutral"
69
+ # "md:link-neutral"
70
+ # "lg:link-neutral"
71
+ neutral: "link-neutral",
72
+ # "sm:link-info"
73
+ # "md:link-info"
74
+ # "lg:link-info"
75
+ info: "link-info",
76
+ # "sm:link-success"
77
+ # "md:link-success"
78
+ # "lg:link-success"
79
+ success: "link-success",
80
+ # "sm:link-warning"
81
+ # "md:link-warning"
82
+ # "lg:link-warning"
83
+ warning: "link-warning",
84
+ # "sm:link-error"
85
+ # "md:link-error"
86
+ # "lg:link-error"
87
+ error: "link-error"
88
+ ).freeze
89
+ end
90
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexyUI
4
+ class Loading < Base
5
+ def initialize(*, as: :span, **)
6
+ super(*, **)
7
+ @as = as
8
+ end
9
+
10
+ def view_template(&)
11
+ generate_classes!(
12
+ component_html_class: :loading,
13
+ modifiers_map: modifiers,
14
+ base_modifiers:,
15
+ options:
16
+ ).then do |classes|
17
+ public_send(as, class: classes, **options, &)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ register_modifiers(
24
+ # "sm:loading-spinner"
25
+ # "md:loading-spinner"
26
+ # "lg:loading-spinner"
27
+ spinner: "loading-spinner",
28
+ # "sm:loading-dots"
29
+ # "md:loading-dots"
30
+ # "lg:loading-dots"
31
+ dots: "loading-dots",
32
+ # "sm:loading-ring"
33
+ # "md:loading-ring"
34
+ # "lg:loading-ring"
35
+ ring: "loading-ring",
36
+ # "sm:loading-ball"
37
+ # "md:loading-ball"
38
+ # "lg:loading-ball"
39
+ ball: "loading-ball",
40
+ # "sm:loading-bars"
41
+ # "md:loading-bars"
42
+ # "lg:loading-bars"
43
+ bars: "loading-bars",
44
+ # "sm:loading-infinity"
45
+ # "md:loading-infinity"
46
+ # "lg:loading-infinity"
47
+ infinity: "loading-infinity",
48
+ # "sm:loading-xs"
49
+ # "md:loading-xs"
50
+ # "lg:loading-xs"
51
+ xs: "loading-xs",
52
+ # "sm:loading-sm"
53
+ # "md:loading-sm"
54
+ # "lg:loading-sm"
55
+ sm: "loading-sm",
56
+ # "sm:loading-md"
57
+ # "md:loading-md"
58
+ # "lg:loading-md"
59
+ md: "loading-md",
60
+ # "sm:loading-lg"
61
+ # "md:loading-lg"
62
+ # "lg:loading-lg"
63
+ lg: "loading-lg",
64
+ # "sm:text-primary"
65
+ # "md:text-primary"
66
+ # "lg:text-primary"
67
+ primary: "text-primary",
68
+ # "sm:text-secondary"
69
+ # "md:text-secondary"
70
+ # "lg:text-secondary"
71
+ secondary: "text-secondary",
72
+ # "sm:text-accent"
73
+ # "md:text-accent"
74
+ # "lg:text-accent"
75
+ accent: "text-accent",
76
+ # "sm:text-neutral"
77
+ # "md:text-neutral"
78
+ # "lg:text-neutral"
79
+ neutral: "text-neutral",
80
+ # "sm:text-info"
81
+ # "md:text-info"
82
+ # "lg:text-info"
83
+ info: "text-info",
84
+ # "sm:text-success"
85
+ # "md:text-success"
86
+ # "lg:text-success"
87
+ success: "text-success",
88
+ # "sm:text-warning"
89
+ # "md:text-warning"
90
+ # "lg:text-warning"
91
+ warning: "text-warning",
92
+ # "sm:text-error"
93
+ # "md:text-error"
94
+ # "lg:text-error"
95
+ error: "text-error"
96
+ ).freeze
97
+ end
98
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexyUI
4
+ class Mask < Base
5
+ def initialize(*, as: :div, **)
6
+ super(*, **)
7
+ @as = as
8
+ end
9
+
10
+ def view_template(&)
11
+ generate_classes!(
12
+ component_html_class: :mask,
13
+ modifiers_map: modifiers,
14
+ base_modifiers:,
15
+ options:
16
+ ).then do |classes|
17
+ public_send(as, class: classes, **options, &)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ register_modifiers(
24
+ # "sm:mask-squircle"
25
+ # "md:mask-squircle"
26
+ # "lg:mask-squircle"
27
+ squircle: "mask-squircle",
28
+ # "sm:mask-heart"
29
+ # "md:mask-heart"
30
+ # "lg:mask-heart"
31
+ heart: "mask-heart",
32
+ # "sm:mask-hexagon"
33
+ # "md:mask-hexagon"
34
+ # "lg:mask-hexagon"
35
+ hexagon: "mask-hexagon",
36
+ # "sm:mask-hexagon-2"
37
+ # "md:mask-hexagon-2"
38
+ # "lg:mask-hexagon-2"
39
+ hexagon_2: "mask-hexagon-2",
40
+ # "sm:mask-decagon"
41
+ # "md:mask-decagon"
42
+ # "lg:mask-decagon"
43
+ decagon: "mask-decagon",
44
+ # "sm:mask-pentagon"
45
+ # "md:mask-pentagon"
46
+ # "lg:mask-pentagon"
47
+ pentagon: "mask-pentagon",
48
+ # "sm:mask-diamond"
49
+ # "md:mask-diamond"
50
+ # "lg:mask-diamond"
51
+ diamond: "mask-diamond",
52
+ # "sm:mask-square"
53
+ # "md:mask-square"
54
+ # "lg:mask-square"
55
+ square: "mask-square",
56
+ # "sm:mask-circle"
57
+ # "md:mask-circle"
58
+ # "lg:mask-circle"
59
+ circle: "mask-circle",
60
+ # "sm:mask-parallelogram"
61
+ # "md:mask-parallelogram"
62
+ # "lg:mask-parallelogram"
63
+ parallelogram: "mask-parallelogram",
64
+ # "sm:mask-parallelogram-2"
65
+ # "md:mask-parallelogram-2"
66
+ # "lg:mask-parallelogram-2"
67
+ parallelogram_2: "mask-parallelogram-2",
68
+ # "sm:mask-parallelogram-3"
69
+ # "md:mask-parallelogram-3"
70
+ # "lg:mask-parallelogram-3"
71
+ parallelogram_3: "mask-parallelogram-3",
72
+ # "sm:mask-parallelogram-4"
73
+ # "md:mask-parallelogram-4"
74
+ # "lg:mask-parallelogram-4"
75
+ parallelogram_4: "mask-parallelogram-4",
76
+ # "sm:mask-star"
77
+ # "md:mask-star"
78
+ # "lg:mask-star"
79
+ star: "mask-star",
80
+ # "sm:mask-star-2"
81
+ # "md:mask-star-2"
82
+ # "lg:mask-star-2"
83
+ star_2: "mask-star-2",
84
+ # "sm:mask-triangle"
85
+ # "md:mask-triangle"
86
+ # "lg:mask-triangle"
87
+ triangle: "mask-triangle",
88
+ # "sm:mask-triangle-2"
89
+ # "md:mask-triangle-2"
90
+ # "lg:mask-triangle-2"
91
+ triangle_2: "mask-triangle-2",
92
+ # "sm:mask-triangle-3"
93
+ # "md:mask-triangle-3"
94
+ # "lg:mask-triangle-3"
95
+ triangle_3: "mask-triangle-3",
96
+ # "sm:mask-triangle-4"
97
+ # "md:mask-triangle-4"
98
+ # "lg:mask-triangle-4"
99
+ triangle_4: "mask-triangle-4",
100
+ # "sm:mask-half-1"
101
+ # "md:mask-half-1"
102
+ # "lg:mask-half-1"
103
+ half_1: "mask-half-1",
104
+ # "sm:mask-half-2"
105
+ # "md:mask-half-2"
106
+ # "lg:mask-half-2"
107
+ half_2: "mask-half-2"
108
+ )
109
+ end
110
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexyUI
4
+ class Menu < Base
5
+ def view_template(&)
6
+ generate_classes!(
7
+ component_html_class: :menu,
8
+ modifiers_map: modifiers,
9
+ base_modifiers:,
10
+ options:
11
+ ).then do |classes|
12
+ ul(class: classes, **options, &)
13
+ end
14
+ end
15
+
16
+ def title(*, as: :li, **options, &)
17
+ generate_classes!(
18
+ component_html_class: :"menu-title",
19
+ options:
20
+ ).then do |classes|
21
+ public_send(as, class: classes, **options, &)
22
+ end
23
+ end
24
+
25
+ def item(*, **, &)
26
+ render MenuItem.new(*, **, &)
27
+ end
28
+
29
+ def submenu(*base_modifiers, **, &)
30
+ if base_modifiers.include?(:collapsible)
31
+ li do
32
+ render CollapsibleSubMenu.new(*base_modifiers, **, &)
33
+ end
34
+ else
35
+ li do
36
+ render SubMenu.new(*base_modifiers, **, &)
37
+ end
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ register_modifiers(
44
+ # "sm:menu-xs"
45
+ # "md:menu-xs"
46
+ # "lg:menu-xs"
47
+ xs: "menu-xs",
48
+ # "sm:menu-sm"
49
+ # "md:menu-sm"
50
+ # "lg:menu-sm"
51
+ sm: "menu-sm",
52
+ # "sm:menu-md"
53
+ # "md:menu-md"
54
+ # "lg:menu-md"
55
+ md: "menu-md",
56
+ # "sm:menu-lg"
57
+ # "md:menu-lg"
58
+ # "lg:menu-lg"
59
+ lg: "menu-lg",
60
+ # "sm:menu-vertical"
61
+ # "md:menu-vertical"
62
+ # "lg:menu-vertical"
63
+ vertical: "menu-vertical",
64
+ # "sm:menu-horizontal"
65
+ # "md:menu-horizontal"
66
+ # "lg:menu-horizontal"
67
+ horizontal: "menu-horizontal",
68
+ # "sm:bg-primary sm:text-primary-content"
69
+ # "md:bg-primary md:text-primary-content"
70
+ # "lg:bg-primary lg:text-primary-content"
71
+ primary: "bg-primary text-primary-content",
72
+ # "sm:bg-secondary sm:text-secondary-content"
73
+ # "md:bg-secondary md:text-secondary-content"
74
+ # "lg:bg-secondary lg:text-secondary-content"
75
+ secondary: "bg-secondary text-secondary-content",
76
+ # "sm:bg-accent sm:text-accent-content"
77
+ # "md:bg-accent md:text-accent-content"
78
+ # "lg:bg-accent lg:text-accent-content"
79
+ accent: "bg-accent text-accent-content",
80
+ # "sm:bg-neutral sm:text-neutral-content"
81
+ # "md:bg-neutral md:text-neutral-content"
82
+ # "lg:bg-neutral lg:text-neutral-content"
83
+ neutral: "bg-neutral text-neutral-content",
84
+ # "sm:bg-base-100 sm:text-base-content"
85
+ # "md:bg-base-100 md:text-base-content"
86
+ # "lg:bg-base-100 lg:text-base-content"
87
+ base_100: "bg-base-100 text-base-content",
88
+ # "sm:bg-base-200 sm:text-base-content"
89
+ # "md:bg-base-200 md:text-base-content"
90
+ # "lg:bg-base-200 lg:text-base-content"
91
+ base_200: "bg-base-200 text-base-content",
92
+ # "sm:bg-base-300 sm:text-base-content"
93
+ # "md:bg-base-300 md:text-base-content"
94
+ # "lg:bg-base-300 lg:text-base-content"
95
+ base_300: "bg-base-300 text-base-content",
96
+ # "sm:bg-info sm:text-info-content"
97
+ # "md:bg-info sm:text-info-content"
98
+ # "lg:bg-info sm:text-info-content"
99
+ info: "bg-info text-info-content",
100
+ # "sm:bg-success sm:text-success-content"
101
+ # "md:bg-success md:text-success-content"
102
+ # "lg:bg-success lg:text-success-content"
103
+ success: "bg-success text-success-content",
104
+ # "sm:bg-warning sm:text-warning-content"
105
+ # "md:bg-warning md:text-warning-content"
106
+ # "lg:bg-warning lg:text-warning-content"
107
+ warning: "bg-warning text-warning-content",
108
+ # "sm:bg-error sm:text-error-content"
109
+ # "md:bg-error md:text-error-content"
110
+ # "lg:bg-error lg:text-error-content"
111
+ error: "bg-error text-error-content"
112
+ )
113
+ end
114
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexyUI
4
+ # @private
5
+ class MenuItem < Base
6
+ def view_template(&)
7
+ generate_classes!(
8
+ modifiers_map: modifiers,
9
+ base_modifiers:,
10
+ options:
11
+ ).then do |classes|
12
+ li(class: classes, &)
13
+ end
14
+ end
15
+
16
+ def title(*, **options, &block)
17
+ generate_classes!(
18
+ component_html_class: :"menu-title",
19
+ options:
20
+ ).then do |classes|
21
+ h2(class: classes, **options, &block)
22
+ end
23
+ end
24
+
25
+ def submenu(*base_modifiers, **, &)
26
+ if base_modifiers.include?(:collapsible)
27
+ render CollapsibleSubMenu.new(*base_modifiers, **, &)
28
+ else
29
+ render SubMenu.new(*base_modifiers, **, &)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ register_modifiers(
36
+ # "sm:disabled"
37
+ # "md:disabled"
38
+ # "lg:disabled"
39
+ disabled: "disabled",
40
+ # "sm:active"
41
+ # "md:active"
42
+ # "lg:active"
43
+ active: "active",
44
+ # "sm:focus"
45
+ # "md:focus"
46
+ # "lg:focus"
47
+ focus: "focus"
48
+ )
49
+ end
50
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexyUI
4
+ class Navbar < Base
5
+ def initialize(*, as: :nav, **)
6
+ super(*, **)
7
+ @as = as
8
+ end
9
+
10
+ def view_template(&)
11
+ generate_classes!(
12
+ component_html_class: :navbar,
13
+ base_modifiers:,
14
+ options:
15
+ ).then do |classes|
16
+ public_send(as, class: classes, **options, &)
17
+ end
18
+ end
19
+
20
+ def start(&)
21
+ div(class: :"navbar-start", &)
22
+ end
23
+
24
+ def center(&)
25
+ div(class: :"navbar-center", &)
26
+ end
27
+
28
+ def end(&)
29
+ div(class: :"navbar-end", &)
30
+ end
31
+ end
32
+ end