Finish both-platform rendering, full component set, and Maven Central install - #1

Draft
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass
Draft

Finish both-platform rendering, full component set, and Maven Central install#1
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass

Conversation

@AndroidPoet

Copy link
Copy Markdown
Owner

Summary

Final release/integration pass for LiquidKit: both-platform rendering is finished, the component set reaches iOS parity, and the library is set up to install automatically from Maven Central with a docs site and the standard quality tooling.

What changed

Components & sample

  • Wired all six new component showcases into the sample app through a navigable component gallery on the Home tab: Buttons & FAB, Surfaces, Menus & Pickers, Fields, Stepper & Media, Toolbar & Sheet. Each opens full-screen with a back affordance.
  • The library now exposes a full iOS-parity set: LiquidButton/LiquidFab, LiquidSurface/LiquidGlassContainer, LiquidDropdownMenu/LiquidPicker, LiquidTextField/LiquidSearchField, LiquidStepper/LiquidMediaControl, LiquidToolbar/LiquidSheet, plus the existing toggle/slider/segmented/navigation.

Rendering

  • Android renders the Liquid Glass look in-Compose via an internal backdrop/refraction shader engine.
  • iOS wraps genuine native UIKit controls (UISwitch / UIButton glass config / UIMenu / UIPickerView / UITextField / UISearchTextField / UIStepper / UINavigationBar / UIVisualEffectView) for authentic system Liquid Glass on iOS 26.
  • Aligned the iOS sheet to the typed UIGlassEffect binding (runtime-gated to iOS 26, with a UIBlurEffect systemMaterial fallback) so it matches the surface implementation.

Install story (Maven Central)

  • Publishing now targets the Sonatype Central Portal: sources + javadoc jars, full POM metadata, and signing read from env/gradle props (no secrets in the repo).
  • Added a tag/release-driven publish workflow. Verified locally with publishToMavenLocal (signed artifacts + per-target KMP modules + POM produced).

Consumer coordinates:

implementation("io.github.androidpoet:liquidkit:0.1.0")
implementation("io.github.androidpoet:liquidkit-navigation3:0.1.0") // optional

Tooling & docs

  • Added Spotless (ktlint), Detekt (tuned config), and Kover (aggregated report + verify floor) and wired them into CI.
  • Added a Nextra docs site under website/ (intro, install for Gradle/KMP + iOS framework, architecture page on the Android-shader / iOS-native model, and a page per component group) plus a Pages deploy workflow.
  • Hardened the iOS sample prebuild script to use the Gradle wrapper instead of a bare gradle on PATH.
  • Refreshed the README install snippet, full component list, and architecture note.

Verification (all green locally)

  • :liquidkit:compileDebugKotlinAndroid
  • :liquidkit:compileKotlinIosSimulatorArm64
  • :sampleApp:assembleDebug
  • spotlessCheck, detekt, koverXmlReport, koverVerify
  • publishToMavenLocal
  • docs pnpm build

Notes

  • Library version is 0.1.0-SNAPSHOT; the README/docs show the 0.1.0 release coordinate that the publish workflow will cut.
  • The Kover verify floor is intentionally low: this is a UI-heavy library that does not yet ship a unit-test suite, so the floor acts as a regression guard to ratchet up as tests are added.
  • The vendored Android shader engine uses bleeding-edge Kotlin (context parameters) that the current ktlint/detekt parsers cannot read, so that package is excluded from formatting/linting and kept as-is.
  • This is a draft; nothing was published to the real Maven Central.

AndroidPoetand others added 13 commits June 19, 2026 02:23
The iOS actual for LiquidToggle referenced Color.toUIColor() without
importing it from the internal package, breaking compileKotlinIosSimulatorArm64.
Add the missing import so the native UISwitch interop compiles and links.
LiquidSurface + LiquidGlassContainer: commonMain expect/actual API
mirroring toggle/slider. Android renders via the backdrop engine
(drawBackdrop + lens/blur/vibrancy + highlight/shadow); iOS hosts a
native UIVisualEffectView with iOS 26 UIGlassEffect (UIBlurEffect
system-material fallback on older systems). Adds SurfaceShowcase sample.
LiquidStepper: glass increment/decrement stepper (commonMain expect,
Android backdrop-engine glass buttons, iOS native UIStepper).
LiquidMediaControl: glass media transport with play/pause toggle plus
scrubber (Android backdrop LiquidButton + LiquidSlider, iOS native
UISlider scrubber + glass UIButton with SF Symbol play/pause).
Adds self-contained StepperMediaShowcase sample.
- commonMain field/ package with expect/actual mirroring toggle/slider
- Android: glass surface (RoundedCornerShape) / capsule pill over the
relocated backdrop engine wrapping BasicTextField
- iOS: genuine native UITextField / UISearchTextField via UIKitView interop
for authentic system Liquid Glass on iOS 26
- Self-contained FieldShowcase sample composable
LiquidDropdownMenu/LiquidMenu and LiquidPicker with expect/actual:
- commonMain: public API mirroring toggle/segmented structure
- androidMain: glass surfaces via relocated backdrop engine
- iosMain: native UIButton+UIMenu dropdown, native UIPickerView
Self-contained MenuShowcase sample.
…ity/field', 'parity/stepper-media' and 'parity/chrome' into feat/finish-liquid-glass
- Wire all six component showcases into the sample app via a navigable
component gallery (buttons, surfaces, menus/pickers, fields,
stepper/media, toolbar/sheet)
- Switch publishing to the Sonatype Central Portal with sources/javadoc
jars, full POM metadata and env-driven signing; add tag-driven release
workflow
- Align the iOS sheet to the typed UIGlassEffect binding (iOS 26) with a
UIBlurEffect systemMaterial fallback, matching the surface implementation
- Harden the iOS sample prebuild to use the Gradle wrapper
- Add Spotless (ktlint), Detekt and Kover quality gates and wire them into CI
- Add a Nextra docs site (intro, install, architecture, per-component pages)
and a Pages deploy workflow
- Refresh the README install snippet, component list and architecture note
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@AndroidPoet
, '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

