plutonium 0.15.20 → 0.15.21

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.
@@ -108,7 +108,7 @@ module PlutoniumUi
108
108
  label = column.label
109
109
  search_object = column.search_object
110
110
 
111
- if (sort_params = search_object.sort_params_for(name, request:))
111
+ if (sort_params = search_object.sort_params_for(name))
112
112
  tag.div class: "inline-flex" do
113
113
  concat begin
114
114
  link_to(sort_params[:url], class: "flex", title: sort_params[:direction] || "Sort") do
@@ -85,7 +85,7 @@ class BlogDefinition < Plutonium::Resource::Definition
85
85
  # Customize how fields are displayed
86
86
  display :title, class: "col-span-full"
87
87
  display :content, class: "col-span-full" do |f|
88
- f.text_tag class: "prose dark:prose-invert"
88
+ f.text_tag class: "format dark:format-invert"
89
89
  end
90
90
 
91
91
  # Custom column display in tables
@@ -29,7 +29,7 @@ module Pu
29
29
  end
30
30
 
31
31
  def install_dependencies
32
- run "yarn add @radioactive-labs/plutonium flowbite @tailwindcss/forms @tailwindcss/typography postcss-cli cssnano"
32
+ run "yarn add @radioactive-labs/plutonium flowbite @tailwindcss/forms @tailwindcss/typography flowbite-typography postcss-cli cssnano"
33
33
  end
34
34
 
35
35
  def configure_application
@@ -15,7 +15,7 @@ module Plutonium
15
15
 
16
16
  def current_query_object
17
17
  @current_query_object ||=
18
- Plutonium::Resource::QueryObject.new(resource_class, raw_resource_query_params) do |query_object|
18
+ Plutonium::Resource::QueryObject.new(resource_class, raw_resource_query_params, request.path) do |query_object|
19
19
  if current_definition.search_definition
20
20
  query_object.define_search proc { |scope, search:|
21
21
  current_definition.search_definition.call(scope, search)
@@ -7,9 +7,10 @@ module Plutonium
7
7
  #
8
8
  # @param resource_class [Object] The resource class.
9
9
  # @param params [Hash] The parameters for initialization.
10
- def initialize(resource_class, params, &)
10
+ def initialize(resource_class, params, request_path, &)
11
11
  @resource_class = resource_class
12
12
  @params = params
13
+ @request_path = request_path
13
14
 
14
15
  define_standard_queries
15
16
  yield self if block_given?
@@ -62,7 +63,7 @@ module Plutonium
62
63
  #
63
64
  # @param options [Hash] The options for building the URL.
64
65
  # @return [String] The constructed URL with query parameters.
65
- def build_url(request:, **options)
66
+ def build_url(**options)
66
67
  q = {}
67
68
 
68
69
  q[:search] = options.key?(:search) ? options[:search].presence : search_query
@@ -74,7 +75,7 @@ module Plutonium
74
75
 
75
76
  q.merge! params.slice(*filter_definitions.keys)
76
77
  query_params = deep_compact({q: q}).to_param
77
- "#{request.path}?#{query_params}"
78
+ "#{@request_path}?#{query_params}"
78
79
  end
79
80
 
80
81
  # Applies the defined filters and sorts to the given scope.
@@ -99,12 +100,12 @@ module Plutonium
99
100
  #
100
101
  # @param name [Symbol, String] The name of the field to sort.
101
102
  # @return [Hash, nil] The sorting parameters including URL and direction.
102
- def sort_params_for(name, request:)
103
+ def sort_params_for(name)
103
104
  return unless sort_definitions[name]
104
105
 
105
106
  {
106
- url: build_url(request:, sort: name),
107
- reset_url: build_url(request:, sort: name, reset: true),
107
+ url: build_url(sort: name),
108
+ reset_url: build_url(sort: name, reset: true),
108
109
  position: selected_sort_fields.index(name.to_s),
109
110
  direction: selected_sort_directions[name]
110
111
  }
@@ -10,6 +10,10 @@ module Plutonium
10
10
  def association_tag(**, &)
11
11
  create_component(Plutonium::UI::Display::Component::Association, :association, **, &)
12
12
  end
13
+
14
+ def markdown_tag(**, &)
15
+ create_component(Plutonium::UI::Display::Component::Markdown, :markdown, **, &)
16
+ end
13
17
  end
14
18
 
15
19
  private
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "redcarpet"
4
+
5
+ module Plutonium
6
+ module UI
7
+ module Display
8
+ module Component
9
+ class Markdown < Phlexi::Display::Components::Base
10
+ include Phlexi::Display::Components::Concerns::DisplaysValue
11
+
12
+ RENDERER = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, tables: true)
13
+
14
+ def render_value(value)
15
+ article(**attributes) do
16
+ unsafe_raw RENDERER.render(value)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -19,7 +19,8 @@ module Plutonium
19
19
  color_indicator: "w-10 h-10 rounded-full mr-2", # max-h-fit
