willamette 0.7.1 → 0.9.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: a4cbc6b7b9d3e64eaf46c8177384acbba815ecbd23fdc10c824cc004429a4b7a
4
- data.tar.gz: 1fc83d4a86c17ed5a5ded03bf349dd9b6a0cec42d7de879bd8b7e41dc206c513
3
+ metadata.gz: a4b853f52bf79b6b1653d57cafb45bbc7dc904f8de77e885fddf57de1724649a
4
+ data.tar.gz: 4b6f1bd188e86211babaa5f3ef67ada6f533e3465089e6d3ef42c5cf39a3088d
5
5
  SHA512:
6
- metadata.gz: f0c45968de2247b4f19c06d85dc4f5098ad55754a07addce4ae07edce8c0fe1cafd80d5fc0047f150e254cf013d901f88b820864c2ce9479f52f43abcff5d2ac
7
- data.tar.gz: 65963015a6e4eb5298cf44e758eaf0c1bf88daff2c5552cb112053b185b42fcd22e4fd5535c747eec797defda625ca70c3456ec9fd4292289b3bc63e83fdc752
6
+ metadata.gz: 88291ce695014b0647393b6c00119beab4b30b9ddd9b3afe5798b34d64d27fb04ccce61671fcd36de863213bc252d719dfd587409c486b6ff919cc516a72102e
7
+ data.tar.gz: a549b26f00fc725f59b507d73bba533ee1b791b1242b4709249b6f7d402baa71f19e2890ecd7e36db60c514f84a79146633eb070426159641e1e0ab4918b3bd8
data/CHANGELOG.md CHANGED
@@ -9,6 +9,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  - ...
11
11
 
12
+ ## [0.8.0] - 2026-04-30
13
+
14
+ - Allow toggling of starting (left) sidebar display
15
+ - Additional modularization of theme CSS
16
+ - Improved color swatches in Style Guide
17
+ - Upgrade Web Awesome to 3.6
18
+
12
19
  ## [0.7.1] - 2026-04-29
13
20
 
14
21
  - Restore bold links in top nav
data/Gemfile CHANGED
@@ -9,6 +9,7 @@ group :test do
9
9
  gem "minitest"
10
10
  gem "minitest-profile"
11
11
  gem "minitest-reporters"
12
+ gem "nokolexbor"
12
13
  end
13
14
 
14
15
  gem "rubocop-bridgetown", "~> 0.7"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- willamette (0.7.1)
4
+ willamette (0.9.0)
5
5
  bridgetown (>= 2.1, < 3.0)
6
6
  nokolexbor (>= 0.6)
7
7
 
@@ -241,6 +241,7 @@ DEPENDENCIES
241
241
  minitest
242
242
  minitest-profile
243
243
  minitest-reporters
244
+ nokolexbor
244
245
  rake (>= 13.0)
245
246
  rubocop-bridgetown (~> 0.7)
246
247
  solargraph (~> 0.58.2)
@@ -5,9 +5,25 @@ remove_file "src/_components/shared/navbar.rb"
5
5
  create_file "src/_components/shared.rb" do <<~RUBY
6
6
  module Shared
7
7
  class Navbar < Bridgetown::Component
8
- attr_reader :metadata, :resource
8
+ attr_reader :metadata, :resource, :strategy
9
9
 
10
- def initialize(metadata:, resource:) = (@metadata, @resource = metadata, resource)
10
+ # @param metadata [HashWithDotAccess::Hash]
11
+ # @param resource [Bridgetown::Resource::Base]
12
+ def initialize(metadata:, resource:)
13
+ @metadata, @resource = metadata, resource
14
+
15
+ @strategy = Willamette.navbar(
16
+ self,
17
+ logo: "/willamette/bridgetown-avatar.svg",
18
+ logo_alt: "Website Logo",
19
+ site_title: metadata.title,
20
+ nav_links: [
21
+ Willamette.link(title: t("nav.blog"), url: "/blog"),
22
+ Willamette.link(title: t("nav.about"), url: "/about"),
23
+ Willamette.link(icon: "mastodon", icon_family: "brands", icon_label: "Mastodon", title: nil, url: "https://mastodon.social"),
24
+ ]
25
+ )
26
+ end
11
27
  end