Finish both-platform rendering, full component set, and Maven Central install - #1

Draft
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass
Draft

Finish both-platform rendering, full component set, and Maven Central install#1
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass

Conversation

@AndroidPoet

Copy link
Copy Markdown
Owner

Summary

Final release/integration pass for LiquidKit: both-platform rendering is finished, the component set reaches iOS parity, and the library is set up to install automatically from Maven Central with a docs site and the standard quality tooling.

What changed

Components & sample

  • Wired all six new component showcases into the sample app through a navigable component gallery on the Home tab: Buttons & FAB, Surfaces, Menus & Pickers, Fields, Stepper & Media, Toolbar & Sheet. Each opens full-screen with a back affordance.
  • The library now exposes a full iOS-parity set: LiquidButton/LiquidFab, LiquidSurface/LiquidGlassContainer, LiquidDropdownMenu/LiquidPicker, LiquidTextField/LiquidSearchField, LiquidStepper/LiquidMediaControl, LiquidToolbar/LiquidSheet, plus the existing toggle/slider/segmented/navigation.

Rendering

  • Android renders the Liquid Glass look in-Compose via an internal backdrop/refraction shader engine.
  • iOS wraps genuine native UIKit controls (UISwitch / UIButton glass config / UIMenu / UIPickerView / UITextField / UISearchTextField / UIStepper / UINavigationBar / UIVisualEffectView) for authentic system Liquid Glass on iOS 26.
  • Aligned the iOS sheet to the typed UIGlassEffect binding (runtime-gated to iOS 26, with a UIBlurEffect systemMaterial fallback) so it matches the surface implementation.

Install story (Maven Central)

  • Publishing now targets the Sonatype Central Portal: sources + javadoc jars, full POM metadata, and signing read from env/gradle props (no secrets in the repo).
  • Added a tag/release-driven publish workflow. Verified locally with publishToMavenLocal (signed artifacts + per-target KMP modules + POM produced).

Consumer coordinates:

implementation("io.github.androidpoet:liquidkit:0.1.0")
implementation("io.github.androidpoet:liquidkit-navigation3:0.1.0") // optional

Tooling & docs

  • Added Spotless (ktlint), Detekt (tuned config), and Kover (aggregated report + verify floor) and wired them into CI.
  • Added a Nextra docs site under website/ (intro, install for Gradle/KMP + iOS framework, architecture page on the Android-shader / iOS-native model, and a page per component group) plus a Pages deploy workflow.
  • Hardened the iOS sample prebuild script to use the Gradle wrapper instead of a bare gradle on PATH.
  • Refreshed the README install snippet, full component list, and architecture note.

Verification (all green locally)

  • :liquidkit:compileDebugKotlinAndroid
  • :liquidkit:compileKotlinIosSimulatorArm64
  • :sampleApp:assembleDebug
  • spotlessCheck, detekt, koverXmlReport, koverVerify
  • publishToMavenLocal
  • docs pnpm build

Notes

  • Library version is 0.1.0-SNAPSHOT; the README/docs show the 0.1.0 release coordinate that the publish workflow will cut.
  • The Kover verify floor is intentionally low: this is a UI-heavy library that does not yet ship a unit-test suite, so the floor acts as a regression guard to ratchet up as tests are added.
  • The vendored Android shader engine uses bleeding-edge Kotlin (context parameters) that the current ktlint/detekt parsers cannot read, so that package is excluded from formatting/linting and kept as-is.
  • This is a draft; nothing was published to the real Maven Central.

AndroidPoetand others added 13 commits June 19, 2026 02:23
The iOS actual for LiquidToggle referenced Color.toUIColor() without
importing it from the internal package, breaking compileKotlinIosSimulatorArm64.
Add the missing import so the native UISwitch interop compiles and links.
LiquidSurface + LiquidGlassContainer: commonMain expect/actual API
mirroring toggle/slider. Android renders via the backdrop engine
(drawBackdrop + lens/blur/vibrancy + highlight/shadow); iOS hosts a
native UIVisualEffectView with iOS 26 UIGlassEffect (UIBlurEffect
system-material fallback on older systems). Adds SurfaceShowcase sample.
LiquidStepper: glass increment/decrement stepper (commonMain expect,
Android backdrop-engine glass buttons, iOS native UIStepper).
LiquidMediaControl: glass media transport with play/pause toggle plus
scrubber (Android backdrop LiquidButton + LiquidSlider, iOS native
UISlider scrubber + glass UIButton with SF Symbol play/pause).
Adds self-contained StepperMediaShowcase sample.
- commonMain field/ package with expect/actual mirroring toggle/slider
- Android: glass surface (RoundedCornerShape) / capsule pill over the
relocated backdrop engine wrapping BasicTextField
- iOS: genuine native UITextField / UISearchTextField via UIKitView interop
for authentic system Liquid Glass on iOS 26
- Self-contained FieldShowcase sample composable
LiquidDropdownMenu/LiquidMenu and LiquidPicker with expect/actual:
- commonMain: public API mirroring toggle/segmented structure
- androidMain: glass surfaces via relocated backdrop engine
- iosMain: native UIButton+UIMenu dropdown, native UIPickerView
Self-contained MenuShowcase sample.
…ity/field', 'parity/stepper-media' and 'parity/chrome' into feat/finish-liquid-glass
- Wire all six component showcases into the sample app via a navigable
component gallery (buttons, surfaces, menus/pickers, fields,
stepper/media, toolbar/sheet)
- Switch publishing to the Sonatype Central Portal with sources/javadoc
jars, full POM metadata and env-driven signing; add tag-driven release
workflow
- Align the iOS sheet to the typed UIGlassEffect binding (iOS 26) with a
UIBlurEffect systemMaterial fallback, matching the surface implementation
- Harden the iOS sample prebuild to use the Gradle wrapper
- Add Spotless (ktlint), Detekt and Kover quality gates and wire them into CI
- Add a Nextra docs site (intro, install, architecture, per-component pages)
and a Pages deploy workflow
- Refresh the README install snippet, component list and architecture note
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@AndroidPoet
, '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