20
20
  email: "flex items-center text-md text-primary-600 dark:text-primary-500 mb-1 whitespace-pre-line",
21
21
  json: "text-sm text-gray-900 dark:text-white mb-1 whitespace-pre font-mono shadow-inner p-4",
22
- prefixed_icon: "w-8 h-8 mr-2"
22
+ prefixed_icon: "w-8 h-8 mr-2",
23
+ markdown: "format dark:format-invert format-primary"
23
24
  })
24
25
  end
25
26
  end
@@ -6,6 +6,21 @@ module Plutonium
6
6
  class Base < Phlexi::Form::Base
7
7
  include Plutonium::UI::Component::Behaviour
8
8
 
9
+ class Builder < Builder
10
+ include Plutonium::UI::Form::Options::InferredTypes
11
+
12
+ def easymde_tag(**, &)
13
+ create_component(Plutonium::UI::Form::Components::Easymde, :easymde, **, &)
14
+ end
15
+ alias_method :markdown_tag, :easymde_tag
16
+
17
+ alias_method :basic_select_tag, :select_tag
18
+ def slim_select_tag(**, &)
19
+ basic_select_tag(**, data_controller: "slim-select", class!: "", &)
20
+ end
21
+ alias_method :select_tag, :slim_select_tag
22
+ end
23
+
9
24
  private
10
25
 
11
26
  def render_actions
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Plutonium
4
+ module UI
5
+ module Form
6
+ module Components
7
+ class Easymde < Phlexi::Form::Components::Base
8
+ include Phlexi::Form::Components::Concerns::HandlesInput
9
+
10
+ def view_template
11
+ textarea(**attributes, data_controller: "easymde") { field.dom.value }
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Plutonium
4
+ module UI
5
+ module Form
6
+ module Options
7
+ module InferredTypes
8
+ private
9
+
10
+ def infer_field_component
11
+ component = super
12
+ case component
13
+ when :select
14
+ :slim_select
15
+ else
16
+ component
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -119,15 +119,35 @@ module Plutonium
119
119
  end
120
120
 
121
121
  def render_styles
122
+ render_external_styles
123
+
122
124
  url = resource_asset_url_for(:css, resource_stylesheet_asset)
123
125
  stylesheet_link_tag(url, "data-turbo-track": "reload")
124
126
  end
125
127
 
128
+ def render_external_styles
129
+ end
130
+
126
131
  def render_scripts
132
+ render_external_scripts
133
+
127
134
  url = resource_asset_url_for(:js, resource_script_asset)
128
135
  javascript_include_tag(url, "data-turbo-track": "reload", type: "module")
129
136
  end
130
137
 
