capybara-lockstep 2.3.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b10f22c42f855e5a7ca55b34c6a7ab33da9712f8f345f4ff6278e93756aca6a6
4
- data.tar.gz: 670652bccdf353c723d0c3466be51bcccff00f9a189306a142caed2e10714f06
3
+ metadata.gz: eb5ab18d6ec37825a825c3da9fdde70e7203b68609242a8a4738cb3034a0c3b2
4
+ data.tar.gz: d74acc6c1c2b73bbeea372f91d54068c548723d28e46cf5a4a01520004d4ef1e
5
5
  SHA512:
6
- metadata.gz: ef6f4cb2a0c2c105e29a99cbaf4f8c2467526b38741dd47a8eb772a4df440c7a0ef27f8e05958d4bbc07746c4e0d9a63763ebd52372db61efbddb81b1d1e90ba
7
- data.tar.gz: c309f4a88411eae4ea65645fe3d99a97a8558af368057aff51d06dd146f289c0ff8b1f3b5c48764200eeb9c221c1b5adc1ff3982428ff51b0699ebfe98f79f46
6
+ metadata.gz: d67cc0d38dc1ab56ff728010cfde78016b357ac5964ab70ed18b7d8173599129eb9ff06bfd4a5e84754698cc568bb14e78378334910afcdabb7a1055f8f1f1ea
7
+ data.tar.gz: 8a8e007d57eb6f2e661a158156aefe4844d26f1de755939040229da146ae32e850b26aacb674cbd02de0ddd196c8e4ee2a39d8b8cb6b526af85ad96eda2d930f
data/CHANGELOG.md CHANGED
@@ -13,9 +13,32 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
13
13
  -
14
14
 
15
15
 
16
- ## 2.3.1 - 2026-02-17
16
+ # 2.4.0 - 2026-10-15
17
17
 