12
28
 
13
29
  class Sidebar < Bridgetown::Component
@@ -50,18 +66,19 @@ create_file "src/_components/shared/navbar.erb" do <<~HTML
50
66
  <% end %>
51
67
 
52
68
  <a slot="logo" href="/">
53
- <img src="<%= '/willamette/bridgetown-avatar.svg' %>" alt="Website Logo" />
54
- <span><%= metadata.title %></span>
69
+ <% if strategy.logo? %>
70
+ <img src="<%= strategy.logo %>" alt="<%= strategy.logo_alt %>" />
71
+ <% end %>
72
+ <% if strategy.site_title? %>
73
+ <span><%= strategy.site_title %></span>
74
+ <% end %>
55
75
  </a>
56
76
 
57
- <a href="<%= relative_url '/search' %>" slot="search"><wa-icon label="<%= t "labels.search" %>" name="search"></wa-icon> <span class="hide-for-mobile"><%= t "labels.search" %> <kbd style="vertical-align: 10%">⌘K</kbd></span></a>
77
+ <% if strategy.search? %>
78
+ <a href="<%= relative_url '/search' %>" slot="search"><wa-icon label="<%= t "labels.search" %>" name="search"></wa-icon> <span class="hide-for-mobile"><%= t "labels.search" %> <kbd style="vertical-align: 10%">⌘K</kbd></span></a>
79
+ <% end %>
58
80
 
59
- <ul slot="nav">
60
- <!-- customize this list! -->
61
- <li><a href="<%= relative_url '/blog' %>">Blog</a></li>
62
- <li><a href="<%= relative_url '/about' %>">About</a></li>
63
- <li><a href="#"><wa-icon label="Mastodon" family="brands" name="mastodon"></wa-icon></a></li>
64
- </ul>
81
+ <%= strategy.nav_links %>
65
82
  </header>
66
83
  HTML
67
84
  end
@@ -6,7 +6,7 @@ class Willamette::SearchDialog < Bridgetown::Component
6
6
  <wll-dialog-inner>
7
7
  </wll-dialog-inner>
8
8
 
9
- <wa-button slot="footer" size="small" appearance="outlined" variant="brand" pill data-dialog="close">
9
+ <wa-button slot="footer" size="s" appearance="outlined" variant="brand" pill data-dialog="close">
10
10
  <wa-icon name="circle-xmark" slot="start"></wa-icon>
11
11
  #{text->{t "labels.close" }}
12
12
  </wa-button>
data/content/search.erb CHANGED
@@ -4,8 +4,7 @@ title: Search
4
4
  ---
5
5
 
6
6
  <wll-search-page>
7
- <!-- input type="search" / -->
8
- <wa-input size="large" placeholder="<%= t("labels.search") %>…" pill>
7
+ <wa-input size="l" placeholder="<%= t("labels.search") %>…" pill>
9
8
  <wa-icon name="search" slot="start"></wa-icon>
10
9
  </wa-input>
11
10
 
@@ -14,6 +14,27 @@ end
14
14
  padding: 1rem;
15
15
  }
16
16
  }
17
+
18
+ ul.color-group {
19
+ display: flex;
20
+ flex-wrap: wrap;
21
+ gap: var(--wa-space-s);
22
+ list-style: none;
23
+ }
24
+
25
+ li.color-preview {
26
+ margin: 0;
27
+ }
28
+
29
+ wa-color-picker output {
30
+ border: 3px solid var(--wa-color-brand-fill-quiet);
31
+ border-radius: var(--wa-border-radius-m);
32
+ padding: .25rem .4rem;
33
+
34
+ &:empty {
35
+ border: none;
36
+ }
37
+ }
17
38
  </style>
18
39
 
19
40
  <wa-callout variant="brand">