Finish both-platform rendering, full component set, and Maven Central install - #1

Draft
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass
Draft

Finish both-platform rendering, full component set, and Maven Central install#1
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass

Conversation

@AndroidPoet

Copy link
Copy Markdown
Owner

Summary

Final release/integration pass for LiquidKit: both-platform rendering is finished, the component set reaches iOS parity, and the library is set up to install automatically from Maven Central with a docs site and the standard quality tooling.

What changed

Components & sample

  • Wired all six new component showcases into the sample app through a navigable component gallery on the Home tab: Buttons & FAB, Surfaces, Menus & Pickers, Fields, Stepper & Media, Toolbar & Sheet. Each opens full-screen with a back affordance.
  • The library now exposes a full iOS-parity set: LiquidButton/LiquidFab, LiquidSurface/LiquidGlassContainer, LiquidDropdownMenu/LiquidPicker, LiquidTextField/LiquidSearchField, LiquidStepper/LiquidMediaControl, LiquidToolbar/LiquidSheet, plus the existing toggle/slider/segmented/navigation.

Rendering

  • Android renders the Liquid Glass look in-Compose via an internal backdrop/refraction shader engine.
  • iOS wraps genuine native UIKit controls (UISwitch / UIButton glass config / UIMenu / UIPickerView / UITextField / UISearchTextField / UIStepper / UINavigationBar / UIVisualEffectView) for authentic system Liquid Glass on iOS 26.
  • Aligned the iOS sheet to the typed UIGlassEffect binding (runtime-gated to iOS 26, with a UIBlurEffect systemMaterial fallback) so it matches the surface implementation.

Install story (Maven Central)

  • Publishing now targets the Sonatype Central Portal: sources + javadoc jars, full POM metadata, and signing read from env/gradle props (no secrets in the repo).
  • Added a tag/release-driven publish workflow. Verified locally with publishToMavenLocal (signed artifacts + per-target KMP modules + POM produced).

Consumer coordinates:

implementation("io.github.androidpoet:liquidkit:0.1.0")
implementation("io.github.androidpoet:liquidkit-navigation3:0.1.0") // optional

Tooling & docs

  • Added Spotless (ktlint), Detekt (tuned config), and Kover (aggregated report + verify floor) and wired them into CI.
  • Added a Nextra docs site under website/ (intro, install for Gradle/KMP + iOS framework, architecture page on the Android-shader / iOS-native model, and a page per component group) plus a Pages deploy workflow.
  • Hardened the iOS sample prebuild script to use the Gradle wrapper instead of a bare gradle on PATH.
  • Refreshed the README install snippet, full component list, and architecture note.

Verification (all green locally)

  • :liquidkit:compileDebugKotlinAndroid
  • :liquidkit:compileKotlinIosSimulatorArm64
  • :sampleApp:assembleDebug
  • spotlessCheck, detekt, koverXmlReport, koverVerify
  • publishToMavenLocal
  • docs pnpm build

Notes

  • Library version is 0.1.0-SNAPSHOT; the README/docs show the 0.1.0 release coordinate that the publish workflow will cut.
  • The Kover verify floor is intentionally low: this is a UI-heavy library that does not yet ship a unit-test suite, so the floor acts as a regression guard to ratchet up as tests are added.
  • The vendored Android shader engine uses bleeding-edge Kotlin (context parameters) that the current ktlint/detekt parsers cannot read, so that package is excluded from formatting/linting and kept as-is.
  • This is a draft; nothing was published to the real Maven Central.

AndroidPoetand others added 13 commits June 19, 2026 02:23
The iOS actual for LiquidToggle referenced Color.toUIColor() without
importing it from the internal package, breaking compileKotlinIosSimulatorArm64.
Add the missing import so the native UISwitch interop compiles and links.
LiquidSurface + LiquidGlassContainer: commonMain expect/actual API
mirroring toggle/slider. Android renders via the backdrop engine
(drawBackdrop + lens/blur/vibrancy + highlight/shadow); iOS hosts a
native UIVisualEffectView with iOS 26 UIGlassEffect (UIBlurEffect
system-material fallback on older systems). Adds SurfaceShowcase sample.
LiquidStepper: glass increment/decrement stepper (commonMain expect,
Android backdrop-engine glass buttons, iOS native UIStepper).
LiquidMediaControl: glass media transport with play/pause toggle plus
scrubber (Android backdrop LiquidButton + LiquidSlider, iOS native
UISlider scrubber + glass UIButton with SF Symbol play/pause).
Adds self-contained StepperMediaShowcase sample.
- commonMain field/ package with expect/actual mirroring toggle/slider
- Android: glass surface (RoundedCornerShape) / capsule pill over the
relocated backdrop engine wrapping BasicTextField
- iOS: genuine native UITextField / UISearchTextField via UIKitView interop
for authentic system Liquid Glass on iOS 26
- Self-contained FieldShowcase sample composable
LiquidDropdownMenu/LiquidMenu and LiquidPicker with expect/actual:
- commonMain: public API mirroring toggle/segmented structure
- androidMain: glass surfaces via relocated backdrop engine
- iosMain: native UIButton+UIMenu dropdown, native UIPickerView
Self-contained MenuShowcase sample.
…ity/field', 'parity/stepper-media' and 'parity/chrome' into feat/finish-liquid-glass
- Wire all six component showcases into the sample app via a navigable
component gallery (buttons, surfaces, menus/pickers, fields,
stepper/media, toolbar/sheet)
- Switch publishing to the Sonatype Central Portal with sources/javadoc
jars, full POM metadata and env-driven signing; add tag-driven release
workflow
- Align the iOS sheet to the typed UIGlassEffect binding (iOS 26) with a
UIBlurEffect systemMaterial fallback, matching the surface implementation
- Harden the iOS sample prebuild to use the Gradle wrapper
- Add Spotless (ktlint), Detekt and Kover quality gates and wire them into CI
- Add a Nextra docs site (intro, install, architecture, per-component pages)
and a Pages deploy workflow
- Refresh the README install snippet, component list and architecture note
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@AndroidPoet
, '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