138
+ def render_external_scripts
139
+ script(
140
+ src: "https://cdn.jsdelivr.net/npm/easymde@2.18.0/dist/easymde.min.js",
141
+ integrity: "sha384-KtB38COewxfrhJxoN2d+olxJAeT08LF8cVZ6DQ8Poqu89zIptqO6zAXoIxpGNWYE",
142
+ crossorigin: "anonymous"
143
+ )
144
+ script(
145
+ src: "https://cdn.jsdelivr.net/npm/slim-select@2.10.0/dist/slimselect.umd.min.js",
146
+ integrity: "sha384-WKsmo+vSs0gqrT+es6wFEojVFn4P0kNaHpHTIkn84iHY8T4rF2V2McZeSbLPLlHy",
147
+ crossorigin: "anonymous"
148
+ )
149
+ end
150
+
131
151
  def render_body_scripts
132
152
  end
133
153
  end
@@ -18,14 +18,14 @@ module Plutonium
18
18
  if current_scope.blank?
19
19
  a(
20
20
  id: "#{name}-scope",
21
- href: current_query_object.build_url(request:, scope: nil),
21
+ href: current_query_object.build_url(scope: nil),
22
22
  class:
23
23
  "px-4 py-2 text-sm font-medium text-white bg-primary-700 border border-primary-700 rounded-lg hover:bg-primary-800 focus:z-10 focus:ring-2 focus:ring-primary-700 focus:text-white dark:bg-primary-600 dark:border-primary-600 dark:hover:bg-primary-700 dark:focus:ring-primary-800"
24
24
  ) { name.humanize }
25
25
  else
26
26
  a(
27
27
  id: "#{name}-scope",
28
- href: current_query_object.build_url(request:, scope: nil),
28
+ href: current_query_object.build_url(scope: nil),
29
29
  class:
30
30
  "px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-lg hover:bg-gray-100 hover:text-gray-700 focus:z-10 focus:ring-2 focus:ring-gray-300 focus:text-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700 dark:focus:ring-gray-700 dark:focus:text-white"
31
31
  ) { name.humanize }
@@ -35,14 +35,14 @@ module Plutonium
35
35
  if name == current_scope
36
36
  a(
37
37
  id: "#{name}-scope",
38
- href: current_query_object.build_url(request:, scope: name),
38
+ href: current_query_object.build_url(scope: name),
39
39
  class:
40
40
  "px-4 py-2 text-sm font-medium text-white bg-primary-700 border border-primary-700 rounded-lg hover:bg-primary-800 focus:z-10 focus:ring-2 focus:ring-primary-700 focus:text-white dark:bg-primary-600 dark:border-primary-600 dark:hover:bg-primary-700 dark:focus:ring-primary-800"
41
41
  ) { name.humanize }
42
42
  else
43
43
  a(
44
44
  id: "#{name}-scope",
45
- href: current_query_object.build_url(request:, scope: name),
45
+ href: current_query_object.build_url(scope: name),
46
46
  class:
47
47
  "px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-lg hover:bg-gray-100 hover:text-gray-700 focus:z-10 focus:ring-2 focus:ring-gray-300 focus:text-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700 dark:focus:ring-gray-700 dark:focus:text-white"
48
48
  ) { name.humanize }
@@ -68,7 +68,7 @@ module Plutonium
68
68
  # field_options[:align] = align_field_to if align_field_to
69
69
  table.column name,
70
70
  **field_options,
71
- sort_params: current_query_object.sort_params_for(name, request:),
71
+ sort_params: current_query_object.sort_params_for(name),
72
72
  &display_tag_block
73
73
  end
74
74
 
@@ -1,5 +1,5 @@
1
1
  module Plutonium