@@ -23,13 +44,13 @@ end
23
44
 
24
45
  <hr />
25
46
 
26
- <wa-color-picker label="Choose a new brand color:" size="large" oninput='
47
+ <wa-color-picker label="Choose a new brand color:" size="l" oninput='
27
48
  document.documentElement.style.setProperty("--wll-color-brand", event.target.value)
28
49
  this.querySelector("output").textContent = `--wll-color-brand: ${event.target.value};`
29
50
  this.querySelector("wa-copy-button").slot = "hint"
30
51
  '>
31
52
  <output id="color-hint" slot="hint"></output>
32
- <wa-copy-button from="color-hint"></wa-copy-button>
53
+ <wa-copy-button from="color-hint" style="vertical-align: middle"></wa-copy-button>
33
54
  </wa-color-picker>
34
55
 
35
56
  <script type="module">
@@ -45,7 +66,7 @@ end
45
66
 
46
67
  ## Brand Color Scale
47
68
 
48
- <ul class="color-group" style="display: flex; flex-wrap: wrap; list-style: none">
69
+ <ul class="color-group">
49
70
  <li class="color-preview">
50
71
  <div class="color swatch" style="--color: var(--wa-color-brand-95)">
51
72
  <wa-copy-button value="--wa-color-brand-95" copy-label="--wa-color-brand-95"></wa-copy-button>
@@ -16,17 +16,17 @@
16
16
  <button type="button" class="wa-outlined" onclick="document.body.classList.toggle('sidebar-end-open')"><wa-icon name="list"></wa-icon></button>
17
17
  </div>
18
18
 
19
- <main-contents <%= "data-pagefind-body" unless data.exclude_from_pagefind %>>
19
+ <main-contents<%= ' data-pagefind-body' unless data.exclude_from_pagefind %>>
20
20
  <%= yield %>
21
21
  </main-contents>
22
-
22
+
23
23
  <wll-back-to-top>
24
24
  <button><wa-icon name="circle-chevron-up"></wa-icon></button>
25
25
  </wll-back-to-top>
26
26
  </main>
27
27
 
28
- <aside slot="sidebar-start">
29
- <%= render Shared::Sidebar.new(metadata: site.metadata, resource:) %>
28
+ <aside slot="sidebar-start"<%= ' hidden' if data.willamette&.hide_sidebar %>>
29
+ <%= render Shared::Sidebar.new(metadata: site.metadata, resource:) unless data.willamette&.hide_sidebar %>
30
30
  </aside>
31
31
 
32
32
  <aside slot="sidebar-end" hidden>
@@ -37,8 +37,6 @@
37
37
 
38
38
  <%= slotted :toc %>
39
39
 
40
- <hr />
41
-
42
40
  <!-- TOC insertion -->
43
41
  </aside>
44
42
 
@@ -20,3 +20,6 @@ en:
20
20
  follow: Follow Us
21
21
  subscribe: Subscribe
22
22
  see_also: See Also
23
+ nav:
24
+ blog: Blog
25
+ about: About
@@ -0,0 +1,41 @@
1
+ module Willamette
2
+ module Strategies
3
+ class Base
4
+ private
5
+
6
+ def links_html(links, slot: nil)
7
+ doc = Nokolexbor::HTML("<ul></ul>")
8
+ list = doc.at_css("ul")
9
+ list[:slot] = slot if slot
10
+ links.each_with_index do |link, index|
11
+ list << link_node(doc:, link:, folder: (links[index + 1]&.depth || 1) > link.depth)
12
+ end
13
+ list.to_html.html_safe
14
+ end
15
+
16
+ def link_node(doc:, link:, folder: false) # rubocop:disable Metrics
17
+ item = doc.create_element("li")
18
+ item[:"item-depth"] = link.depth
19
+ anchor = doc.create_element("a")
20
+ anchor[:href] = @component.relative_url(link.url)
21
+ anchor[:"aria-current"] = "page" if link.current
22
+
23
+ if link.icon || respond_to?(:default_link_icon)
24
+ icon = doc.create_element("wa-icon")
25
+ icon[:name] = link.icon || default_link_icon(folder:)
26
+ icon[:family] = link.icon_family if link.icon_family
27
+ icon[:label] = link.icon_label if link.icon_label
28
+ anchor << icon
29
+ end
30
+
31
+ if link.title
32
+ anchor << doc.create_text_node(" ")
33
+ anchor << doc.create_text_node(link.title)
34
+ end
35
+
36
+ item << anchor
37
+ item
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,9 +1,11 @@
1
1
  module Willamette