Finish both-platform rendering, full component set, and Maven Central install - #1

Draft
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass
Draft

Finish both-platform rendering, full component set, and Maven Central install#1
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass

Conversation

@AndroidPoet

Copy link
Copy Markdown
Owner

Summary

Final release/integration pass for LiquidKit: both-platform rendering is finished, the component set reaches iOS parity, and the library is set up to install automatically from Maven Central with a docs site and the standard quality tooling.

What changed

Components & sample

  • Wired all six new component showcases into the sample app through a navigable component gallery on the Home tab: Buttons & FAB, Surfaces, Menus & Pickers, Fields, Stepper & Media, Toolbar & Sheet. Each opens full-screen with a back affordance.
  • The library now exposes a full iOS-parity set: LiquidButton/LiquidFab, LiquidSurface/LiquidGlassContainer, LiquidDropdownMenu/LiquidPicker, LiquidTextField/LiquidSearchField, LiquidStepper/LiquidMediaControl, LiquidToolbar/LiquidSheet, plus the existing toggle/slider/segmented/navigation.

Rendering

  • Android renders the Liquid Glass look in-Compose via an internal backdrop/refraction shader engine.
  • iOS wraps genuine native UIKit controls (UISwitch / UIButton glass config / UIMenu / UIPickerView / UITextField / UISearchTextField / UIStepper / UINavigationBar / UIVisualEffectView) for authentic system Liquid Glass on iOS 26.
  • Aligned the iOS sheet to the typed UIGlassEffect binding (runtime-gated to iOS 26, with a UIBlurEffect systemMaterial fallback) so it matches the surface implementation.

Install story (Maven Central)

  • Publishing now targets the Sonatype Central Portal: sources + javadoc jars, full POM metadata, and signing read from env/gradle props (no secrets in the repo).
  • Added a tag/release-driven publish workflow. Verified locally with publishToMavenLocal (signed artifacts + per-target KMP modules + POM produced).

Consumer coordinates:

implementation("io.github.androidpoet:liquidkit:0.1.0")
implementation("io.github.androidpoet:liquidkit-navigation3:0.1.0") // optional

Tooling & docs

  • Added Spotless (ktlint), Detekt (tuned config), and Kover (aggregated report + verify floor) and wired them into CI.
  • Added a Nextra docs site under website/ (intro, install for Gradle/KMP + iOS framework, architecture page on the Android-shader / iOS-native model, and a page per component group) plus a Pages deploy workflow.
  • Hardened the iOS sample prebuild script to use the Gradle wrapper instead of a bare gradle on PATH.
  • Refreshed the README install snippet, full component list, and architecture note.

Verification (all green locally)

  • :liquidkit:compileDebugKotlinAndroid
  • :liquidkit:compileKotlinIosSimulatorArm64
  • :sampleApp:assembleDebug
  • spotlessCheck, detekt, koverXmlReport, koverVerify
  • publishToMavenLocal
  • docs pnpm build

Notes

  • Library version is 0.1.0-SNAPSHOT; the README/docs show the 0.1.0 release coordinate that the publish workflow will cut.
  • The Kover verify floor is intentionally low: this is a UI-heavy library that does not yet ship a unit-test suite, so the floor acts as a regression guard to ratchet up as tests are added.
  • The vendored Android shader engine uses bleeding-edge Kotlin (context parameters) that the current ktlint/detekt parsers cannot read, so that package is excluded from formatting/linting and kept as-is.
  • This is a draft; nothing was published to the real Maven Central.

AndroidPoetand others added 13 commits June 19, 2026 02:23
The iOS actual for LiquidToggle referenced Color.toUIColor() without
importing it from the internal package, breaking compileKotlinIosSimulatorArm64.
Add the missing import so the native UISwitch interop compiles and links.
LiquidSurface + LiquidGlassContainer: commonMain expect/actual API
mirroring toggle/slider. Android renders via the backdrop engine
(drawBackdrop + lens/blur/vibrancy + highlight/shadow); iOS hosts a
native UIVisualEffectView with iOS 26 UIGlassEffect (UIBlurEffect
system-material fallback on older systems). Adds SurfaceShowcase sample.
LiquidStepper: glass increment/decrement stepper (commonMain expect,
Android backdrop-engine glass buttons, iOS native UIStepper).
LiquidMediaControl: glass media transport with play/pause toggle plus
scrubber (Android backdrop LiquidButton + LiquidSlider, iOS native
UISlider scrubber + glass UIButton with SF Symbol play/pause).
Adds self-contained StepperMediaShowcase sample.
- commonMain field/ package with expect/actual mirroring toggle/slider
- Android: glass surface (RoundedCornerShape) / capsule pill over the
relocated backdrop engine wrapping BasicTextField
- iOS: genuine native UITextField / UISearchTextField via UIKitView interop
for authentic system Liquid Glass on iOS 26
- Self-contained FieldShowcase sample composable
LiquidDropdownMenu/LiquidMenu and LiquidPicker with expect/actual:
- commonMain: public API mirroring toggle/segmented structure
- androidMain: glass surfaces via relocated backdrop engine
- iosMain: native UIButton+UIMenu dropdown, native UIPickerView
Self-contained MenuShowcase sample.
…ity/field', 'parity/stepper-media' and 'parity/chrome' into feat/finish-liquid-glass
- Wire all six component showcases into the sample app via a navigable
component gallery (buttons, surfaces, menus/pickers, fields,
stepper/media, toolbar/sheet)
- Switch publishing to the Sonatype Central Portal with sources/javadoc
jars, full POM metadata and env-driven signing; add tag-driven release
workflow
- Align the iOS sheet to the typed UIGlassEffect binding (iOS 26) with a
UIBlurEffect systemMaterial fallback, matching the surface implementation
- Harden the iOS sample prebuild to use the Gradle wrapper
- Add Spotless (ktlint), Detekt and Kover quality gates and wire them into CI
- Add a Nextra docs site (intro, install, architecture, per-component pages)
and a Pages deploy workflow
- Refresh the README install snippet, component list and architecture note
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@AndroidPoet
, '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

Finish both-platform rendering, full component set, and Maven Central install - #1

