Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ContriBoot

ContriBoot brings the classic contribution graph we all know and love into your app with ease. You can drop one in wherever you need it, and there’s plenty of flexibility to make it your own. If you’re curious about how to use or tweak it, the test app has a bunch of examples to check out. Access Test App

Requirements

PlatformsMinimum Swift Version
iOS 16+5.9

Getting Started

Swift Package Manager

  1. in XCode go to File -> Add Package Dependencies...

  1. In the searchbar paste the github url (https://github.com/mazefest/ContriBoot)](https://github.com/mazefest/ContriBootExampleApp) and select Copy Dependency.

Now you can import ContriBoot and use the library whereever you like.

Integration

1. Import ContriBoot

Import ContriBoot inside of the desired file you are wanting to implement Contriboot's features.

import ContriBoot

2. Setup Your Data

The first step is to update your data models to work with ContriBoot by making them conform to the Contributable protocol. The only required parameter is a date: Date var.

structYourDataModel:Contributable{varworkout:Stringvardate:Date // <-- needed for coforming to Contributable
}

Now your data can be used with ContriBoot

3. Making the Graph

Now we just need to pass in your data into the ContriBootYearGraph.

List{ContriBootYearGraph(items:[YourDataModel])}

This will give you the default Contribution graph, as shown below.

Different Stlyes

Now you can configure the graph to look anyway you like. There are currently 3 available styles. You can apply the styles to the ContriBootYearGraph by modifying it with the .style(_ ContributeStyle) function.

BinaryContributeStyle

Contribution colors will be colored if there is more than one contirbution for that specific date. You can also configure BinaryContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle()) // <- HERE
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle(color: .pink))
}
}

GradientContributeStyle

Contibution will be colored with an opacity value based off the max contirbution count in the year. GradientContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle()) // <- Here
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle(color: .pink))
}
}

CustomContributeStyle

You are in control, you have to do all the work now.

When using CustomContributeStyle(customView: () -> some View) you will have to provide the view yourself inside the completion handler. You will be given the number of contributions for the day the view is drawing and can make decisions on what view should be displayed.

Section {
ContriBootYearGraph(items: data)
.contributeStyle(CustomContributeStyle({ contributions in // <- Your custom implementation here
if contributions.count > 0 {
Image(systemName: "checkmark.circle.fill")
.bold()
.foregroundStyle(Color.green)
} else {
ContributionSquareView(color: Color.gray.opacity(0.33))
}
}))
}

You can also go crazy with it, as seen above.

Example App

For other example of configuring the conrtibution graph in an actual app check out the test app. HERE

About

ContriBoot is a SwiftUI library that makes it simple and fast to create a year-style contribution chart, like the ones you see on GitHub.

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ContriBoot

ContriBoot brings the classic contribution graph we all know and love into your app with ease. You can drop one in wherever you need it, and there’s plenty of flexibility to make it your own. If you’re curious about how to use or tweak it, the test app has a bunch of examples to check out. Access Test App

Requirements

PlatformsMinimum Swift Version
iOS 16+5.9

Getting Started

Swift Package Manager

  1. in XCode go to File -> Add Package Dependencies...

  1. In the searchbar paste the github url (https://github.com/mazefest/ContriBoot)](https://github.com/mazefest/ContriBootExampleApp) and select Copy Dependency.

Now you can import ContriBoot and use the library whereever you like.

Integration

1. Import ContriBoot

Import ContriBoot inside of the desired file you are wanting to implement Contriboot's features.

import ContriBoot

2. Setup Your Data

The first step is to update your data models to work with ContriBoot by making them conform to the Contributable protocol. The only required parameter is a date: Date var.

structYourDataModel:Contributable{varworkout:Stringvardate:Date // <-- needed for coforming to Contributable
}

Now your data can be used with ContriBoot

3. Making the Graph

Now we just need to pass in your data into the ContriBootYearGraph.

List{ContriBootYearGraph(items:[YourDataModel])}

This will give you the default Contribution graph, as shown below.

Different Stlyes

Now you can configure the graph to look anyway you like. There are currently 3 available styles. You can apply the styles to the ContriBootYearGraph by modifying it with the .style(_ ContributeStyle) function.

BinaryContributeStyle

Contribution colors will be colored if there is more than one contirbution for that specific date. You can also configure BinaryContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle()) // <- HERE
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle(color: .pink))
}
}

GradientContributeStyle