2
2
  # Contain logic for rendering
3
- Strategies::Link = Data.define(:depth, :current, :icon, :icon_family, :title, :url)
3
+ Strategies::Link = Data.define(
4
+ :depth, :current, :icon, :icon_family, :icon_label, :title, :url
5
+ )
4
6
 
5
- def self.link(depth: 1, current: false, icon: nil, icon_family: nil, **) # rubocop:disable Metrics/ParameterLists
6
- Strategies::Link.new(depth:, current:, icon:, icon_family:, **)
7
+ def self.link(depth: 1, current: false, icon: nil, icon_family: nil, icon_label: nil, **) # rubocop:disable Metrics/ParameterLists
8
+ Strategies::Link.new(depth:, current:, icon:, icon_family:, icon_label:, **)
7
9
  end
8
10
 
9
11
  def self.links_for(base_resource)
@@ -0,0 +1,43 @@
1
+ module Willamette
2
+ # rubocop:disable Metrics/ParameterLists
3
+ module Strategies
4
+ # Contain logic for navbar rendering
5
+ class Navbar < Base
6
+ attr_reader :logo, :logo_alt, :site_title
7
+
8
+ # Use the `navbar` module method on `Willamette`
9
+ def initialize(
10
+ component, logo:, logo_alt:, site_title:, nav_links:, search:
11
+ )
12
+ @component = component
13
+ @logo = logo
14
+ @logo_alt = logo_alt
15
+ @site_title = site_title
16
+ @nav_links = nav_links
17
+ @search = search
18
+ end
19
+
20
+ def logo? = @logo
21
+
22
+ def site_title? = @site_title
23
+
24
+ def search? = @search
25
+
26
+ def nav_links = links_html(@nav_links, slot: :nav)
27
+ end
28
+ end
29
+
30
+ def self.navbar(
31
+ component,
32
+ logo:,
33
+ site_title:,
34
+ nav_links:,
35
+ logo_alt: "logo",
36
+ search: true
37
+ )
38
+ Willamette::Strategies::Navbar.new(
39
+ component, logo:, logo_alt:, site_title:, nav_links:, search:
40
+ )
41
+ end
42
+ # rubocop:enable Metrics/ParameterLists
43
+ end
@@ -1,75 +1,47 @@
1
1
  module Willamette
2
- # Contain logic for rendering
3
2
  # rubocop:disable Metrics/ParameterLists
4
- class Strategies::Sidebar
5
- attr_reader :description
6
-
7
- # Use the `sidebar` module method on `Willamette`
8
- def initialize(
9
- component, description:, explore_links:, follow_links:, subscribe:, see_also_links:
10
- )
11
- @component = component
12
- @description = description
13
- @explore_links = explore_links || []
14
- @follow_links = follow_links || []
15
- @subscribe = subscribe
16
- @see_also_links = see_also_links || []
17
- end
18
-
19
- def explore? = !@explore_links.empty?
3
+ module Strategies
4
+ # Contain logic for sidebar rendering
5
+ class Sidebar < Base
6
+ attr_reader :description
7
+
8
+ # Use the `sidebar` module method on `Willamette`
9
+ def initialize(
10
+ component, description:, explore_links:, follow_links:, subscribe:, see_also_links:
11
+ )
12
+ @component = component
13
+ @description = description
14
+ @explore_links = explore_links || []
15
+ @follow_links = follow_links || []
16
+ @subscribe = subscribe
17
+ @see_also_links = see_also_links || []
18
+ end
20
19
 