Draft
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass
Draft

Finish both-platform rendering, full component set, and Maven Central install#1
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass

Conversation

@AndroidPoet

Copy link
Copy Markdown
Owner

Summary

Final release/integration pass for LiquidKit: both-platform rendering is finished, the component set reaches iOS parity, and the library is set up to install automatically from Maven Central with a docs site and the standard quality tooling.

What changed

Components & sample

  • Wired all six new component showcases into the sample app through a navigable component gallery on the Home tab: Buttons & FAB, Surfaces, Menus & Pickers, Fields, Stepper & Media, Toolbar & Sheet. Each opens full-screen with a back affordance.
  • The library now exposes a full iOS-parity set: LiquidButton/LiquidFab, LiquidSurface/LiquidGlassContainer, LiquidDropdownMenu/LiquidPicker, LiquidTextField/LiquidSearchField, LiquidStepper/LiquidMediaControl, LiquidToolbar/LiquidSheet, plus the existing toggle/slider/segmented/navigation.

Rendering

  • Android renders the Liquid Glass look in-Compose via an internal backdrop/refraction shader engine.
  • iOS wraps genuine native UIKit controls (UISwitch / UIButton glass config / UIMenu / UIPickerView / UITextField / UISearchTextField / UIStepper / UINavigationBar / UIVisualEffectView) for authentic system Liquid Glass on iOS 26.
  • Aligned the iOS sheet to the typed UIGlassEffect binding (runtime-gated to iOS 26, with a UIBlurEffect systemMaterial fallback) so it matches the surface implementation.

Install story (Maven Central)

  • Publishing now targets the Sonatype Central Portal: sources + javadoc jars, full POM metadata, and signing read from env/gradle props (no secrets in the repo).
  • Added a tag/release-driven publish workflow. Verified locally with publishToMavenLocal (signed artifacts + per-target KMP modules + POM produced).

Consumer coordinates:

implementation("io.github.androidpoet:liquidkit:0.1.0")
implementation("io.github.androidpoet:liquidkit-navigation3:0.1.0") // optional

Tooling & docs

  • Added Spotless (ktlint), Detekt (tuned config), and Kover (aggregated report + verify floor) and wired them into CI.
  • Added a Nextra docs site under website/ (intro, install for Gradle/KMP + iOS framework, architecture page on the Android-shader / iOS-native model, and a page per component group) plus a Pages deploy workflow.
  • Hardened the iOS sample prebuild script to use the Gradle wrapper instead of a bare gradle on PATH.
  • Refreshed the README install snippet, full component list, and architecture note.

Verification (all green locally)

  • :liquidkit:compileDebugKotlinAndroid
  • :liquidkit:compileKotlinIosSimulatorArm64
  • :sampleApp:assembleDebug
  • spotlessCheck, detekt, koverXmlReport, koverVerify
  • publishToMavenLocal
  • docs pnpm build

Notes

  • Library version is 0.1.0-SNAPSHOT; the README/docs show the 0.1.0 release coordinate that the publish workflow will cut.
  • The Kover verify floor is intentionally low: this is a UI-heavy library that does not yet ship a unit-test suite, so the floor acts as a regression guard to ratchet up as tests are added.
  • The vendored Android shader engine uses bleeding-edge Kotlin (context parameters) that the current ktlint/detekt parsers cannot read, so that package is excluded from formatting/linting and kept as-is.
  • This is a draft; nothing was published to the real Maven Central.

AndroidPoetand others added 13 commits June 19, 2026 02:23
The iOS actual for LiquidToggle referenced Color.toUIColor() without
importing it from the internal package, breaking compileKotlinIosSimulatorArm64.
Add the missing import so the native UISwitch interop compiles and links.
LiquidSurface + LiquidGlassContainer: commonMain expect/actual API
mirroring toggle/slider. Android renders via the backdrop engine
(drawBackdrop + lens/blur/vibrancy + highlight/shadow); iOS hosts a
native UIVisualEffectView with iOS 26 UIGlassEffect (UIBlurEffect
system-material fallback on older systems). Adds SurfaceShowcase sample.
LiquidStepper: glass increment/decrement stepper (commonMain expect,
Android backdrop-engine glass buttons, iOS native UIStepper).
LiquidMediaControl: glass media transport with play/pause toggle plus
scrubber (Android backdrop LiquidButton + LiquidSlider, iOS native
UISlider scrubber + glass UIButton with SF Symbol play/pause).
Adds self-contained StepperMediaShowcase sample.
- commonMain field/ package with expect/actual mirroring toggle/slider
- Android: glass surface (RoundedCornerShape) / capsule pill over the
relocated backdrop engine wrapping BasicTextField
- iOS: genuine native UITextField / UISearchTextField via UIKitView interop
for authentic system Liquid Glass on iOS 26
- Self-contained FieldShowcase sample composable
LiquidDropdownMenu/LiquidMenu and LiquidPicker with expect/actual:
- commonMain: public API mirroring toggle/segmented structure
- androidMain: glass surfaces via relocated backdrop engine
- iosMain: native UIButton+UIMenu dropdown, native UIPickerView
Self-contained MenuShowcase sample.
…ity/field', 'parity/stepper-media' and 'parity/chrome' into feat/finish-liquid-glass
- Wire all six component showcases into the sample app via a navigable
component gallery (buttons, surfaces, menus/pickers, fields,
stepper/media, toolbar/sheet)
- Switch publishing to the Sonatype Central Portal with sources/javadoc
jars, full POM metadata and env-driven signing; add tag-driven release
workflow
- Align the iOS sheet to the typed UIGlassEffect binding (iOS 26) with a
UIBlurEffect systemMaterial fallback, matching the surface implementation
- Harden the iOS sample prebuild to use the Gradle wrapper
- Add Spotless (ktlint), Detekt and Kover quality gates and wire them into CI
- Add a Nextra docs site (intro, install, architecture, per-component pages)
and a Pages deploy workflow
- Refresh the README install snippet, component list and architecture note
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@AndroidPoet
, '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

Finish both-platform rendering, full component set, and Maven Central install - #1