2
- VERSION = "0.15.20"
2
+ VERSION = "0.15.21"
3
3
  NEXT_MAJOR_VERSION = VERSION.split(".").tap { |v|
4
4
  v[1] = v[1].to_i + 1
5
5
  v[2] = 0
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@radioactive-labs/plutonium",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@radioactive-labs/plutonium",
9
- "version": "0.1.10",
9
+ "version": "0.1.11",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@hotwired/stimulus": "^3.2.2",
@@ -22,6 +22,7 @@
22
22
  "cssnano": "^7.0.2",
23
23
  "esbuild": "^0.20.1",
24
24
  "esbuild-plugin-manifest": "^1.0.3",
25
+ "flowbite-typography": "^1.0.5",
25
26
  "mermaid": "^11.4.0",
26
27
  "postcss": "^8.4.35",
27
28
  "postcss-cli": "^11.0.0",
@@ -3930,6 +3931,18 @@
3930
3931
  "mini-svg-data-uri": "^1.4.3"
3931
3932
  }
3932
3933
  },
3934
+ "node_modules/flowbite-typography": {
3935
+ "version": "1.0.5",
3936
+ "resolved": "https://registry.npmjs.org/flowbite-typography/-/flowbite-typography-1.0.5.tgz",
3937
+ "integrity": "sha512-IqTwOYgGZkXTK/5ngx3A9oQwgOqnRyUKUfIiB+w6xDmiD8z3cKDIgYfFpHIMKbLVfg+QmJIPqEEPrGZbAwVT6g==",
3938
+ "dev": true,
3939
+ "license": "MIT",
3940
+ "dependencies": {
3941
+ "lodash.castarray": "^4.4.0",
3942
+ "lodash.isplainobject": "^4.0.6",
3943
+ "lodash.merge": "^4.6.2"
3944
+ }
3945
+ },
3933
3946
  "node_modules/focus-trap": {
3934
3947
  "version": "7.6.0",
3935
3948
  "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.0.tgz",
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@radioactive-labs/plutonium",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "description": "Core assets for the Plutonium gem",
5
5
  "type": "module",
6
6
  "main": "src/js/core.js",
@@ -31,6 +31,7 @@
31
31
  "cssnano": "^7.0.2",
32
32
  "esbuild": "^0.20.1",
33
33
  "esbuild-plugin-manifest": "^1.0.3",
34
+ "flowbite-typography": "^1.0.5",
34
35
  "mermaid": "^11.4.0",
35
36
  "postcss": "^8.4.35",
36
37
  "postcss-cli": "^11.0.0",
data/src/css/easymde.css CHANGED
@@ -233,11 +233,11 @@
233
233
 
234
234
  /* Preview */
235
235
  .editor-preview {
236
- @apply p-2.5 bg-gray-50 dark:bg-gray-900 prose dark:prose-invert max-w-none prose-sm sm:prose-base;
236
+ @apply p-2.5 bg-gray-50 dark:bg-gray-900 format dark:format-invert format-primary max-w-none;
237
237
  }
238
238
 
239
239
  .editor-preview-side {
240
- @apply fixed bottom-0 w-1/2 top-[50px] right-0 z-50 overflow-auto hidden box-border border border-gray-300 dark:border-gray-600 break-words prose dark:prose-invert max-w-none prose-sm sm:prose-base;
240
+ @apply fixed bottom-0 w-1/2 top-[50px] right-0 z-50 overflow-auto hidden box-border border border-gray-300 dark:border-gray-600 break-words format dark:format-invert format-primary max-w-none;
241
241
  }
242
242
 
243
243
  .editor-preview-active-side {
@@ -1,5 +1,6 @@
1
1
  @import "core.css";
2
2
  @import "easymde.css";
3
+ @import "slim_select.css";
3
4
 
4
5
  @tailwind base;
5
6
  @tailwind components;
@@ -0,0 +1,297 @@
1
+ @layer components {
2
+ :root {
3
+ --ss-primary-color: theme('colors.primary.500');
4
+ --ss-bg-color: theme('colors.white');
5
+ --ss-font-color: theme('colors.gray.900');
6
+ --ss-font-placeholder-color: theme('colors.gray.500');
7
+ --ss-disabled-color: theme('colors.gray.100');
8
+ --ss-border-color: theme('colors.gray.300');
9
+ --ss-highlight-color: theme('colors.yellow.200');
10
+ --ss-success-color: theme('colors.green.500');
11
+ --ss-error-color: theme('colors.red.500');
12
+ --ss-focus-color: theme('colors.primary.500');
13
+ }
14
+
15
+ .dark {
16
+ --ss-primary-color: theme('colors.primary.400');
17
+ --ss-bg-color: theme('colors.gray.700');
18
+ --ss-font-color: theme('colors.white');
19
+ --ss-font-placeholder-color: theme('colors.gray.400');
20
+ --ss-disabled-color: theme('colors.gray.800');
21
+ --ss-border-color: theme('colors.gray.600');
22
+ --ss-highlight-color: theme('colors.yellow.300');
23
+ --ss-success-color: theme('colors.green.400');
24
+ --ss-error-color: theme('colors.red.400');
25
+ --ss-focus-color: theme('colors.primary.400');
26
+ }
27
+
28
+ @keyframes ss-valueIn {
29
+ 0% {
30
+ @apply scale-0 opacity-0;
31
+ }
32
+
33
+ 100% {
34
+ @apply scale-100 opacity-100;
35
+ }
36
+ }
37
+
38
+ @keyframes ss-valueOut {
39
+ 0% {
40
+ @apply scale-100 opacity-100;
41
+ }
42
+
43
+ 100% {
44
+ @apply scale-0 opacity-0;
45
+ }
46
+ }
47
+
48
+ .ss-hide {
49
+ @apply hidden !important;
50
+ }
51
+
52
+ .ss-main {
53
+ @apply flex flex-row relative select-none w-full p-2 border rounded-md shadow-sm font-medium text-sm border-gray-300 bg-white text-gray-900 dark:bg-gray-700 dark:border-gray-600 dark:text-white focus:ring-primary-500 focus:border-primary-500 focus:outline-none cursor-pointer transition-colors duration-200 overflow-hidden;
54
+ }
55
+
56
+ .ss-main:focus {
57
+ @apply ring-1 ring-primary-500 border-primary-500;
58
+ }
59
+
60
+ .ss-main.ss-disabled {
61
+ @apply cursor-not-allowed bg-gray-100 dark:bg-gray-800 text-gray-500 dark:text-gray-400;
62
+ }
63
+
64
+ .ss-main.ss-open-above {
65
+ @apply rounded-b-md rounded-t-none;
66
+ }
67
+
68
+ .ss-main.ss-open-below {
69
+ @apply rounded-t-md rounded-b-none;
70
+ }
71
+
72
+ .ss-main .ss-values {
73
+ @apply inline-flex flex-wrap gap-[5px] flex-1;
74
+ }
75
+
76
+ .ss-main .ss-values .ss-placeholder {
77
+ @apply flex p-0 m-0 leading-normal items-center w-full text-gray-500 dark:text-gray-400 overflow-hidden truncate whitespace-nowrap;
78
+ }
79
+
80
+ .ss-main .ss-values .ss-max {
81
+ @apply flex select-none items-center w-fit text-xs text-white dark:text-gray-900 leading-normal p-[3px_5px] bg-primary-500 rounded-md;
82
+ }
83
+
84
+ .ss-main .ss-values .ss-single {
85
+ @apply flex m-0;
86
+ }
87
+
88
+ .ss-main .ss-values .ss-value {
89
+ @apply flex select-none items-center w-fit bg-primary-500 rounded-md;
90
+ animation: ss-valueIn 0.2s ease-out forwards;
91
+ }
92
+
93
+ .ss-main .ss-values .ss-value.ss-value-out {
94
+ animation: ss-valueOut 0.2s ease-out forwards;
95
+ }
96
+
97
+ .ss-main .ss-values .ss-value .ss-value-text {
98
+ @apply text-xs text-white dark:text-gray-900 leading-normal p-[3px_5px];
99
+ }
100
+
101
+ .ss-main .ss-values .ss-value .ss-value-delete {
102
+ @apply flex items-center h-[7px] w-[7px] p-[3px_5px] cursor-pointer border-l border-solid border-white dark:border-gray-900 box-content;
103
+ }
104
+
105
+ .ss-main .ss-values .ss-value .ss-value-delete svg {
106
+ @apply h-[7px] w-[7px];
107
+ }
108
+
109
+ .ss-main .ss-values .ss-value .ss-value-delete svg path {
110
+ @apply fill-none stroke-white dark:stroke-gray-900;
111
+ stroke-width: 18;
112
+ stroke-linecap: round;
113
+ stroke-linejoin: round;
114
+ }
115
+
116
+ .ss-main .ss-deselect {
117
+ @apply flex-none flex items-center justify-center w-fit h-auto p-[0_5px];
118
+ }
119
+
120
+ .ss-main .ss-deselect svg {
121
+ @apply w-[8px] h-[8px];
122
+ }
123
+
124
+ .ss-main .ss-deselect svg path {
125
+ @apply fill-none stroke-gray-500 dark:stroke-gray-400;
126
+ stroke-width: 20;
127
+ stroke-linecap: round;
128
+ stroke-linejoin: round;
129
+ }
130
+
131
+ .ss-main .ss-arrow {
132
+ @apply flex-none flex items-center justify-end w-4 h-4 m-auto;
133
+ }
134
+
135
+ .ss-main .ss-arrow path {
136
+ @apply fill-none stroke-gray-500 dark:stroke-gray-400 transition-transform duration-200;
137
+ stroke-width: 2;
138
+ stroke-linecap: round;
139
+ stroke-linejoin: round;
140
+ }
141
+
142
+ .ss-content {
143
+ @apply absolute flex h-auto flex-col w-auto max-h-[300px] box-border border rounded-b-md shadow-lg border-gray-300 bg-white dark:bg-gray-700 dark:border-gray-600 transition-all duration-200 opacity-0 scale-y-0 origin-top overflow-hidden z-[10000];
144
+ }
145
+
146
+ .ss-content.ss-relative {
147
+ @apply relative h-full;
148
+ }
149
+
150
+ .ss-content.ss-fixed {
151
+ @apply fixed;
152
+ }
153
+
154
+ .ss-content.ss-open-above {
155
+ @apply flex-col-reverse opacity-100 scale-y-100 origin-bottom rounded-t-md;
156
+ }
157
+
158
+ .ss-content.ss-open-below {
159
+ @apply opacity-100 scale-y-100 origin-top rounded-b-md;
160
+ }
161
+
162
+ .ss-content .ss-search {
163
+ @apply flex-none flex flex-row p-2;
164
+ }
165
+
166
+ .ss-content .ss-search input {
167
+ @apply inline-flex text-base leading-normal flex-auto w-full min-w-0 p-2 m-0 border rounded-md shadow-sm font-medium text-sm border-gray-300 bg-gray-100 text-gray-900 placeholder-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white focus:ring-primary-500 focus:border-primary-500 focus:outline-none text-left box-border;
168
+ }
169
+
170
+ .ss-content .ss-search .ss-addable {
171
+ @apply inline-flex justify-center items-center cursor-pointer flex-none h-auto ml-2 border shadow-sm border-gray-300 dark:border-gray-600;
172
+ }
173
+
174
+ .ss-content .ss-search .ss-addable svg {
175
+ @apply flex items-center justify-end flex-none w-4 h-4 m-2;
176
+ }
177
+
178
+ .ss-content .ss-search .ss-addable svg path {
179
+ @apply fill-none stroke-gray-500 dark:stroke-gray-400;
180
+ stroke-width: 2;
181
+ stroke-linecap: round;
182
+ stroke-linejoin: round;
183
+ }
184
+
185
+ .ss-content .ss-list {
186
+ @apply flex-auto h-auto overflow-x-hidden overflow-y-auto;
187
+ }
188
+
189
+ .ss-content .ss-list .ss-error {
190
+ @apply text-red-500 dark:text-red-400 p-2;
191
+ }
192
+
193
+ .ss-content .ss-list .ss-searching {
194
+ @apply text-gray-900 dark:text-white p-2;
195
+ }
196
+
197
+ .ss-content .ss-list .ss-optgroup.ss-close .ss-option {
198
+ @apply hidden !important;
199
+ }
200
+
201
+ /* Update the specific no results style */
202
+ .ss-content .ss-list .ss-search {
203
+ @apply flex-none text-sm text-gray-500 dark:text-gray-400 p-2 font-medium;
204
+ }
205
+
206
+ /* The original search container styles should be scoped properly */
207
+ .ss-content>.ss-search {
208
+ @apply flex-none flex flex-row p-2;
209
+ }
210
+
211
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label {
212
+ @apply flex flex-row items-center justify-between p-2 bg-gray-50 dark:bg-gray-800;
213
+ }
214
+
215
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-label-text {
216
+ @apply flex-auto font-bold text-gray-900 dark:text-white;
217
+ }
218
+
219
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label:has(.ss-arrow) {
220
+ @apply cursor-pointer;
221
+ }
222
+
223
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions {
224
+ @apply flex-none flex flex-row items-center justify-center gap-2;
225
+ }
226
+
227
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall {
228
+ @apply flex-none flex flex-row cursor-pointer hover:opacity-50;
229
+ }
230
+
231
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall.ss-selected svg path {
232
+ @apply stroke-red-500 dark:stroke-red-400;
233
+ }
234
+
235
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall span {
236
+ @apply flex-none flex items-center justify-center text-[60%] text-center pr-1;
237
+ }
238
+
239
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall svg {
240
+ @apply flex-none w-[13px] h-[13px];
241
+ }
242
+
243
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall svg path {
244
+ @apply fill-none stroke-green-500 dark:stroke-green-400;
245
+ stroke-linecap: round;
246
+ stroke-linejoin: round;
247
+ }
248
+
249
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall svg:first-child {
250
+ stroke-width: 5;
251
+ }
252
+
253
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall svg:last-child {
254
+ stroke-width: 11;
255
+ }
256
+
257
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-closable {
258
+ @apply flex-none flex flex-row cursor-pointer;
259
+ }
260
+
261
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-closable .ss-arrow {
262
+ @apply flex-auto w-[10px] h-[10px];
263
+ }
264
+
265
+ .ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-closable .ss-arrow path {
266
+ @apply fill-none stroke-gray-500 dark:stroke-gray-400 transition-transform duration-200;
267
+ stroke-width: 2;
268
+ stroke-linecap: round;
269
+ stroke-linejoin: round;
270
+ }
271
+
272
+ .ss-content .ss-list .ss-optgroup .ss-option {
273
+ @apply p-2 pl-6;
274
+ }
275
+
276
+ .ss-content .ss-list .ss-option {
277
+ @apply block p-2 whitespace-normal text-gray-900 dark:text-white cursor-pointer select-none hover:bg-gray-100 dark:hover:bg-gray-600;
278
+ min-height: 0;
279
+ }
280
+
281
+ .ss-content .ss-list .ss-option:empty {
282
+ @apply hidden p-0 m-0;
283
+ }
284
+
285
+ .ss-content .ss-list .ss-option.ss-highlighted,
286
+ .ss-content .ss-list .ss-option:not(.ss-disabled).ss-selected {
287
+ @apply text-white dark:text-gray-900 bg-primary-500;
288
+ }
289
+
290
+ .ss-content .ss-list .ss-option.ss-disabled {
291
+ @apply cursor-not-allowed bg-gray-100 dark:bg-gray-800 text-gray-500 dark:text-gray-400;
292
+ }
293
+
294
+ .ss-content .ss-list .ss-option .ss-search-highlight {
295
+ @apply inline-block bg-yellow-200 dark:bg-yellow-300;
296
+ }
297
+ }