karafka-web 1.0.0.rc1 → 1.0.0.rc2
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/CHANGELOG.md +13 -6
- data/Gemfile.lock +11 -11
- data/config/locales/pro_errors.yml +1 -1
- data/karafka-web.gemspec +1 -1
- data/lib/karafka/web/management/actions/enable.rb +13 -5
- data/lib/karafka/web/pro/commanding/config.rb +3 -1
- data/lib/karafka/web/pro/commanding/contracts/config.rb +4 -1
- data/lib/karafka/web/pro/commanding/listener.rb +2 -2
- data/lib/karafka/web/pro/ui/controllers/explorer/explorer_controller.rb +4 -0
- data/lib/karafka/web/pro/ui/views/errors/_detail.erb +18 -6
- data/lib/karafka/web/pro/ui/views/explorer/explorer/message/_metadata.erb +3 -2
- data/lib/karafka/web/pro/ui/views/explorer/explorer/messages/_linked_detail.erb +58 -0
- data/lib/karafka/web/pro/ui/views/explorer/search/_metadata.erb +7 -3
- data/lib/karafka/web/pro/ui/views/jobs/_job.erb +1 -1
- data/lib/karafka/web/ui/public/javascripts/application.min.js.gz +0 -0
- data/lib/karafka/web/ui/public/stylesheets/application.min.css +211 -211
- data/lib/karafka/web/ui/public/stylesheets/application.min.css.br +0 -0
- data/lib/karafka/web/ui/public/stylesheets/application.min.css.gz +0 -0
- data/lib/karafka/web/ui/public/stylesheets/libs/highlight_dark.min.css.gz +0 -0
- data/lib/karafka/web/ui/public/stylesheets/libs/highlight_light.min.css.gz +0 -0
- data/lib/karafka/web/version.rb +1 -1
- data/package-lock.json +3 -3
- metadata +4 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 40523f2ea1cc3692a28961e8bab7627b6ae2855c51354298312aca0f04b2a4ce
|
|
4
|
+
data.tar.gz: e633a829ba38a4f9d406b67246953736129beea35318472a08dda19a05b01215
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8a02a2163be4f9c267d53fe73505bfcce408acafc353c575de3f860138acaa84a52707040c771b8828b0a90bcad64a37930908d5fc6cec42ee675fb83a481a15
|
|
7
|
+
data.tar.gz: a70a15746249bfb9005903e75cdc35ba8bf63a66e4d9ab102ae9f17101c17fc47a1a0318dc0a7264e3018be32ddcc27d244539d80d0b7599cf4fcee022dbe2f2
|
data/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Karafka Web Changelog
|
|
2
2
|
|
|
3
3
|
## 1.0.0 (Unreleased)
|
|
4
|
-
- [
|
|
5
|
-
- [
|
|
4
|
+
- **[Breaking]** Namespace the commanding pause configuration under `config.commanding.pause`. The flat `config.commanding.pause_timeout` setting has been removed in favor of the nested `config.commanding.pause.timeout` namespace, mirroring the pause configuration namespacing introduced in Karafka.
|
|
5
|
+
- [Enhancement] Link the topic, partition and offset in the Explorer's single-message metadata table to the Explorer, matching the linking on the Errors detail view. The offset points at the message currently being viewed but is kept linked so the whole topic/partition/offset coordinate is navigable (#1179).
|
|
6
|
+
- [Enhancement] Link the topic, partition and offsets on the Errors detail view to the Explorer, so you can jump straight from an error to the corresponding topic/partition/message. The `topic` links to the topic in the Explorer, the `partition` links to the partition, and the producer dispatch-error `offset` is now linked as well (previously only `first_offset`/`last_offset`/`committed_offset` were, and only when valid). Also linked the partition and its scanned offset range shown in the Search results metadata to the Explorer (#1179).
|
|
6
7
|
- [Enhancement] Make `assert_ok` surface the actual captured exception (class, message, backtrace) on a 500, not just the generic static error page body. Subscribes to the same `error.occurred` monitor event the production error handler already dispatches web UI errors through, capturing the last one per test. This has been the main blocker in diagnosing rare CI-only flakes in the Pro Explorer controller specs, where a failure only ever showed the generic HTML error page with no indication of what actually broke.
|
|
7
8
|
- [Enhancement] Remove the OSS "support Karafka Pro" banner that was rendered on every Web UI page for non-Pro users. It's no longer needed at this stage since users are already aware of the Pro offering.
|
|
8
9
|
- [Enhancement] Migrate the Web UI topic declarations to Karafka's new standalone `Karafka::App.declaratives.draw` API (Karafka `2.6.0.beta1`). The Web UI topics are declared as `active false` (Web UI manages their creation and runtime replication factor itself), replacing the deprecated routing-based `config(active: false)` bridge that was previously called on each routing topic.
|
|
@@ -14,7 +15,17 @@
|
|
|
14
15
|
- [Enhancement] Track `poll_interval` (max.poll.interval.ms) per subscription group alongside `poll_age` to help users monitor how close they are to the polling timeout limit. Consumer schema version bumped to 1.7.0.
|
|
15
16
|
- [Enhancement] Replace token-based CSRF protection (`route_csrf` plugin) with header-based protection using `Sec-Fetch-Site` header (`sec_fetch_site_csrf` plugin). This eliminates the need for CSRF tokens by leveraging browser-enforced headers that cannot be forged from cross-origin requests. Modern browsers automatically include this header, providing simpler and more robust CSRF protection.
|
|
16
17
|
- [Enhancement] Include a short spec file hash in generated test topic names for traceability. Topic names now follow the `it-{hash}-{uuid}` format, making it easy to identify which test file created a given topic in Kafka logs.
|
|
18
|
+
- [Enhancement] Add a standardized `empty_state` helper/component (icon, message, optional description, and optional call-to-action) and replace the ad hoc `alert_info`/`alert_box_info` "There are no X" messages across every empty-list view (Jobs, DLQ, Explorer, Health, Errors, Consumers, Recurring Tasks, Scheduled Messages, dashboard, and paginated tables) with it, for a consistent look across the Web UI. Demoed on the internal style-guide `/ux` page.
|
|
19
|
+
- [Enhancement] Expand the internal `/ux` style-guide page to cover every UI component actually used across the app, so upgrades (daisyUI, Tailwind, etc.) can be visually spot-checked in one place: plain `.card`/`.card-body`, `.modal`/`dialog`, `.dropdown`, `.tooltip`, the `.btn-ghost`/`.btn-square`/`.btn-action`/`.btn-lockable`/`.confirm-action` button modifiers, the breadcrumbs component, and the `status_badge`/`lag_trend_badge`/`kafka_state_badge`/`lso_risk_state_badge`/`truncate`/`lag_with_label`/`offset_with_label` helper methods (previously only their raw CSS classes were demoed). Adds a small reusable `ModalOpener` JS component (`[data-modal-open]`) since the CSP disallows the inline `onclick` handler style used by the existing search modal trigger.
|
|
20
|
+
- [Enhancement] Replace the bare `assert(response.ok?)` pattern with a new `assert_ok` test helper across the whole controller test suite (381 call sites). On failure it now prints the actual response status and a body excerpt instead of a generic "Expected false to be truthy", making intermittent CI-only non-200 failures actually diagnosable.
|
|
21
|
+
- [Change] Require Karafka `>= 2.6.0.rc2` (was `>= 2.6.0.beta1`), which ships the nested `pause` routing DSL and the removal of the flat per-topic pause setters.
|
|
17
22
|
- [Change] Require Roda `>= 3.100` (previously `~> 3.69`).
|
|
23
|
+
- [Change] Switch to Karafka 2.6's new, group-type-agnostic `#group`/`group_id` accessors instead of `#consumer_group`/`consumer_group_id` when reading from Karafka's own routing and instrumentation APIs (`topic.group`, `subscription_group.group`, `event[:group_id]`), preparing for upcoming Kafka share group support (KIP-932). `consumer_group`/`consumer_group_id` remain as karafka-web's own internal naming (tracking payloads, commanding schema, UI labels) — only the calls into Karafka's own API surface changed. Closes #1022.
|
|
24
|
+
- [Fix] The Explorer's time-based `#closest` lookup for a time beyond the last message now lands on the partition's default view (the latest page of results), which is the closest data to a future time. Adapts to Karafka `2.6`'s `Admin#read_topic` fix (a `Time` start offset past the high watermark now returns no messages instead of the newest).
|
|
25
|
+
- [Fix] Declare the Web UI consumer topic pause strategy via the nested `pause(...)` routing DSL (Karafka Pro's Granular Backoffs) instead of the flat `pause_timeout`/`pause_max_timeout`/`pause_with_exponential_backoff` setters, which Karafka `2.6` removed. The custom backoff is now applied only when Karafka Pro is available; on OSS the Web UI topic falls back to the global pause defaults. Without this, enabling the Web UI on Karafka `2.6` raised an error during routing.
|
|
26
|
+
- [Fix] Link the global Jobs view's committed offset to the Explorer. `jobs/_job.erb` linked the first and last offsets but the committed offset was accidentally rendered as plain text, unlike the consumer-scoped Jobs view which links all three (#1179).
|
|
27
|
+
- [Fix] Fix two precision bugs in `Aggregators::State`/`Aggregators::Metrics` process eviction and utilization, both caught by a Copilot PR review and confirmed on the merged pipeline refactor. `evict_expired_processes` computed the ttl window via integer division (`config.ttl / 1_000`), truncating any non-multiple-of-1000 millisecond ttl and evicting processes up to ~999ms earlier than configured; it now uses float division. `RefreshCurrentStats#call` computed average utilization via `utilization / (stats[:processes] + 0.0001)`, an epsilon guard against division by zero that also systematically underestimated utilization for any nonzero process count; it now divides exactly and returns `0.0` only when there are zero active processes.
|
|
28
|
+
- [Fix] Fix the real cause of the intermittent, seemingly-unrelated CI-only Pro Explorer flakes finally surfaced by the `assert_ok` diagnostic below: not a Kafka broker/timing race, but Ruby's object-shape warning (a controller class crossing 8 distinct instance-variable shapes) being turned into a hard failure by the test suite's `Warning.process` hook. Controllers, like the Roda app classes already exempted, legitimately accumulate many shapes because they conditionally set a handful of instance variables depending on the specific request branch taken (e.g. Explorer's `#show` only sets `@safe_key`/`@safe_headers`/`@safe_payload` when the message isn't a compacted/system entry). Which controller happens to cross the threshold depends on minitest's random run order, which is why it surfaced as an unrelated-looking flake instead of a stable, reproducible failure. Widened the existing `Ui::App` shape-variation exception to cover controller classes too.
|
|
18
29
|
- [Fix] Harden the `wait_for_offset_visible` test helper (used after a transactional produce) to also exercise the Web UI's own message-read path, not just the admin watermark offset. The admin watermark advancing only proves the broker appended the control record; the Web UI reads with a much shorter `fetch.wait.max.ms` than the admin client and could still intermittently raise or return stale results on that exact offset (e.g. the flaky Pro Explorer `system entry` spec), even after the watermark-only wait introduced previously. The helper now also polls the same `Karafka::Web::Ui::Lib::Admin.read_topic` call the Web UI performs and requires it to complete without error before returning.
|
|
19
30
|
- [Fix] Fix two more flaky Pro Explorer `#recent` specs (`when getting recent for the whole topic` / `when recent is on the first partition` and `when recent is on another partition`). Both produced a message to one partition, then a fixed `sleep(0.1)` before producing the message that should be "most recent" to another partition and immediately requesting the endpoint, racing broker propagation under CI load the same way the already-fixed single-partition `#recent` spec did. Replaced the fixed sleep with a `wait_for_message` poll on the second produce's own offset, matching the existing pattern used by the sibling spec right below it.
|
|
20
31
|
- [Fix] Stop a long, unbreakable page title (e.g. a long topic name on the Pro Explorer topic page) and the breadcrumbs bar above it from overflowing the page. A grid/flex item's default `min-width: auto` let the title and breadcrumbs blow out past the viewport instead of shrinking, which pushed layout wide enough to force an unexpected page scrollbar. The title wrapper and `breadcrumbs-wrapper` now set `min-width: 0`, the title text wraps via `overflow-wrap: anywhere`, and the breadcrumbs list now wraps onto multiple lines instead of relying on an easy-to-miss horizontal scroll.
|
|
@@ -35,15 +46,11 @@
|
|
|
35
46
|
- [Fix] Normalize a batch of styling inconsistencies found while auditing #906: a `data-table-wraper` typo left the Cluster replication table unstyled, `Cluster::_config` rendered raw `true`/`false` instead of badges (unlike the identical `Topics::Configs` table), a Recurring Tasks "Trigger" button's disabled state was computed but never applied to its class, several views carried dead pre-Tailwind Bootstrap classes (`col-sm-*`, `col-lg-*`, `row`, `container-wrapper`) with no effect, one Topics Configs action cell was missing the `options` column class, a handful of breadcrumb/title labels had grammar or casing inconsistencies ("Cluster informations", "Consumers Groups Health", "Dead Letter Queue topics"), the OSS Routing topic list hand-rolled a `badge-warning` for inactive topics instead of the `badge_secondary` used by the identical Pro table, the filtered-payload notice used unstyled Bootstrap-era markup instead of the shared `alert_box_warning` primitive, `status-row-stopping` was colored red (`border-l-error`) while `status_badge` treats "stopping" as the same warning tier as "quiet"/"quieting", three Pro Topics checklist notices (before deleting a topic, increasing partitions, or editing a config value) hand-rolled a bare `alert` div with no severity color or icon instead of the shared `alert_box_warning` primitive used by their sibling warning boxes on the same pages, `alert_box_primary`/`alert_box_secondary` displayed the success checkmark icon (copy-pasted from `alert_box_success`) instead of matching their non-box `info_circle`/`pause_circle` siblings, the internal style-guide page demoed the wrong pencil icon for edit actions, and a scheduled message's "Cancel dispatch" button used a passive error-status icon instead of the `trash` icon already used for every other removal action.
|
|
36
47
|
- [Fix] Continue normalizing styling inconsistencies from the #906 audit: Health and Recurring Tasks tab bars hand-rolled `col-span-12 mb-9` instead of the shared `tab-container-wrapper` class, and the Scheduled Messages per-partition schedule heading used `h3`/`.h3` where the equivalent per-group heading on Health pages uses `h2`/`.h2`.
|
|
37
48
|
- [Fix] Retire the `.row-table`/`.row-table-wrapper` table primitive, which had drifted to a single real caller (the Pro per-topic Errors table) against 45+ real uses of `.data-table`, and additionally used a different button-alignment convention (`text-center` vs. `.data-table`'s `text-right`) than every other action column in the app. Switched that one table to `.data-table`, removed the now fully unused CSS utilities and their style-guide demo, and fixed a stale ".row-table" label left over in an unrelated `.data-table` demo section.
|
|
38
|
-
- [Enhancement] Add a standardized `empty_state` helper/component (icon, message, optional description, and optional call-to-action) and replace the ad hoc `alert_info`/`alert_box_info` "There are no X" messages across every empty-list view (Jobs, DLQ, Explorer, Health, Errors, Consumers, Recurring Tasks, Scheduled Messages, dashboard, and paginated tables) with it, for a consistent look across the Web UI. Demoed on the internal style-guide `/ux` page.
|
|
39
49
|
- [Fix] Fix unreadable `.btn-outline.btn-active` buttons (e.g. the dashboard time-range selector) in both the light and dark themes. The daisyUI 5.6 upgrade left the active state's background color computed from the same `--btn-color` variable as the outline's text color, so the two nearly matched; the button now switches to the color-variant's contrasting foreground color when active, matching its existing `:hover` behavior.
|
|
40
|
-
- [Enhancement] Expand the internal `/ux` style-guide page to cover every UI component actually used across the app, so upgrades (daisyUI, Tailwind, etc.) can be visually spot-checked in one place: plain `.card`/`.card-body`, `.modal`/`dialog`, `.dropdown`, `.tooltip`, the `.btn-ghost`/`.btn-square`/`.btn-action`/`.btn-lockable`/`.confirm-action` button modifiers, the breadcrumbs component, and the `status_badge`/`lag_trend_badge`/`kafka_state_badge`/`lso_risk_state_badge`/`truncate`/`lag_with_label`/`offset_with_label` helper methods (previously only their raw CSS classes were demoed). Adds a small reusable `ModalOpener` JS component (`[data-modal-open]`) since the CSP disallows the inline `onclick` handler style used by the existing search modal trigger.
|
|
41
50
|
- [Fix] Fix a flaky Pro Explorer spec (`when requested message exists but is a system entry`) caused by the `produce` test helper's transactional flow: it only waited a fixed `sleep(0.1)` for a transactional produce's commit control record to become visible before the test reads it back, which is too short under CI load and made the spec intermittently 404 or see stale content. Replaced the fixed sleep with a `wait_for_offset_visible` poll that waits until the control record's offset is actually part of the readable watermark range, mirroring the existing `wait_for_message`/`create_topic` readiness-polling pattern instead of a fixed delay.
|
|
42
51
|
- [Fix] Stop a misclick on a Pro-gated OSS element from fully navigating away to the standalone "Pro Feature" upsell page. This affected the sidebar (Health, Explorer, Cron, Schedules, Dead, Topics), the Consumers tabs (Performance, Controls, Commands), the dashboard's "Data transfers" chart tab, and several unguarded links with no visual gating indicator at all: the dashboard's "Total lag"/"Dead" counters, Cluster topic/partition names, per-message Explorer offset links on the Errors detail page, and consumer process IDs on the Consumers and Jobs list pages. Gated sidebar/tab items are now truly inert `disabled` buttons with an "Available in Karafka Pro" hover tooltip instead of `<a href>` links (or, for the dashboard chart tab, a JS-clickable `<span>`) pointing at the real Pro-only content; the previously-unguarded inline links are now plain text in the OSS templates, with a matching Pro-only view override (`dashboard/_counters`, `cluster/_partition`, `errors/_detail`) restoring the links for Pro users, keeping the OSS templates free of any `Karafka.pro?` branching. Also fixes the sidebar's collapse/expand toggle showing the default arrow cursor instead of a pointer on hover, and hardens `TabsManager` (the chart-tab-switching JS) to no-op instead of throwing when a tab's target content or a previously-active tab is missing/disabled, which had broken tab-switching for the Utilization/RSS/Concurrency charts for anyone who had the now-disabled "Data transfers" tab persisted as their last-active tab. Closes #1106.
|
|
43
52
|
- [Fix] Add `rel="noopener noreferrer"` to every `target="_blank"` link across the Web UI (docs, Slack, GitHub, and "become Pro" links in the support, status, dashboard, and Pro topic-replication warning views). Without it, the opened external page could access `window.opener` and redirect the original Web UI tab to an arbitrary page (reverse tabnabbing).
|
|
44
53
|
- [Fix] Fix a flaky Pro Explorer spec (`ExplorerController#recent::when getting recent for the partition`) that produced a message and immediately requested the "recent" endpoint with no readiness wait, occasionally racing the broker's propagation of the just-produced message under CI load. Added a `wait_for_message` poll before the request, matching the existing readiness-polling pattern used elsewhere in the suite.
|
|
45
|
-
- [Enhancement] Replace the bare `assert(response.ok?)` pattern with a new `assert_ok` test helper across the whole controller test suite (381 call sites). On failure it now prints the actual response status and a body excerpt instead of a generic "Expected false to be truthy", making intermittent CI-only non-200 failures actually diagnosable.
|
|
46
|
-
- [Change] Switch to Karafka 2.6's new, group-type-agnostic `#group`/`group_id` accessors instead of `#consumer_group`/`consumer_group_id` when reading from Karafka's own routing and instrumentation APIs (`topic.group`, `subscription_group.group`, `event[:group_id]`), preparing for upcoming Kafka share group support (KIP-932). `consumer_group`/`consumer_group_id` remain as karafka-web's own internal naming (tracking payloads, commanding schema, UI labels) — only the calls into Karafka's own API surface changed. Closes #1022.
|
|
47
54
|
|
|
48
55
|
## 0.11.6 (2026-02-01)
|
|
49
56
|
- **[Feature]** Provide ability to pause/resume all partitions of a topic at once across all consumer processes via the Health Overview page (Pro). Topic-level commands are broadcast to all processes, and each process applies the command to partitions it owns within the specified consumer group. This simplifies bulk operations compared to pausing/resuming individual partitions one by one.
|
data/Gemfile.lock
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
karafka-web (1.0.0.
|
|
4
|
+
karafka-web (1.0.0.rc2)
|
|
5
5
|
erubi (~> 1.4)
|
|
6
|
-
karafka (>= 2.6.0.
|
|
6
|
+
karafka (>= 2.6.0.rc2, < 2.7.0)
|
|
7
7
|
karafka-core (>= 2.6.0, < 2.7.0)
|
|
8
8
|
roda (>= 3.100, < 4.0)
|
|
9
9
|
tilt (~> 2.0)
|
|
@@ -34,45 +34,45 @@ GEM
|
|
|
34
34
|
raabro (~> 1.4)
|
|
35
35
|
io-console (0.8.2)
|
|
36
36
|
json (2.20.0)
|
|
37
|
-
karafka (2.6.0.
|
|
37
|
+
karafka (2.6.0.rc2)
|
|
38
38
|
karafka-core (>= 2.6.0, < 2.7.0)
|
|
39
|
-
karafka-rdkafka (>= 0.
|
|
39
|
+
karafka-rdkafka (>= 0.28.0)
|
|
40
40
|
waterdrop (>= 2.10.1, < 3.0.0)
|
|
41
41
|
zeitwerk (~> 2.3)
|
|
42
42
|
karafka-core (2.6.2)
|
|
43
43
|
karafka-rdkafka (>= 0.20.0)
|
|
44
44
|
logger (>= 1.6.0)
|
|
45
|
-
karafka-rdkafka (0.
|
|
45
|
+
karafka-rdkafka (0.28.0)
|
|
46
46
|
ffi (~> 1.17.1)
|
|
47
47
|
json (> 2.0)
|
|
48
48
|
logger
|
|
49
49
|
mini_portile2 (~> 2.6)
|
|
50
50
|
rake (> 12)
|
|
51
|
-
karafka-rdkafka (0.
|
|
51
|
+
karafka-rdkafka (0.28.0-aarch64-linux-gnu)
|
|
52
52
|
ffi (~> 1.17.1)
|
|
53
53
|
json (> 2.0)
|
|
54
54
|
logger
|
|
55
55
|
mini_portile2 (~> 2.6)
|
|
56
56
|
rake (> 12)
|
|
57
|
-
karafka-rdkafka (0.
|
|
57
|
+
karafka-rdkafka (0.28.0-aarch64-linux-musl)
|
|
58
58
|
ffi (~> 1.17.1)
|
|
59
59
|
json (> 2.0)
|
|
60
60
|
logger
|
|
61
61
|
mini_portile2 (~> 2.6)
|
|
62
62
|
rake (> 12)
|
|
63
|
-
karafka-rdkafka (0.
|
|
63
|
+
karafka-rdkafka (0.28.0-arm64-darwin)
|
|
64
64
|
ffi (~> 1.17.1)
|
|
65
65
|
json (> 2.0)
|
|
66
66
|
logger
|
|
67
67
|
mini_portile2 (~> 2.6)
|
|
68
68
|
rake (> 12)
|
|
69
|
-
karafka-rdkafka (0.
|
|
69
|
+
karafka-rdkafka (0.28.0-x86_64-linux-gnu)
|
|
70
70
|
ffi (~> 1.17.1)
|
|
71
71
|
json (> 2.0)
|
|
72
72
|
logger
|
|
73
73
|
mini_portile2 (~> 2.6)
|
|
74
74
|
rake (> 12)
|
|
75
|
-
karafka-rdkafka (0.
|
|
75
|
+
karafka-rdkafka (0.28.0-x86_64-linux-musl)
|
|
76
76
|
ffi (~> 1.17.1)
|
|
77
77
|
json (> 2.0)
|
|
78
78
|
logger
|
|
@@ -120,7 +120,7 @@ GEM
|
|
|
120
120
|
roda (3.105.0)
|
|
121
121
|
rack
|
|
122
122
|
ruby2_keywords (0.0.5)
|
|
123
|
-
simplecov (1.0.
|
|
123
|
+
simplecov (1.0.3)
|
|
124
124
|
tilt (2.7.0)
|
|
125
125
|
tzinfo (2.0.6)
|
|
126
126
|
concurrent-ruby (~> 1.0)
|
|
@@ -7,7 +7,7 @@ en:
|
|
|
7
7
|
commanding.active_format: needs to be either true or false
|
|
8
8
|
commanding.consumer_group_format: 'needs to be a string with a Kafka accepted format'
|
|
9
9
|
commanding.max_wait_time_format: needs to be an integer bigger than 0
|
|
10
|
-
commanding.
|
|
10
|
+
commanding.pause.timeout_format: needs to be an integer bigger than 0
|
|
11
11
|
commanding.kafka_format: needs to be a filled hash
|
|
12
12
|
|
|
13
13
|
ui.search.matchers_must_have_name_and_call: 'must respond to #name and its instance to #call'
|
data/karafka-web.gemspec
CHANGED
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
|
17
17
|
spec.licenses = %w[LGPL-3.0-only Commercial]
|
|
18
18
|
|
|
19
19
|
spec.add_dependency "erubi", "~> 1.4"
|
|
20
|
-
spec.add_dependency "karafka", ">= 2.6.0.
|
|
20
|
+
spec.add_dependency "karafka", ">= 2.6.0.rc2", "< 2.7.0"
|
|
21
21
|
spec.add_dependency "karafka-core", ">= 2.6.0", "< 2.7.0"
|
|
22
22
|
spec.add_dependency "roda", ">= 3.100", "< 4.0"
|
|
23
23
|
spec.add_dependency "tilt", "~> 2.0"
|
|
@@ -74,11 +74,19 @@ module Karafka
|
|
|
74
74
|
initial_offset "latest"
|
|
75
75
|
# Increase backoff time on errors. Incompatible schema errors are not recoverable
|
|
76
76
|
# until rolling upgrade completes, so we use a longer max timeout to prevent
|
|
77
|
-
# spamming errors in logs.
|
|
78
|
-
#
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
# spamming errors in logs. We set this ourselves so user settings do not impact
|
|
78
|
+
# frequency of retrying.
|
|
79
|
+
#
|
|
80
|
+
# Per-topic pause customization is a Karafka Pro feature (Granular Backoffs), so we
|
|
81
|
+
# only apply it when Pro is available; on OSS we fall back to the global pause
|
|
82
|
+
# defaults.
|
|
83
|
+
if ::Karafka.pro?
|
|
84
|
+
pause(
|
|
85
|
+
timeout: 5_000,
|
|
86
|
+
max_timeout: 60_000,
|
|
87
|
+
with_exponential_backoff: true
|
|
88
|
+
)
|
|
89
|
+
end
|
|
82
90
|
# We use the defaults + our config alterations that may not align with what
|
|
83
91
|
# user wants for his topics.
|
|
84
92
|
kafka kafka_config
|
|
@@ -51,7 +51,9 @@ module Karafka
|
|
|
51
51
|
# This should not happen often so waiting that long should not pose significant risks
|
|
52
52
|
# and should not cause issues with the user-experience, since this is only commanding
|
|
53
53
|
# connection
|
|
54
|
-
setting :
|
|
54
|
+
setting :pause do
|
|
55
|
+
setting :timeout, default: 10_000
|
|
56
|
+
end
|
|
55
57
|
|
|
56
58
|
# The underlying iterator requires specific settings, do not change this unless you know
|
|
57
59
|
# what you area doing
|
|
@@ -44,9 +44,12 @@ module Karafka
|
|
|
44
44
|
|
|
45
45
|
nested(:commanding) do
|
|
46
46
|
required(:active) { |val| [true, false].include?(val) }
|
|
47
|
-
required(:pause_timeout) { |val| val.is_a?(Integer) && val.positive? }
|
|
48
47
|
required(:max_wait_time) { |val| val.is_a?(Integer) && val.positive? }
|
|
49
48
|
required(:kafka) { |val| val.is_a?(Hash) }
|
|
49
|
+
|
|
50
|
+
nested(:pause) do
|
|
51
|
+
required(:timeout) { |val| val.is_a?(Integer) && val.positive? }
|
|
52
|
+
end
|
|
50
53
|
end
|
|
51
54
|
|
|
52
55
|
# Ensure all commanding kafka keys are symbols
|
|
@@ -62,7 +62,7 @@ module Karafka
|
|
|
62
62
|
rescue => e
|
|
63
63
|
report_error(e)
|
|
64
64
|
|
|
65
|
-
sleep(c_config.
|
|
65
|
+
sleep(c_config.pause.timeout / 1_000)
|
|
66
66
|
|
|
67
67
|
next
|
|
68
68
|
end
|
|
@@ -71,7 +71,7 @@ module Karafka
|
|
|
71
71
|
|
|
72
72
|
return if done?
|
|
73
73
|
|
|
74
|
-
sleep(c_config.
|
|
74
|
+
sleep(c_config.pause.timeout / 1_000)
|
|
75
75
|
|
|
76
76
|
retry
|
|
77
77
|
end
|
|
@@ -226,6 +226,10 @@ module Karafka
|
|
|
226
226
|
target = Web::Ui::Lib::Admin.read_topic(topic_id, partition_id, 1, time).first
|
|
227
227
|
|
|
228
228
|
partition_path = "explorer/topics/#{topic_id}/#{partition_id}"
|
|
229
|
+
# When the requested time is beyond the last message (no match), we leave the offset
|
|
230
|
+
# off so the Explorer lands on its default view - the latest page of results - which
|
|
231
|
+
# is the closest data to a future time. Karafka 2.6's `read_topic` returns nothing
|
|
232
|
+
# for such a time (it used to return the newest message).
|
|
229
233
|
partition_path += "?offset=#{target.offset}" if target
|
|
230
234
|
|
|
231
235
|
redirect(partition_path)
|
|
@@ -29,16 +29,28 @@
|
|
|
29
29
|
***
|
|
30
30
|
<% elsif k2.to_s == 'tags' %>
|
|
31
31
|
<%== tags(v2) %>
|
|
32
|
-
<% elsif k2.to_s == '
|
|
33
|
-
<a href="<%= explorer_topics_path(
|
|
32
|
+
<% elsif k2.to_s == 'topic' && !v2.nil? %>
|
|
33
|
+
<a href="<%= explorer_topics_path(v2) %>">
|
|
34
34
|
<%= v2 %>
|
|
35
35
|
</a>
|
|
36
|
-
<% elsif k2.to_s == '
|
|
37
|
-
<a href="<%= explorer_topics_path(v[:topic],
|
|
36
|
+
<% elsif k2.to_s == 'partition' && v[:topic] && !v2.nil? %>
|
|
37
|
+
<a href="<%= explorer_topics_path(v[:topic], v2) %>">
|
|
38
38
|
<%= v2 %>
|
|
39
39
|
</a>
|
|
40
|
-
<% elsif k2.to_s == '
|
|
41
|
-
<a href="<%= explorer_topics_path(v[:topic], v[:partition],
|
|
40
|
+
<% elsif k2.to_s == 'offset' && v[:topic] && v[:partition] && !v2.nil? && v2 >= 0 %>
|
|
41
|
+
<a href="<%= explorer_topics_path(v[:topic], v[:partition], v2) %>">
|
|
42
|
+
<%= v2 %>
|
|
43
|
+
</a>
|
|
44
|
+
<% elsif k2.to_s == 'first_offset' && v[:topic] && v[:partition] && !v2.nil? && v2 >= 0 %>
|
|
45
|
+
<a href="<%= explorer_topics_path(v[:topic], v[:partition], v2) %>">
|
|
46
|
+
<%= v2 %>
|
|
47
|
+
</a>
|
|
48
|
+
<% elsif k2.to_s == 'last_offset' && v[:topic] && v[:partition] && !v2.nil? && v2 >= 0 %>
|
|
49
|
+
<a href="<%= explorer_topics_path(v[:topic], v[:partition], v2) %>">
|
|
50
|
+
<%= v2 %>
|
|
51
|
+
</a>
|
|
52
|
+
<% elsif k2.to_s == 'committed_offset' && v[:topic] && v[:partition] && !v2.nil? && v2 >= 0 %>
|
|
53
|
+
<a href="<%= explorer_topics_path(v[:topic], v[:partition], v2) %>">
|
|
42
54
|
<%= v2 %>
|
|
43
55
|
</a>
|
|
44
56
|
<% else %>
|
|
@@ -76,10 +76,11 @@
|
|
|
76
76
|
<% @message.metadata.to_h.except(*special).each do |k, v| %>
|
|
77
77
|
<%==
|
|
78
78
|
partial(
|
|
79
|
-
'explorer/explorer/messages/
|
|
79
|
+
'explorer/explorer/messages/linked_detail',
|
|
80
80
|
locals: {
|
|
81
81
|
k: k,
|
|
82
|
-
v: v
|
|
82
|
+
v: v,
|
|
83
|
+
message: @message
|
|
83
84
|
}
|
|
84
85
|
)
|
|
85
86
|
%>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<%# Karafka Pro - Source Available Commercial Software %>
|
|
2
|
+
<%# Copyright (c) 2017-present Maciej Mensfeld. All rights reserved. %>
|
|
3
|
+
<%# This software is NOT open source. It is source-available commercial software %>
|
|
4
|
+
<%# requiring a paid license for use. It is NOT covered by LGPL. %>
|
|
5
|
+
<%# The author retains all right, title, and interest in this software, %>
|
|
6
|
+
<%# including all copyrights, patents, and other intellectual property rights. %>
|
|
7
|
+
<%# No patent rights are granted under this license. %>
|
|
8
|
+
<%# PROHIBITED: Use without a valid commercial license %>
|
|
9
|
+
<%# PROHIBITED: Redistribution, modification, or derivative works without authorization %>
|
|
10
|
+
<%# PROHIBITED: Reverse engineering, decompilation, or disassembly of this software %>
|
|
11
|
+
<%# PROHIBITED: Use as training data for AI/ML models or inclusion in datasets %>
|
|
12
|
+
<%# PROHIBITED: Scraping, crawling, or automated collection for any purpose %>
|
|
13
|
+
<%# PERMITTED: Reading, referencing, and linking for personal or commercial use %>
|
|
14
|
+
<%# PERMITTED: Runtime retrieval by AI assistants, coding agents, and RAG systems %>
|
|
15
|
+
<%# PERMITTED: for the purpose of providing contextual help to Karafka users %>
|
|
16
|
+
<%# Receipt, viewing, or possession of this software does not convey or %>
|
|
17
|
+
<%# imply any license or right beyond those expressly stated above. %>
|
|
18
|
+
<%# License: https://karafka.io/docs/Pro-License-Comm/ %>
|
|
19
|
+
<%# Contact: contact@karafka.io %>
|
|
20
|
+
|
|
21
|
+
<%
|
|
22
|
+
# Renders a single message metadata row, linking the topic/partition/offset identifiers to
|
|
23
|
+
# the Explorer. The offset points at the message currently being viewed, but we keep it
|
|
24
|
+
# linked for consistency so the whole coordinate (topic/partition/offset) is navigable.
|
|
25
|
+
# Any other key falls back to the plain detail rendering.
|
|
26
|
+
explorer_link =
|
|
27
|
+
case k
|
|
28
|
+
when :topic
|
|
29
|
+
explorer_topics_path(v)
|
|
30
|
+
when :partition
|
|
31
|
+
explorer_topics_path(message.topic, v)
|
|
32
|
+
when :offset
|
|
33
|
+
explorer_topics_path(message.topic, message.partition, v)
|
|
34
|
+
end
|
|
35
|
+
%>
|
|
36
|
+
|
|
37
|
+
<% if explorer_link %>
|
|
38
|
+
<tr>
|
|
39
|
+
<td>
|
|
40
|
+
<%= k %>
|
|
41
|
+
</td>
|
|
42
|
+
<td>
|
|
43
|
+
<a href="<%= explorer_link %>">
|
|
44
|
+
<%= v %>
|
|
45
|
+
</a>
|
|
46
|
+
</td>
|
|
47
|
+
</tr>
|
|
48
|
+
<% else %>
|
|
49
|
+
<%==
|
|
50
|
+
partial(
|
|
51
|
+
'explorer/explorer/messages/detail',
|
|
52
|
+
locals: {
|
|
53
|
+
k: k,
|
|
54
|
+
v: v
|
|
55
|
+
}
|
|
56
|
+
)
|
|
57
|
+
%>
|
|
58
|
+
<% end %>
|
|
@@ -57,13 +57,17 @@
|
|
|
57
57
|
<tbody>
|
|
58
58
|
<% @search_details[:partitions].sort.to_h.each do |k, v| %>
|
|
59
59
|
<tr>
|
|
60
|
-
<td>
|
|
60
|
+
<td>
|
|
61
|
+
<a href="<%= explorer_topics_path(@topic_id, k) %>">
|
|
62
|
+
Partition <%= k %>
|
|
63
|
+
</a>
|
|
64
|
+
</td>
|
|
61
65
|
<td><%= v[:checked] %></td>
|
|
62
66
|
<% if v[:first_message] %>
|
|
63
67
|
<td>
|
|
64
|
-
|
|
68
|
+
<%== offset_with_label(@topic_id, k, v[:first_message].offset, explore: true) %>
|
|
65
69
|
-
|
|
66
|
-
|
|
70
|
+
<%== offset_with_label(@topic_id, k, v[:last_message].offset, explore: true) %>
|
|
67
71
|
</td>
|
|
68
72
|
<td>
|
|
69
73
|
<%
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
<%== offset_with_label job.topic, job.partition, job.last_offset, explore: true %>
|
|
51
51
|
</td>
|
|
52
52
|
<td>
|
|
53
|
-
<%== offset_with_label job.topic, job.partition, job.committed_offset %>
|
|
53
|
+
<%== offset_with_label job.topic, job.partition, job.committed_offset, explore: true %>
|
|
54
54
|
</td>
|
|
55
55
|
<td>
|
|
56
56
|
<%== relative_time job.updated_at %>
|
|
Binary file
|
|
@@ -315,7 +315,7 @@
|
|
|
315
315
|
opacity: 100%;
|
|
316
316
|
transition: visibility 0s allow-discrete, background-color 0.3s ease-out, opacity 0.1s ease-out;
|
|
317
317
|
background-color: oklch(0% 0 0/ 0.4);
|
|
318
|
-
|
|
318
|
+
> .modal-box {
|
|
319
319
|
translate: 0 0;
|
|
320
320
|
scale: 1;
|
|
321
321
|
opacity: 1;
|
|
@@ -1109,9 +1109,7 @@
|
|
|
1109
1109
|
}
|
|
1110
1110
|
.collapse:not(td, tr, colgroup) {
|
|
1111
1111
|
visibility: revert-layer;
|
|
1112
|
-
|
|
1113
|
-
@layer daisyui.l1.l2.l3 {
|
|
1114
|
-
.collapse {
|
|
1112
|
+
@layer daisyui.l1.l2.l3 {
|
|
1115
1113
|
display: grid;
|
|
1116
1114
|
position: relative;
|
|
1117
1115
|
border-radius: var(--radius-box, 1rem);
|
|
@@ -1119,111 +1117,137 @@
|
|
|
1119
1117
|
grid-template-rows: max-content 0fr;
|
|
1120
1118
|
grid-template-columns: minmax(0, 1fr);
|
|
1121
1119
|
isolation: isolate;
|
|
1122
|
-
|
|
1123
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
1124
|
-
.collapse {
|
|
1120
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
1125
1121
|
transition: grid-template-rows 0.2s;
|
|
1126
1122
|
}
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
transition: background-color 0.2s ease-out;
|
|
1139
|
-
}
|
|
1140
|
-
.collapse:is([open], [tabindex]:focus:not(.collapse-close), [tabindex]:focus-within:not(.collapse-close) ), .collapse:not(.collapse-close):has( > input:is([type="checkbox"], [type="radio"]):checked) {
|
|
1141
|
-
grid-template-rows: max-content 1fr;
|
|
1142
|
-
}
|
|
1143
|
-
.collapse:is([open], [tabindex]:focus:not(.collapse-close), [tabindex]:focus-within:not(.collapse-close) ) > .collapse-content, .collapse:not(.collapse-close) > :where(input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-content) {
|
|
1144
|
-
--overflow-delay: 0.2s;
|
|
1145
|
-
overflow: revert-layer;
|
|
1146
|
-
content-visibility: visible;
|
|
1147
|
-
min-height: fit-content;
|
|
1148
|
-
@supports not (content-visibility: visible) {
|
|
1149
|
-
visibility: visible;
|
|
1123
|
+
> input:is([type="checkbox"], [type="radio"]) {
|
|
1124
|
+
grid-column-start: 1;
|
|
1125
|
+
grid-row-start: 1;
|
|
1126
|
+
appearance: none;
|
|
1127
|
+
opacity: 0;
|
|
1128
|
+
z-index: 1;
|
|
1129
|
+
width: 100%;
|
|
1130
|
+
padding: 1rem;
|
|
1131
|
+
padding-inline-end: 3rem;
|
|
1132
|
+
min-height: 1lh;
|
|
1133
|
+
transition: background-color 0.2s ease-out;
|
|
1150
1134
|
}
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
outline-color: var(--color-base-content);
|
|
1154
|
-
outline-style: solid;
|
|
1155
|
-
outline-width: 2px;
|
|
1156
|
-
outline-offset: 2px;
|
|
1157
|
-
}
|
|
1158
|
-
.collapse:not(.collapse-close) > input[type="checkbox"], .collapse:not(.collapse-close) > input[type="radio"]:not(:checked), .collapse:not(.collapse-close) > .collapse-title {
|
|
1159
|
-
cursor: pointer;
|
|
1160
|
-
}
|
|
1161
|
-
:is(.collapse[tabindex]:focus:not(.collapse-close, .collapse[open]), .collapse[tabindex]:focus-within:not(.collapse-close, .collapse[open])) > .collapse-title {
|
|
1162
|
-
cursor: unset;
|
|
1163
|
-
}
|
|
1164
|
-
.collapse:is([open], [tabindex]:focus:not(.collapse-close), [tabindex]:focus-within:not(.collapse-close) ) > :where(.collapse-content), .collapse:not(.collapse-close) > :where(input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-content) {
|
|
1165
|
-
padding-bottom: 1rem;
|
|
1166
|
-
}
|
|
1167
|
-
.collapse:is(details) {
|
|
1168
|
-
width: 100%;
|
|
1169
|
-
&::details-content {
|
|
1170
|
-
--overflow-delay: 0s;
|
|
1171
|
-
overflow: clip;
|
|
1172
|
-
height: 0;
|
|
1135
|
+
&:is([open], [tabindex]:focus:not(.collapse-close), [tabindex]:focus-within:not(.collapse-close) ), &:not(.collapse-close):has( > input:is([type="checkbox"], [type="radio"]):checked) {
|
|
1136
|
+
grid-template-rows: max-content 1fr;
|
|
1173
1137
|
}
|
|
1174
|
-
&:
|
|
1138
|
+
&:is([open], [tabindex]:focus:not(.collapse-close), [tabindex]:focus-within:not(.collapse-close) ) > .collapse-content, &:not(.collapse-close) > :where(input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-content) {
|
|
1139
|
+
--overflow-delay: 0.2s;
|
|
1175
1140
|
overflow: revert-layer;
|
|
1176
|
-
|
|
1141
|
+
content-visibility: visible;
|
|
1142
|
+
min-height: fit-content;
|
|
1143
|
+
@supports not (content-visibility: visible) {
|
|
1144
|
+
visibility: visible;
|
|
1145
|
+
}
|
|
1177
1146
|
}
|
|
1178
|
-
|
|
1147
|
+
&:focus-visible, &:has( > input:is([type="checkbox"], [type="radio"]):focus-visible), &:has(summary:focus-visible) {
|
|
1148
|
+
outline-color: var(--color-base-content);
|
|
1149
|
+
outline-style: solid;
|
|
1150
|
+
outline-width: 2px;
|
|
1151
|
+
outline-offset: 2px;
|
|
1152
|
+
}
|
|
1153
|
+
&:not(.collapse-close) {
|
|
1154
|
+
> input[type="checkbox"], > input[type="radio"]:not(:checked), > .collapse-title {
|
|
1155
|
+
cursor: pointer;
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
&[tabindex]:focus:not(.collapse-close, .collapse[open]), &[tabindex]:focus-within:not(.collapse-close, .collapse[open]) {
|
|
1159
|
+
> .collapse-title {
|
|
1160
|
+
cursor: unset;
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
&:is([open], [tabindex]:focus:not(.collapse-close), [tabindex]:focus-within:not(.collapse-close) ) > :where(.collapse-content), &:not(.collapse-close) > :where(input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-content) {
|
|
1164
|
+
padding-bottom: 1rem;
|
|
1165
|
+
}
|
|
1166
|
+
&:is(details) {
|
|
1167
|
+
width: 100%;
|
|
1179
1168
|
&::details-content {
|
|
1180
|
-
|
|
1181
|
-
|
|
1169
|
+
--overflow-delay: 0s;
|
|
1170
|
+
overflow: clip;
|
|
1171
|
+
height: 0;
|
|
1182
1172
|
}
|
|
1183
1173
|
&:where([open])::details-content {
|
|
1184
|
-
|
|
1174
|
+
overflow: revert-layer;
|
|
1175
|
+
height: auto;
|
|
1185
1176
|
}
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1177
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
1178
|
+
&::details-content {
|
|
1179
|
+
transition: overflow 0.2s allow-discrete var(--overflow-delay), content-visibility 0.2s allow-discrete, visibility 0.2s allow-discrete, min-height 0.2s ease-out allow-discrete, padding 0.1s ease-out 20ms, background-color 0.2s ease-out, height 0.2s;
|
|
1180
|
+
interpolate-size: allow-keywords;
|
|
1181
|
+
}
|
|
1182
|
+
&:where([open])::details-content {
|
|
1183
|
+
--overflow-delay: 0.2s;
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
> summary {
|
|
1187
|
+
position: relative;
|
|
1188
|
+
display: block;
|
|
1189
|
+
outline: none;
|
|
1190
|
+
&::-webkit-details-marker {
|
|
1191
|
+
display: none;
|
|
1192
|
+
}
|
|
1193
1193
|
}
|
|
1194
1194
|
}
|
|
1195
1195
|
}
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1196
|
+
@layer daisyui.l1.l2 {
|
|
1197
|
+
&:is([open]) {
|
|
1198
|
+
&.collapse-arrow {
|
|
1199
|
+
> .collapse-title:after {
|
|
1200
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
1201
|
+
transform: translateY(-50%) rotate(225deg);
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1201
1205
|
}
|
|
1202
|
-
|
|
1203
|
-
|
|
1206
|
+
&.collapse-open {
|
|
1207
|
+
&.collapse-arrow {
|
|
1208
|
+
> .collapse-title:after {
|
|
1209
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
1210
|
+
transform: translateY(-50%) rotate(225deg);
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
&.collapse-plus {
|
|
1215
|
+
> .collapse-title:after {
|
|
1216
|
+
--tw-content: "−";
|
|
1217
|
+
content: var(--tw-content);
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
&[tabindex].collapse-arrow:focus:not(.collapse-close), &.collapse-arrow[tabindex]:focus-within:not(.collapse-close) {
|
|
1222
|
+
> .collapse-title:after {
|
|
1223
|
+
transform: translateY(-50%) rotate(225deg);
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
&.collapse-arrow:not(.collapse-close) {
|
|
1227
|
+
> input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-title:after {
|
|
1228
|
+
transform: translateY(-50%) rotate(225deg);
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
&[open] {
|
|
1232
|
+
&.collapse-plus {
|
|
1233
|
+
> .collapse-title:after {
|
|
1234
|
+
--tw-content: "−";
|
|
1235
|
+
content: var(--tw-content);
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
&[tabindex].collapse-plus:focus:not(.collapse-close) {
|
|
1240
|
+
> .collapse-title:after {
|
|
1241
|
+
--tw-content: "−";
|
|
1242
|
+
content: var(--tw-content);
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
&.collapse-plus:not(.collapse-close) {
|
|
1246
|
+
> input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-title:after {
|
|
1247
|
+
--tw-content: "−";
|
|
1248
|
+
content: var(--tw-content);
|
|
1249
|
+
}
|
|
1204
1250
|
}
|
|
1205
|
-
}
|
|
1206
|
-
.collapse.collapse-open.collapse-plus > .collapse-title:after {
|
|
1207
|
-
--tw-content: "−";
|
|
1208
|
-
content: var(--tw-content);
|
|
1209
|
-
}
|
|
1210
|
-
:is(.collapse[tabindex].collapse-arrow:focus:not(.collapse-close), .collapse.collapse-arrow[tabindex]:focus-within:not(.collapse-close)) > .collapse-title:after {
|
|
1211
|
-
transform: translateY(-50%) rotate(225deg);
|
|
1212
|
-
}
|
|
1213
|
-
.collapse.collapse-arrow:not(.collapse-close) > input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-title:after {
|
|
1214
|
-
transform: translateY(-50%) rotate(225deg);
|
|
1215
|
-
}
|
|
1216
|
-
.collapse[open].collapse-plus > .collapse-title:after {
|
|
1217
|
-
--tw-content: "−";
|
|
1218
|
-
content: var(--tw-content);
|
|
1219
|
-
}
|
|
1220
|
-
.collapse[tabindex].collapse-plus:focus:not(.collapse-close) > .collapse-title:after {
|
|
1221
|
-
--tw-content: "−";
|
|
1222
|
-
content: var(--tw-content);
|
|
1223
|
-
}
|
|
1224
|
-
.collapse.collapse-plus:not(.collapse-close) > input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-title:after {
|
|
1225
|
-
--tw-content: "−";
|
|
1226
|
-
content: var(--tw-content);
|
|
1227
1251
|
}
|
|
1228
1252
|
}
|
|
1229
1253
|
@layer daisyui.l1.l2.l3 {
|
|
@@ -1309,6 +1333,7 @@
|
|
|
1309
1333
|
display: inline-grid;
|
|
1310
1334
|
height: var(--size);
|
|
1311
1335
|
width: var(--size);
|
|
1336
|
+
flex-shrink: 0;
|
|
1312
1337
|
place-content: center;
|
|
1313
1338
|
border-radius: calc(infinity * 1px);
|
|
1314
1339
|
background-color: transparent;
|
|
@@ -1542,7 +1567,7 @@
|
|
|
1542
1567
|
padding-inline: calc(0.25rem * 3);
|
|
1543
1568
|
vertical-align: middle;
|
|
1544
1569
|
white-space: nowrap;
|
|
1545
|
-
--size: calc(var(--size-field, 0.25rem) * var(--in-size-mul));
|
|
1570
|
+
--size: calc(var(--size-field, 0.25rem) * var(--in-size-mul, 10));
|
|
1546
1571
|
--input-color: var(--color-base-content);
|
|
1547
1572
|
}
|
|
1548
1573
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -1554,7 +1579,7 @@
|
|
|
1554
1579
|
cursor: text;
|
|
1555
1580
|
width: clamp(3rem, 20rem, 100%);
|
|
1556
1581
|
height: var(--size);
|
|
1557
|
-
font-size: max(var(--font-size, 0rem), var(--font-size-min));
|
|
1582
|
+
font-size: max(var(--font-size, 0rem), var(--font-size-min, 0.875rem));
|
|
1558
1583
|
touch-action: manipulation;
|
|
1559
1584
|
border-start-start-radius: var(--join-ss, var(--radius-field));
|
|
1560
1585
|
border-start-end-radius: var(--join-se, var(--radius-field));
|
|
@@ -1609,7 +1634,7 @@
|
|
|
1609
1634
|
text-align: inherit;
|
|
1610
1635
|
}
|
|
1611
1636
|
&::-webkit-inner-spin-button {
|
|
1612
|
-
margin-block: calc(0.25rem * var(--spin-my));
|
|
1637
|
+
margin-block: calc(0.25rem * var(--spin-my, -3));
|
|
1613
1638
|
}
|
|
1614
1639
|
&::-webkit-calendar-picker-indicator {
|
|
1615
1640
|
position: absolute;
|
|
@@ -1657,19 +1682,6 @@
|
|
|
1657
1682
|
.input:has( > input[disabled]) > input[disabled] {
|
|
1658
1683
|
cursor: not-allowed;
|
|
1659
1684
|
}
|
|
1660
|
-
}
|
|
1661
|
-
@layer daisyui.l1.l2 {
|
|
1662
|
-
.input {
|
|
1663
|
-
--in-size-mul: 10;
|
|
1664
|
-
--font-size-min: 0.875rem;
|
|
1665
|
-
--spin-my: -3;
|
|
1666
|
-
}
|
|
1667
|
-
.floating-label:has(.input) {
|
|
1668
|
-
--top-mul: 5;
|
|
1669
|
-
--font-size: 0.875rem;
|
|
1670
|
-
}
|
|
1671
|
-
}
|
|
1672
|
-
@layer daisyui.l1.l2.l3 {
|
|
1673
1685
|
.range {
|
|
1674
1686
|
appearance: none;
|
|
1675
1687
|
webkit-appearance: none;
|
|
@@ -2084,7 +2096,7 @@
|
|
|
2084
2096
|
padding-inline-start: calc(0.25rem * 3);
|
|
2085
2097
|
padding-inline-end: calc(0.25rem * 7);
|
|
2086
2098
|
vertical-align: middle;
|
|
2087
|
-
--size: calc(var(--size-field, 0.25rem) * var(--sl-size-mul));
|
|
2099
|
+
--size: calc(var(--size-field, 0.25rem) * var(--sl-size-mul, 10));
|
|
2088
2100
|
--input-color: var(--color-base-content);
|
|
2089
2101
|
}
|
|
2090
2102
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -2095,7 +2107,7 @@
|
|
|
2095
2107
|
.select {
|
|
2096
2108
|
width: clamp(3rem, 20rem, 100%);
|
|
2097
2109
|
height: var(--size);
|
|
2098
|
-
font-size: max(var(--font-size, 0rem), var(--font-size-min));
|
|
2110
|
+
font-size: max(var(--font-size, 0rem), var(--font-size-min, 0.875rem));
|
|
2099
2111
|
touch-action: manipulation;
|
|
2100
2112
|
border-start-start-radius: var(--join-ss, var(--radius-field));
|
|
2101
2113
|
border-start-end-radius: var(--join-se, var(--radius-field));
|
|
@@ -2226,7 +2238,7 @@
|
|
|
2226
2238
|
:is(:is(.select), .select select) option {
|
|
2227
2239
|
border-radius: var(--radius-field);
|
|
2228
2240
|
padding-block: calc(0.25rem * 1.5);
|
|
2229
|
-
padding-inline: calc(0.25rem * var(--option-px));
|
|
2241
|
+
padding-inline: calc(0.25rem * var(--option-px, 3));
|
|
2230
2242
|
transition-property: color, background-color;
|
|
2231
2243
|
transition-duration: 0.2s;
|
|
2232
2244
|
transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
|
|
@@ -2254,15 +2266,6 @@
|
|
|
2254
2266
|
}
|
|
2255
2267
|
}
|
|
2256
2268
|
@layer daisyui.l1.l2 {
|
|
2257
|
-
.select {
|
|
2258
|
-
--sl-size-mul: 10;
|
|
2259
|
-
--font-size-min: 0.875rem;
|
|
2260
|
-
--option-px: 3;
|
|
2261
|
-
}
|
|
2262
|
-
.floating-label:has(.select) {
|
|
2263
|
-
--top-mul: 5;
|
|
2264
|
-
--font-size: 0.875rem;
|
|
2265
|
-
}
|
|
2266
2269
|
.menu-horizontal {
|
|
2267
2270
|
display: inline-flex;
|
|
2268
2271
|
flex-direction: row;
|
|
@@ -2895,7 +2898,7 @@
|
|
|
2895
2898
|
}
|
|
2896
2899
|
.textarea {
|
|
2897
2900
|
width: clamp(3rem, 20rem, 100%);
|
|
2898
|
-
font-size: max(var(--font-size, 0rem), var(--font-size-min));
|
|
2901
|
+
font-size: max(var(--font-size, 0rem), var(--font-size-min, 0.875rem));
|
|
2899
2902
|
touch-action: manipulation;
|
|
2900
2903
|
border: var(--border) solid var(--input-color, #0000);
|
|
2901
2904
|
box-shadow: 0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset;
|
|
@@ -2958,36 +2961,27 @@
|
|
|
2958
2961
|
}
|
|
2959
2962
|
}
|
|
2960
2963
|
@layer daisyui.l1.l2 {
|
|
2961
|
-
.textarea {
|
|
2962
|
-
--font-size-min: 0.875rem;
|
|
2963
|
-
}
|
|
2964
|
-
.floating-label:has(.textarea) {
|
|
2965
|
-
--top-mul: 5;
|
|
2966
|
-
--font-size: 0.875rem;
|
|
2967
|
-
}
|
|
2968
2964
|
.btn-active {
|
|
2969
2965
|
--btn-bg: var(--btn-color, var(--color-base-200));
|
|
2970
|
-
color: var(--btn-fg, var(--color-base-content));
|
|
2971
|
-
--btn-border: var(--btn-bg);
|
|
2972
2966
|
}
|
|
2973
2967
|
@supports (color: color-mix(in lab, red, red)) {
|
|
2974
2968
|
.btn-active {
|
|
2975
|
-
--btn-
|
|
2969
|
+
--btn-bg: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 5%);
|
|
2976
2970
|
}
|
|
2977
2971
|
}
|
|
2978
2972
|
.btn-active {
|
|
2979
|
-
--btn-
|
|
2980
|
-
--btn-
|
|
2981
|
-
--btn-shadow: 0 3px 2px -2px var(--btn-bg),
|
|
2982
|
-
0 4px 3px -2px var(--btn-bg);
|
|
2973
|
+
color: var(--btn-fg, var(--color-base-content));
|
|
2974
|
+
--btn-border: var(--btn-color, var(--color-base-200));
|
|
2983
2975
|
}
|
|
2984
2976
|
@supports (color: color-mix(in lab, red, red)) {
|
|
2985
2977
|
.btn-active {
|
|
2986
|
-
--btn-
|
|
2987
|
-
0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000);
|
|
2978
|
+
--btn-border: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%);
|
|
2988
2979
|
}
|
|
2989
2980
|
}
|
|
2990
2981
|
.btn-active {
|
|
2982
|
+
--btn-border-style: solid;
|
|
2983
|
+
--btn-inset: 0 0 0 0 oklch(0% 0 0/0);
|
|
2984
|
+
--btn-shadow: 0 0 0 0 oklch(0% 0 0/0);
|
|
2991
2985
|
isolation: isolate;
|
|
2992
2986
|
}
|
|
2993
2987
|
}
|
|
@@ -3831,14 +3825,6 @@
|
|
|
3831
3825
|
place-items: start;
|
|
3832
3826
|
gap: calc(0.25rem * 2);
|
|
3833
3827
|
}
|
|
3834
|
-
.footer.footer-center {
|
|
3835
|
-
grid-auto-flow: column dense;
|
|
3836
|
-
place-items: center;
|
|
3837
|
-
text-align: center;
|
|
3838
|
-
& > *:not(script, style, template) {
|
|
3839
|
-
place-items: center;
|
|
3840
|
-
}
|
|
3841
|
-
}
|
|
3842
3828
|
.stat {
|
|
3843
3829
|
display: inline-grid;
|
|
3844
3830
|
width: 100%;
|
|
@@ -4218,7 +4204,7 @@
|
|
|
4218
4204
|
.modal-bottom {
|
|
4219
4205
|
place-items: end;
|
|
4220
4206
|
}
|
|
4221
|
-
.modal-bottom .modal-box {
|
|
4207
|
+
.modal-bottom > .modal-box {
|
|
4222
4208
|
height: auto;
|
|
4223
4209
|
width: 100%;
|
|
4224
4210
|
max-width: none;
|
|
@@ -4233,7 +4219,7 @@
|
|
|
4233
4219
|
.modal-middle {
|
|
4234
4220
|
place-items: center;
|
|
4235
4221
|
}
|
|
4236
|
-
.modal-middle .modal-box {
|
|
4222
|
+
.modal-middle > .modal-box {
|
|
4237
4223
|
height: auto;
|
|
4238
4224
|
width: calc(11 / 12 * 100%);
|
|
4239
4225
|
max-width: 32rem;
|
|
@@ -4248,7 +4234,7 @@
|
|
|
4248
4234
|
.modal-top {
|
|
4249
4235
|
place-items: start;
|
|
4250
4236
|
}
|
|
4251
|
-
.modal-top .modal-box {
|
|
4237
|
+
.modal-top > .modal-box {
|
|
4252
4238
|
height: auto;
|
|
4253
4239
|
width: 100%;
|
|
4254
4240
|
max-width: none;
|
|
@@ -4590,6 +4576,9 @@
|
|
|
4590
4576
|
padding-block: calc(0.25rem * 1.5);
|
|
4591
4577
|
font-size: 1.125rem;
|
|
4592
4578
|
}
|
|
4579
|
+
.menu-lg details[open] > summary:before {
|
|
4580
|
+
font-size: 1.125rem;
|
|
4581
|
+
}
|
|
4593
4582
|
.menu-lg .menu-title {
|
|
4594
4583
|
padding-inline: calc(0.25rem * 6);
|
|
4595
4584
|
padding-block: calc(0.25rem * 3);
|
|
@@ -4600,6 +4589,9 @@
|
|
|
4600
4589
|
padding-block: calc(0.25rem * 1.5);
|
|
4601
4590
|
font-size: 0.875rem;
|
|
4602
4591
|
}
|
|
4592
|
+
.menu-md details[open] > summary:before {
|
|
4593
|
+
font-size: 0.875rem;
|
|
4594
|
+
}
|
|
4603
4595
|
.menu-md .menu-title {
|
|
4604
4596
|
padding-inline: calc(0.25rem * 3);
|
|
4605
4597
|
padding-block: calc(0.25rem * 2);
|
|
@@ -4610,6 +4602,9 @@
|
|
|
4610
4602
|
padding-block: 0.25rem;
|
|
4611
4603
|
font-size: 0.75rem;
|
|
4612
4604
|
}
|
|
4605
|
+
.menu-sm details[open] > summary:before {
|
|
4606
|
+
font-size: 0.75rem;
|
|
4607
|
+
}
|
|
4613
4608
|
.menu-sm .menu-title {
|
|
4614
4609
|
padding-inline: calc(0.25rem * 3);
|
|
4615
4610
|
padding-block: calc(0.25rem * 2);
|
|
@@ -4620,6 +4615,9 @@
|
|
|
4620
4615
|
padding-block: 0.25rem;
|
|
4621
4616
|
font-size: 0.6875rem;
|
|
4622
4617
|
}
|
|
4618
|
+
.menu-xs details[open] > summary:before {
|
|
4619
|
+
font-size: 0.6875rem;
|
|
4620
|
+
}
|
|
4623
4621
|
.menu-xs .menu-title {
|
|
4624
4622
|
padding-inline: calc(0.25rem * 2);
|
|
4625
4623
|
padding-block: 0.25rem;
|
|
@@ -6303,6 +6301,26 @@ table td.options {
|
|
|
6303
6301
|
--depth: 1;
|
|
6304
6302
|
--noise: 0;
|
|
6305
6303
|
}
|
|
6304
|
+
:root {
|
|
6305
|
+
--page-scroll-lock: initial;
|
|
6306
|
+
--page-overflow: var(--page-scroll-lock) hidden;
|
|
6307
|
+
}
|
|
6308
|
+
:root:not(span) {
|
|
6309
|
+
overflow: var(--page-overflow);
|
|
6310
|
+
}
|
|
6311
|
+
:root {
|
|
6312
|
+
--fx-noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");
|
|
6313
|
+
}
|
|
6314
|
+
:root, [data-theme] {
|
|
6315
|
+
background-color: var(--root-bg);
|
|
6316
|
+
color: var(--color-base-content);
|
|
6317
|
+
}
|
|
6318
|
+
:root {
|
|
6319
|
+
background-color: var(--page-scroll-bg, var(--root-bg));
|
|
6320
|
+
}
|
|
6321
|
+
:where(:root, [data-theme]) {
|
|
6322
|
+
--root-bg: var(--color-base-100);
|
|
6323
|
+
}
|
|
6306
6324
|
@property --radialprogress {
|
|
6307
6325
|
syntax: "<percentage>";
|
|
6308
6326
|
inherits: true;
|
|
@@ -6318,14 +6336,6 @@ table td.options {
|
|
|
6318
6336
|
@supports (color: color-mix(in lab, red, red)) {
|
|
6319
6337
|
scrollbar-color: color-mix(in oklch, currentColor 35%, #0000) #0000;
|
|
6320
6338
|
}
|
|
6321
|
-
--fx-noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");
|
|
6322
|
-
--page-scroll-lock: initial;
|
|
6323
|
-
--page-overflow: var(--page-scroll-lock) hidden;
|
|
6324
|
-
}
|
|
6325
|
-
:root:not(span) {
|
|
6326
|
-
overflow: var(--page-overflow);
|
|
6327
|
-
}
|
|
6328
|
-
:root {
|
|
6329
6339
|
--page-has-backdrop: var(--page-scroll-lock) 1;
|
|
6330
6340
|
--page-scroll-bg: var(--page-scroll-lock)
|
|
6331
6341
|
var(--root-bg, #0000);
|
|
@@ -6345,49 +6355,41 @@ table td.options {
|
|
|
6345
6355
|
--page-has-scroll: ;
|
|
6346
6356
|
}
|
|
6347
6357
|
}
|
|
6348
|
-
:root, [data-theme] {
|
|
6349
|
-
background-color: var(--root-bg);
|
|
6350
|
-
color: var(--color-base-content);
|
|
6351
|
-
}
|
|
6352
|
-
:root {
|
|
6353
|
-
background-color: var(--page-scroll-bg, var(--root-bg));
|
|
6354
|
-
}
|
|
6355
|
-
:where(:root, [data-theme]) {
|
|
6356
|
-
--root-bg: var(--color-base-100);
|
|
6357
|
-
}
|
|
6358
6358
|
}
|
|
6359
6359
|
@keyframes dropdown {
|
|
6360
6360
|
0% {
|
|
6361
6361
|
opacity: 0;
|
|
6362
6362
|
}
|
|
6363
6363
|
}
|
|
6364
|
-
@keyframes
|
|
6365
|
-
|
|
6366
|
-
--
|
|
6364
|
+
@keyframes aura {
|
|
6365
|
+
to {
|
|
6366
|
+
--aura-angle: 360deg;
|
|
6367
|
+
transform: translateZ(1px);
|
|
6367
6368
|
}
|
|
6368
|
-
|
|
6369
|
-
|
|
6369
|
+
}
|
|
6370
|
+
@keyframes aura-glow {
|
|
6371
|
+
20%, 80% {
|
|
6372
|
+
opacity: 0.7;
|
|
6373
|
+
filter: blur(0.25rem);
|
|
6370
6374
|
}
|
|
6371
|
-
|
|
6372
|
-
|
|
6375
|
+
50% {
|
|
6376
|
+
opacity: 1;
|
|
6377
|
+
filter: blur(0.75rem);
|
|
6373
6378
|
}
|
|
6374
6379
|
}
|
|
6375
|
-
@keyframes
|
|
6376
|
-
|
|
6377
|
-
|
|
6380
|
+
@keyframes aura-glow-after {
|
|
6381
|
+
20%, 80% {
|
|
6382
|
+
opacity: 0.3;
|
|
6383
|
+
filter: blur(1rem);
|
|
6378
6384
|
}
|
|
6379
6385
|
50% {
|
|
6380
|
-
|
|
6386
|
+
opacity: 0.6;
|
|
6387
|
+
filter: blur(1.5rem);
|
|
6381
6388
|
}
|
|
6382
6389
|
}
|
|
6383
|
-
@keyframes
|
|
6384
|
-
|
|
6385
|
-
|
|
6386
|
-
opacity: 0;
|
|
6387
|
-
}
|
|
6388
|
-
100% {
|
|
6389
|
-
scale: 1;
|
|
6390
|
-
opacity: 1;
|
|
6390
|
+
@keyframes progress {
|
|
6391
|
+
50% {
|
|
6392
|
+
background-position-x: -115%;
|
|
6391
6393
|
}
|
|
6392
6394
|
}
|
|
6393
6395
|
@keyframes skeleton {
|
|
@@ -6398,46 +6400,44 @@ table td.options {
|
|
|
6398
6400
|
background-position: -50%;
|
|
6399
6401
|
}
|
|
6400
6402
|
}
|
|
6401
|
-
@keyframes progress {
|
|
6402
|
-
50% {
|
|
6403
|
-
background-position-x: -115%;
|
|
6404
|
-
}
|
|
6405
|
-
}
|
|
6406
6403
|
@keyframes rating {
|
|
6407
6404
|
0%, 40% {
|
|
6408
6405
|
scale: 1.1;
|
|
6409
6406
|
filter: brightness(1.05) contrast(1.05);
|
|
6410
6407
|
}
|
|
6411
6408
|
}
|
|
6412
|
-
@keyframes
|
|
6413
|
-
|
|
6414
|
-
|
|
6415
|
-
transform: translateZ(1px);
|
|
6409
|
+
@keyframes menu {
|
|
6410
|
+
0% {
|
|
6411
|
+
opacity: 0;
|
|
6416
6412
|
}
|
|
6417
6413
|
}
|
|
6418
|
-
@keyframes
|
|
6419
|
-
|
|
6420
|
-
|
|
6421
|
-
|
|
6414
|
+
@keyframes toast {
|
|
6415
|
+
0% {
|
|
6416
|
+
scale: 0.9;
|
|
6417
|
+
opacity: 0;
|
|
6422
6418
|
}
|
|
6423
|
-
|
|
6419
|
+
100% {
|
|
6420
|
+
scale: 1;
|
|
6424
6421
|
opacity: 1;
|
|
6425
|
-
filter: blur(0.75rem);
|
|
6426
6422
|
}
|
|
6427
6423
|
}
|
|
6428
|
-
@keyframes
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
filter: blur(1rem);
|
|
6424
|
+
@keyframes rotator {
|
|
6425
|
+
89.9999%, 100% {
|
|
6426
|
+
--first-item-position: 0 0%;
|
|
6432
6427
|
}
|
|
6433
|
-
|
|
6434
|
-
|
|
6435
|
-
|
|
6428
|
+
90%, 99.9999% {
|
|
6429
|
+
--first-item-position: 0 calc(var(--items) * 100%);
|
|
6430
|
+
}
|
|
6431
|
+
100% {
|
|
6432
|
+
translate: 0 -100%;
|
|
6436
6433
|
}
|
|
6437
6434
|
}
|
|
6438
|
-
@keyframes
|
|
6435
|
+
@keyframes radio {
|
|
6439
6436
|
0% {
|
|
6440
|
-
|
|
6437
|
+
padding: 5px;
|
|
6438
|
+
}
|
|
6439
|
+
50% {
|
|
6440
|
+
padding: 3px;
|
|
6441
6441
|
}
|
|
6442
6442
|
}
|
|
6443
6443
|
@property --tw-border-style {
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/lib/karafka/web/version.rb
CHANGED
data/package-lock.json
CHANGED
|
@@ -1140,9 +1140,9 @@
|
|
|
1140
1140
|
}
|
|
1141
1141
|
},
|
|
1142
1142
|
"node_modules/daisyui": {
|
|
1143
|
-
"version": "5.7.
|
|
1144
|
-
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.7.
|
|
1145
|
-
"integrity": "sha512-
|
|
1143
|
+
"version": "5.7.4",
|
|
1144
|
+
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.7.4.tgz",
|
|
1145
|
+
"integrity": "sha512-zKzFIwvEvn2QvE1TbUUtDnYFOqWoxeZh+j4QXfhkZKYAT++pO2ijyT9rkFm0GIPDWR1/oo9hHZzd96AsTK0iZg==",
|
|
1146
1146
|
"dev": true,
|
|
1147
1147
|
"license": "MIT",
|
|
1148
1148
|
"funding": {
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: karafka-web
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.0.
|
|
4
|
+
version: 1.0.0.rc2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Maciej Mensfeld
|
|
@@ -29,7 +29,7 @@ dependencies:
|
|
|
29
29
|
requirements:
|
|
30
30
|
- - ">="
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: 2.6.0.
|
|
32
|
+
version: 2.6.0.rc2
|
|
33
33
|
- - "<"
|
|
34
34
|
- !ruby/object:Gem::Version
|
|
35
35
|
version: 2.7.0
|
|
@@ -39,7 +39,7 @@ dependencies:
|
|
|
39
39
|
requirements:
|
|
40
40
|
- - ">="
|
|
41
41
|
- !ruby/object:Gem::Version
|
|
42
|
-
version: 2.6.0.
|
|
42
|
+
version: 2.6.0.rc2
|
|
43
43
|
- - "<"
|
|
44
44
|
- !ruby/object:Gem::Version
|
|
45
45
|
version: 2.7.0
|
|
@@ -409,6 +409,7 @@ files:
|
|
|
409
409
|
- lib/karafka/web/pro/ui/views/explorer/explorer/messages/_detail.erb
|
|
410
410
|
- lib/karafka/web/pro/ui/views/explorer/explorer/messages/_headers.erb
|
|
411
411
|
- lib/karafka/web/pro/ui/views/explorer/explorer/messages/_key.erb
|
|
412
|
+
- lib/karafka/web/pro/ui/views/explorer/explorer/messages/_linked_detail.erb
|
|
412
413
|
- lib/karafka/web/pro/ui/views/explorer/explorer/partition.erb
|
|
413
414
|
- lib/karafka/web/pro/ui/views/explorer/explorer/partition/_cleaned.erb
|
|
414
415
|
- lib/karafka/web/pro/ui/views/explorer/explorer/partition/_empty.erb
|