Draft
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass
Draft

Finish both-platform rendering, full component set, and Maven Central install#1
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass

Conversation

@AndroidPoet

Copy link
Copy Markdown
Owner

Summary

Final release/integration pass for LiquidKit: both-platform rendering is finished, the component set reaches iOS parity, and the library is set up to install automatically from Maven Central with a docs site and the standard quality tooling.

What changed

Components & sample

  • Wired all six new component showcases into the sample app through a navigable component gallery on the Home tab: Buttons & FAB, Surfaces, Menus & Pickers, Fields, Stepper & Media, Toolbar & Sheet. Each opens full-screen with a back affordance.
  • The library now exposes a full iOS-parity set: LiquidButton/LiquidFab, LiquidSurface/LiquidGlassContainer, LiquidDropdownMenu/LiquidPicker, LiquidTextField/LiquidSearchField, LiquidStepper/LiquidMediaControl, LiquidToolbar/LiquidSheet, plus the existing toggle/slider/segmented/navigation.

Rendering

  • Android renders the Liquid Glass look in-Compose via an internal backdrop/refraction shader engine.
  • iOS wraps genuine native UIKit controls (UISwitch / UIButton glass config / UIMenu / UIPickerView / UITextField / UISearchTextField / UIStepper / UINavigationBar / UIVisualEffectView) for authentic system Liquid Glass on iOS 26.
  • Aligned the iOS sheet to the typed UIGlassEffect binding (runtime-gated to iOS 26, with a UIBlurEffect systemMaterial fallback) so it matches the surface implementation.

Install story (Maven Central)

  • Publishing now targets the Sonatype Central Portal: sources + javadoc jars, full POM metadata, and signing read from env/gradle props (no secrets in the repo).
  • Added a tag/release-driven publish workflow. Verified locally with publishToMavenLocal (signed artifacts + per-target KMP modules + POM produced).

Consumer coordinates:

implementation("io.github.androidpoet:liquidkit:0.1.0")
implementation("io.github.androidpoet:liquidkit-navigation3:0.1.0") // optional

Tooling & docs

  • Added Spotless (ktlint), Detekt (tuned config), and Kover (aggregated report + verify floor) and wired them into CI.
  • Added a Nextra docs site under website/ (intro, install for Gradle/KMP + iOS framework, architecture page on the Android-shader / iOS-native model, and a page per component group) plus a Pages deploy workflow.
  • Hardened the iOS sample prebuild script to use the Gradle wrapper instead of a bare gradle on PATH.
  • Refreshed the README install snippet, full component list, and architecture note.

Verification (all green locally)

  • :liquidkit:compileDebugKotlinAndroid
  • :liquidkit:compileKotlinIosSimulatorArm64
  • :sampleApp:assembleDebug
  • spotlessCheck, detekt, koverXmlReport, koverVerify
  • publishToMavenLocal
  • docs pnpm build

Notes

  • Library version is 0.1.0-SNAPSHOT; the README/docs show the 0.1.0 release coordinate that the publish workflow will cut.
  • The Kover verify floor is intentionally low: this is a UI-heavy library that does not yet ship a unit-test suite, so the floor acts as a regression guard to ratchet up as tests are added.
  • The vendored Android shader engine uses bleeding-edge Kotlin (context parameters) that the current ktlint/detekt parsers cannot read, so that package is excluded from formatting/linting and kept as-is.
  • This is a draft; nothing was published to the real Maven Central.

AndroidPoetand others added 13 commits June 19, 2026 02:23
The iOS actual for LiquidToggle referenced Color.toUIColor() without
importing it from the internal package, breaking compileKotlinIosSimulatorArm64.
Add the missing import so the native UISwitch interop compiles and links.
LiquidSurface + LiquidGlassContainer: commonMain expect/actual API
mirroring toggle/slider. Android renders via the backdrop engine
(drawBackdrop + lens/blur/vibrancy + highlight/shadow); iOS hosts a
native UIVisualEffectView with iOS 26 UIGlassEffect (UIBlurEffect
system-material fallback on older systems). Adds SurfaceShowcase sample.
LiquidStepper: glass increment/decrement stepper (commonMain expect,
Android backdrop-engine glass buttons, iOS native UIStepper).
LiquidMediaControl: glass media transport with play/pause toggle plus
scrubber (Android backdrop LiquidButton + LiquidSlider, iOS native
UISlider scrubber + glass UIButton with SF Symbol play/pause).
Adds self-contained StepperMediaShowcase sample.
- commonMain field/ package with expect/actual mirroring toggle/slider
- Android: glass surface (RoundedCornerShape) / capsule pill over the
relocated backdrop engine wrapping BasicTextField
- iOS: genuine native UITextField / UISearchTextField via UIKitView interop
for authentic system Liquid Glass on iOS 26
- Self-contained FieldShowcase sample composable
LiquidDropdownMenu/LiquidMenu and LiquidPicker with expect/actual:
- commonMain: public API mirroring toggle/segmented structure
- androidMain: glass surfaces via relocated backdrop engine
- iosMain: native UIButton+UIMenu dropdown, native UIPickerView
Self-contained MenuShowcase sample.
…ity/field', 'parity/stepper-media' and 'parity/chrome' into feat/finish-liquid-glass
- Wire all six component showcases into the sample app via a navigable
component gallery (buttons, surfaces, menus/pickers, fields,
stepper/media, toolbar/sheet)
- Switch publishing to the Sonatype Central Portal with sources/javadoc
jars, full POM metadata and env-driven signing; add tag-driven release
workflow
- Align the iOS sheet to the typed UIGlassEffect binding (iOS 26) with a
UIBlurEffect systemMaterial fallback, matching the surface implementation
- Harden the iOS sample prebuild to use the Gradle wrapper
- Add Spotless (ktlint), Detekt and Kover quality gates and wire them into CI
- Add a Nextra docs site (intro, install, architecture, per-component pages)
and a Pages deploy workflow
- Refresh the README install snippet, component list and architecture note
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@AndroidPoet
, '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

Finish both-platform rendering, full component set, and Maven Central install - #1