Contibution will be colored with an opacity value based off the max contirbution count in the year. GradientContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle()) // <- Here
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle(color: .pink))
}
}

CustomContributeStyle

You are in control, you have to do all the work now.

When using CustomContributeStyle(customView: () -> some View) you will have to provide the view yourself inside the completion handler. You will be given the number of contributions for the day the view is drawing and can make decisions on what view should be displayed.

Section {
ContriBootYearGraph(items: data)
.contributeStyle(CustomContributeStyle({ contributions in // <- Your custom implementation here
if contributions.count > 0 {
Image(systemName: "checkmark.circle.fill")
.bold()
.foregroundStyle(Color.green)
} else {
ContributionSquareView(color: Color.gray.opacity(0.33))
}
}))
}

You can also go crazy with it, as seen above.

Example App

For other example of configuring the conrtibution graph in an actual app check out the test app. HERE

About

ContriBoot is a SwiftUI library that makes it simple and fast to create a year-style contribution chart, like the ones you see on GitHub.

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ContriBoot

ContriBoot brings the classic contribution graph we all know and love into your app with ease. You can drop one in wherever you need it, and there’s plenty of flexibility to make it your own. If you’re curious about how to use or tweak it, the test app has a bunch of examples to check out. Access Test App

Requirements

PlatformsMinimum Swift Version
iOS 16+5.9

Getting Started

Swift Package Manager

  1. in XCode go to File -> Add Package Dependencies...

  1. In the searchbar paste the github url (https://github.com/mazefest/ContriBoot)](https://github.com/mazefest/ContriBootExampleApp) and select Copy Dependency.

Now you can import ContriBoot and use the library whereever you like.

Integration

1. Import ContriBoot

Import ContriBoot inside of the desired file you are wanting to implement Contriboot's features.

import ContriBoot

2. Setup Your Data

The first step is to update your data models to work with ContriBoot by making them conform to the Contributable protocol. The only required parameter is a date: Date var.

structYourDataModel:Contributable{varworkout:Stringvardate:Date // <-- needed for coforming to Contributable
}

Now your data can be used with ContriBoot

3. Making the Graph

Now we just need to pass in your data into the ContriBootYearGraph.

List{ContriBootYearGraph(items:[YourDataModel])}

This will give you the default Contribution graph, as shown below.

Different Stlyes

Now you can configure the graph to look anyway you like. There are currently 3 available styles. You can apply the styles to the ContriBootYearGraph by modifying it with the .style(_ ContributeStyle) function.

BinaryContributeStyle

Contribution colors will be colored if there is more than one contirbution for that specific date. You can also configure BinaryContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle()) // <- HERE
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle(color: .pink))
}
}

GradientContributeStyle

Contibution will be colored with an opacity value based off the max contirbution count in the year. GradientContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle()) // <- Here
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle(color: .pink))
}
}

CustomContributeStyle

You are in control, you have to do all the work now.

When using CustomContributeStyle(customView: () -> some View) you will have to provide the view yourself inside the completion handler. You will be given the number of contributions for the day the view is drawing and can make decisions on what view should be displayed.

Section {
ContriBootYearGraph(items: data)
.contributeStyle(CustomContributeStyle({ contributions in // <- Your custom implementation here
if contributions.count > 0 {
Image(systemName: "checkmark.circle.fill")
.bold()
.foregroundStyle(Color.green)
} else {
ContributionSquareView(color: Color.gray.opacity(0.33))
}
}))
}

You can also go crazy with it, as seen above.

Example App

For other example of configuring the conrtibution graph in an actual app check out the test app. HERE

About

ContriBoot is a SwiftUI library that makes it simple and fast to create a year-style contribution chart, like the ones you see on GitHub.

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ContriBoot

ContriBoot brings the classic contribution graph we all know and love into your app with ease. You can drop one in wherever you need it, and there’s plenty of flexibility to make it your own. If you’re curious about how to use or tweak it, the test app has a bunch of examples to check out. Access Test App

Requirements

PlatformsMinimum Swift Version
iOS 16+5.9

Getting Started

