From 043a30c9fa4ccbb9158932fd917a44ca94a9bd63 Mon Sep 17 00:00:00 2001 From: George Kiagiadakis Date: Thu, 3 Sep 2026 15:44:48 +0300 Subject: [PATCH] Add a linux-bluetooth mailing list page Replace the footer link to subspace.kernel.org with a local page covering how to subscribe, post, report bugs and send patches to the list, along with the list addresses, the lore archive, Patchwork and the kernel.org list hosting docs. Generalise the news article styling into a shared .articleBody class so content pages can reuse it, add a .calloutNote component, and emit per-page and description metadata. Closes: #3 --- assets/css/main.css | 187 +++++++++++++++++++++-------- content/mailing-list.md | 97 +++++++++++++++ data/footer_links.yaml | 2 +- layouts/mailing-list/single.html | 60 +++++++++ layouts/news/single.html | 4 +- layouts/partials/footer-links.html | 3 +- layouts/partials/head.html | 4 +- 7 files changed, 300 insertions(+), 57 deletions(-) create mode 100644 content/mailing-list.md create mode 100644 layouts/mailing-list/single.html diff --git a/assets/css/main.css b/assets/css/main.css index 2ff4119..b5184b7 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -10,6 +10,8 @@ --color-grey: #333333; --color-white: #ffffff; --color-light-grey-bg: #f0f0f0; + --color-border: #eaeaea; + --color-blue-tint: #eef3ff; --gradient-blue: linear-gradient(180deg, var(--color-light-blue) 0%, var(--color-dark-blue) 100%); @@ -1037,12 +1039,12 @@ a.footer-link-action:hover { color: var(--color-black); } -.newsIndexLoadMoreWrapper { +.pageActionWrapper { width: 100%; margin: 100px 0 0; position: relative; } -.newsIndexLoadMoreWrapper a { +.pageActionWrapper a { font-size: 16px; font-weight: 700; color: var(--color-black); @@ -1056,7 +1058,7 @@ a.footer-link-action:hover { transition: all 0.3s ease-in-out; text-decoration: none; } -.newsIndexLoadMoreWrapper a::after { +.pageActionWrapper a::after { content: ''; width: 100%; border-top: 1px solid #eaeaea; @@ -1065,7 +1067,7 @@ a.footer-link-action:hover { left: 0; top: 28px; } -.newsIndexLoadMoreWrapper a:hover { +.pageActionWrapper a:hover { background-color: var(--color-dark-blue); color: #fff; text-decoration: none; @@ -1122,12 +1124,16 @@ a.footer-link-action:hover { } /* ======================================== - 14. NEWS ARTICLE (single page) + 14. ARTICLE BODY (content single pages) ======================================== */ -.newsArticleBody { +.articleBody { padding: 0 10%; } +/* Pages with no date header need to supply that spacing themselves */ +.articleBody-noMeta { + padding-top: 70px; +} .newsArticleDateWrapper { margin: 30px 0 40px; width: 100%; @@ -1136,53 +1142,65 @@ a.footer-link-action:hover { .newsArticleDateWrapper p { font-size: 15px; } -.newsArticleBody .heroIMG { +.articleBody .heroIMG { width: 100%; height: auto; margin-bottom: 40px; } -.newsArticleBody .heroIMG img { +.articleBody .heroIMG img { width: 100%; height: auto; display: block; } /* Article typography */ -.newsArticleBody p, -.newsArticleBody li { +.articleBody p, +.articleBody li { line-height: 150%; } -.newsArticleBody hr { +.articleBody hr { margin: 25px 0; border: none; border-top: 1px solid #eaeaea; } -.newsArticleBody h1, -.newsArticleBody h2, -.newsArticleBody h3, -.newsArticleBody h4, -.newsArticleBody h5, -.newsArticleBody h6 { +.articleBody h1, +.articleBody h2, +.articleBody h3, +.articleBody h4, +.articleBody h5, +.articleBody h6 { line-height: 130%; margin: 25px 0 10px; padding: 0; } -.newsArticleBody ul, -.newsArticleBody ol { +.articleBody ul, +.articleBody ol { margin-left: 15px; margin-bottom: 15px; } -.newsArticleBody li { +.articleBody li { padding-left: 15px; margin-bottom: 4px; } -.newsArticleBody blockquote { +.articleBody blockquote { border-left: 3px solid var(--color-dark-blue); margin-left: 0; padding: 10px 0 10px 30px; color: var(--color-light-blue); } -.newsArticleBody code { +.articleBody .calloutNote { + border-left: 5px solid var(--color-dark-blue); + background: var(--color-blue-tint); + padding: 20px 30px; + margin: 0 0 35px; +} +.articleBody .calloutNote p { + margin: 0; +} +.articleBody .calloutNote a { + font-weight: 700; +} +.articleBody code { display: inline-block; font-family: "Source Code Pro", Courier, 'Courier New', monospace; font-weight: 500; @@ -1190,7 +1208,7 @@ a.footer-link-action:hover { line-height: 150%; max-width: 100%; } -.newsArticleBody code span { +.articleBody code span { font-size: 14px; line-height: 140%; margin-bottom: 7px; @@ -1199,16 +1217,16 @@ a.footer-link-action:hover { } /* Fenced code blocks (Hugo/Chroma output: .highlight > pre > code) */ -.newsArticleBody .highlight { +.articleBody .highlight { margin-bottom: 1em; } -.newsArticleBody .highlight pre { +.articleBody .highlight pre { padding: 20px; border: 1px solid #eaeaea; margin: 0; overflow-x: auto; } -.newsArticleBody pre { +.articleBody pre { font-family: "Source Code Pro", Courier, 'Courier New', monospace; font-size: 14px; line-height: 150%; @@ -1217,14 +1235,14 @@ a.footer-link-action:hover { overflow-x: auto; margin: 0 0 1em; } -.newsArticleBody pre code { +.articleBody pre code { display: block; font-size: 14px; line-height: 150%; } /* Cite element (appears after blockquotes) */ -.newsArticleBody cite { +.articleBody cite { display: block; font-style: italic; font-size: 14px; @@ -1236,19 +1254,22 @@ a.footer-link-action:hover { /* Article responsive */ @media only screen and (max-width: 1250px) { - .newsArticleBody { + .articleBody { padding: 0 5%; } } @media only screen and (max-width: 1000px) { - .newsArticleBody { + .articleBody { padding: 0 3%; } - .newsArticleBody p, - .newsArticleBody li { + .articleBody-noMeta { + padding-top: 50px; + } + .articleBody p, + .articleBody li { font-size: 15px; } - .newsArticleBody .heroIMG { + .articleBody .heroIMG { margin-bottom: 30px; } .newsArticleDateWrapper { @@ -1259,7 +1280,7 @@ a.footer-link-action:hover { } } @media only screen and (max-width: 800px) { - .newsArticleBody .heroIMG img { + .articleBody .heroIMG img { width: calc(100% + 60px + 8%); position: relative; left: calc(-30px - 4%); @@ -1268,23 +1289,30 @@ a.footer-link-action:hover { .newsArticleDateWrapper { margin: 20px 0 25px; } - .newsArticleBody code span { + .articleBody code span { font-size: 13px; } - .newsArticleBody .highlight pre, - .newsArticleBody pre { + .articleBody .highlight pre, + .articleBody pre { padding: 15px; font-size: 13px; } - .newsArticleBody pre code { + .articleBody pre code { font-size: 13px; } } @media only screen and (max-width: 650px) { - .newsArticleBody { + .articleBody { padding: 0 2%; } - .newsArticleBody .heroIMG { + .articleBody-noMeta { + padding-top: 40px; + } + .articleBody .calloutNote { + padding: 15px 20px; + margin-bottom: 25px; + } + .articleBody .heroIMG { margin-bottom: 25px; } .newsArticleDateWrapper { @@ -1293,7 +1321,7 @@ a.footer-link-action:hover { .newsArticleDateWrapper p { font-size: 13px; } - .newsArticleBody .heroIMG img { + .articleBody .heroIMG img { width: calc(150% + 60px + 4%); position: relative; left: calc(-30px - 2% - 25%); @@ -1301,32 +1329,35 @@ a.footer-link-action:hover { main { overflow-x: hidden; } - .newsArticleBody ul, - .newsArticleBody ol { + .articleBody ul, + .articleBody ol { margin-left: 10px; margin-bottom: 15px; } - .newsArticleBody li { + .articleBody li { padding-left: 10px; } } @media only screen and (max-width: 450px) { - .newsArticleBody { + .articleBody { padding: 0; } - .newsArticleBody p, - .newsArticleBody li { + .articleBody-noMeta { + padding-top: 35px; + } + .articleBody p, + .articleBody li { font-size: 14px; } .newsArticleDateWrapper { margin: 15px 0 20px; } - .newsArticleBody ul, - .newsArticleBody ol { + .articleBody ul, + .articleBody ol { margin-left: 8px; margin-bottom: 15px; } - .newsArticleBody li { + .articleBody li { padding-left: 8px; } } @@ -1352,7 +1383,7 @@ a.footer-link-action:hover { background: #fff; } -.newsIndexLoadMoreWrapper.backToNewsBtnWrapper { +.pageActionWrapper.backLinkWrapper { margin-top: 75px; margin-bottom: 60px; } @@ -1364,3 +1395,57 @@ a.footer-link-action:hover { html { scroll-behavior: smooth; } + +/* ======================================== + 17. MAILING LIST INFO + ======================================== */ + +.mailingListInfo { + border: 1px solid var(--color-border); + background: var(--color-light-grey-bg); + padding: 8px 30px; + margin-bottom: 2rem; +} + +.mailingListInfo dl { + margin: 0; +} + +.mailingListInfo-row { + display: flex; + flex-wrap: wrap; + gap: 8px 24px; + padding: 15px 0; + border-bottom: 1px solid var(--color-border); +} + +.mailingListInfo-row:last-child { + border-bottom: none; +} + +.mailingListInfo-row dt { + flex: 0 0 160px; + font-weight: 700; + color: var(--color-black); +} + +.mailingListInfo-row dd { + flex: 1 1 300px; + margin: 0; + color: var(--color-grey); +} + +.mailingListInfo-row code { + background: var(--color-white); + border: 1px solid var(--color-border); + padding: 2px 6px; +} + +@media only screen and (max-width: 640px) { + .mailingListInfo { + padding: 4px 20px; + } + .mailingListInfo-row dt { + flex-basis: 100%; + } +} diff --git a/content/mailing-list.md b/content/mailing-list.md new file mode 100644 index 0000000..d4af56f --- /dev/null +++ b/content/mailing-list.md @@ -0,0 +1,97 @@ +--- +title: "linux-bluetooth Mailing List" +type: "mailing-list" +description: "How to subscribe to, post on, and browse the archives of the linux-bluetooth kernel mailing list." +list_address: "linux-bluetooth@vger.kernel.org" +subscribe_mailto: "mailto:linux-bluetooth+subscribe@vger.kernel.org" +subscribe_digest_mailto: "mailto:linux-bluetooth+subscribe-digest@vger.kernel.org" +unsubscribe_mailto: "mailto:linux-bluetooth+unsubscribe@vger.kernel.org" +post_mailto: "mailto:linux-bluetooth@vger.kernel.org" +archive_url: "https://lore.kernel.org/linux-bluetooth/" +patchwork_url: "https://patchwork.kernel.org/project/bluetooth/list/" +hosting_info_url: "https://subspace.kernel.org/vger.kernel.org.html#linux-bluetooth" +--- + +The **linux-bluetooth** list is where development of the Linux kernel Bluetooth +subsystem and the BlueZ userspace stack is discussed. Patches, bug reports, and +design discussions for both the kernel Bluetooth code and BlueZ happen here. +The Linux Bluetooth stack is written by many people, so please use the list +instead of emailing developers directly. + +## Subscribing + +You do **not** need to subscribe in order to post — subscribing only means you +receive a copy of every message, either individually or as a daily digest. +kernel.org [advises Gmail users](https://subspace.kernel.org/subscribing.html) +to take the digest on busy lists, because individual delivery can push you past +Gmail's delivery quota and make you miss unrelated mail as well. To stop +receiving list mail, send a message to the unsubscribe address below; its +subject and body are ignored and can be left blank. + +<div class="calloutNote"> + +Don't want to follow the list itself? **Weekly summaries of activity on this +list** are published on the [BlueZ news page]({{< relref "/news" >}}). + +</div> + +## Posting to the list + +A handful of rules apply to every kernel.org list, and mail that ignores them +is usually rejected or quietly ignored: + +- **Send plain text only.** HTML mail is rejected by the list. This is by far + the most common reason a first post never appears. +- **Use a short, descriptive subject.** "Bluetooth is broken" tells nobody + anything; "LE scanning stalls after resume on Intel AX211" does. +- **Reply to all** so the discussion stays on the list, quote inline rather + than above the whole message, and trim the parts you are not replying to. +- **Strip corporate confidentiality disclaimers** before posting to a public + list. + +The reasoning behind each of these is spelled out in the +[kernel.org mailing list etiquette guide](https://subspace.kernel.org/etiquette.html). +It is also worth searching the archive before asking — many questions have +been answered already. + +## Reporting a bug + +Bugs in the BlueZ userspace stack are tracked on GitHub: please open an issue +at [bluez/bluez](https://github.com/bluez/bluez/issues) rather than posting it +here. Bugs in the kernel Bluetooth subsystem are not tracked there and do +belong on this list. + +Either way, include the BlueZ version (`bluetoothd --version`), the kernel +version, and which adapter is involved. Nearly every Bluetooth problem needs a +HCI trace to diagnose, so capture the failure with `btmon` and include that, +along with the output of `bluetoothd -n -d` if the daemon is involved. Say what +you expected to happen and what happened instead. + +**Do not report suspected security vulnerabilities through either channel.** +Public disclosure makes an issue ineligible for a CVE; file a draft advisory as +described in the +[BlueZ security policy](https://github.com/bluez/bluez/blob/master/SECURITY.md) +instead. + +## Sending patches + +The preferred way to send patches is by email with `git send-email`. Which +rules apply depends on which tree you are patching, and confusing the two is a +common reason for a patch to be sent back: + +- **BlueZ userspace** — prefix the subject with `[PATCH BlueZ]`, follow the + BlueZ coding style, and do **not** add a `Signed-off-by` line; BlueZ does + not use them, so including one is an error. The full set of rules is in + [HACKING](https://github.com/bluez/bluez/blob/master/HACKING). +- **Kernel Bluetooth subsystem** — the standard + [kernel patch submission process](https://www.kernel.org/doc/html/latest/process/submitting-patches.html) + applies, `Signed-off-by` included. + +Bug fixes take priority over new features, so send them separately rather than +bundling them with a larger series. If an AI coding assistant was involved, +disclose it with an `Assisted-by` tag as described in +[doc/coding-assistants.rst](https://github.com/bluez/bluez/blob/master/doc/coding-assistants.rst). + +Once sent, your patch appears in Patchwork (linked below), which tracks its +review state. If a submission goes unanswered for a while, reply to your +own message to bump the thread rather than resending it as a new post. diff --git a/data/footer_links.yaml b/data/footer_links.yaml index c0f147b..6756ce6 100644 --- a/data/footer_links.yaml +++ b/data/footer_links.yaml @@ -6,7 +6,7 @@ columns: icon: "github" - heading: "Mailing list" description: "The parts of the Linux Bluetooth stack are written by many people and it is not the job of just one single person. If you want to get in contact with the developers, please join the developer mailing list and never write to them directly." - url: "https://subspace.kernel.org/vger.kernel.org.html#linux-bluetooth" + url: "/mailing-list/" link_text: "Subscribe to the linux-bluetooth mailing list" icon: "mail" - heading: "Slack" diff --git a/layouts/mailing-list/single.html b/layouts/mailing-list/single.html new file mode 100644 index 0000000..3ccf669 --- /dev/null +++ b/layouts/mailing-list/single.html @@ -0,0 +1,60 @@ +{{ define "main" }} + {{- partial "header.html" . -}} + <main> + <section class="hero contentHero"> + <div class="container"> + <h1>{{ .Title }}</h1> + </div> + </section> + + <section class="articleBody articleBody-noMeta"> + <div class="container"> + {{ .Content }} + + <div class="mailingListInfo"> + <dl> + <div class="mailingListInfo-row"> + <dt>List address</dt> + <dd><code>{{ .Params.list_address }}</code></dd> + </div> + <div class="mailingListInfo-row"> + <dt>Subscribe</dt> + <dd> + <a href="{{ .Params.subscribe_mailto }}">Subscribe (individual mail)</a> + · + <a href="{{ .Params.subscribe_digest_mailto }}">Subscribe (daily digest)</a> + </dd> + </div> + <div class="mailingListInfo-row"> + <dt>Unsubscribe</dt> + <dd><a href="{{ .Params.unsubscribe_mailto }}">Unsubscribe</a></dd> + </div> + <div class="mailingListInfo-row"> + <dt>Post</dt> + <dd><a href="{{ .Params.post_mailto }}">{{ .Params.list_address }}</a> (no subscription required)</dd> + </div> + <div class="mailingListInfo-row"> + <dt>Web archive</dt> + <dd><a href="{{ .Params.archive_url }}" target="_blank" rel="noopener">{{ .Params.archive_url }}</a></dd> + </div> + <div class="mailingListInfo-row"> + <dt>Patch tracking</dt> + <dd><a href="{{ .Params.patchwork_url }}" target="_blank" rel="noopener">Bluetooth project on Patchwork</a></dd> + </div> + <div class="mailingListInfo-row"> + <dt>List hosting</dt> + <dd><a href="{{ .Params.hosting_info_url }}" target="_blank" rel="noopener">kernel.org subspace documentation</a></dd> + </div> + </dl> + </div> + + <div class="pageActionWrapper backLinkWrapper"> + <a href="{{ "/" | relURL }}" title="Back to home">Back to home</a> + </div> + </div> + </section> + + {{- partial "footer-links.html" . -}} + </main> + {{- partial "footer.html" . -}} +{{ end }} diff --git a/layouts/news/single.html b/layouts/news/single.html index 7794af1..35fc393 100644 --- a/layouts/news/single.html +++ b/layouts/news/single.html @@ -7,7 +7,7 @@ <h1>{{ .Title }}</h1> </div> </section> - <section class="newsArticleBody"> + <section class="articleBody"> <div class="container"> <div class="newsArticleDateWrapper"> <p>{{ .Date.Format "2 January 2006" }}</p> @@ -24,7 +24,7 @@ <h1>{{ .Title }}</h1> {{ .Content }} - <div class="newsIndexLoadMoreWrapper backToNewsBtnWrapper"> + <div class="pageActionWrapper backLinkWrapper"> <a href="{{ "news/" | relURL }}" title="Back to News">Back to news</a> </div> </div> diff --git a/layouts/partials/footer-links.html b/layouts/partials/footer-links.html index b585e33..eec1b66 100644 --- a/layouts/partials/footer-links.html +++ b/layouts/partials/footer-links.html @@ -4,7 +4,8 @@ <div class="footer-link-col"> <h3>{{ .heading }}</h3> <p>{{ .description }}</p> - <a href="{{ .url }}" class="footer-link-action" target="_blank" rel="noopener"> + {{ $isExternal := not (hasPrefix .url "/") }} + <a href="{{ .url | relURL }}" class="footer-link-action" {{ if $isExternal }}target="_blank" rel="noopener"{{ end }}> {{ partial (printf "icons/%s.html" .icon) . }} {{ .link_text }} </a> diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 657d603..47c8498 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -1,7 +1,7 @@ <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> -<title>{{ .Site.Title }} - +{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} | {{ .Site.Title }}{{ end }} + {{/* CSS via Hugo Pipes */}} {{ $css := resources.Get "css/main.css" | minify | fingerprint }}