21
- def explore_links = links_html(@explore_links)
20
+ def explore? = !@explore_links.empty?
22
21
 
23
- def description? = @description && !explore?
22
+ def explore_links = links_html(@explore_links)
24
23
 
25
- def follow? = !@follow_links.empty?
24
+ def description? = @description && !explore?
26
25
 
27
- def follow_links = links_html(@follow_links)
26
+ def follow? = !@follow_links.empty?
28
27
 
29
- def subscribe? = @subscribe
28
+ def follow_links = links_html(@follow_links)
30
29
 
31
- def see_also? = !@see_also_links.empty?
30
+ def subscribe? = @subscribe
32
31
 
33
- def see_also_links = links_html(@see_also_links)
32
+ def see_also? = !@see_also_links.empty?
34
33
 
35
- def default_link_icon(folder: false)
36
- folder ? "folder-open" : "file-lines"
37
- end
34
+ def see_also_links = links_html(@see_also_links)
38
35
 
39
- private
40
-
41
- def links_html(links)
42
- doc = Nokolexbor::HTML("<ul></ul>")
43
- list = doc.at_css("ul")
44
- links.each_with_index do |link, index|
45
- list << link_node(doc:, link:, folder: (links[index + 1]&.depth || 1) > link.depth)
36
+ def default_link_icon(folder: false)
37
+ folder ? "folder-open" : "file-lines"
46
38
  end
47
- list.to_html.html_safe
48
- end
49
-
50
- def link_node(doc:, link:, folder: false) # rubocop:disable Metrics/AbcSize
51
- item = doc.create_element("li")
52
- item[:"item-depth"] = link.depth
53
- anchor = doc.create_element("a")
54
- anchor[:href] = @component.relative_url(link.url)
55
- anchor[:"aria-current"] = "page" if link.current
56
-
57
- icon = doc.create_element("wa-icon")
58
- icon[:name] = link.icon || default_link_icon(folder:)
59
- icon[:family] = link.icon_family if link.icon_family
60
- anchor << icon
61
-
62
- anchor << doc.create_text_node(" ")
63
- anchor << doc.create_text_node(link.title)
64
-
65
- item << anchor
66
- item
67
39
  end
68
40
  end
69
41
 
70
42
  def self.sidebar(
71
43
  component,
72
- description:,
44
+ description: nil,
73
45
  explore_links: nil,
74
46
  follow_links: nil,
75
47
  subscribe: false,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Willamette
4
- VERSION = "0.7.1"
4
+ VERSION = "0.9.0"
5
5
  end
data/lib/willamette.rb CHANGED
@@ -13,7 +13,9 @@ end
13
13
  require "willamette/builders/author_extension"
14
14
  require "willamette/builders/inspectors"
15
15
  require "willamette/builders/toc"
16
+ require "willamette/strategies/base"
16
17
  require "willamette/strategies/link"
18
+ require "willamette/strategies/navbar"
17
19
  require "willamette/strategies/sidebar"
18
20
 
19
21
  # use `<wll-code>` element instead of `<div>`
data/package-lock.json CHANGED
@@ -1,32 +1,33 @@
1
1
  {
2
2
  "name": "willamette",
3
- "version": "0.1.1",
3
+ "version": "0.9.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "willamette",
9
- "version": "0.1.1",
9
+ "version": "0.9.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@awesome.me/webawesome": ">=3.0.0",
12
+ "@awesome.me/webawesome": ">=3.6.0",
13
13
  "hotkeys-js": "^4.0.0",
14
14
  "pagefind": "^1.4.0"
15
15
  }
16
16
  },