Swift Package Manager

  1. in XCode go to File -> Add Package Dependencies...

  1. In the searchbar paste the github url (https://github.com/mazefest/ContriBoot)](https://github.com/mazefest/ContriBootExampleApp) and select Copy Dependency.

Now you can import ContriBoot and use the library whereever you like.

Integration

1. Import ContriBoot

Import ContriBoot inside of the desired file you are wanting to implement Contriboot's features.

import ContriBoot

2. Setup Your Data

The first step is to update your data models to work with ContriBoot by making them conform to the Contributable protocol. The only required parameter is a date: Date var.

structYourDataModel:Contributable{varworkout:Stringvardate:Date // <-- needed for coforming to Contributable
}

Now your data can be used with ContriBoot

3. Making the Graph

Now we just need to pass in your data into the ContriBootYearGraph.

List{ContriBootYearGraph(items:[YourDataModel])}

This will give you the default Contribution graph, as shown below.

Different Stlyes

Now you can configure the graph to look anyway you like. There are currently 3 available styles. You can apply the styles to the ContriBootYearGraph by modifying it with the .style(_ ContributeStyle) function.

BinaryContributeStyle

Contribution colors will be colored if there is more than one contirbution for that specific date. You can also configure BinaryContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle()) // <- HERE
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle(color: .pink))
}
}

GradientContributeStyle

Contibution will be colored with an opacity value based off the max contirbution count in the year. GradientContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle()) // <- Here
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle(color: .pink))
}
}

CustomContributeStyle

You are in control, you have to do all the work now.

When using CustomContributeStyle(customView: () -> some View) you will have to provide the view yourself inside the completion handler. You will be given the number of contributions for the day the view is drawing and can make decisions on what view should be displayed.

Section {
ContriBootYearGraph(items: data)
.contributeStyle(CustomContributeStyle({ contributions in // <- Your custom implementation here
if contributions.count > 0 {
Image(systemName: "checkmark.circle.fill")
.bold()
.foregroundStyle(Color.green)
} else {
ContributionSquareView(color: Color.gray.opacity(0.33))
}
}))
}

You can also go crazy with it, as seen above.

Example App

For other example of configuring the conrtibution graph in an actual app check out the test app. HERE

About

ContriBoot is a SwiftUI library that makes it simple and fast to create a year-style contribution chart, like the ones you see on GitHub.

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ContriBoot

ContriBoot brings the classic contribution graph we all know and love into your app with ease. You can drop one in wherever you need it, and there’s plenty of flexibility to make it your own. If you’re curious about how to use or tweak it, the test app has a bunch of examples to check out. Access Test App

Requirements

PlatformsMinimum Swift Version
iOS 16+5.9

Getting Started

Swift Package Manager

  1. in XCode go to File -> Add Package Dependencies...

  1. In the searchbar paste the github url (https://github.com/mazefest/ContriBoot)](https://github.com/mazefest/ContriBootExampleApp) and select Copy Dependency.

Now you can import ContriBoot and use the library whereever you like.

Integration

1. Import ContriBoot

Import ContriBoot inside of the desired file you are wanting to implement Contriboot's features.

import ContriBoot

2. Setup Your Data

The first step is to update your data models to work with ContriBoot by making them conform to the Contributable protocol. The only required parameter is a date: Date var.

structYourDataModel:Contributable{varworkout:Stringvardate:Date // <-- needed for coforming to Contributable
}

Now your data can be used with ContriBoot

3. Making the Graph

Now we just need to pass in your data into the ContriBootYearGraph.

List{ContriBootYearGraph(items:[YourDataModel])}

This will give you the default Contribution graph, as shown below.

Different Stlyes

Now you can configure the graph to look anyway you like. There are currently 3 available styles. You can apply the styles to the ContriBootYearGraph by modifying it with the .style(_ ContributeStyle) function.

BinaryContributeStyle

Contribution colors will be colored if there is more than one contirbution for that specific date. You can also configure BinaryContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle()) // <- HERE
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle(color: .pink))
}
}

GradientContributeStyle

Contibution will be colored with an opacity value based off the max contirbution count in the year. GradientContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle()) // <- Here
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle(color: .pink))
}
}

CustomContributeStyle

You are in control, you have to do all the work now.

When using CustomContributeStyle(customView: () -> some View) you will have to provide the view yourself inside the completion handler. You will be given the number of contributions for the day the view is drawing and can make decisions on what view should be displayed.

Section {
ContriBootYearGraph(items: data)
.contributeStyle(CustomContributeStyle({ contributions in // <- Your custom implementation here
if contributions.count > 0 {
Image(systemName: "checkmark.circle.fill")
.bold()
.foregroundStyle(Color.green)
} else {
ContributionSquareView(color: Color.gray.opacity(0.33))
}
}))
}