Draft
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass
Draft

Finish both-platform rendering, full component set, and Maven Central install#1
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass

Conversation

@AndroidPoet

Copy link
Copy Markdown
Owner

Summary

Final release/integration pass for LiquidKit: both-platform rendering is finished, the component set reaches iOS parity, and the library is set up to install automatically from Maven Central with a docs site and the standard quality tooling.

What changed

Components & sample

  • Wired all six new component showcases into the sample app through a navigable component gallery on the Home tab: Buttons & FAB, Surfaces, Menus & Pickers, Fields, Stepper & Media, Toolbar & Sheet. Each opens full-screen with a back affordance.
  • The library now exposes a full iOS-parity set: LiquidButton/LiquidFab, LiquidSurface/LiquidGlassContainer, LiquidDropdownMenu/LiquidPicker, LiquidTextField/LiquidSearchField, LiquidStepper/LiquidMediaControl, LiquidToolbar/LiquidSheet, plus the existing toggle/slider/segmented/navigation.

Rendering

  • Android renders the Liquid Glass look in-Compose via an internal backdrop/refraction shader engine.
  • iOS wraps genuine native UIKit controls (UISwitch / UIButton glass config / UIMenu / UIPickerView / UITextField / UISearchTextField / UIStepper / UINavigationBar / UIVisualEffectView) for authentic system Liquid Glass on iOS 26.
  • Aligned the iOS sheet to the typed UIGlassEffect binding (runtime-gated to iOS 26, with a UIBlurEffect systemMaterial fallback) so it matches the surface implementation.

Install story (Maven Central)

  • Publishing now targets the Sonatype Central Portal: sources + javadoc jars, full POM metadata, and signing read from env/gradle props (no secrets in the repo).
  • Added a tag/release-driven publish workflow. Verified locally with publishToMavenLocal (signed artifacts + per-target KMP modules + POM produced).

Consumer coordinates:

implementation("io.github.androidpoet:liquidkit:0.1.0")
implementation("io.github.androidpoet:liquidkit-navigation3:0.1.0") // optional

Tooling & docs

  • Added Spotless (ktlint), Detekt (tuned config), and Kover (aggregated report + verify floor) and wired them into CI.
  • Added a Nextra docs site under website/ (intro, install for Gradle/KMP + iOS framework, architecture page on the Android-shader / iOS-native model, and a page per component group) plus a Pages deploy workflow.
  • Hardened the iOS sample prebuild script to use the Gradle wrapper instead of a bare gradle on PATH.
  • Refreshed the README install snippet, full component list, and architecture note.

Verification (all green locally)

  • :liquidkit:compileDebugKotlinAndroid
  • :liquidkit:compileKotlinIosSimulatorArm64
  • :sampleApp:assembleDebug
  • spotlessCheck, detekt, koverXmlReport, koverVerify
  • publishToMavenLocal
  • docs pnpm build

Notes

  • Library version is 0.1.0-SNAPSHOT; the README/docs show the 0.1.0 release coordinate that the publish workflow will cut.
  • The Kover verify floor is intentionally low: this is a UI-heavy library that does not yet ship a unit-test suite, so the floor acts as a regression guard to ratchet up as tests are added.
  • The vendored Android shader engine uses bleeding-edge Kotlin (context parameters) that the current ktlint/detekt parsers cannot read, so that package is excluded from formatting/linting and kept as-is.
  • This is a draft; nothing was published to the real Maven Central.

AndroidPoetand others added 13 commits June 19, 2026 02:23
The iOS actual for LiquidToggle referenced Color.toUIColor() without
importing it from the internal package, breaking compileKotlinIosSimulatorArm64.
Add the missing import so the native UISwitch interop compiles and links.
LiquidSurface + LiquidGlassContainer: commonMain expect/actual API
mirroring toggle/slider. Android renders via the backdrop engine
(drawBackdrop + lens/blur/vibrancy + highlight/shadow); iOS hosts a
native UIVisualEffectView with iOS 26 UIGlassEffect (UIBlurEffect
system-material fallback on older systems). Adds SurfaceShowcase sample.
LiquidStepper: glass increment/decrement stepper (commonMain expect,
Android backdrop-engine glass buttons, iOS native UIStepper).
LiquidMediaControl: glass media transport with play/pause toggle plus
scrubber (Android backdrop LiquidButton + LiquidSlider, iOS native
UISlider scrubber + glass UIButton with SF Symbol play/pause).
Adds self-contained StepperMediaShowcase sample.
- commonMain field/ package with expect/actual mirroring toggle/slider
- Android: glass surface (RoundedCornerShape) / capsule pill over the
relocated backdrop engine wrapping BasicTextField
- iOS: genuine native UITextField / UISearchTextField via UIKitView interop
for authentic system Liquid Glass on iOS 26
- Self-contained FieldShowcase sample composable
LiquidDropdownMenu/LiquidMenu and LiquidPicker with expect/actual:
- commonMain: public API mirroring toggle/segmented structure
- androidMain: glass surfaces via relocated backdrop engine
- iosMain: native UIButton+UIMenu dropdown, native UIPickerView
Self-contained MenuShowcase sample.
…ity/field', 'parity/stepper-media' and 'parity/chrome' into feat/finish-liquid-glass
- Wire all six component showcases into the sample app via a navigable
component gallery (buttons, surfaces, menus/pickers, fields,
stepper/media, toolbar/sheet)
- Switch publishing to the Sonatype Central Portal with sources/javadoc
jars, full POM metadata and env-driven signing; add tag-driven release
workflow
- Align the iOS sheet to the typed UIGlassEffect binding (iOS 26) with a
UIBlurEffect systemMaterial fallback, matching the surface implementation
- Harden the iOS sample prebuild to use the Gradle wrapper
- Add Spotless (ktlint), Detekt and Kover quality gates and wire them into CI
- Add a Nextra docs site (intro, install, architecture, per-component pages)
and a Pages deploy workflow
- Refresh the README install snippet, component list and architecture note
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@AndroidPoet
, '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

Finish both-platform rendering, full component set, and Maven Central install - #1

