1919
2020body {
2121 font-family : "Segoe UI" , Tahoma, Geneva, Verdana, sans-serif;
22- line-height : 1.6 ;
22+ line-height : 1.4 ;
2323 color : var (--rust-light );
2424 background-color : var (--rust-dark );
2525 max-width : 900px ;
3535h5 ,
3636h6 {
3737 color : var (--rust-orange );
38- margin-top : 1.5 em ;
39- margin-bottom : 0.5 em ;
38+ margin-top : 1.3 em ;
39+ margin-bottom : 0.4 em ;
4040 font-weight : 600 ;
41- line-height : 1.3 ;
41+ line-height : 1.2 ;
4242}
4343
4444h1 {
8787}
8888
8989a : hover {
90- border-bottom-color : var (--rust-link );
90+ border-bottom-color : var (--rust-gray );
9191}
9292
9393/* Lists */
185185h6 code {
186186 font-size : 0.9em ;
187187}
188- </ style > </ head > < title > Rust Basel Meetups</ title > < div id =" 0 "> < h2 > Opensource Contributions Meetup </ h2 > </ div > < div > < h3 > Address </ h3 > < p > Barfüsserplatz 6 </ p > < p > Basel </ p > < p > 4051 </ p > < p > Switzerland </ p > < p > Level 4 - Optravis Headquarter</ p > </ div > < h3 > Sponsors</ h3 > < div > < p > Optravic LLC</ p > < a href ="http://optravis.com "> http://optravis.com</ a > < p > </ p > </ div > < div > < h3 > Opensource Contribution Meetup</ h3 >
188+ </ style > </ head > < title > Rust Basel Meetups</ title > < a href =" https://rust-basel.ch "> < h1 > Rust Basel | Meetups | Workshops </ h1 > </ a > < div > < input type =" search " id =" search " placeholder =" Search Meetups " > < button > Search </ button > </ div > < div id =" 0 " > < h2 > Opensource Contributions Meetup | ? | 0 </ h2 > </ div > < div > < p > Level 4 - Optravis Headquarter | Barfüsserplatz 6 | Basel | 4051 </ p > </ div > < h3 > Sponsors</ h3 > < div > < p > Optravic LLC</ p > < a href ="http://optravis.com "> http://optravis.com</ a > < p > </ p > </ div > < div > < h3 > Meetup</ h3 >
189189< p > Welcome to the first Rust Basel meetup focused on open source contributions!</ p >
190+ < h3 > Featured Projects and Issues</ h3 >
191+ < h4 > Issues</ h4 >
192+ < ul >
193+ < li > < a href ="https://github.com/vleue/vleue_navigator/issues/106 "> https://github.com/vleue/vleue_navigator/issues/106</ a > </ li >
194+ </ ul >
195+ < h4 > Repositories</ h4 >
196+ < ul >
197+ < li > < a href ="https://github.com/BloopAI/vibe-kanban "> https://github.com/BloopAI/vibe-kanban</ a > </ li >
198+ < li > < a href ="https://github.com/ironcalc/IronCalc "> https://github.com/ironcalc/IronCalc</ a > </ li >
199+ < li > < a href ="https://github.com/rust-basel/cli "> https://github.com/rust-basel/cli</ a > </ li >
200+ < li > Create your own Rust Open Source Project</ li >
201+ </ ul >
190202< h3 > Teambuilding</ h3 >
191- < p > Build a team of two or three people.
192- Teams with three people might want to make sure that at least one person has some prior experience with Rust.</ p >
193- < h3 > Choose a project</ h3 >
194- < p > First decide what option you want to pursue:</ p >
195- < p > Options:</ p >
203+ < ul >
204+ < li > We vote on which projects people want to work on.</ li >
205+ < li > If more than three people want to work on the same project, we split the team into two teams.</ li >
206+ < li > Make your spaces.</ li >
207+ </ ul >
208+ < h3 > We vote on which ones are left over</ h3 >
196209< ul >
197210< li > Contribute to an existing Rust Open Source Project</ li >
198211< li > Start your own Open Source Project that integrates with Software via some Protocols or APIs
@@ -207,34 +220,123 @@ <h3>Choose a project</h3>
207220</ li >
208221</ ul >
209222< h4 > Solving Tickets</ h4 >
210- < p > Make sure to first decide on the technical branch you are maybe intersted in:</ p >
211- < ul >
212- < li > Embedded</ li >
213- < li > WebDev</ li >
214- < li > CLI</ li >
215- < li > GUI</ li >
216- < li > Databases</ li >
217- < li > ServerFrameworks</ li >
218- < li > Blockchain</ li >
219- </ ul >
220- < p > Then search what projects exitst in that area, see if there are any open tickets.
221- What to look out for:</ p >
223+ < p > What to look out for:</ p >
222224< ul >
223225< li > Tickets with Help Wanted Label</ li >
224226< li > Tickets with Good First Issue Label</ li >
225227</ ul >
226- < h4 > Integrating with Projects</ h4 >
227- < p > Normally you use some software that can be extended in some way or support interactions over some protocol or API.
228- Think about what software you use on a daily basis, or what software you would like to use but is missing some maybe a ui or a cli.</ p >
229- < h3 > Projects and Issues</ h3 >
230- < h4 > Issues</ h4 >
231- < ul >
232- < li > < a href ="https://github.com/vleue/vleue_navigator/issues/106 "> https://github.com/vleue/vleue_navigator/issues/106</ a > </ li >
233- </ ul >
234- < h4 > Repositories</ h4 >
235- < ul >
236- < li > < a href ="https://github.com/BloopAI/vibe-kanban "> https://github.com/BloopAI/vibe-kanban</ a > </ li >
237- < li > < a href ="https://github.com/ironcalc/IronCalc "> https://github.com/ironcalc/IronCalc</ a > </ li >
238- < li > < a href ="https://github.com/rust-basel/cli "> https://github.com/rust-basel/cli</ a > </ li >
239- </ ul >
240- </ div >
228+ </ div > < script > /**
229+ * Automatically jumps to elements based on search input field changes
230+ * Searches through all text content in the page and scrolls to the first match
231+ */
232+ ( function ( ) {
233+ // Find all input fields with type="search" or role="search" or class containing "search"
234+ const searchInputs = document . querySelectorAll ( "search" ) ;
235+
236+ // If no search inputs found, create a listener for any input field
237+ const inputs =
238+ searchInputs . length > 0
239+ ? searchInputs
240+ : document . querySelectorAll ( "search" ) ;
241+
242+ /**
243+ * Highlights matching text in the document
244+ */
245+ function highlightText ( text ) {
246+ // Remove previous highlights
247+ document . querySelectorAll ( ".search-highlight" ) . forEach ( ( el ) => {
248+ const parent = el . parentNode ;
249+ parent . replaceChild ( document . createTextNode ( el . textContent ) , el ) ;
250+ parent . normalize ( ) ;
251+ } ) ;
252+
253+ if ( ! text || text . length < 2 ) return null ;
254+
255+ // Find all text nodes in the document
256+ const walker = document . createTreeWalker (
257+ document . body ,
258+ NodeFilter . SHOW_TEXT ,
259+ {
260+ acceptNode : function ( node ) {
261+ // Skip script, style, and input elements
262+ if ( node . parentElement . matches ( "script, style, input, textarea" ) ) {
263+ return NodeFilter . FILTER_REJECT ;
264+ }
265+ return NodeFilter . FILTER_ACCEPT ;
266+ } ,
267+ } ,
268+ ) ;
269+
270+ let node ;
271+ let firstMatch = null ;
272+ const textLower = text . toLowerCase ( ) ;
273+
274+ while ( ( node = walker . nextNode ( ) ) ) {
275+ const nodeText = node . textContent ;
276+ const nodeLower = nodeText . toLowerCase ( ) ;
277+ const index = nodeLower . indexOf ( textLower ) ;
278+
279+ if ( index !== - 1 ) {
280+ // Create highlighted version
281+ const before = nodeText . substring ( 0 , index ) ;
282+ const match = nodeText . substring ( index , index + text . length ) ;
283+ const after = nodeText . substring ( index + text . length ) ;
284+
285+ const highlight = document . createElement ( "mark" ) ;
286+ highlight . className = "search-highlight" ;
287+ highlight . textContent = match ;
288+ highlight . style . backgroundColor = "#ce422b" ;
289+ highlight . style . color = "#ffffff" ;
290+ highlight . style . padding = "2px 4px" ;
291+ highlight . style . borderRadius = "2px" ;
292+
293+ const fragment = document . createDocumentFragment ( ) ;
294+ fragment . appendChild ( document . createTextNode ( before ) ) ;
295+ fragment . appendChild ( highlight ) ;
296+ fragment . appendChild ( document . createTextNode ( after ) ) ;
297+
298+ node . parentNode . replaceChild ( fragment , node ) ;
299+
300+ if ( ! firstMatch ) {
301+ firstMatch = highlight ;
302+ }
303+ }
304+ }
305+
306+ return firstMatch ;
307+ }
308+
309+ /**
310+ * Jumps to the first matching element
311+ */
312+ function jumpToMatch ( searchText ) {
313+ const firstMatch = highlightText ( searchText ) ;
314+
315+ if ( firstMatch ) {
316+ firstMatch . scrollIntoView ( {
317+ behavior : "smooth" ,
318+ block : "center" ,
319+ } ) ;
320+ return true ;
321+ }
322+ return false ;
323+ }
324+
325+ // Add event listeners to all search inputs
326+ inputs . forEach ( ( input ) => {
327+ let debounceTimer ;
328+
329+ input . addEventListener ( "input" , function ( e ) {
330+ clearTimeout ( debounceTimer ) ;
331+
332+ // Debounce to avoid excessive processing while typing
333+ debounceTimer = setTimeout ( ( ) => {
334+ const searchText = e . target . value . trim ( ) ;
335+ jumpToMatch ( searchText ) ;
336+ } , 300 ) ;
337+ } ) ;
338+ } ) ;
339+
340+ console . log ( `Search-to-jump initialized on ${ inputs . length } input field(s)` ) ;
341+ } ) ( ) ;
342+ </ script >
0 commit comments