You can also go crazy with it, as seen above.

Example App

For other example of configuring the conrtibution graph in an actual app check out the test app. HERE

About

ContriBoot is a SwiftUI library that makes it simple and fast to create a year-style contribution chart, like the ones you see on GitHub.

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ContriBoot

ContriBoot brings the classic contribution graph we all know and love into your app with ease. You can drop one in wherever you need it, and there’s plenty of flexibility to make it your own. If you’re curious about how to use or tweak it, the test app has a bunch of examples to check out. Access Test App

Requirements

PlatformsMinimum Swift Version
iOS 16+5.9

Getting Started

Swift Package Manager

  1. in XCode go to File -> Add Package Dependencies...

  1. In the searchbar paste the github url (https://github.com/mazefest/ContriBoot)](https://github.com/mazefest/ContriBootExampleApp) and select Copy Dependency.

Now you can import ContriBoot and use the library whereever you like.

Integration

1. Import ContriBoot

Import ContriBoot inside of the desired file you are wanting to implement Contriboot's features.

import ContriBoot

2. Setup Your Data

The first step is to update your data models to work with ContriBoot by making them conform to the Contributable protocol. The only required parameter is a date: Date var.

structYourDataModel:Contributable{varworkout:Stringvardate:Date // <-- needed for coforming to Contributable
}

Now your data can be used with ContriBoot

3. Making the Graph

Now we just need to pass in your data into the ContriBootYearGraph.

List{ContriBootYearGraph(items:[YourDataModel])}

This will give you the default Contribution graph, as shown below.

Different Stlyes

Now you can configure the graph to look anyway you like. There are currently 3 available styles. You can apply the styles to the ContriBootYearGraph by modifying it with the .style(_ ContributeStyle) function.

BinaryContributeStyle

Contribution colors will be colored if there is more than one contirbution for that specific date. You can also configure BinaryContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle()) // <- HERE
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle(color: .pink))
}
}

GradientContributeStyle

Contibution will be colored with an opacity value based off the max contirbution count in the year. GradientContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle()) // <- Here
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle(color: .pink))
}
}

CustomContributeStyle

You are in control, you have to do all the work now.

When using CustomContributeStyle(customView: () -> some View) you will have to provide the view yourself inside the completion handler. You will be given the number of contributions for the day the view is drawing and can make decisions on what view should be displayed.

Section {
ContriBootYearGraph(items: data)
.contributeStyle(CustomContributeStyle({ contributions in // <- Your custom implementation here
if contributions.count > 0 {
Image(systemName: "checkmark.circle.fill")
.bold()
.foregroundStyle(Color.green)
} else {
ContributionSquareView(color: Color.gray.opacity(0.33))
}
}))
}

You can also go crazy with it, as seen above.

Example App

For other example of configuring the conrtibution graph in an actual app check out the test app. HERE

About

ContriBoot is a SwiftUI library that makes it simple and fast to create a year-style contribution chart, like the ones you see on GitHub.

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ContriBoot

ContriBoot brings the classic contribution graph we all know and love into your app with ease. You can drop one in wherever you need it, and there’s plenty of flexibility to make it your own. If you’re curious about how to use or tweak it, the test app has a bunch of examples to check out. Access Test App

Requirements

PlatformsMinimum Swift Version
iOS 16+5.9

Getting Started

Swift Package Manager

  1. in XCode go to File -> Add Package Dependencies...

  1. In the searchbar paste the github url (https://github.com/mazefest/ContriBoot)](https://github.com/mazefest/ContriBootExampleApp) and select Copy Dependency.

Now you can import ContriBoot and use the library whereever you like.

Integration

1. Import ContriBoot

Import ContriBoot inside of the desired file you are wanting to implement Contriboot's features.

import ContriBoot

2. Setup Your Data

The first step is to update your data models to work with ContriBoot by making them conform to the Contributable protocol. The only required parameter is a date: Date var.

structYourDataModel:Contributable{varworkout:Stringvardate:Date // <-- needed for coforming to Contributable
}

Now your data can be used with ContriBoot

3. Making the Graph

Now we just need to pass in your data into the ContriBootYearGraph.

List{ContriBootYearGraph(items:[YourDataModel])}

This will give you the default Contribution graph, as shown below.

Different Stlyes

Now you can configure the graph to look anyway you like. There are currently 3 available styles. You can apply the styles to the ContriBootYearGraph by modifying it with the .style(_ ContributeStyle) function.

BinaryContributeStyle

Contribution colors will be colored if there is more than one contirbution for that specific date. You can also configure BinaryContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle()) // <- HERE
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle(color: .pink))
}
}