17
17
  "node_modules/@awesome.me/webawesome": {
18
- "version": "3.0.0",
19
- "resolved": "https://registry.npmjs.org/@awesome.me/webawesome/-/webawesome-3.0.0.tgz",
20
- "integrity": "sha512-KLxAiSV9hH+bB8OkpaZUA9zNgBu6G1cXirsE0VWmdS/jtpup1Wf1aC7yGYjPSi/61BVUqk8geA4oylt4oLdmlQ==",
18
+ "version": "3.6.0",
19
+ "resolved": "https://registry.npmjs.org/@awesome.me/webawesome/-/webawesome-3.6.0.tgz",
20
+ "integrity": "sha512-cUQWAq5KwQzy1fsMFUSJqGL6z/s9/VFOqnypOZOXZdpsfnD7gVFKnY6if9EbgzxtCXiHTOnEZ8N3mnwW2Z/Sww==",
21
21
  "license": "MIT",
22
22
  "dependencies": {
23
23
  "@ctrl/tinycolor": "4.1.0",
24
24
  "@floating-ui/dom": "^1.6.13",
25
25
  "@lit/react": "^1.0.8",
26
26
  "@shoelace-style/animations": "^1.2.0",
27
- "@shoelace-style/localize": "^3.2.1",
27
+ "@shoelace-style/localize": "^3.2.2",
28
28
  "composed-offset-position": "^0.0.6",
29
29
  "lit": "^3.2.1",
30
+ "marked": "^11.2.0",
30
31
  "nanoid": "^5.1.5",
31
32
  "qr-creator": "^1.0.0"
32
33
  },
@@ -181,9 +182,9 @@
181
182
  }
182
183
  },
183
184
  "node_modules/@shoelace-style/localize": {
184
- "version": "3.2.1",
185
- "resolved": "https://registry.npmjs.org/@shoelace-style/localize/-/localize-3.2.1.tgz",
186
- "integrity": "sha512-r4C9C/5kSfMBIr0D9imvpRdCNXtUNgyYThc4YlS6K5Hchv1UyxNQ9mxwj+BTRH2i1Neits260sR3OjKMnplsFA==",
185
+ "version": "3.2.2",
186
+ "resolved": "https://registry.npmjs.org/@shoelace-style/localize/-/localize-3.2.2.tgz",
187
+ "integrity": "sha512-h3+2/cFWGaw3KQUwintkP4Cy3PtrVW//ysr9DM5nOfIXYekgrHwsELk/nyxc8hmjVP/Kcon7KCzvUtSwUBipfQ==",
187
188
  "license": "MIT"
188
189
  },
189
190
  "node_modules/@types/react": {
@@ -258,6 +259,18 @@
258
259
  "@types/trusted-types": "^2.0.2"
259
260
  }
260
261
  },
262
+ "node_modules/marked": {
263
+ "version": "11.2.0",
264
+ "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz",
265
+ "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==",
266
+ "license": "MIT",
267
+ "bin": {
268
+ "marked": "bin/marked.js"
269
+ },
270
+ "engines": {
271
+ "node": ">= 18"
272
+ }
273
+ },
261
274
  "node_modules/nanoid": {
262
275
  "version": "5.1.6",
263
276
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz",
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "willamette",
3
- "version": "0.7.1",
3
+ "version": "0.9.0",
4
4
  "main": "frontend/javascript/index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,7 +15,7 @@
15
15
  "frontend"
16
16
  ],
17
17
  "dependencies": {
18
- "@awesome.me/webawesome": ">=3.0.0",
18
+ "@awesome.me/webawesome": ">=3.6.0",
19
19
  "hotkeys-js": "^4.0.0",
20
20
  "pagefind": "^1.4.0"
21
21
  }
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: willamette
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bridgetown Team
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-04-30 00:00:00.000000000 Z
10
+ date: 2026-05-05 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: bridgetown
@@ -116,7 +116,9 @@ files:
116
116
  - lib/willamette/builders/inspectors.rb
117
117
  - lib/willamette/builders/toc.rb
118
118
  - lib/willamette/locales/en.yml
119
+ - lib/willamette/strategies/base.rb
119
120
  - lib/willamette/strategies/link.rb
121
+ - lib/willamette/strategies/navbar.rb
120
122
  - lib/willamette/strategies/sidebar.rb
121
123
  - lib/willamette/version.rb
122
124
  - package-lock.json