panda-core 0.8.0 → 0.8.1
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/lib/panda/core/testing/rails_helper.rb +8 -1
- data/lib/panda/core/testing/support/system/capybara_setup.rb +62 -0
- data/lib/panda/core/testing/support/system/cuprite_setup.rb +115 -0
- data/lib/panda/core/testing/support/system/database_connection_helpers.rb +23 -0
- data/lib/panda/core/testing/support/system/system_test_helpers.rb +233 -0
- data/lib/panda/core/version.rb +1 -1
- data/lib/tasks/assets.rake +2 -2
- data/public/panda-core-assets/panda-core-1762886534.css +2 -0
- metadata +7 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d71882619f044e6c12c628c91dd32e1f3f8d35ed6c06c2d56a952df67b2d185d
|
|
4
|
+
data.tar.gz: 98ffdb33880b310143ba47d13f40edda3fe5568a9474d089fc56fa6f43b45cba
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e76cc361df60d271c1ce4489eb892731e5ae03bdbe7de1eaddd9ae60c3bb9a0c31319aa309f6a8be020a9fae34cd1cbdcf3bfcce3ebc7bc8379609412b870167
|
|
7
|
+
data.tar.gz: a16db81da2dd0248dc6e0dd9d306dcc2d134ddcb372b707c65c99a9a6c31a24c79e175ee01412abe46fe6f6148afe2bd648351fa876cca3bfd6ec6d39c646a04
|
|
@@ -31,7 +31,14 @@ end
|
|
|
31
31
|
# Load all support files from panda-core
|
|
32
32
|
# Files are now in lib/panda/core/testing/support/ to be included in the published gem
|
|
33
33
|
support_path = File.expand_path("../support", __FILE__)
|
|
34
|
-
|
|
34
|
+
|
|
35
|
+
# Load system test infrastructure first (Capybara, Cuprite, helpers)
|
|
36
|
+
system_test_files = Dir[File.join(support_path, "system/**/*.rb")].sort
|
|
37
|
+
system_test_files.each { |f| require f }
|
|
38
|
+
|
|
39
|
+
# Load other support files
|
|
40
|
+
other_support_files = Dir[File.join(support_path, "**/*.rb")].sort.reject { |f| f.include?("/system/") }
|
|
41
|
+
other_support_files.each { |f| require f }
|
|
35
42
|
|
|
36
43
|
RSpec.configure do |config|
|
|
37
44
|
# Include panda-core route helpers by default
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Shared Capybara configuration for all Panda gems
|
|
4
|
+
# This provides standard Capybara setup with sensible defaults
|
|
5
|
+
|
|
6
|
+
# Increase wait time for CI environments where asset loading is slower
|
|
7
|
+
Capybara.default_max_wait_time = ENV["CI"].present? ? 10 : 5
|
|
8
|
+
|
|
9
|
+
# Normalize whitespaces when using `has_text?` and similar matchers,
|
|
10
|
+
# i.e., ignore newlines, trailing spaces, etc.
|
|
11
|
+
# That makes tests less dependent on slight UI changes.
|
|
12
|
+
Capybara.default_normalize_ws = true
|
|
13
|
+
|
|
14
|
+
# Where to store system tests artifacts (e.g. screenshots, downloaded files, etc.).
|
|
15
|
+
# It could be useful to be able to configure this path from the outside (e.g., on CI).
|
|
16
|
+
Capybara.save_path = ENV.fetch("CAPYBARA_ARTIFACTS", "./tmp/capybara")
|
|
17
|
+
|
|
18
|
+
# Disable animation so we're not waiting for it
|
|
19
|
+
Capybara.disable_animation = true
|
|
20
|
+
|
|
21
|
+
# See SystemTestHelpers#take_screenshot
|
|
22
|
+
# This allows us to track which session was last used for proper screenshot naming
|
|
23
|
+
Capybara.singleton_class.prepend(Module.new do
|
|
24
|
+
attr_accessor :last_used_session
|
|
25
|
+
|
|
26
|
+
def using_session(name, &block)
|
|
27
|
+
self.last_used_session = name
|
|
28
|
+
super
|
|
29
|
+
ensure
|
|
30
|
+
self.last_used_session = nil
|
|
31
|
+
end
|
|
32
|
+
end)
|
|
33
|
+
|
|
34
|
+
# Configure server host and port
|
|
35
|
+
Capybara.server_host = "127.0.0.1"
|
|
36
|
+
Capybara.server_port = ENV["CAPYBARA_PORT"]&.to_i # Let Capybara choose if not specified
|
|
37
|
+
|
|
38
|
+
# Configure Puma server with explicit options
|
|
39
|
+
# Use single-threaded mode to share database connection with tests
|
|
40
|
+
Capybara.register_server :puma do |app, port, host|
|
|
41
|
+
require "rack/handler/puma"
|
|
42
|
+
Rack::Handler::Puma.run(app, Port: port, Host: host, Silent: true, Threads: "1:1")
|
|
43
|
+
end
|
|
44
|
+
Capybara.server = :puma
|
|
45
|
+
|
|
46
|
+
# Do not set app_host here - let Capybara determine it from the server
|
|
47
|
+
# This avoids conflicts between what's configured and what's actually running
|
|
48
|
+
|
|
49
|
+
# RSpec configuration for Capybara
|
|
50
|
+
RSpec.configure do |config|
|
|
51
|
+
# Save screenshots on system test failures
|
|
52
|
+
config.after(:each, type: :system) do |example|
|
|
53
|
+
if example.exception
|
|
54
|
+
timestamp = Time.now.strftime("%Y-%m-%d-%H%M%S")
|
|
55
|
+
"tmp/capybara/failures/#{example.full_description.parameterize}_#{timestamp}"
|
|
56
|
+
|
|
57
|
+
# Screenshots are saved automatically by Capybara, but we could save additional artifacts here
|
|
58
|
+
# save_page("#{filename_base}.html")
|
|
59
|
+
# save_screenshot("#{filename_base}.png", full: true)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "ferrum"
|
|
4
|
+
require "capybara/cuprite"
|
|
5
|
+
|
|
6
|
+
# Shared Cuprite driver configuration for all Panda gems
|
|
7
|
+
# This provides standard Cuprite setup with sensible defaults that work across gems
|
|
8
|
+
#
|
|
9
|
+
# Features:
|
|
10
|
+
# - :cuprite driver for standard desktop testing
|
|
11
|
+
# - :cuprite_mobile driver for mobile viewport testing
|
|
12
|
+
# - JavaScript error reporting enabled by default (js_errors: true)
|
|
13
|
+
# - CI-optimized browser options
|
|
14
|
+
# - Environment-based configuration (HEADLESS, INSPECTOR, SLOWMO)
|
|
15
|
+
|
|
16
|
+
module Panda
|
|
17
|
+
module Core
|
|
18
|
+
module Testing
|
|
19
|
+
module CupriteSetup
|
|
20
|
+
# Base Cuprite options shared across all drivers
|
|
21
|
+
def self.base_options
|
|
22
|
+
{
|
|
23
|
+
window_size: [1440, 1000],
|
|
24
|
+
inspector: ENV["INSPECTOR"].in?(%w[y 1 yes true]),
|
|
25
|
+
headless: !ENV["HEADLESS"].in?(%w[n 0 no false]),
|
|
26
|
+
slowmo: ENV["SLOWMO"]&.to_f || 0,
|
|
27
|
+
timeout: 30,
|
|
28
|
+
js_errors: true, # IMPORTANT: Report JavaScript errors as test failures
|
|
29
|
+
ignore_default_browser_options: false,
|
|
30
|
+
process_timeout: 10,
|
|
31
|
+
wait_for_network_idle: false, # Don't wait for all network requests
|
|
32
|
+
pending_connection_errors: false, # Don't fail on pending external connections
|
|
33
|
+
browser_options: {
|
|
34
|
+
"no-sandbox": nil,
|
|
35
|
+
"disable-gpu": nil,
|
|
36
|
+
"disable-dev-shm-usage": nil,
|
|
37
|
+
"disable-background-networking": nil,
|
|
38
|
+
"disable-default-apps": nil,
|
|
39
|
+
"disable-extensions": nil,
|
|
40
|
+
"disable-sync": nil,
|
|
41
|
+
"disable-translate": nil,
|
|
42
|
+
"no-first-run": nil,
|
|
43
|
+
"ignore-certificate-errors": nil,
|
|
44
|
+
"allow-insecure-localhost": nil,
|
|
45
|
+
"enable-features": "NetworkService,NetworkServiceInProcess",
|
|
46
|
+
"disable-blink-features": "AutomationControlled"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Additional options for CI environments
|
|
52
|
+
def self.ci_browser_options
|
|
53
|
+
{
|
|
54
|
+
"disable-web-security": nil,
|
|
55
|
+
"allow-file-access-from-files": nil,
|
|
56
|
+
"allow-file-access": nil
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Configure standard desktop driver
|
|
61
|
+
def self.register_desktop_driver
|
|
62
|
+
options = base_options.dup
|
|
63
|
+
|
|
64
|
+
# Add CI-specific options
|
|
65
|
+
if ENV["GITHUB_ACTIONS"] == "true"
|
|
66
|
+
options[:browser_options].merge!(ci_browser_options)
|
|
67
|
+
|
|
68
|
+
puts "\n🔍 Cuprite Configuration (Desktop):"
|
|
69
|
+
puts " Debug mode: #{ENV["DEBUG"]}"
|
|
70
|
+
puts " Headless: #{options[:headless]}"
|
|
71
|
+
puts " JS Errors: #{options[:js_errors]}"
|
|
72
|
+
puts " Browser options: #{options[:browser_options].keys.join(", ")}"
|
|
73
|
+
puts ""
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
Capybara.register_driver :cuprite do |app|
|
|
77
|
+
Capybara::Cuprite::Driver.new(app, **options)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Configure mobile viewport driver
|
|
82
|
+
def self.register_mobile_driver
|
|
83
|
+
options = base_options.dup
|
|
84
|
+
options[:window_size] = [375, 667] # iPhone SE size
|
|
85
|
+
|
|
86
|
+
if ENV["GITHUB_ACTIONS"] == "true"
|
|
87
|
+
options[:browser_options].merge!(ci_browser_options)
|
|
88
|
+
|
|
89
|
+
puts "\n🔍 Cuprite Configuration (Mobile):"
|
|
90
|
+
puts " Window size: #{options[:window_size]}"
|
|
91
|
+
puts " JS Errors: #{options[:js_errors]}"
|
|
92
|
+
puts ""
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
Capybara.register_driver :cuprite_mobile do |app|
|
|
96
|
+
Capybara::Cuprite::Driver.new(app, **options)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Register all drivers
|
|
101
|
+
def self.setup!
|
|
102
|
+
register_desktop_driver
|
|
103
|
+
register_mobile_driver
|
|
104
|
+
|
|
105
|
+
# Set default drivers
|
|
106
|
+
Capybara.default_driver = :cuprite
|
|
107
|
+
Capybara.javascript_driver = :cuprite
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Auto-setup when required
|
|
115
|
+
Panda::Core::Testing::CupriteSetup.setup!
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Share database connection between test thread and server thread
|
|
4
|
+
# This allows the Puma server to see uncommitted transaction data from fixtures
|
|
5
|
+
class ActiveRecord::Base
|
|
6
|
+
mattr_accessor :shared_connection
|
|
7
|
+
@@shared_connection = nil
|
|
8
|
+
|
|
9
|
+
def self.connection
|
|
10
|
+
@@shared_connection || retrieve_connection
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Set up shared connection before system tests
|
|
15
|
+
RSpec.configure do |config|
|
|
16
|
+
config.before(:each, type: :system) do
|
|
17
|
+
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
config.after(:each, type: :system) do
|
|
21
|
+
ActiveRecord::Base.shared_connection = nil
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Generic system test helpers for Cuprite-based testing
|
|
4
|
+
# These methods work for any Rails application using Cuprite
|
|
5
|
+
|
|
6
|
+
module Panda
|
|
7
|
+
module Core
|
|
8
|
+
module Testing
|
|
9
|
+
module SystemTestHelpers
|
|
10
|
+
# Make failure screenshots compatible with multi-session setup
|
|
11
|
+
def take_screenshot
|
|
12
|
+
return super unless Capybara.last_used_session
|
|
13
|
+
|
|
14
|
+
Capybara.using_session(Capybara.last_used_session) { super }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Ensure page is loaded and stable before interacting
|
|
18
|
+
def ensure_page_loaded
|
|
19
|
+
# Check if we're on about:blank
|
|
20
|
+
current_url = begin
|
|
21
|
+
page.current_url
|
|
22
|
+
rescue
|
|
23
|
+
"unknown"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
if current_url.include?("about:blank")
|
|
27
|
+
puts "[CI] Page is on about:blank, skipping recovery to avoid loops" if ENV["GITHUB_ACTIONS"]
|
|
28
|
+
return false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Wait for page to be ready
|
|
32
|
+
wait_for_ready_state
|
|
33
|
+
true
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Wait for document ready state
|
|
37
|
+
def wait_for_ready_state
|
|
38
|
+
Timeout.timeout(5) do
|
|
39
|
+
loop do
|
|
40
|
+
ready = page.evaluate_script("document.readyState")
|
|
41
|
+
break if ready == "complete"
|
|
42
|
+
|
|
43
|
+
sleep 0.1
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
rescue Timeout::Error
|
|
47
|
+
puts "[CI] Timeout waiting for document ready state" if ENV["GITHUB_ACTIONS"]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Waits for a specific selector to be present and visible
|
|
51
|
+
# @param selector [String] CSS selector to wait for
|
|
52
|
+
# @param timeout [Integer] Maximum time to wait in seconds (default: 5)
|
|
53
|
+
# @return [Boolean] true if element is found, false if timeout occurs
|
|
54
|
+
def wait_for_selector(selector, timeout: 5)
|
|
55
|
+
start_time = Time.now
|
|
56
|
+
while Time.now - start_time < timeout
|
|
57
|
+
return true if page.has_css?(selector, visible: true)
|
|
58
|
+
|
|
59
|
+
sleep 0.1
|
|
60
|
+
end
|
|
61
|
+
false
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Waits for a specific text to be present on the page
|
|
65
|
+
# @param text [String] Text to wait for
|
|
66
|
+
# @param timeout [Integer] Maximum time to wait in seconds (default: 5)
|
|
67
|
+
# @return [Boolean] true if text is found, false if timeout occurs
|
|
68
|
+
def wait_for_text(text, timeout: 5)
|
|
69
|
+
start_time = Time.now
|
|
70
|
+
while Time.now - start_time < timeout
|
|
71
|
+
return true if page.has_text?(text)
|
|
72
|
+
|
|
73
|
+
sleep 0.1
|
|
74
|
+
end
|
|
75
|
+
false
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Waits for network requests to complete
|
|
79
|
+
# @param timeout [Integer] Maximum time to wait in seconds (default: 5)
|
|
80
|
+
# @return [Boolean] true if network is idle, false if timeout occurs
|
|
81
|
+
def wait_for_network_idle(timeout: 5)
|
|
82
|
+
page.driver.wait_for_network_idle(timeout: timeout)
|
|
83
|
+
true
|
|
84
|
+
rescue => e
|
|
85
|
+
puts "[CI] Network idle timeout: #{e.message}" if ENV["GITHUB_ACTIONS"]
|
|
86
|
+
false
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Waits for JavaScript to modify the DOM
|
|
90
|
+
# @param timeout [Integer] Maximum time to wait in seconds (default: 5)
|
|
91
|
+
# @return [Boolean] true if mutation occurred, false if timeout occurs
|
|
92
|
+
def wait_for_dom_mutation(timeout: 5)
|
|
93
|
+
start_time = Time.now
|
|
94
|
+
initial_dom = page.html
|
|
95
|
+
while Time.now - start_time < timeout
|
|
96
|
+
return true if page.html != initial_dom
|
|
97
|
+
|
|
98
|
+
sleep 0.1
|
|
99
|
+
end
|
|
100
|
+
false
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Drop #pause anywhere in a test to stop the execution
|
|
104
|
+
# Useful when you want to check out the contents of a web page in the middle of a test
|
|
105
|
+
# running in a headful mode
|
|
106
|
+
def pause
|
|
107
|
+
page.driver.pause
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Drop #browser_debug anywhere in a test to open a Chrome inspector and pause the execution
|
|
111
|
+
# Usage: browser_debug(binding)
|
|
112
|
+
def browser_debug(*)
|
|
113
|
+
page.driver.debug
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Allows sending a list of CSS selectors to be clicked on in the correct order (no delay)
|
|
117
|
+
# Useful where you need to trigger e.g. a blur event on an input field
|
|
118
|
+
def click_on_selectors(*css_selectors)
|
|
119
|
+
css_selectors.each do |selector|
|
|
120
|
+
find(selector).click
|
|
121
|
+
sleep 0.1 # Add a small delay to allow JavaScript to run
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Wait for a field to have a specific value
|
|
126
|
+
# @param field_name [String] The field name or label
|
|
127
|
+
# @param value [String] The expected value
|
|
128
|
+
# @param timeout [Integer] Maximum time to wait in seconds (default: 5)
|
|
129
|
+
def wait_for_field_value(field_name, value, timeout: 5)
|
|
130
|
+
start_time = Time.now
|
|
131
|
+
while Time.now - start_time < timeout
|
|
132
|
+
return true if page.has_field?(field_name, with: value)
|
|
133
|
+
|
|
134
|
+
sleep 0.1
|
|
135
|
+
end
|
|
136
|
+
false
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Configure RSpec to use these helpers
|
|
144
|
+
RSpec.configure do |config|
|
|
145
|
+
config.include Panda::Core::Testing::SystemTestHelpers, type: :system
|
|
146
|
+
|
|
147
|
+
# Make URLs in mailers contain the correct server host
|
|
148
|
+
# This is required for testing links in emails (e.g., via capybara-email)
|
|
149
|
+
config.around(:each, type: :system) do |ex|
|
|
150
|
+
was_host = Rails.application.default_url_options[:host]
|
|
151
|
+
Rails.application.default_url_options[:host] = Capybara.server_host
|
|
152
|
+
ex.run
|
|
153
|
+
Rails.application.default_url_options[:host] = was_host
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Make sure this hook runs before others
|
|
157
|
+
# Means you don't have to set js: true in every system spec
|
|
158
|
+
config.prepend_before(:each, type: :system) do
|
|
159
|
+
driven_by :cuprite
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# CI-specific error handling
|
|
163
|
+
config.around(:each, type: :system) do |example|
|
|
164
|
+
if ENV["GITHUB_ACTIONS"] == "true"
|
|
165
|
+
begin
|
|
166
|
+
example.run
|
|
167
|
+
rescue => e
|
|
168
|
+
puts "[CI] Test error detected: #{e.class} - #{e.message}"
|
|
169
|
+
puts "[CI] Current URL: #{begin
|
|
170
|
+
page.current_url
|
|
171
|
+
rescue
|
|
172
|
+
"unknown"
|
|
173
|
+
end}"
|
|
174
|
+
raise e
|
|
175
|
+
end
|
|
176
|
+
else
|
|
177
|
+
example.run
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Enhanced screenshot capture on failure
|
|
182
|
+
config.after(:each, type: :system) do |example|
|
|
183
|
+
next unless example.exception
|
|
184
|
+
|
|
185
|
+
begin
|
|
186
|
+
# Wait for any pending JavaScript to complete
|
|
187
|
+
begin
|
|
188
|
+
page.driver.wait_for_network_idle
|
|
189
|
+
rescue
|
|
190
|
+
nil
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
sleep 0.5 # Wait for DOM to be ready
|
|
194
|
+
|
|
195
|
+
# Get comprehensive page info
|
|
196
|
+
page_html = begin
|
|
197
|
+
page.html
|
|
198
|
+
rescue
|
|
199
|
+
"<html><body>Error loading page</body></html>"
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
page_title = begin
|
|
203
|
+
page.title
|
|
204
|
+
rescue
|
|
205
|
+
"N/A"
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# Warn about minimal page content
|
|
209
|
+
if page_html.length < 100
|
|
210
|
+
puts "Warning: Page content appears minimal (#{page_html.length} chars) when taking screenshot"
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Use Capybara's save_screenshot method
|
|
214
|
+
screenshot_path = Capybara.save_screenshot
|
|
215
|
+
if screenshot_path
|
|
216
|
+
puts "Screenshot saved to: #{screenshot_path}"
|
|
217
|
+
puts "Page title: #{page_title}"
|
|
218
|
+
puts "Page content length: #{page_html.length} characters"
|
|
219
|
+
|
|
220
|
+
# Save page HTML for debugging in CI
|
|
221
|
+
if ENV["GITHUB_ACTIONS"]
|
|
222
|
+
html_debug_path = screenshot_path.gsub(".png", ".html")
|
|
223
|
+
File.write(html_debug_path, page_html)
|
|
224
|
+
puts "Page HTML saved to: #{html_debug_path}"
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
rescue => e
|
|
228
|
+
puts "Failed to capture screenshot: #{e.message}"
|
|
229
|
+
puts "Exception class: #{example.exception.class}"
|
|
230
|
+
puts "Exception message: #{example.exception.message}"
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
data/lib/panda/core/version.rb
CHANGED
data/lib/tasks/assets.rake
CHANGED
|
@@ -59,7 +59,7 @@ namespace :panda do
|
|
|
59
59
|
|
|
60
60
|
if system(cmd)
|
|
61
61
|
puts "✅ CSS compiled: #{output_file} (#{File.size(output_file)} bytes)"
|
|
62
|
-
puts "📦 Included content from: #{Panda::Core::ModuleRegistry.registered_modules.join(
|
|
62
|
+
puts "📦 Included content from: #{Panda::Core::ModuleRegistry.registered_modules.join(", ")}" if Panda::Core::ModuleRegistry.registered_modules.any?
|
|
63
63
|
else
|
|
64
64
|
puts "❌ CSS compilation failed"
|
|
65
65
|
exit 1
|
|
@@ -82,7 +82,7 @@ namespace :panda do
|
|
|
82
82
|
|
|
83
83
|
if system(cmd)
|
|
84
84
|
puts "✅ CSS compiled: #{versioned_file} (#{File.size(versioned_file)} bytes)"
|
|
85
|
-
puts "📦 Included content from: #{Panda::Core::ModuleRegistry.registered_modules.join(
|
|
85
|
+
puts "📦 Included content from: #{Panda::Core::ModuleRegistry.registered_modules.join(", ")}" if Panda::Core::ModuleRegistry.registered_modules.any?
|
|
86
86
|
|
|
87
87
|
# Create/update unversioned symlink
|
|
88
88
|
symlink = output_dir.join("panda-core.css")
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-serif:ui-serif,Georgia,Cambria,"Times New Roman",Times,serif;--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-700:oklch(50% .134 242.749);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-indigo-300:var(--color-primary-300);--color-indigo-400:var(--color-primary-400);--color-indigo-500:var(--color-primary-500);--color-indigo-600:var(--color-primary-600);--color-indigo-900:var(--color-primary-900);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-gray-50:var(--color-gray-50);--color-gray-100:var(--color-gray-100);--color-gray-200:var(--color-gray-200);--color-gray-300:var(--color-gray-300);--color-gray-400:var(--color-gray-400);--color-gray-500:var(--color-gray-500);--color-gray-600:var(--color-gray-600);--color-gray-700:var(--color-gray-700);--color-gray-800:var(--color-gray-800);--color-gray-900:var(--color-gray-900);--color-gray-950:var(--color-gray-950);--color-neutral-400:oklch(70.8% 0 0);--color-black:var(--color-black);--color-white:var(--color-white);--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--radius-md:.375rem;--radius-lg:.5rem;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-light:var(--color-light);--color-mid:var(--color-mid);--color-dark:var(--color-dark);--color-highlight:var(--color-highlight);--color-active:var(--color-active);--color-inactive:var(--color-inactive);--color-warning:var(--color-warning);--color-error:var(--color-error);--color-primary-50:var(--color-primary-50);--color-primary-100:var(--color-primary-100);--color-primary-200:var(--color-primary-200);--color-primary-300:var(--color-primary-300);--color-primary-400:var(--color-primary-400);--color-primary-500:var(--color-primary-500);--color-primary-600:var(--color-primary-600);--color-primary-700:var(--color-primary-700);--color-primary-800:var(--color-primary-800);--color-primary-900:var(--color-primary-900);--color-primary-950:var(--color-primary-950)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html[data-theme=default]{--color-white:#f9f9f9;--color-black:#1a161d;--color-light:#eecee6;--color-mid:#8d5eb7;--color-dark:#211d49;--color-highlight:#d04014;--color-active:#008755;--color-warning:#facf8e;--color-inactive:#d8f7f5;--color-error:#f58181;--color-primary-50:#faf5ff;--color-primary-100:#f3e8ff;--color-primary-200:#e9d5ff;--color-primary-300:#d8b4fe;--color-primary-400:#c084fc;--color-primary-500:#8d5eb7;--color-primary-600:#7850a0;--color-primary-700:#64418c;--color-primary-800:#3c2d64;--color-primary-900:#211d49;--color-primary-950:#181432;--color-gray-50:#f9fafb;--color-gray-100:#f3f4f6;--color-gray-200:#e5e7eb;--color-gray-300:#d1d5db;--color-gray-400:#9ca3af;--color-gray-500:#6b7280;--color-gray-600:#4b5563;--color-gray-700:#374151;--color-gray-800:#1f2937;--color-gray-900:#111827;--color-gray-950:#030712}html[data-theme=sky]{--color-white:#f9f9f9;--color-black:#1a161d;--color-light:#cceef2;--color-mid:#2a669f;--color-dark:#14204a;--color-highlight:#d04014;--color-active:#459a59;--color-warning:#f4be66;--color-inactive:#d8f7f5;--color-error:#d04014;--color-primary-50:#f0f9ff;--color-primary-100:#e0f2fe;--color-primary-200:#bae6fd;--color-primary-300:#7dd3fc;--color-primary-400:#38bdf8;--color-primary-500:#2a669f;--color-primary-600:#235584;--color-primary-700:#1c446a;--color-primary-800:#163452;--color-primary-900:#14204a;--color-primary-950:#0f1837;--color-gray-50:#f9fafb;--color-gray-100:#f3f4f6;--color-gray-200:#e5e7eb;--color-gray-300:#d1d5db;--color-gray-400:#9ca3af;--color-gray-500:#6b7280;--color-gray-600:#4b5563;--color-gray-700:#374151;--color-gray-800:#1f2937;--color-gray-900:#111827;--color-gray-950:#030712}a.block-link:after{content:"";position:absolute;inset:0}html[data-theme=default] .bg-gradient-admin{background:linear-gradient(to bottom right,#211d49,#8d5eb7)}html[data-theme=sky] .bg-gradient-admin{background:linear-gradient(to bottom right,#14204a,#2a669f)}}@layer components{input[type=text],input[type=email],input[type=password],input[type=url],input[type=tel],input[type=number],input[type=date],input[type=datetime-local],input[type=month],input[type=week],input[type=time],input[type=search],textarea{border-radius:var(--radius-md);border-style:var(--tw-border-style);background-color:var(--color-white);width:100%;padding:calc(var(--spacing)*2);color:var(--color-gray-900);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-mid);--tw-ring-inset:inset;border-width:0;display:block}:is(input[type=text],input[type=email],input[type=password],input[type=url],input[type=tel],input[type=number],input[type=date],input[type=datetime-local],input[type=month],input[type=week],input[type=time],input[type=search],textarea)::placeholder{color:var(--color-gray-300)}:is(input[type=text],input[type=email],input[type=password],input[type=url],input[type=tel],input[type=number],input[type=date],input[type=datetime-local],input[type=month],input[type=week],input[type=time],input[type=search],textarea):focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-dark);--tw-ring-inset:inset}@media (hover:hover){:is(input[type=text],input[type=email],input[type=password],input[type=url],input[type=tel],input[type=number],input[type=date],input[type=datetime-local],input[type=month],input[type=week],input[type=time],input[type=search],textarea):hover{cursor:pointer}}@media (min-width:40rem){input[type=text],input[type=email],input[type=password],input[type=url],input[type=tel],input[type=number],input[type=date],input[type=datetime-local],input[type=month],input[type=week],input[type=time],input[type=search],textarea{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}}:is(input[type=text],input[type=email],input[type=password],input[type=url],input[type=tel],input[type=number],input[type=date],input[type=datetime-local],input[type=month],input[type=week],input[type=time],input[type=search],textarea):disabled{cursor:not-allowed;background-color:var(--color-gray-50);--tw-ring-color:var(--color-gray-300)}:is(input[type=text],input[type=email],input[type=password],input[type=url],input[type=tel],input[type=number],input[type=date],input[type=datetime-local],input[type=month],input[type=week],input[type=time],input[type=search],textarea):disabled:focus{--tw-ring-color:var(--color-gray-300)}select{border-radius:var(--radius-md);border-style:var(--tw-border-style);background-color:var(--color-white);width:100%;padding-block:calc(var(--spacing)*1.5);padding-right:calc(var(--spacing)*10);padding-left:calc(var(--spacing)*3);color:var(--color-gray-900);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-mid);--tw-ring-inset:inset;border-width:0;display:block}select:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-dark);--tw-ring-inset:inset}@media (hover:hover){select:hover{cursor:pointer}}@media (min-width:40rem){select{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}}select:disabled{cursor:not-allowed;background-color:var(--color-gray-50);--tw-ring-color:var(--color-gray-300)}select:disabled:focus{--tw-ring-color:var(--color-gray-300)}select{appearance:none;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em}input[type=checkbox],input[type=radio]{height:calc(var(--spacing)*4);width:calc(var(--spacing)*4);border-color:var(--color-gray-300);background-color:var(--color-white);color:var(--color-indigo-600);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;border-radius:.25rem;transition-duration:.2s}:is(input[type=checkbox],input[type=radio]):focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-indigo-500);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}:is(input[type=checkbox],input[type=radio]):disabled{cursor:not-allowed;background-color:var(--color-gray-100)}input[type=radio]{border-radius:3.40282e38px}label{margin-bottom:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-gray-700);display:block}.field{margin-bottom:calc(var(--spacing)*4)}input.error,textarea.error,select.error,:is(input.error,textarea.error,select.error):focus{--tw-ring-color:var(--color-red-500)}.field-error{margin-top:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-red-600)}.btn{border-radius:var(--radius-md);padding-inline:calc(var(--spacing)*6);padding-block:calc(var(--spacing)*3);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;justify-content:center;align-items:center;transition-duration:.2s;display:inline-flex}.btn:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.btn:disabled{cursor:not-allowed;opacity:.5}.btn-primary{background-color:var(--color-mid);color:var(--color-white)}@media (hover:hover){.btn-primary:hover{opacity:.9}}.btn-primary:focus{--tw-ring-color:var(--color-mid)}.btn-secondary{background-color:var(--color-gray-200);color:var(--color-gray-900)}@media (hover:hover){.btn-secondary:hover{background-color:var(--color-gray-300)}}.btn-secondary:focus{--tw-ring-color:var(--color-gray-500)}.btn-danger{background-color:var(--color-red-600);color:var(--color-white)}@media (hover:hover){.btn-danger:hover{background-color:var(--color-red-700)}}.btn-danger:focus{--tw-ring-color:var(--color-red-500)}:where(.codex-editor__redactor .ce-block .ce-block__content>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1.6rem*var(--tw-space-y-reverse));margin-block-end:calc(1.6rem*calc(1 - var(--tw-space-y-reverse)))}.codex-editor__redactor .ce-block .ce-block__content{font-family:var(--font-sans);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:1.6;--tw-font-weight:var(--font-weight-normal);line-height:1.6;font-weight:var(--font-weight-normal);color:var(--color-dark)}.codex-editor__redactor .ce-block .ce-block__content h1.ce-header{font-family:var(--font-sans);font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-leading:1.2;--tw-font-weight:var(--font-weight-semibold);line-height:1.2;font-weight:var(--font-weight-semibold)}@media (min-width:48rem){.codex-editor__redactor .ce-block .ce-block__content h1.ce-header{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}.codex-editor__redactor .ce-block .ce-block__content h2.ce-header{margin-top:calc(var(--spacing)*8);margin-bottom:calc(var(--spacing)*4);font-family:var(--font-sans);font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-leading:1.3;--tw-font-weight:var(--font-weight-medium);line-height:1.3;font-weight:var(--font-weight-medium)}.codex-editor__redactor .ce-block .ce-block__content h3.ce-header{margin-top:calc(var(--spacing)*6);margin-bottom:calc(var(--spacing)*4);font-family:var(--font-sans);font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-leading:1.3;--tw-font-weight:var(--font-weight-normal);line-height:1.3;font-weight:var(--font-weight-normal)}.codex-editor__redactor .ce-block .ce-block__content p,.codex-editor__redactor .ce-block .ce-block__content li{--tw-leading:1.6;--tw-tracking:var(--tracking-wide);max-width:85ch;letter-spacing:var(--tracking-wide);line-height:1.6}:is(.codex-editor__redactor .ce-block .ce-block__content p,.codex-editor__redactor .ce-block .ce-block__content li) a{color:#1a9597;text-underline-offset:2px;text-decoration-line:underline}@media (hover:hover){:is(.codex-editor__redactor .ce-block .ce-block__content p,.codex-editor__redactor .ce-block .ce-block__content li) a:hover{color:#158486}}:is(.codex-editor__redactor .ce-block .ce-block__content p,.codex-editor__redactor .ce-block .ce-block__content li) a:focus{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:#1a9597}:is(.codex-editor__redactor .ce-block .ce-block__content p,.codex-editor__redactor .ce-block .ce-block__content li) strong,:is(.codex-editor__redactor .ce-block .ce-block__content p,.codex-editor__redactor .ce-block .ce-block__content li) b{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.codex-editor__redactor .ce-block .ce-block__content p{margin-bottom:calc(var(--spacing)*4)}.codex-editor__redactor .ce-block .ce-block__content .cdx-quote{margin-bottom:calc(var(--spacing)*4);border-left-style:var(--tw-border-style);border-left-width:8px;border-left-color:var(--color-inactive);padding:calc(var(--spacing)*6);background-color:#eef0f3}.codex-editor__redactor .ce-block .ce-block__content .cdx-quote .cdx-quote__caption{margin-top:calc(var(--spacing)*2);margin-left:calc(var(--spacing)*6);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-dark);display:block}.codex-editor__redactor .ce-block .ce-block__content .cdx-quote .cdx-quote__text{quotes:"“" "”" "‘" "’";padding-left:calc(var(--spacing)*6)}.codex-editor__redactor .ce-block .ce-block__content .cdx-quote .cdx-quote__text:before{margin-right:calc(var(--spacing)*2);margin-left:calc(var(--spacing)*-8);vertical-align:text-bottom;font-family:var(--font-serif);font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height));--tw-leading:calc(var(--spacing)*4);line-height:calc(var(--spacing)*4);color:var(--color-dark);content:open-quote}.codex-editor__redactor .ce-block .ce-block__content .cdx-quote .cdx-quote__text p{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));font-style:italic;display:inline}.codex-editor__redactor .ce-block .ce-block__content .cdx-list{margin-bottom:calc(var(--spacing)*4);padding-left:calc(var(--spacing)*6)}--ordered:is(.codex-editor__redactor .ce-block .ce-block__content .cdx-list){list-style-type:decimal}--unordered:is(.codex-editor__redactor .ce-block .ce-block__content .cdx-list){list-style-type:disc}.codex-editor__redactor .ce-block .ce-block__content .cdx-list .cdx-list{margin-top:calc(var(--spacing)*2);margin-bottom:calc(var(--spacing)*0)}.codex-editor__redactor .ce-block .ce-block__content .cdx-list .cdx-list__item{margin-bottom:calc(var(--spacing)*2);padding-left:calc(var(--spacing)*2)}.codex-editor__redactor .ce-block .ce-block__content .cdx-nested-list{margin-bottom:calc(var(--spacing)*4);padding-left:calc(var(--spacing)*6)}--ordered:is(.codex-editor__redactor .ce-block .ce-block__content .cdx-nested-list){list-style-type:decimal}--unordered:is(.codex-editor__redactor .ce-block .ce-block__content .cdx-nested-list){list-style-type:disc}.codex-editor__redactor .ce-block .ce-block__content .cdx-nested-list .cdx-nested-list{margin-top:calc(var(--spacing)*2);margin-bottom:calc(var(--spacing)*0)}.codex-editor__redactor .ce-block .ce-block__content .cdx-nested-list .cdx-nested-list__item{margin-bottom:calc(var(--spacing)*2);padding-left:calc(var(--spacing)*2)}.codex-editor__redactor .ce-block .ce-block__content .cdx-table{margin-block:calc(var(--spacing)*6);border-collapse:collapse;border-style:var(--tw-border-style);border-width:2px;border-color:var(--color-dark);width:100%}__head:is(.codex-editor__redactor .ce-block .ce-block__content .cdx-table){border-right-style:var(--tw-border-style);border-right-width:2px;border-color:var(--color-dark);background-color:var(--color-light);padding:calc(var(--spacing)*3);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}__row:is(.codex-editor__redactor .ce-block .ce-block__content .cdx-table){border-bottom-style:var(--tw-border-style);border-bottom-width:2px;border-color:var(--color-dark)}__cell:is(.codex-editor__redactor .ce-block .ce-block__content .cdx-table){border-right-style:var(--tw-border-style);border-right-width:2px;border-color:var(--color-dark);padding:calc(var(--spacing)*3)}.codex-editor__redactor .ce-block .ce-block__content .cdx-embed iframe{--tw-border-style:none;border-style:none;width:100%}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.-inset-2\.5{inset:calc(var(--spacing)*-2.5)}.inset-0{inset:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.right-0{right:calc(var(--spacing)*0)}.right-3{right:calc(var(--spacing)*3)}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.col-span-3{grid-column:span 3/span 3}.col-span-full{grid-column:1/-1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-4{margin-inline:calc(var(--spacing)*-4)}.mx-auto{margin-inline:auto}.-mt-1{margin-top:calc(var(--spacing)*-1)}.-mt-2{margin-top:calc(var(--spacing)*-2)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-10{margin-top:calc(var(--spacing)*10)}.mt-16{margin-top:calc(var(--spacing)*16)}.mt-auto{margin-top:auto}.-mr-1{margin-right:calc(var(--spacing)*-1)}.-mr-12{margin-right:calc(var(--spacing)*-12)}.mr-1{margin-right:calc(var(--spacing)*1)}.-mb-px{margin-bottom:-1px}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-8{margin-left:calc(var(--spacing)*8)}.ml-12{margin-left:calc(var(--spacing)*12)}.ml-16{margin-left:calc(var(--spacing)*16)}.ml-24{margin-left:calc(var(--spacing)*24)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.aspect-10\/7{aspect-ratio:10/7}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-12{width:calc(var(--spacing)*12);height:calc(var(--spacing)*12)}.size-full{width:100%;height:100%}.h-3{height:calc(var(--spacing)*3)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-32{height:calc(var(--spacing)*32)}.h-48{height:calc(var(--spacing)*48)}.h-\[calc\(100vh-9rem\)\]{height:calc(100vh - 9rem)}.h-full{height:100%}.max-h-16{max-height:calc(var(--spacing)*16)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-32{min-height:calc(var(--spacing)*32)}.min-h-\[2\.5rem\]{min-height:2.5rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-0{width:calc(var(--spacing)*0)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-48{width:calc(var(--spacing)*48)}.w-56{width:calc(var(--spacing)*56)}.w-96{width:calc(var(--spacing)*96)}.w-auto{width:auto}.w-full{width:100%}.max-w-48{max-width:calc(var(--spacing)*48)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-56{min-width:calc(var(--spacing)*56)}.flex-1{flex:1}.flex-auto{flex:auto}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.origin-top-right{transform-origin:100% 0}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-1\.5{column-gap:calc(var(--spacing)*1.5)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.gap-x-3{column-gap:calc(var(--spacing)*3)}.gap-x-4{column-gap:calc(var(--spacing)*4)}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-5{row-gap:calc(var(--spacing)*5)}.gap-y-8{row-gap:calc(var(--spacing)*8)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-s-md{border-start-start-radius:var(--radius-md);border-end-start-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-tl-md{border-top-left-radius:var(--radius-md)}.rounded-tr-md{border-top-right-radius:var(--radius-md)}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dark,.border-dark\/20{border-color:var(--color-dark)}@supports (color:color-mix(in lab, red, red)){.border-dark\/20{border-color:color-mix(in oklab,var(--color-dark)20%,transparent)}}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-500{border-color:var(--color-gray-500)}.border-gray-900\/25{border-color:var(--color-gray-900)}@supports (color:color-mix(in lab, red, red)){.border-gray-900\/25{border-color:color-mix(in oklab,var(--color-gray-900)25%,transparent)}}.border-mid{border-color:var(--color-mid)}.border-neutral-400{border-color:var(--color-neutral-400)}.border-red-200{border-color:var(--color-red-200)}.border-red-600{border-color:var(--color-red-600)}.border-transparent{border-color:#0000}.border-white\/20{border-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-black\/5{background-color:var(--color-black)}@supports (color:color-mix(in lab, red, red)){.bg-black\/5{background-color:color-mix(in oklab,var(--color-black)5%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-dark{background-color:var(--color-dark)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500\/5{background-color:var(--color-gray-500)}@supports (color:color-mix(in lab, red, red)){.bg-gray-500\/5{background-color:color-mix(in oklab,var(--color-gray-500)5%,transparent)}}.bg-gray-500\/75{background-color:var(--color-gray-500)}@supports (color:color-mix(in lab, red, red)){.bg-gray-500\/75{background-color:color-mix(in oklab,var(--color-gray-500)75%,transparent)}}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-600{background-color:var(--color-green-600)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-mid{background-color:var(--color-mid)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-600{background-color:var(--color-red-600)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-transparent{background-color:#0000}.bg-white,.bg-white\/10{background-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-500{--tw-gradient-from:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-light{--tw-gradient-from:var(--color-light);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-light\/20{--tw-gradient-from:var(--color-light)}@supports (color:color-mix(in lab, red, red)){.from-light\/20{--tw-gradient-from:color-mix(in oklab,var(--color-light)20%,transparent)}}.from-light\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-light{--tw-gradient-to:var(--color-light);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-600{--tw-gradient-to:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-3\.5{padding-inline:calc(var(--spacing)*3.5)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-10{padding-block:calc(var(--spacing)*10)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-0\.5{padding-top:calc(var(--spacing)*.5)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-8{padding-right:calc(var(--spacing)*8)}.pr-9{padding-right:calc(var(--spacing)*9)}.pr-10{padding-right:calc(var(--spacing)*10)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-11{padding-left:calc(var(--spacing)*11)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-2xl\/7{font-size:var(--text-2xl);line-height:calc(var(--spacing)*7)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-sm\/6{font-size:var(--text-sm);line-height:calc(var(--spacing)*6)}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-xs\/5{font-size:var(--text-xs);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-keep{word-break:keep-all}.whitespace-nowrap{white-space:nowrap}.text-black,.text-black\/60{color:var(--color-black)}@supports (color:color-mix(in lab, red, red)){.text-black\/60{color:color-mix(in oklab,var(--color-black)60%,transparent)}}.text-blue-400{color:var(--color-blue-400)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-dark{color:var(--color-dark)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-400{color:var(--color-green-400)}.text-green-700{color:var(--color-green-700)}.text-indigo-600{color:var(--color-indigo-600)}.text-purple-700{color:var(--color-purple-700)}.text-red-400{color:var(--color-red-400)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-sky-700{color:var(--color-sky-700)}.text-white,.text-white\/80{color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.text-white\/80{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.uppercase{text-transform:uppercase}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.inset-ring{--tw-inset-ring-shadow:inset 0 0 0 1px var(--tw-inset-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-black,.ring-black\/30{--tw-ring-color:var(--color-black)}@supports (color:color-mix(in lab, red, red)){.ring-black\/30{--tw-ring-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.ring-blue-400\/20{--tw-ring-color:#54a2ff33}@supports (color:color-mix(in lab, red, red)){.ring-blue-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-400)20%,transparent)}}.ring-blue-600\/20{--tw-ring-color:#155dfc33}@supports (color:color-mix(in lab, red, red)){.ring-blue-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-blue-600)20%,transparent)}}.ring-blue-700\/10{--tw-ring-color:#1447e61a}@supports (color:color-mix(in lab, red, red)){.ring-blue-700\/10{--tw-ring-color:color-mix(in oklab,var(--color-blue-700)10%,transparent)}}.ring-gray-300{--tw-ring-color:var(--color-gray-300)}.ring-gray-400\/10{--tw-ring-color:var(--color-gray-400)}@supports (color:color-mix(in lab, red, red)){.ring-gray-400\/10{--tw-ring-color:color-mix(in oklab,var(--color-gray-400)10%,transparent)}}.ring-gray-500\/10{--tw-ring-color:var(--color-gray-500)}@supports (color:color-mix(in lab, red, red)){.ring-gray-500\/10{--tw-ring-color:color-mix(in oklab,var(--color-gray-500)10%,transparent)}}.ring-gray-600\/20{--tw-ring-color:var(--color-gray-600)}@supports (color:color-mix(in lab, red, red)){.ring-gray-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-600)20%,transparent)}}.ring-green-400\/20{--tw-ring-color:#05df7233}@supports (color:color-mix(in lab, red, red)){.ring-green-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-400)20%,transparent)}}.ring-green-600\/20{--tw-ring-color:#00a54433}@supports (color:color-mix(in lab, red, red)){.ring-green-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-green-600)20%,transparent)}}.ring-mid{--tw-ring-color:var(--color-mid)}.ring-purple-600\/20{--tw-ring-color:#9810fa33}@supports (color:color-mix(in lab, red, red)){.ring-purple-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-purple-600)20%,transparent)}}.ring-red-400\/20{--tw-ring-color:#ff656833}@supports (color:color-mix(in lab, red, red)){.ring-red-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-400)20%,transparent)}}.ring-red-600\/10{--tw-ring-color:#e400141a}@supports (color:color-mix(in lab, red, red)){.ring-red-600\/10{--tw-ring-color:color-mix(in oklab,var(--color-red-600)10%,transparent)}}.ring-red-600\/20{--tw-ring-color:#e4001433}@supports (color:color-mix(in lab, red, red)){.ring-red-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-red-600)20%,transparent)}}.ring-sky-700\/10{--tw-ring-color:#0069a41a}@supports (color:color-mix(in lab, red, red)){.ring-sky-700\/10{--tw-ring-color:color-mix(in oklab,var(--color-sky-700)10%,transparent)}}.ring-yellow-400\/20{--tw-ring-color:#fac80033}@supports (color:color-mix(in lab, red, red)){.ring-yellow-400\/20{--tw-ring-color:color-mix(in oklab,var(--color-yellow-400)20%,transparent)}}.ring-yellow-600\/20{--tw-ring-color:#cd890033}@supports (color:color-mix(in lab, red, red)){.ring-yellow-600\/20{--tw-ring-color:color-mix(in oklab,var(--color-yellow-600)20%,transparent)}}.inset-ring-gray-300{--tw-inset-ring-color:var(--color-gray-300)}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.-outline-offset-1{outline-offset:calc(1px*-1)}.outline-offset-2{outline-offset:2px}.outline-black\/5{outline-color:var(--color-black)}@supports (color:color-mix(in lab, red, red)){.outline-black\/5{outline-color:color-mix(in oklab,var(--color-black)5%,transparent)}}.outline-gray-200{outline-color:var(--color-gray-200)}.outline-gray-300{outline-color:var(--color-gray-300)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-75{--tw-duration:75ms;transition-duration:75ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:opacity-75:is(:where(.group):hover *){opacity:.75}}.file\:rounded::file-selector-button{border-radius:.25rem}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-white::file-selector-button{background-color:var(--color-white)}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:text-gray-500::file-selector-button{color:var(--color-gray-500)}.placeholder\:text-gray-300::placeholder{color:var(--color-gray-300)}.placeholder\:text-gray-400::placeholder{color:var(--color-gray-400)}.focus-within\:outline-2:focus-within{outline-style:var(--tw-outline-style);outline-width:2px}.focus-within\:outline-offset-2:focus-within{outline-offset:2px}.focus-within\:outline-indigo-600:focus-within{outline-color:var(--color-indigo-600)}@media (hover:hover){.hover\:cursor-pointer:hover{cursor:pointer}.hover\:border-gray-300:hover{border-color:var(--color-gray-300)}.hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-500\/20:hover{background-color:var(--color-gray-500)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-500\/20:hover{background-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-green-500:hover{background-color:var(--color-green-500)}.hover\:bg-indigo-500:hover{background-color:var(--color-indigo-500)}.hover\:bg-mid\/60:hover{background-color:var(--color-mid)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-mid\/60:hover{background-color:color-mix(in oklab,var(--color-mid)60%,transparent)}}.hover\:bg-mid\/80:hover{background-color:var(--color-mid)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-mid\/80:hover{background-color:color-mix(in oklab,var(--color-mid)80%,transparent)}}.hover\:bg-red-200:hover{background-color:var(--color-red-200)}.hover\:bg-red-500:hover{background-color:var(--color-red-500)}.hover\:bg-white:hover,.hover\:bg-white\/20:hover{background-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.hover\:text-black\/80:hover{color:var(--color-black)}@supports (color:color-mix(in lab, red, red)){.hover\:text-black\/80:hover{color:color-mix(in oklab,var(--color-black)80%,transparent)}}.hover\:text-gray-500:hover{color:var(--color-gray-500)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-indigo-500:hover{color:var(--color-indigo-500)}.hover\:text-indigo-900:hover{color:var(--color-indigo-900)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-white:hover{color:var(--color-white)}.hover\:opacity-70:hover{opacity:.7}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:file\:bg-gray-50:hover::file-selector-button{background-color:var(--color-gray-50)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-dark:focus{--tw-ring-color:var(--color-dark)}.focus\:ring-gray-300:focus{--tw-ring-color:var(--color-gray-300)}.focus\:ring-indigo-600:focus{--tw-ring-color:var(--color-indigo-600)}.focus\:ring-white:focus{--tw-ring-color:var(--color-white)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:outline-offset-2:focus{outline-offset:2px}.focus\:outline-blue-600:focus{outline-color:var(--color-blue-600)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-0:focus-visible{outline-style:var(--tw-outline-style);outline-width:0}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:-outline-offset-2:focus-visible{outline-offset:calc(2px*-1)}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-blue-600:focus-visible{outline-color:var(--color-blue-600)}.focus-visible\:outline-gray-700:focus-visible{outline-color:var(--color-gray-700)}.focus-visible\:outline-green-600:focus-visible{outline-color:var(--color-green-600)}.focus-visible\:outline-indigo-600:focus-visible{outline-color:var(--color-indigo-600)}.focus-visible\:outline-red-300:focus-visible{outline-color:var(--color-red-300)}.focus-visible\:outline-red-600:focus-visible{outline-color:var(--color-red-600)}.focus-visible\:outline-white:focus-visible{outline-color:var(--color-white)}.active\:bg-gray-200:active{background-color:var(--color-gray-200)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:-mx-6{margin-inline:calc(var(--spacing)*-6)}.sm\:mx-auto{margin-inline:auto}.sm\:mt-2{margin-top:calc(var(--spacing)*2)}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:w-full{width:100%}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:gap-x-6{column-gap:calc(var(--spacing)*6)}.sm\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sm\:p-6{padding:calc(var(--spacing)*6)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-sm\/6{font-size:var(--text-sm);line-height:calc(var(--spacing)*6)}.sm\:leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.sm\:tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.sm\:duration-700{--tw-duration:.7s;transition-duration:.7s}}@media (min-width:48rem){.md\:mt-0{margin-top:calc(var(--spacing)*0)}.md\:ml-4{margin-left:calc(var(--spacing)*4)}.md\:flex{display:flex}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}}@media (min-width:64rem){.lg\:fixed{position:fixed}.lg\:inset-y-0{inset-block:calc(var(--spacing)*0)}.lg\:z-50{z-index:50}.lg\:mt-0{margin-top:calc(var(--spacing)*0)}.lg\:ml-72{margin-left:calc(var(--spacing)*72)}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:max-h-full{max-height:100%}.lg\:w-72{width:calc(var(--spacing)*72)}.lg\:flex-shrink-0{flex-shrink:0}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:px-6{padding-inline:calc(var(--spacing)*6)}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}}@media (min-width:80rem){.xl\:gap-x-8{column-gap:calc(var(--spacing)*8)}:where(.xl\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-x-reverse)))}}@media (prefers-color-scheme:dark){.dark\:border-white\/10{border-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark\:border-white\/25{border-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/25{border-color:color-mix(in oklab,var(--color-white)25%,transparent)}}.dark\:bg-blue-400\/10{background-color:#54a2ff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-400\/10{background-color:color-mix(in oklab,var(--color-blue-400)10%,transparent)}}.dark\:bg-blue-500{background-color:var(--color-blue-500)}.dark\:bg-gray-400\/10{background-color:var(--color-gray-400)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-400\/10{background-color:color-mix(in oklab,var(--color-gray-400)10%,transparent)}}.dark\:bg-gray-600{background-color:var(--color-gray-600)}.dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-900\/50{background-color:var(--color-gray-900)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.dark\:bg-green-400\/10{background-color:#05df721a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-400\/10{background-color:color-mix(in oklab,var(--color-green-400)10%,transparent)}}.dark\:bg-green-500{background-color:var(--color-green-500)}.dark\:bg-purple-400\/10{background-color:#c07eff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-400\/10{background-color:color-mix(in oklab,var(--color-purple-400)10%,transparent)}}.dark\:bg-red-400\/10{background-color:#ff65681a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-400\/10{background-color:color-mix(in oklab,var(--color-red-400)10%,transparent)}}.dark\:bg-red-500{background-color:var(--color-red-500)}.dark\:bg-white\/5{background-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/5{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.dark\:bg-white\/10{background-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-blue-500{color:var(--color-blue-500)}.dark\:text-gray-100{color:var(--color-gray-100)}.dark\:text-gray-300{color:var(--color-gray-300)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-gray-500{color:var(--color-gray-500)}.dark\:text-gray-600{color:var(--color-gray-600)}.dark\:text-green-400{color:var(--color-green-400)}.dark\:text-green-500{color:var(--color-green-500)}.dark\:text-indigo-400{color:var(--color-indigo-400)}.dark\:text-purple-400{color:var(--color-purple-400)}.dark\:text-red-400{color:var(--color-red-400)}.dark\:text-red-500{color:var(--color-red-500)}.dark\:text-white{color:var(--color-white)}.dark\:text-yellow-500{color:var(--color-yellow-500)}.dark\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\:ring-blue-500\/30{--tw-ring-color:#3080ff4d}@supports (color:color-mix(in lab, red, red)){.dark\:ring-blue-500\/30{--tw-ring-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.dark\:ring-gray-500\/20{--tw-ring-color:var(--color-gray-500)}@supports (color:color-mix(in lab, red, red)){.dark\:ring-gray-500\/20{--tw-ring-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.dark\:ring-green-500\/30{--tw-ring-color:#00c7584d}@supports (color:color-mix(in lab, red, red)){.dark\:ring-green-500\/30{--tw-ring-color:color-mix(in oklab,var(--color-green-500)30%,transparent)}}.dark\:ring-red-500\/30{--tw-ring-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.dark\:ring-red-500\/30{--tw-ring-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.dark\:ring-yellow-500\/30{--tw-ring-color:#edb2004d}@supports (color:color-mix(in lab, red, red)){.dark\:ring-yellow-500\/30{--tw-ring-color:color-mix(in oklab,var(--color-yellow-500)30%,transparent)}}.dark\:inset-ring-white\/5{--tw-inset-ring-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.dark\:inset-ring-white\/5{--tw-inset-ring-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.dark\:outline-white\/5{outline-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.dark\:outline-white\/5{outline-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.dark\:outline-white\/10{outline-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.dark\:outline-white\/10{outline-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark\:placeholder\:text-gray-500::placeholder{color:var(--color-gray-500)}.dark\:after\:absolute:after{content:var(--tw-content);position:absolute}.dark\:after\:inset-y-0:after{content:var(--tw-content);inset-block:calc(var(--spacing)*0)}.dark\:after\:left-0:after{content:var(--tw-content);left:calc(var(--spacing)*0)}.dark\:after\:w-px:after{content:var(--tw-content);width:1px}.dark\:after\:bg-white\/10:after{content:var(--tw-content);background-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.dark\:after\:bg-white\/10:after{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark\:focus-within\:outline-indigo-500:focus-within{outline-color:var(--color-indigo-500)}@media (hover:hover){.dark\:hover\:bg-blue-400:hover{background-color:var(--color-blue-400)}.dark\:hover\:bg-gray-500:hover{background-color:var(--color-gray-500)}.dark\:hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.dark\:hover\:bg-green-400:hover{background-color:var(--color-green-400)}.dark\:hover\:bg-red-400:hover{background-color:var(--color-red-400)}.dark\:hover\:bg-white\/5:hover{background-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/5:hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.dark\:hover\:bg-white\/20:hover{background-color:var(--color-white)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark\:hover\:text-indigo-300:hover{color:var(--color-indigo-300)}.dark\:hover\:text-white:hover{color:var(--color-white)}}.dark\:focus\:outline-blue-500:focus{outline-color:var(--color-blue-500)}.dark\:focus\:outline-indigo-500:focus{outline-color:var(--color-indigo-500)}.dark\:focus-visible\:outline-blue-500:focus-visible{outline-color:var(--color-blue-500)}.dark\:focus-visible\:outline-gray-600:focus-visible{outline-color:var(--color-gray-600)}.dark\:focus-visible\:outline-green-500:focus-visible{outline-color:var(--color-green-500)}.dark\:focus-visible\:outline-red-500:focus-visible{outline-color:var(--color-red-500)}}@starting-style{.starting\:translate-y-2{--tw-translate-y:calc(var(--spacing)*2);translate:var(--tw-translate-x)var(--tw-translate-y)}}@starting-style{.starting\:opacity-0{opacity:0}}@starting-style{@media (min-width:40rem){.starting\:sm\:translate-x-2{--tw-translate-x:calc(var(--spacing)*2);translate:var(--tw-translate-x)var(--tw-translate-y)}}}@starting-style{@media (min-width:40rem){.starting\:sm\:translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}}}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: panda-core
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.8.
|
|
4
|
+
version: 0.8.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Otaina Limited
|
|
@@ -504,6 +504,10 @@ files:
|
|
|
504
504
|
- lib/panda/core/testing/support/omniauth_setup.rb
|
|
505
505
|
- lib/panda/core/testing/support/service_stubs.rb
|
|
506
506
|
- lib/panda/core/testing/support/setup.rb
|
|
507
|
+
- lib/panda/core/testing/support/system/capybara_setup.rb
|
|
508
|
+
- lib/panda/core/testing/support/system/cuprite_setup.rb
|
|
509
|
+
- lib/panda/core/testing/support/system/database_connection_helpers.rb
|
|
510
|
+
- lib/panda/core/testing/support/system/system_test_helpers.rb
|
|
507
511
|
- lib/panda/core/version.rb
|
|
508
512
|
- lib/tasks/assets.rake
|
|
509
513
|
- lib/tasks/panda/core/migrations.rake
|
|
@@ -512,6 +516,7 @@ files:
|
|
|
512
516
|
- lib/tasks/panda_core_users.rake
|
|
513
517
|
- public/panda-core-assets/panda-core-0.7.5.css
|
|
514
518
|
- public/panda-core-assets/panda-core-0.8.0.css
|
|
519
|
+
- public/panda-core-assets/panda-core-1762886534.css
|
|
515
520
|
- public/panda-core-assets/panda-core.css
|
|
516
521
|
homepage: https://github.com/tastybamboo/panda-core
|
|
517
522
|
licenses:
|
|
@@ -534,7 +539,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
534
539
|
- !ruby/object:Gem::Version
|
|
535
540
|
version: '0'
|
|
536
541
|
requirements: []
|
|
537
|
-
rubygems_version: 3.
|
|
542
|
+
rubygems_version: 3.7.2
|
|
538
543
|
specification_version: 4
|
|
539
544
|
summary: Core libraries and development tools for Tasty Bamboo projects
|
|
540
545
|
test_files: []
|