18
- ### Compatible changes
18
+ ## Compatible changes
19
+
20
+ - Skip the check for an open alert before synchronizing when the Selenium driver ignores unhandled prompts (`unhandled_prompt_behavior: 'ignore'` or `{ default: 'ignore' }`). Such a driver keeps the alert open while synchronizing, so the check only cost an additional roundtrip to the browser. Configure this with the new option `Capybara::Lockstep.check_alerts` (`true`, `false` or `nil` for auto-detection).
21
+
22
+
23
+ # 2.3.2 - 2026-09-11
24
+
25
+ ## Compatible changes
26
+
27
+ - Treat a Selenium `UnknownError` carrying the CDP message `Promise was collected` as a benign "navigated away" event,
28
+ - like the existing `document unloaded` `JavascriptError`. Newer Chrome (141+) with selenium-webdriver 4.41 reports
29
+ - a destroyed JS execution context (e.g. Turbo frame swaps, SPA navigations) this way, which previously surfaced as
30
+ - a flaky, hard-to-diagnose test failure.
31
+ - Skip client synchronization when the effective timeout is not positive. Capybara evaluates filter blocks
32
+ - (e.g. `has_css?('.foo') { |node| node.has_field?('bar') }`) with `using_wait_time(0)`. A nested lookup inside such
33
+ - a block triggered a synchronization with a timeout of 0 when the client was out of sync (e.g. after a timed-out
34
+ - synchronization or on a page without the capybara-lockstep snippet). Capybara's Selenium driver persisted that 0
35
+ - as the WebDriver script timeout, so every later script-based command (including Capybara's visibility checks)
36
+ - failed with `Selenium::WebDriver::Error::ScriptTimeoutError`. This only affected the default configuration
37
+ - (`Capybara::Lockstep.timeout = nil`).
38
+
39
+ # 2.3.1 - 2026-02-17
40
+
41
+ ## Compatible changes
19
42
 
20
43
  - Add tests for Ruby 4.0
21
44
  - Increase `required_ruby_version` and `activesupport` minimum version in gemspec so people
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- capybara-lockstep (2.3.1)
4
+ capybara-lockstep (2.4.0)
5
5
  activesupport (>= 7.0)
6
6
  capybara (>= 3.0)
7
7
 
@@ -65,7 +65,7 @@ GEM
65
65
  mustermann (3.0.0)
66
66
  ruby2_keywords (~> 0.0.1)
67
67
  nio4r (2.6.1)
68
- nokogiri (1.15.5)
68
+ nokogiri (1.19.4)
69
69
  mini_portile2 (~> 2.8.2)
70
70
  racc (~> 1.4)
71
71
  ostruct (0.6.3)
data/README.md CHANGED
@@ -184,7 +184,7 @@ use Capybara::Lockstep::Middleware
184
184
  ### Configuring Selenium WebDriver (recommended)
185
185
 
186
186
  By default, webdrivers will automatically dismiss any user prompts (like alerts) when trying to perform an action.
187
- While capybara-lockstep carefully detects alerts before synchronizing, and will skip interaction with the browser to avoid accidentally dismissing alerts, it can not synchronize around some rare race conditions.
187
+ With this default, capybara-lockstep checks for an open alert before synchronizing, and will skip interaction with the browser to avoid accidentally dismissing alerts. However, it can not synchronize around some rare race conditions, and the check costs an additional roundtrip to the browser.
188
188
 
189
189
  [We recommend](https://makandracards.com/makandra/617366-how-to-configure-selenium-webdriver-to-not-automatically-close-alerts-or-other-browser-dialogs) you configure your webdriver to not automatically dismiss user prompts by setting the "unhandled prompt behavior" capability to [`ignore`](https://w3c.github.io/webdriver/#dfn-known-prompt-handling-approaches-table). Using "ignore", errors are raised like with the default behavior, but user prompts are kept open.
190
190
 
@@ -199,6 +199,18 @@ Capybara.register_driver(:selenium) do |app|
199
199
  end
200
200
  ```
201
201
 
202
+ When your driver ignores user prompts, capybara-lockstep no longer checks for an open alert before synchronizing. The driver keeps the alert open and capybara-lockstep retries synchronization on the next Capybara command. This also works when you configure the capability by prompt type, e.g. `unhandled_prompt_behavior: { default: 'ignore' }`, as long as alerts, confirms and prompts are all ignored. Note that selenium-webdriver 4.35 and older convert such a map to a string when passed through `Options`. On these versions, pass it as `Selenium::WebDriver::Remote::Capabilities.new(unhandled_prompt_behavior: { default: 'ignore' })` alongside your options.
203
+
204
+ You can override this detection:
205
+
206
+ ```ruby
207
+ Capybara::Lockstep.check_alerts = true # always check for an open alert before synchronizing
208
+ Capybara::Lockstep.check_alerts = false # never check for an open alert before synchronizing
209
+ Capybara::Lockstep.check_alerts = nil # check unless the driver ignores user prompts (default)
210
+ ```
211
+
212
+ Only disable the check if your driver keeps alerts open, otherwise synchronization will dismiss them.
213
+
202
214
  ### Verify successful integration
203
215
 
204
216
  capybara-lockstep will automatically patch Capybara to wait for the browser after every command.
@@ -342,6 +354,8 @@ Capybara::Lockstep.timeout = 5 # seconds
342
354
 
343
355
  By default Capybara will **not** raise an error after a timeout. You may occasionally get a slow server response, and Capybara will retry synchronization before the next interaction or `visit`. This is often good enough.
344
356
 
357
+ When the effective timeout is `0` (e.g. inside a Capybara filter block, which Capybara evaluates with `using_wait_time(0)`), capybara-lockstep skips the synchronization, logs `Cannot synchronize client with a timeout of 0 seconds` and retries on the next interaction.
358
+
345
359
  If you want to be strict you may configure that an `Capybara::Lockstep::Timeout` error is raised after a timeout:
346
360
 
347
361
  ```ruby
@@ -5,32 +5,26 @@ Gem::Specification.new do |spec|
5
5
  spec.version = Capybara::Lockstep::VERSION
6
6
  spec.authors = ["Henning Koch"]
7
7
  spec.email = ["henning.koch@makandra.de"]
8
-
9
- spec.summary = "Synchronize Capybara commands with client-side JavaScript and AJAX requests"
10
8
  spec.homepage = "https://github.com/makandra/capybara-lockstep"
9
+ spec.summary = "Synchronize Capybara commands with client-side JavaScript and AJAX requests"
11
10
  spec.license = "MIT"
12
- spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
13
11
 
14
- spec.metadata["homepage_uri"] = spec.homepage
15
- spec.metadata["source_code_uri"] = spec.homepage
12
+ spec.metadata = {
13
+ "homepage_uri" => spec.homepage,
14
+ "source_code_uri" => spec.homepage,
15
+ "bug_tracker_uri" => "#{spec.homepage}/issues",
16
+ "changelog_uri" => "#{spec.homepage}/blob/main/CHANGELOG.md",
17
+ "rubygems_mfa_required" => 'true',
18
+ }
16
19
 
17
- spec.metadata["bug_tracker_uri"] = "https://github.com/makandra/capybara-lockstep/issues"
18
- spec.metadata["changelog_uri"] = "https://github.com/makandra/capybara-lockstep/blob/main/CHANGELOG.md"
19
- spec.metadata["rubygems_mfa_required"] = 'true'
20
+ spec.files = `git ls-files`.split("\n").select { |f| !File.symlink?(f) && !f.match(%r{^(spec|dev|media|.github)/}) }
21
+ spec.require_paths = ["lib"]
20
22
 
21
- # Specify which files should be added to the gem when it is released.
22
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
25
- end
26
23
  spec.bindir = "exe"
27
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
24
+ spec.executables = []
25
+
26
+ spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
29
27
 
30
- # Uncomment to register a new dependency of your gem
31
28
  spec.add_dependency "capybara", ">= 3.0"
32
29
  spec.add_dependency "activesupport", ">= 7.0"
33
-
34
- # For more information and examples about making a new gem, checkout our
35
- # guide at: https://bundler.io/guides/creating_gem.html
36
30
  end
@@ -32,6 +32,22 @@ module Capybara
32
32
  else
33
33
  unhandled_synchronize_error(e)
34
34
  end
35
+ rescue ::Selenium::WebDriver::Error::UnknownError => e
36
+ # Newer Chrome (e.g. chrome-headless-shell 141) with selenium-webdriver 4.41
37
+ # reports the same "navigated away" condition differently than the older
38
+ # JavascriptError "document unloaded" message handled above. When an interaction
39
+ # destroys the JS execution context that owns our pending async probe (a Turbo
40
+ # frame swap or an SPA navigation), the promise can never resolve and the driver
41
+ # raises a Selenium::WebDriver::Error::UnknownError wrapping the CDP error:
42
+ # 'unknown error: unhandled inspector error: {"code":-32000,"message":"Promise was collected"}'.
43
+ # Treat this symmetrically to the 'unload' branch above: leave the client
44
+ # unsynchronized and retry on the next Capybara synchronize call, by then we
45
+ # should see the new page. Any other UnknownError is still unexpected and re-raised.
46
+ if e.message.include?('Promise was collected')
47
+ log ERROR_NAVIGATED_AWAY
48
+ else
49
+ unhandled_synchronize_error(e)
50
+ end
35
51
  rescue StandardError => e
36
52
  unhandled_synchronize_error(e)
37
53
  end
@@ -37,9 +37,21 @@ module Capybara
37
37
  # If synchronization fails below we consider us unsynchronized after.
38
38
  self.synchronized = false
39
39
 
40
- # Running the synchronization script while an alert is open would close the alert,
41
- # most likely causing subsequent expectations to fail.
42
- if alert_present?
40
+ # Capybara evaluates filter blocks with `using_wait_time(0)`. Our default timeout is
41
+ # Capybara.default_max_wait_time, so a nested lookup inside such a block would try
42
+ # to synchronize with a timeout of 0. An async script can never finish within 0 seconds,
43
+ # and Capybara's Selenium driver would persist that 0 as the WebDriver script timeout,
44
+ # breaking every later script-based command with a ScriptTimeoutError.
45
+ if timeout <= 0
46
+ log "Cannot synchronize client with a timeout of #{timeout} seconds"
47
+ # Don't raise an error, this will happen in an innocent test.
48
+ # We will retry on the next Capybara synchronize call with a real timeout.
49
+ return
50
+ end
51
+
52
+ # Unless the driver ignores unhandled prompts, running the synchronization script while an alert
53
+ # is open would close the alert, most likely causing subsequent expectations to fail.
54
+ if check_alerts? && alert_present?
43
55
  log ERROR_ALERT_OPEN
44
56
  # Don't raise an error, this will happen in an innocent test.
45
57
  # We will retry on the next Capybara synchronize call.
@@ -98,6 +110,10 @@ module Capybara
98
110
  raise e
99
111
  end
100
112
 
113
+ def check_alerts?
114
+ Lockstep.check_alerts?
115
+ end
116
+
101
117
  def timeout
102
118
  Lockstep.timeout
103
119
  end
@@ -18,6 +18,16 @@ module Capybara
18
18
  @timeout_with = action&.to_sym
19
19
  end
20
20
 
21
+ def check_alerts?
22
+ # A driver that ignores unhandled prompts keeps an alert open while running our synchronization script.
23
+ # It raises an UnexpectedAlertOpenError instead, which we handle like an open alert.
24
+ @check_alerts.nil? ? !unhandled_prompts_ignored? : @check_alerts
25
+ end
26
+
27
+ def check_alerts=(value)
28
+ @check_alerts = value
29
+ end
30
+
21
31
  def debug
22
32
  @debug.nil? ? false : @debug
23
33
  end
@@ -25,7 +25,22 @@ module Capybara
25
25
  false
26
26
  end
27
27
 
28
- private
28
+ def unhandled_prompts_ignored?
29
+ return false unless selenium_driver?
30
+
31
+ # The capabilities were returned when the session was created, so this does not talk to the browser.
32
+ # The behavior is either a string ("ignore") or a map by prompt type ({ "default" => "ignore" }).
33
+ behavior = page.driver.browser.capabilities[:unhandled_prompt_behavior]
34
+
35
+ if behavior.is_a?(Hash)
36
+ # We don't consider "beforeUnload" prompts: the string form doesn't apply to them, WebDriver accepts them instead.
37
+ %w[alert confirm prompt].all? do |type|
38
+ behavior.fetch(type) { behavior['default'] } == 'ignore'
39
+ end
40
+ else
41
+ behavior == 'ignore'
42
+ end
43
+ end
29
44
 
30
45
  def selenium_driver?
31
46
  defined?(Capybara::Selenium::Driver) && driver.is_a?(Capybara::Selenium::Driver)
@@ -35,7 +50,6 @@ module Capybara
35
50
  defined?(Capybara::Cuprite::Driver) && driver.is_a?(Capybara::Cuprite::Driver)
36
51
  end
37
52
 
38
-
39
53
  end
40
54
  end
41
55
  end
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Lockstep
3
- VERSION = "2.3.1"
3
+ VERSION = "2.4.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-lockstep
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henning Koch
@@ -43,7 +43,6 @@ executables: []
43
43
  extensions: []
44
44
  extra_rdoc_files: []
45
45
  files:
46
- - ".github/workflows/test.yml"
47
46
  - ".gitignore"
48
47
  - ".rspec"
49
48
  - ".ruby-version"
@@ -72,12 +71,6 @@ files:
72
71
  - lib/capybara-lockstep/server.rb
73
72
  - lib/capybara-lockstep/util.rb
74
73
  - lib/capybara-lockstep/version.rb
75
- - media/logo.dark.shapes.svg
76
- - media/logo.dark.text.svg
77
- - media/logo.light.shapes.svg
78
- - media/logo.light.text.svg
79
- - media/makandra-with-bottom-margin.dark.svg
80
- - media/makandra-with-bottom-margin.light.svg
81
74
  - tasks/spec_tasks.rb
82
75
  homepage: https://github.com/makandra/capybara-lockstep
83
76
  licenses:
@@ -1,64 +0,0 @@
1
- ---
2
- name: Tests
3
- on:
4
- push:
5
- branches:
6
- - main
7
- pull_request:
8
- branches:
9
- - main
10
- workflow_dispatch:
11
- branches:
12
- - main
13
- jobs:
14
- test:
15
- runs-on: ubuntu-24.04
16
- timeout-minutes: 3
17
- strategy:
18
- fail-fast: false
19
- matrix:
20
- include:
21
- - ruby: 3.2.0
22
- gemfile: Gemfile
23
- capybara_driver: selenium
24
- - ruby: 3.2.0
25
- gemfile: Gemfile
26
- capybara_driver: cuprite
27
- - ruby: 3.4.1
28
- gemfile: Gemfile
29
- capybara_driver: selenium
30
- - ruby: 3.4.1
31
- gemfile: Gemfile
32
- capybara_driver: cuprite
33
- - ruby: 4.0.1
34
- gemfile: Gemfile
35
- capybara_driver: selenium
36
- - ruby: 4.0.1
37
- gemfile: Gemfile
38
- capybara_driver: cuprite
39
- env:
40
- BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
41
- CAPYBARA_DRIVER: "${{ matrix.capybara_driver }}"
42
- steps:
43
- - uses: actions/checkout@v3
44
- - name: Install Chrome
45
- uses: browser-actions/setup-chrome@latest
46
- - name: Show Chrome version
47
- run: chrome --version
48
- - name: Install ChromeDriver
49
- uses: nanasess/setup-chromedriver@master
50
- if: "${{ matrix.capybara_driver == 'selenium' }}"
51
- - name: Install ruby
52
- uses: ruby/setup-ruby@v1
53
- with:
54
- ruby-version: "${{ matrix.ruby }}"
55
- - name: Bundle
56
- run: |
57
- gem install bundler:2.3.1
58
- bundle install --no-deployment
59
- - name: Run tests
60
- uses: nick-invision/retry@v2
61
- with:
62
- timeout_seconds: 30
63
- max_attempts: 3
64
- command: bundle exec rake spec
@@ -1,169 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:xlink="http://www.w3.org/1999/xlink"
11
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
- width="103.71816mm"
14
- height="14.056225mm"
15
- viewBox="0 0 103.71816 14.056225"
16
- version="1.1"
17
- id="svg838"
18
- inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
19
- sodipodi:docname="logo.dark.shapes.svg"
20
- inkscape:export-filename="/home/henning/Projects/capybara-lockstep/media/capybara-lockstep.dark.png"
21
- inkscape:export-xdpi="196"
22
- inkscape:export-ydpi="196">
23
- <defs
24
- id="defs832">
25
- <linearGradient
26
- inkscape:collect="always"
27
- id="linearGradient1406">
28
- <stop
29
- style="stop-color:#ff0844;stop-opacity:1"
30
- offset="0"
31
- id="stop1402" />
32
- <stop
33
- style="stop-color:#ffb199;stop-opacity:1"
34
- offset="1"
35
- id="stop1404" />
36
- </linearGradient>
37
- <linearGradient
38
- inkscape:collect="always"
39
- xlink:href="#linearGradient1406"
40
- id="linearGradient1408"
41
- x1="22.054907"
42
- y1="91.071762"
43
- x2="88.956696"
44
- y2="91.071762"
45
- gradientUnits="userSpaceOnUse"
46
- gradientTransform="matrix(1.5503049,0,0,0.08820435,-34.191832,57.908781)" />
47
- </defs>
48
- <sodipodi:namedview
49
- id="base"
50
- pagecolor="#ffffff"
51
- bordercolor="#666666"
52
- borderopacity="1.0"
53
- inkscape:pageopacity="0.0"
54
- inkscape:pageshadow="2"
55
- inkscape:zoom="2.8"
56
- inkscape:cx="120.47146"
57
- inkscape:cy="-25.333161"
58
- inkscape:document-units="mm"
59
- inkscape:current-layer="text1385"
60
- showgrid="false"
61
- fit-margin-top="0"
62
- fit-margin-left="0"
63
- fit-margin-right="0"
64
- fit-margin-bottom="0"
65
- inkscape:window-width="2560"
66
- inkscape:window-height="1391"
67
- inkscape:window-x="1920"
68
- inkscape:window-y="0"
69
- inkscape:window-maximized="1"
70
- inkscape:pagecheckerboard="true" />
71
- <metadata
72
- id="metadata835">
73
- <rdf:RDF>
74
- <cc:Work
75
- rdf:about="">
76
- <dc:format>image/svg+xml</dc:format>
77
- <dc:type
78
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
79
- <dc:title></dc:title>
80
- </cc:Work>
81
- </rdf:RDF>
82
- </metadata>
83
- <g
84
- inkscape:label="Layer 1"
85
- inkscape:groupmode="layer"
86
- id="layer1"
87
- transform="translate(0,-52.518951)">
88
- <g
89
- aria-label="CAPYBARA-LOCKSTEP"
90
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
91
- id="text1385">
92
- <path
93
- d="m 3.8629165,58.191618 q 0.4868334,0 0.8837084,-0.142875 0.4021666,-0.142875 0.5979583,-0.280459 l 0.6773333,1.344084 q -0.2487083,0.211666 -0.8519583,0.428625 -0.5979583,0.216958 -1.4234583,0.216958 -0.7725833,0 -1.4499166,-0.269875 Q 1.6192499,59.218201 1.1006666,58.731368 0.58737498,58.239243 0.29104166,57.583076 0,56.921618 0,56.149034 0,55.376451 0.29104166,54.714993 0.58208331,54.048243 1.095375,53.556118 q 0.5185833,-0.492125 1.1959166,-0.762 0.682625,-0.275167 1.4552083,-0.275167 0.8255,0 1.4234583,0.216958 0.60325,0.216959 0.8519583,0.428625 L 5.3445832,54.508618 Q 5.1487915,54.365743 4.7466249,54.228159 4.3497499,54.085284 3.8629165,54.085284 q -0.5397499,0 -0.9419166,0.169334 -0.4021666,0.164041 -0.6720416,0.455083 -0.269875,0.291042 -0.4021667,0.656167 -0.1322917,0.365125 -0.1322917,0.767291 0,0.407459 0.1322917,0.777875 0.1322917,0.365125 0.4021667,0.656167 0.269875,0.291042 0.6720416,0.460375 0.4021667,0.164042 0.9419166,0.164042 z"
94
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
95
- id="path822" />
96
- <path
97
- d="m 9.2498207,52.645951 h 1.5716253 l 2.756958,6.985 h -1.688042 l -0.508,-1.402292 H 8.6941957 L 8.180904,59.630951 H 6.4875707 Z m -0.026458,4.196292 h 1.6351247 l -0.809625,-2.291292 h -0.01587 z"
98
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
99
- id="path824" />
100
- <path
101
- d="m 14.144601,52.645951 h 2.54 q 0.672042,0 1.211792,0.238125 0.53975,0.232833 0.85725,0.714375 0.322792,0.47625 0.322792,1.195917 0,0.714375 -0.322792,1.217083 -0.3175,0.497417 -0.85725,0.762 -0.53975,0.259292 -1.211792,0.259292 H 15.72681 v 2.598208 h -1.582209 z m 1.582209,3.137958 h 0.518583 q 0.322792,0 0.576792,-0.09525 0.259291,-0.09525 0.41275,-0.301625 0.153458,-0.211666 0.153458,-0.555625 0,-0.34925 -0.153458,-0.550333 -0.153459,-0.206375 -0.41275,-0.296333 -0.254,-0.08996 -0.576792,-0.08996 H 15.72681 Z"
102
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
103
- id="path826" />
104
- <path
105
- d="m 21.769887,57.117409 -2.407708,-4.471458 h 1.920875 l 1.275291,2.661708 1.280584,-2.661708 h 1.910291 l -2.397125,4.471458 v 2.513542 h -1.582208 z"
106
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
107
- id="path828" />
108
- <path
109
- d="m 26.384201,52.645951 h 2.397125 q 0.597958,0 1.105958,0.164042 0.513292,0.164041 0.8255,0.53975 0.3175,0.370416 0.3175,1.005416 0,0.418042 -0.15875,0.746125 -0.153458,0.328084 -0.41275,0.53975 -0.254,0.206375 -0.555625,0.275167 0.264583,0.03175 0.513292,0.153458 0.254,0.116417 0.455083,0.328084 0.206375,0.206375 0.322792,0.518583 0.121708,0.306917 0.121708,0.73025 0,0.587375 -0.264583,1.037167 -0.259292,0.4445 -0.762,0.6985 -0.497417,0.248708 -1.222375,0.248708 h -2.682875 z m 1.582208,5.720292 h 0.719667 q 0.338667,0 0.550333,-0.100542 0.216958,-0.105833 0.3175,-0.296333 0.100542,-0.195792 0.100542,-0.465667 0,-0.423333 -0.264584,-0.619125 -0.259291,-0.201083 -0.730249,-0.201083 h -0.693209 z m 0,-2.921 h 0.640292 q 0.280458,0 0.465667,-0.100542 0.190499,-0.100542 0.285749,-0.280458 0.100542,-0.185209 0.100542,-0.423334 0,-0.428625 -0.243416,-0.576791 -0.243417,-0.153459 -0.66675,-0.153459 h -0.582084 z"
110
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
111
- id="path830" />
112
- <path
113
- d="m 34.438084,52.645951 h 1.571625 l 2.756958,6.985 h -1.688042 l -0.508,-1.402292 h -2.688166 l -0.513292,1.402292 h -1.693333 z m -0.02646,4.196292 h 1.635125 l -0.809625,-2.291292 h -0.01588 z"
114
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
115
- id="path832" />
116
- <path
117
- d="m 39.290533,52.645951 h 2.846917 q 0.608541,0 1.084791,0.254 0.47625,0.254 0.751417,0.735542 0.280458,0.47625 0.280458,1.137708 0,0.661458 -0.238125,1.084792 -0.232833,0.418041 -0.560917,0.629708 -0.328083,0.206375 -0.608541,0.248708 l 1.698625,2.894542 h -1.778 l -1.513417,-2.772833 h -0.381 v 2.772833 h -1.582208 z m 1.582208,3.116792 h 0.6985 q 0.423334,0 0.740834,-0.206375 0.317499,-0.206375 0.317499,-0.73025 0,-0.523875 -0.312208,-0.724959 -0.312208,-0.206375 -0.735541,-0.206375 h -0.709084 z"
118
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
119
- id="path834" />
120
- <path
121
- d="m 47.339146,52.645951 h 1.571625 l 2.756958,6.985 h -1.688042 l -0.508,-1.402292 h -2.688166 l -0.513292,1.402292 h -1.693333 z m -0.02646,4.196292 h 1.635125 l -0.809625,-2.291292 h -0.01588 z"
122
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
123
- id="path836" />
124
- <path
125
- d="m 52.006369,57.905868 v -1.36525 h 2.725208 v 1.36525 z"
126
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
127
- id="path838" />
128
- <path
129
- d="m 55.927475,52.645951 h 1.582208 v 5.598583 h 2.534708 v 1.386417 h -4.116916 z"
130
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
131
- id="path840" />
132
- <path
133
- d="m 62.325091,56.133159 q 0,0.597959 0.243416,1.084792 0.248709,0.481542 0.682625,0.767292 0.439209,0.28575 1.016,0.28575 0.576792,0 1.010709,-0.28575 0.439208,-0.28575 0.682625,-0.767292 0.248708,-0.486833 0.248708,-1.084792 0,-0.597958 -0.248708,-1.0795 -0.243417,-0.481541 -0.682625,-0.767291 -0.433917,-0.291042 -1.010709,-0.291042 -0.576791,0 -1.016,0.291042 -0.433916,0.28575 -0.682625,0.767291 -0.243416,0.481542 -0.243416,1.0795 z m -1.645709,0 q 0,-0.762 0.269875,-1.418166 0.269875,-0.661459 0.756709,-1.153584 0.486833,-0.492125 1.143,-0.767291 0.656166,-0.275167 1.418166,-0.275167 0.772584,0 1.423459,0.275167 0.656166,0.275166 1.137708,0.767291 0.486833,0.492125 0.751417,1.153584 0.269875,0.656166 0.269875,1.418166 0,0.767292 -0.259292,1.42875 -0.259292,0.656167 -0.740833,1.153584 -0.481542,0.492125 -1.137709,0.767291 -0.656166,0.275167 -1.444625,0.275167 -0.804333,0 -1.465791,-0.275167 -0.656167,-0.275166 -1.132417,-0.767291 -0.47625,-0.497417 -0.735542,-1.153584 -0.254,-0.661458 -0.254,-1.42875 z"
134
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
135
- id="path842" />
136
- <path
137
- d="m 72.453325,58.191618 q 0.486833,0 0.883708,-0.142875 0.402167,-0.142875 0.597958,-0.280459 l 0.677334,1.344084 q -0.248709,0.211666 -0.851958,0.428625 -0.597959,0.216958 -1.423459,0.216958 -0.772583,0 -1.449916,-0.269875 -0.677334,-0.269875 -1.195917,-0.756708 -0.513292,-0.492125 -0.809625,-1.148292 -0.291042,-0.661458 -0.291042,-1.434042 0,-0.772583 0.291042,-1.434041 0.291042,-0.66675 0.804333,-1.158875 0.518584,-0.492125 1.195917,-0.762 0.682625,-0.275167 1.455208,-0.275167 0.8255,0 1.423459,0.216958 0.603249,0.216959 0.851958,0.428625 l -0.677334,1.344084 q -0.195791,-0.142875 -0.597958,-0.280459 -0.396875,-0.142875 -0.883708,-0.142875 -0.53975,0 -0.941917,0.169334 -0.402166,0.164041 -0.672041,0.455083 -0.269875,0.291042 -0.402167,0.656167 -0.132292,0.365125 -0.132292,0.767291 0,0.407459 0.132292,0.777875 0.132292,0.365125 0.402167,0.656167 0.269875,0.291042 0.672041,0.460375 0.402167,0.164042 0.941917,0.164042 z"
138
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
139
- id="path844" />
140
- <path
141
- d="m 78.427604,56.022034 2.656417,3.608917 h -1.889125 l -2.148417,-3.053292 v 3.053292 h -1.582208 v -6.985 h 1.582208 v 2.8575 l 1.979083,-2.8575 h 1.783292 z"
142
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
143
- id="path846" />
144
- <path
145
- d="m 84.248426,52.518951 q 0.650875,0 1.137709,0.142875 0.486833,0.142875 0.783166,0.301625 0.296334,0.15875 0.359834,0.211667 l -0.762,1.275291 q -0.08467,-0.0635 -0.291042,-0.185208 -0.201083,-0.121708 -0.481542,-0.216958 -0.275166,-0.09525 -0.576791,-0.09525 -0.407459,0 -0.661459,0.148166 -0.248708,0.142875 -0.248708,0.428625 0,0.195792 0.132292,0.354542 0.137583,0.153458 0.41275,0.296333 0.280458,0.137584 0.709083,0.301625 0.391583,0.142875 0.735542,0.338667 0.343958,0.195792 0.60325,0.465667 0.264583,0.264583 0.418041,0.613833 0.153459,0.34925 0.153459,0.79375 0,0.529167 -0.216959,0.92075 -0.216958,0.386292 -0.592666,0.640292 -0.370417,0.254 -0.846667,0.375708 -0.470958,0.127 -0.978958,0.127 -0.719667,0 -1.291167,-0.164042 -0.566208,-0.164041 -0.915458,-0.354541 -0.34925,-0.1905 -0.418042,-0.254 l 0.788458,-1.328209 q 0.0635,0.04762 0.243417,0.153459 0.185208,0.105833 0.449792,0.22225 0.264583,0.111125 0.560916,0.1905 0.301625,0.07937 0.592667,0.07937 0.486833,0 0.73025,-0.185209 0.243417,-0.1905 0.243417,-0.497416 0,-0.227542 -0.153459,-0.407459 -0.153458,-0.179916 -0.460375,-0.338666 -0.306916,-0.164042 -0.767291,-0.343959 -0.460375,-0.185208 -0.862542,-0.449791 -0.396875,-0.264584 -0.645583,-0.661459 -0.248709,-0.396875 -0.248709,-0.98425 0,-0.587375 0.328084,-1.016 0.333375,-0.433916 0.873125,-0.66675 0.545041,-0.232833 1.164166,-0.232833 z"
146
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
147
- id="path848" />
148
- <path
149
- d="m 88.926256,54.032368 h -1.666875 v -1.386417 h 4.910667 v 1.386417 h -1.661584 v 5.598583 h -1.582208 z"
150
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
151
- id="path850" />
152
- <path
153
- d="m 93.021982,52.645951 h 4.460875 v 1.386417 h -2.883958 v 1.423458 h 2.8575 v 1.344083 h -2.8575 v 1.444625 h 2.883958 v 1.386417 h -4.460875 z"
154
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
155
- id="path852" />
156
- <path
157
- d="m 98.689342,52.645951 h 2.539998 q 0.67204,0 1.21179,0.238125 0.53975,0.232833 0.85725,0.714375 0.3228,0.47625 0.3228,1.195917 0,0.714375 -0.3228,1.217083 -0.3175,0.497417 -0.85725,0.762 -0.53975,0.259292 -1.21179,0.259292 h -0.95779 v 2.598208 h -1.582208 z m 1.582208,3.137958 h 0.51858 q 0.3228,0 0.5768,-0.09525 0.25929,-0.09525 0.41275,-0.301625 0.15345,-0.211666 0.15345,-0.555625 0,-0.34925 -0.15345,-0.550333 -0.15346,-0.206375 -0.41275,-0.296333 -0.254,-0.08996 -0.5768,-0.08996 h -0.51858 z"
158
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';fill:#ffffff;fill-opacity:1;stroke-width:0.26458332"
159
- id="path854" />
160
- </g>
161
- <rect
162
- style="fill:url(#linearGradient1408);fill-opacity:1;stroke:none;stroke-width:0.03697885;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
163
- id="rect1387"
164
- width="103.71816"
165
- height="1.2668874"
166
- x="-3.5527137e-15"
167
- y="65.308289" />
168
- </g>
169
- </svg>
@@ -1,107 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
-
4
- <svg
5
- xmlns:dc="http://purl.org/dc/elements/1.1/"
6
- xmlns:cc="http://creativecommons.org/ns#"
7
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
- xmlns:svg="http://www.w3.org/2000/svg"
9
- xmlns="http://www.w3.org/2000/svg"
10
- xmlns:xlink="http://www.w3.org/1999/xlink"
11
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
- width="103.71816mm"
14
- height="14.056225mm"
15
- viewBox="0 0 103.71816 14.056225"
16
- version="1.1"
17
- id="svg838"
18
- inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
19
- sodipodi:docname="capybara-lockstep.dark.svg"
20
- inkscape:export-filename="/home/henning/Projects/capybara-lockstep/media/capybara-lockstep.dark.png"
21
- inkscape:export-xdpi="196"
22
- inkscape:export-ydpi="196">
23
- <defs
24
- id="defs832">
25
- <linearGradient
26
- inkscape:collect="always"
27
- id="linearGradient1406">
28
- <stop
29
- style="stop-color:#ff0844;stop-opacity:1"
30
- offset="0"
31
- id="stop1402" />
32
- <stop
33
- style="stop-color:#ffb199;stop-opacity:1"
34
- offset="1"
35
- id="stop1404" />
36
- </linearGradient>
37
- <linearGradient
38
- inkscape:collect="always"
39
- xlink:href="#linearGradient1406"
40
- id="linearGradient1408"
41
- x1="22.054907"
42
- y1="91.071762"
43
- x2="88.956696"
44
- y2="91.071762"
45
- gradientUnits="userSpaceOnUse"
46
- gradientTransform="matrix(1.5503049,0,0,0.08820435,-34.191832,57.908781)" />
47
- </defs>
48
- <sodipodi:namedview
49
- id="base"
50
- pagecolor="#ffffff"
51
- bordercolor="#666666"
52
- borderopacity="1.0"
53
- inkscape:pageopacity="0.0"
54
- inkscape:pageshadow="2"
55
- inkscape:zoom="2.8"
56
- inkscape:cx="183.50717"
57
- inkscape:cy="-23.90459"
58
- inkscape:document-units="mm"
59
- inkscape:current-layer="layer1"
60
- showgrid="false"
61
- fit-margin-top="0"
62
- fit-margin-left="0"
63
- fit-margin-right="0"
64
- fit-margin-bottom="0"
65
- inkscape:window-width="1920"
66
- inkscape:window-height="1151"
67
- inkscape:window-x="1920"
68
- inkscape:window-y="0"
69
- inkscape:window-maximized="1"
70
- inkscape:pagecheckerboard="true" />
71
- <metadata
72
- id="metadata835">
73
- <rdf:RDF>
74
- <cc:Work
75
- rdf:about="">
76
- <dc:format>image/svg+xml</dc:format>
77
- <dc:type
78
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
79
- <dc:title></dc:title>
80
- </cc:Work>
81
- </rdf:RDF>
82
- </metadata>
83
- <g
84
- inkscape:label="Layer 1"
85
- inkscape:groupmode="layer"
86
- id="layer1"
87
- transform="translate(0,-52.518951)">
88
- <text
89
- xml:space="preserve"
90
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
91
- x="-0.27516666"
92
- y="59.630951"
93
- id="text1385"><tspan
94
- sodipodi:role="line"
95
- id="tspan1383"
96
- x="-0.27516666"
97
- y="59.630951"
98
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'League Spartan';-inkscape-font-specification:'League Spartan';stroke-width:0.26458332;fill:#ffffff;fill-opacity:1;">CAPYBARA-LOCKSTEP</tspan></text>
99
- <rect
100
- style="fill:url(#linearGradient1408);fill-opacity:1;stroke:none;stroke-width:0.03697885;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
101
- id="rect1387"
102
- width="103.71816"
103
- height="1.2668874"
104
- x="-3.5527137e-15"
105
- y="65.308289" />
106
- </g>
107
- </svg>