Draft
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass
Draft

Finish both-platform rendering, full component set, and Maven Central install#1
AndroidPoet wants to merge 13 commits into
mainfrom
feat/finish-liquid-glass

Conversation

@AndroidPoet

Copy link
Copy Markdown
Owner

Summary

Final release/integration pass for LiquidKit: both-platform rendering is finished, the component set reaches iOS parity, and the library is set up to install automatically from Maven Central with a docs site and the standard quality tooling.

What changed

Components & sample

  • Wired all six new component showcases into the sample app through a navigable component gallery on the Home tab: Buttons & FAB, Surfaces, Menus & Pickers, Fields, Stepper & Media, Toolbar & Sheet. Each opens full-screen with a back affordance.
  • The library now exposes a full iOS-parity set: LiquidButton/LiquidFab, LiquidSurface/LiquidGlassContainer, LiquidDropdownMenu/LiquidPicker, LiquidTextField/LiquidSearchField, LiquidStepper/LiquidMediaControl, LiquidToolbar/LiquidSheet, plus the existing toggle/slider/segmented/navigation.

Rendering

  • Android renders the Liquid Glass look in-Compose via an internal backdrop/refraction shader engine.
  • iOS wraps genuine native UIKit controls (UISwitch / UIButton glass config / UIMenu / UIPickerView / UITextField / UISearchTextField / UIStepper / UINavigationBar / UIVisualEffectView) for authentic system Liquid Glass on iOS 26.
  • Aligned the iOS sheet to the typed UIGlassEffect binding (runtime-gated to iOS 26, with a UIBlurEffect systemMaterial fallback) so it matches the surface implementation.

Install story (Maven Central)

  • Publishing now targets the Sonatype Central Portal: sources + javadoc jars, full POM metadata, and signing read from env/gradle props (no secrets in the repo).
  • Added a tag/release-driven publish workflow. Verified locally with publishToMavenLocal (signed artifacts + per-target KMP modules + POM produced).

Consumer coordinates:

implementation("io.github.androidpoet:liquidkit:0.1.0")
implementation("io.github.androidpoet:liquidkit-navigation3:0.1.0") // optional

Tooling & docs

  • Added Spotless (ktlint), Detekt (tuned config), and Kover (aggregated report + verify floor) and wired them into CI.
  • Added a Nextra docs site under website/ (intro, install for Gradle/KMP + iOS framework, architecture page on the Android-shader / iOS-native model, and a page per component group) plus a Pages deploy workflow.
  • Hardened the iOS sample prebuild script to use the Gradle wrapper instead of a bare gradle on PATH.
  • Refreshed the README install snippet, full component list, and architecture note.

Verification (all green locally)

  • :liquidkit:compileDebugKotlinAndroid
  • :liquidkit:compileKotlinIosSimulatorArm64
  • :sampleApp:assembleDebug
  • spotlessCheck, detekt, koverXmlReport, koverVerify
  • publishToMavenLocal
  • docs pnpm build

Notes

  • Library version is 0.1.0-SNAPSHOT; the README/docs show the 0.1.0 release coordinate that the publish workflow will cut.
  • The Kover verify floor is intentionally low: this is a UI-heavy library that does not yet ship a unit-test suite, so the floor acts as a regression guard to ratchet up as tests are added.
  • The vendored Android shader engine uses bleeding-edge Kotlin (context parameters) that the current ktlint/detekt parsers cannot read, so that package is excluded from formatting/linting and kept as-is.
  • This is a draft; nothing was published to the real Maven Central.

AndroidPoetand others added 13 commits June 19, 2026 02:23
The iOS actual for LiquidToggle referenced Color.toUIColor() without
importing it from the internal package, breaking compileKotlinIosSimulatorArm64.
Add the missing import so the native UISwitch interop compiles and links.
LiquidSurface + LiquidGlassContainer: commonMain expect/actual API
mirroring toggle/slider. Android renders via the backdrop engine
(drawBackdrop + lens/blur/vibrancy + highlight/shadow); iOS hosts a
native UIVisualEffectView with iOS 26 UIGlassEffect (UIBlurEffect
system-material fallback on older systems). Adds SurfaceShowcase sample.
LiquidStepper: glass increment/decrement stepper (commonMain expect,
Android backdrop-engine glass buttons, iOS native UIStepper).
LiquidMediaControl: glass media transport with play/pause toggle plus
scrubber (Android backdrop LiquidButton + LiquidSlider, iOS native
UISlider scrubber + glass UIButton with SF Symbol play/pause).
Adds self-contained StepperMediaShowcase sample.
- commonMain field/ package with expect/actual mirroring toggle/slider
- Android: glass surface (RoundedCornerShape) / capsule pill over the
relocated backdrop engine wrapping BasicTextField
- iOS: genuine native UITextField / UISearchTextField via UIKitView interop
for authentic system Liquid Glass on iOS 26
- Self-contained FieldShowcase sample composable
LiquidDropdownMenu/LiquidMenu and LiquidPicker with expect/actual:
- commonMain: public API mirroring toggle/segmented structure
- androidMain: glass surfaces via relocated backdrop engine
- iosMain: native UIButton+UIMenu dropdown, native UIPickerView
Self-contained MenuShowcase sample.
…ity/field', 'parity/stepper-media' and 'parity/chrome' into feat/finish-liquid-glass
- Wire all six component showcases into the sample app via a navigable
component gallery (buttons, surfaces, menus/pickers, fields,
stepper/media, toolbar/sheet)
- Switch publishing to the Sonatype Central Portal with sources/javadoc
jars, full POM metadata and env-driven signing; add tag-driven release
workflow
- Align the iOS sheet to the typed UIGlassEffect binding (iOS 26) with a
UIBlurEffect systemMaterial fallback, matching the surface implementation
- Harden the iOS sample prebuild to use the Gradle wrapper
- Add Spotless (ktlint), Detekt and Kover quality gates and wire them into CI
- Add a Nextra docs site (intro, install, architecture, per-component pages)
and a Pages deploy workflow
- Refresh the README install snippet, component list and architecture note
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@AndroidPoet