GradientContributeStyle

Contibution will be colored with an opacity value based off the max contirbution count in the year. GradientContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle()) // <- Here
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle(color: .pink))
}
}

CustomContributeStyle

You are in control, you have to do all the work now.

When using CustomContributeStyle(customView: () -> some View) you will have to provide the view yourself inside the completion handler. You will be given the number of contributions for the day the view is drawing and can make decisions on what view should be displayed.

Section {
ContriBootYearGraph(items: data)
.contributeStyle(CustomContributeStyle({ contributions in // <- Your custom implementation here
if contributions.count > 0 {
Image(systemName: "checkmark.circle.fill")
.bold()
.foregroundStyle(Color.green)
} else {
ContributionSquareView(color: Color.gray.opacity(0.33))
}
}))
}

You can also go crazy with it, as seen above.

Example App

For other example of configuring the conrtibution graph in an actual app check out the test app. HERE

About

ContriBoot is a SwiftUI library that makes it simple and fast to create a year-style contribution chart, like the ones you see on GitHub.

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ContriBoot

ContriBoot brings the classic contribution graph we all know and love into your app with ease. You can drop one in wherever you need it, and there’s plenty of flexibility to make it your own. If you’re curious about how to use or tweak it, the test app has a bunch of examples to check out. Access Test App

Requirements

PlatformsMinimum Swift Version
iOS 16+5.9

Getting Started

Swift Package Manager

  1. in XCode go to File -> Add Package Dependencies...

  1. In the searchbar paste the github url (https://github.com/mazefest/ContriBoot)](https://github.com/mazefest/ContriBootExampleApp) and select Copy Dependency.

Now you can import ContriBoot and use the library whereever you like.

Integration

1. Import ContriBoot

Import ContriBoot inside of the desired file you are wanting to implement Contriboot's features.

import ContriBoot

2. Setup Your Data

The first step is to update your data models to work with ContriBoot by making them conform to the Contributable protocol. The only required parameter is a date: Date var.

structYourDataModel:Contributable{varworkout:Stringvardate:Date // <-- needed for coforming to Contributable
}

Now your data can be used with ContriBoot

3. Making the Graph

Now we just need to pass in your data into the ContriBootYearGraph.

List{ContriBootYearGraph(items:[YourDataModel])}

This will give you the default Contribution graph, as shown below.

Different Stlyes

Now you can configure the graph to look anyway you like. There are currently 3 available styles. You can apply the styles to the ContriBootYearGraph by modifying it with the .style(_ ContributeStyle) function.

BinaryContributeStyle

Contribution colors will be colored if there is more than one contirbution for that specific date. You can also configure BinaryContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle()) // <- HERE
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(BinaryContributeStyle(color: .pink))
}
}

GradientContributeStyle

Contibution will be colored with an opacity value based off the max contirbution count in the year. GradientContributeStyle(color: Color, absentColor: Color, cornerRadius: Double) color: Color -> Color of the squares with contributions. absentColor: Color -> Color of squares with 0 contributions. cornerRadius: Double -> Corner radius for contribution squares.

List {
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle()) // <- Here
}
Section {
ContriBootYearGraph(items: data)
.contributeStyle(GradientContributeStyle(color: .pink))
}
}

CustomContributeStyle

You are in control, you have to do all the work now.

When using CustomContributeStyle(customView: () -> some View) you will have to provide the view yourself inside the completion handler. You will be given the number of contributions for the day the view is drawing and can make decisions on what view should be displayed.

Section {
ContriBootYearGraph(items: data)
.contributeStyle(CustomContributeStyle({ contributions in // <- Your custom implementation here
if contributions.count > 0 {
Image(systemName: "checkmark.circle.fill")
.bold()
.foregroundStyle(Color.green)
} else {
ContributionSquareView(color: Color.gray.opacity(0.33))
}
}))
}

You can also go crazy with it, as seen above.

Example App

For other example of configuring the conrtibution graph in an actual app check out the test app. HERE

About

ContriBoot is a SwiftUI library that makes it simple and fast to create a year-style contribution chart, like the ones you see on GitHub.

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages