s_packages 5.5.3
s_packages: ^5.5.3 copied to clipboard
A unified Flutter package which gathers multiple widgets and tools.
5.5.3 #
- Fix:
SSpreadsheethorizontal scroll metrics went stale after a resizeSSpreadsheetHorizontalSyncControllerwas only ever fed from a strip'sinitStatepost-frame callback and its scroll listener. A resize changesmaxScrollExtentwithout moving the offset, so neither fired and the published metrics kept describing the old viewport — leavingSSpreadsheetHorizontalScrollButtons(and anything else bound to the controller) disabled over content that had become scrollable, or enabled over content that no longer was, until the user happened to scroll.- Each horizontal strip now also listens for
ScrollMetricsNotification— the signal aScrollabledispatches exactly when viewport or content dimensions change — and re-reads its own controller. Reports are coalesced to at most one post-frame flush per strip per frame; no timers, no polling. Notifications whosemetrics.axisis not horizontal (a vertical scrollable nested inside a cell) are ignored.
- Fix: the published
ScrollControllercould be a disposed body row- Every strip reports, and the column header and each mounted, virtualised
body row each own a controller from the shared sync group. Last-writer-wins
meant
value.controllercould end up being a row that later scrolled out of view and disposed its controller. - The controller now elects a single owner: the column header when there is one (it is never virtualised), otherwise the first live body strip. A live body owner is not swapped for another interchangeable body row, so ownership does not churn. Strips register on mount and unregister immediately before disposing their controller, so ownership moves on while the remaining strips are still usable.
- Every strip reports, and the column header and each mounted, virtualised
body row each own a controller from the shared sync group. Last-writer-wins
meant
- Fix:
valuewas replaced on every report, even an identical oneupdatealways built a fresh metrics object, so an unchanged tuple still notified every listener. Publication is now skipped when offset, extent and controller identity are all unchanged — controller identity is part of the comparison, so a replacement strip reporting the same numbers still propagates. A settled layout no longer emits a notification loop.
- Fix:
animateToStart/animateToEndcould act on a detached controller- Both now verify the controller is live and has content dimensions, read the
extent from the live
ScrollPositionrather than the published snapshot (so a scroll issued right after a resize lands on the current end), and tolerate the strip being torn down mid-animation.
- Both now verify the controller is live and has content dimensions, read the
extent from the live
- New:
SSpreadsheetHorizontalSyncController.refresh()- Re-reads the owning strip and republishes on demand, for hosts that resize the spreadsheet through a route the notification does not cover.
- Fix:
canScrollRighttreated remaining == threshold as not scrollableoffset < (maxScrollExtent - threshold)is a strict comparison, so a host that passesthreshold: 1over 1 px of hidden content (or the default100over exactly 100 px) still saw the right arrow disabled. Remaining distance is now compared inclusively (remaining >= thresholdandremaining > 0).
- No breaking API changes.
update, theSSpreadsheetHorizontalMetricsChangedtypedef andSSpreadsheetHorizontalScrollButtons.activationThreshold(still defaulting to100) are unchanged; hosts that need a tighter boundary keep passing their own threshold.
5.5.2 #
SSpreadsheetgainsrowHeaderTapSplashColor/columnHeaderTapSplashColor- New optional params (both default to
Colors.transparent, matching prior behavior) controlling the splash/hover color ofenableTapToSelectRowHeader/enableTapToSelectColumnHeader's tap target. Passnullto fall back toSInkButton's own default visible ripple, or any color to match your header's theme — so a header that wants visible tap feedback no longer needs to hand-roll its ownSInkButtonwrapper just to get one, on top of whatenableTapToSelect*Headeralready provides.
- New optional params (both default to
5.5.1 #
- Fix:
SSpreadsheet.enableTapToSelectRowHeader/enableTapToSelectColumnHeadercould be silently blocked by the header's own content- The tap catcher was placed as a same-level
Stacksibling behind whateverrowHeaderBuilder/columnHeaderBuilderrendered. AStack's hit test stops at the first (topmost) child whose subtree claims the tap — so any non-interactive content in front of the catcher that happened to hit-test positively could swallow the tap before it ever reached the catcher underneath, making the header effectively untappable. - Fixed by wrapping the header content in the tap target as its ancestor instead of a
sibling (the same structure a hand-written
SInkButton-wrapped header already used safely). The tap target istranslucent, so interactive descendants (e.g. a lock icon button inside the header) still win their own bounds as before. - No API changes.
- The tap catcher was placed as a same-level
5.5.0 #
SSpreadsheetgains built-in row/column selection + dimming- New
SSpreadsheetSelectionController: tracks a selected row and/or column by opaque identity key (via the newcolumnKeyBuilder, mirroring the existingrowKeyBuilder) rather than by raw index, so a selection survives row filtering/reordering that shifts indices. Defaults toexclusive: true(selecting one axis clears the other); passexclusive: falseto allow both at once. - New
SSpreadsheetparams:selectionController,columnKeyBuilder,dimUnselectedOpacity(opt-in — defaults to1.0, i.e. off),dimAnimationDuration,enableTapToSelectRowHeader,enableTapToSelectColumnHeader,onRowHeaderSelected,onColumnHeaderSelected,onSelectionCleared,onCellTap. - When enabled,
SSpreadsheetautomatically dims every header/cell outside the selected row/column, wires up tap-to-select on headers, and — via aTapRegiongroup per row/column key — clears the selection when the user taps anywhere outside the selected row/column (another cell, another header, or outside the grid entirely). Callers no longer need to hand-roll any of this (opacity computation,TapRegiongroupIds, outside-tap deselection) themselves. - Fully backward compatible: all new params default to no-ops/disabled, so
existing
SSpreadsheetusages are unaffected.
- New
5.4.1 #
TimeInputno longer shows an "Empty" validation error for an intentionally empty field- When
isEmptyWhenTimeNullistrue, an empty field represents a valid null time (e.g. a cleared filter), not an invalid one. The internal validator now skips the "Empty" error in that case while still validating malformed non-empty input. - Previously, any consumer that kept a
TimeInputempty after the user tapped out (rather than falling back to a default value) would see a persistent "Empty" error message under the field.
- When
5.4.0 #
SInkButtonnow has a built-inTapRegion- New optional params:
tapRegionObjectId(→TapRegion.groupId),tapRegionEnabled,tapRegionBehavior,onTapOutside,onTapInside,onTapUpOutside,onTapUpInside,consumeOutsideTaps,tapRegionDebugLabel— mirroringTapRegion's own constructor 1:1, withTapRegion's own defaults. Callers no longer need to manually nest aTapRegioninside anSInkButton'schildto detect taps outside the button (e.g. to auto-collapse an expanded panel). - Fully backward compatible: all new params default to no-ops, so existing usages are unaffected.
SButtonandSExpandableHandles— the other public widgets that wrapSInkButtonas their entire tap surface — now expose and forward the same params.
- New optional params:
5.3.11 #
s_clientGET/HEAD/bodyless DELETE fixSClientno longer sends aContent-Typeheader on requests with no body (get,head, anddeletewhen called without abody). PreviouslydefaultHeaders(application/json) was merged in unconditionally, which turns an otherwise CORS-simple request into one that triggers a preflight (OPTIONS) round-trip on web — and some servers (e.g. Google Apps Script web app endpoints) don't handle that preflight, causing the request to fail silently on web.- POST/PUT/PATCH and DELETE-with-body are unaffected: their Content-Type is still resolved from headers/defaults as before.
5.3.10 #
-
s_bannermeasurement fix- Removed child instance identity comparison in
SBanner.didUpdateWidgetto avoid spurious_childSizeresets when the parent rebuilds with a new but size-identical child instance. This prevents ribbon flicker (e.g. 'Pending ATC') when the containing widget updates (selection changes, context menu opens, etc.). - Added post-frame re-measure logic when
isActivebecomes true and size isn't known.
- Removed child instance identity comparison in
-
Disabled wrapper gesture handling no longer leaks an unintended semantic tap action (disabled controls remain non-tappable to assistive technologies)
5.3.9 #
-
s_future_buttonupgraded- Added new customization parameters:
labelStylefor custom label text styling (merged with the default bold white style)successColor,errorColor,successIcon,errorIconfor completion-state visualssemanticsLabelfor explicit accessibility naming
- Improved lifecycle behavior:
- Added update handling so changes to
label,labelStyle, andiconare reliably reflected while mounted - Added stable animated content identity updates to avoid stale content through transitions
- Added update handling so changes to
- Improved idle content composition:
- Supports icon-only, label-only, and icon+label rendering when both are provided
- Hardened async and interaction flow:
- Prevents concurrent double-tap execution while an async action is active
- Starts async work immediately on accepted tap (no dependency on animation completion timing)
- Added mounted/disposal/operation guards around delayed success/error/reset/callback paths
- Improved semantics and enabled-state behavior:
- Loading/disabled states are reflected via semantic state values and enabled flags
- Disabled
SFutureButtonnow forwards a null internal callback to reflect a true non-interactive state
- Example updates:
- Updated
SFutureButtonexample to demonstratelabelStyle, icon+label composition, and custom success visuals
- Updated
- Added focused lifecycle regression coverage:
- New
test/s_future_button_lifecycle_test.dartverifies label/style updates, content composition, completion customization forwarding, single-flight async behavior, disposal safety, and semantics
- New
- Added new customization parameters:
-
s_disabledaccessibility fix
5.3.8 #
s_switcherupgraded- breaking change Renamed
valueTexttovalue. - breaking change converted widget to
StatefulWidget: To ensure thatSSwitchercatches changes to thevalueparameter automatically during its lifecycle
- breaking change Renamed
5.3.7 #
states_rebuilder_extended— zero-rebuild listener extensions forInjected:- Added
addSideEffectListener(VoidCallback)→ returns a disposerVoidCallback. Invokes the callback on everynotify()without triggering widget rebuilds. Built onaddObserver(isSideEffects: true). - Added
addListener(VoidCallback)/removeListener(VoidCallback)—ValueNotifier-compatible API soInjectedinstances can be used as drop-in replacements forValueNotifierwithout changing listener registration code. Uses anExpando-backed registry to track disposers per instance. - Both extensions are zero-rebuild: the callback runs directly via the side-effects listener path, never through
OnBuilder/ widget rebuilds. Ideal for high-frequency updates like edge-triggered auto-scroll.
- Added
5.3.6 #
- upgraded dependencies
5.3.5 #
s_spreadsheet— coordinate-to-grid hit-test API:- Made
_SSpreadsheetStatepublic asSSpreadsheetStateso callers can useGlobalKey<SSpreadsheetState>. - Added
SSpreadsheetHitResultclass with row/column indices, progress within hit cell (rowProgress,columnProgress), visibility context booleans (isFirstVisibleRow,isLastVisibleRow,canScrollUp,canScrollDown,isFirstVisibleColumn,isLastVisibleColumn,canScrollLeft,canScrollRight), and total counts (totalRows,totalColumns). - Added
hitTest(double viewportLocalX, double viewportLocalY, double viewportWidth, double viewportHeight)method toSSpreadsheetState— maps a viewport-local position to a grid cell with full visibility context for edge-triggered auto-scroll. - Exported
SSpreadsheetStateandSSpreadsheetHitResultfroms_spreadsheetlibrary barrel.
- Made
5.3.4 #
-
s_webviewupgraded:- Visual Dark Mode on Web (CSS Filter): Added a new
darkModeconfiguration parameter. On Flutter Web, this dynamically applies a CSSinvert(1) hue-rotate(180deg)filter to the underlying iframe element by recursively traversing the DOM and Shadow roots. For pages loaded via CORS proxy, it injects a custom stylesheet to re-invert image, video, canvas, and picture elements to preserve their natural colors. On desktop platforms, it sets native webview brightness. - Custom Proxy Headers: Updated
SWebViewConfigwithproxyHeaderssupport to send custom HTTP headers (such as authorization bearer tokens) to private/secure CORS proxies. - Premium Fallback UI & builders: Added a customizable
fallbackBuildercallback. If a page fails to load (iframe blocks, proxy issues) and no builder is specified, SWebView renders a built-in premium Card UI informing the user and providing direct "Retry with Proxy" and "Open in New Tab" actions.
- Visual Dark Mode on Web (CSS Filter): Added a new
-
s_sidebarupgraded:- Modernized UI/UX: Converted items to a stateful widget to support smooth scale and padding shift animations on hover.
- Section Headers & Dividers: Added
SSideBarItem.header(...)andSSideBarItem.divider()to group items under styled, uppercase, muted headers. - Custom Indicators & Decorations: Added
SideBarIndicatorStylesupportingpill,leftLine,rightLine, ornone, and allowed custom backgrounds viaselectedItemDecorationandunselectedItemDecoration. - Redesigned Collapse Toggles: Added
SideBarMinimizeButtonStylesupporting a sleek bottom row button (bottomRow), an overlapping floating edge toggle (floating), and the original legacy arrow. - Header & Footer Slots: Added collapsible custom
headerandfooterparameters to host widgets like user profile cards that transition gracefully when minimized.
5.3.3 #
s_switcherupdated:- updated the UI Layout
5.3.2 #
s_spreadsheetupdated: debugprints removed
5.3.1 #
s_spreadsheetupdated: quick fix made to autofocus of KeystrokeListener
5.3.0 #
s_spreadsheetupgraded- Keyboard Shortcuts Support: Added comprehensive keystroke support to the spreadsheet via the new
enableKeystrokesparameter (disabled by default for backwards compatibility). - Custom Shortcuts & Actions:
- Introduced
keystrokeShortcutsfor mapping customShortcutActivators toIntents. - Added
keystrokeActionHandlersto bind intent types toVoidCallbackhandlers. - Exposed
includeDefaultKeystrokeShortcuts(defaulttrue) to enable/disable built-in defaults (Escape, Ctrl+S, Ctrl+Z, Ctrl+Y, Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X, Ctrl+/, F1), with automatic platform modifier adaptation (Meta on macOS, Control elsewhere).
- Introduced
- Visual HUD Overlay: Added
keystrokeHudBuilderandkeystrokeHudDuration(default 1s) to show a temporary overlay of the triggered shortcut, usingkeystrokeActionLabelsto map intent types to human-readable action labels. - Focus & Refocus Management:
- Added
keystrokeFocusNodefor external focus node injection. - Added
keystrokeRequestFocusOnInit(defaulttrue) to request autofocus on initialization. - Introduced
shouldPauseKeystrokescallback to pause shortcut detection and refocus, allowing descendant text input fields/search bars to acquire exclusive keyboard access. - Implemented web-specific focus forcing on pointer down (
onPointerDownListener) to reliably prime the DOM<input>element connection in web browsers.
- Added
- Diagnostics: Added
keystrokeDebugLogs(defaultfalse) to print key events to console for debugging.
- Keyboard Shortcuts Support: Added comprehensive keystroke support to the spreadsheet via the new
5.2.3 #
s_switchernew supackage- A widget that displays and sets a value with decrement (-) and increment (+) buttons. It is composed of a prefix widget (title or custom prefix), a value widget (text or custom value widget), and a suffix widget (suffix text or custom suffix).
5.2.2 #
s_context_menuupdated to ensure some async algorithms were protected with amountedcheck
5.2.1 #
metadependency downgraded due toflutter_testconstraints
5.2.0 #
s_packagespub dependencies upgraded
5.1.9 #
-
indexscroll_listview_builderupgraded- Structural reset detection for filtered data: Added
_shouldForceAnimatedListResetheuristic that detects when filtering or bulk data changes produce a substantially different set of rows (>30% key turnover). In such cases theAnimatedListis fully recreated via_resetAnimatedListfor correct data binding instead of attempting key-based diffing against stale widgets. - Improved declarative vs imperative scroll coexistence: New
_isHandlingProgrammaticScrolland_hasRebuiltSinceProgrammaticScrollflags prevent the declarativeindexToScrollToauto-restore from fighting with programmaticcontroller.scrollToIndex()calls. The auto-restore now only triggers on truly external rebuilds, not the immediate callback-driven rebuild. _isDiffInProgressguard: Prevents_applyKeyBasedAnimatedListDifffrom running while a staggered removal or delayed insertion is in progress, avoiding desync with theAnimatedList's internal state.scrollCacheExtentoptimization: BothAnimatedListandListView.buildernow useScrollCacheExtent.pixels(500)for better scroll cache performance.
- Structural reset detection for filtered data: Added
-
s_spreadsheetupgraded- Updated to leverage the enhanced
IndexScrollListViewBuilderimprovements above (structural reset detection, improved scroll coexistence, and scroll cache optimization) for the vertical body and horizontal per-row strips. - Exposed
addAutomaticKeepAlives(defaultfalse) to control whether body rows are kept alive during scrolling.
- Updated to leverage the enhanced
5.1.8 #
-
indexscroll_listview_builderupgraded- Added built-in row insert/remove animations by optionally using an internal
AnimatedList(enabled by default via the newenableRowAnimationsparameter). - New
itemKeyBuilderparameter: supply stable keys (e.g. database IDs or timestamps) soAnimatedListcan correctly track and animate items whose indices change (filtering, reordering, etc.). Falls back to index-based keys when omitted. - New staggered removal behavior (
staggerRowRemovals, defaulttrue): when multiple rows are removed at once (common during filtering), removals now animate sequentially from bottom to top, producing a natural "list shortens upward" effect. Total stagger span is capped by the newmaxStaggerDuration(default 300 ms, individual delays ≤ 100 ms). - Added
rowAnimationDuration(default 400 ms) androwAnimationCurve(defaultCurves.easeOutCubic) for full control over insert and remove animation timing and feel. - All existing features (indexed scrolling via
IndexedScrollController, auto-scroll, scrollbars, declarativeindexToScrollTo, etc.) continue to work when row animations are enabled. - The previous 5.1.7
shrinkWrap/ unbounded viewport fix forAnimatedListis included.
- Added built-in row insert/remove animations by optionally using an internal
-
s_spreadsheetupgraded- Exposed the new row animation controls from the underlying
IndexScrollListViewBuilder:enableRowAnimations(defaulttrue)rowKeyBuilder(maps toitemKeyBuilderfor stable row identity)rowAnimationDuration
- Rows now animate in/out when
rowCountchanges (e.g. live filtering or dynamic data sets) while preserving accurateIndexedScrollControllerscrolling.
- Exposed the new row animation controls from the underlying
5.1.7 #
- 'indexscroll_listview_builder fixed
- shrinkWrap: needsShrinkWrap added to the AnimatedList, to fix unbounded ViewPort layout issues
5.1.6 #
- 'indexscroll_listview_builder upgraded
- internally uses
AnimatedListto allow animations when list changes (adding, removing, or new list)
- internally uses
5.1.5 #
- 's_spreadsheet upgraded
SSpreadsheetcan now scroll to an exact row viaIndexedScrollController.scrollToIndex(), making scrolling accurate regardless of variable row heights, dynamic content, or changes to row sizing.- replaced both
ListView.builderwidgets insideSSpreadsheet(vertical body and horizontal per-row strips) withIndexScrollListViewBuilder, addedverticalIndexedController(IndexedScrollController?) as the sole vertical scrolling interface (removing the now-redundantverticalControllerparameter), and re-exportedIndexedScrollControllerfrom the library export file.
- replaced both
5.1.4 #
s_time'sTimeInputwidget updated- Cursor Positioning
Both overwrite and backspace now use
_positionAtDigitSlotconsistently, which maps a 0-based digit slot index to its formatted-text offset. The unused_positionAfterDigitCountmethod was removed.
- Cursor Positioning
Both overwrite and backspace now use
5.1.3 #
keystroke_listenerupdated- Fixed three issues in the KeystrokeListener: removed unmodified single-key shortcuts (BACKSPACE, ENTER, arrow keys, SPACE, TAB) from _defaultShortcuts so they propagate to child text fields instead of being consumed by Shortcuts; added shouldSuppressAutoRefocus callback to gate the aggressive focus-stealing only when the scheduler's pause is active; and wrapped the visual debug SnackBar in a try-catch to prevent crashes when no Scaffold ancestor exists.
5.1.2 #
keystroke_listenerupdated- Modified
_handleFocusChange()inKeystrokeListenerto only suppress refocus when shouldSuppressAutoRefocus returns true, to stop aggressively stealing focus back from child TextField/TimeInput widgets bug that occured even when keystroke detection was paused — if a descendant in the focus tree has primary focus (_effectiveFocusNode.hasFocus is still true), it no longer calls requestFocus() to steal it back, which was defeating the scheduler's keystroke-pause mechanism.
- Modified
5.1.1 #
s_timeTimeInputgiven aRoleFocusNodeoptional param
5.1.0 #
-
New internal fork:
s_sync_scroll_controller- What it is: a low-level synchronization utility for coordinating multiple
ScrollControllers so they move together as one logical scroll surface. - What it is for: split/linked scrolling layouts (e.g., spreadsheet-style UIs, frozen columns/headers, mirrored panes, and synchronized dashboards).
- Added a maintained in-repo subpackage:
lib/s_sync_scroll_controller/. - Forked and modernized synced-scroll internals for current Flutter usage patterns.
- Added explicit
SyncScrollControllerGroup.dispose()lifecycle handling. - Hardened offset handling with stable last-known offset behavior when no clients are attached.
- Improved peer hold/link lifecycle handling for multi-position/controller churn scenarios.
- What it is: a low-level synchronization utility for coordinating multiple
-
s_spreadsheetmigrated to internal sync engine- What it is: a high-level spreadsheet/table widget built for large datasets with synchronized horizontal behavior across rows.
- What it is for: rendering data-grid-like experiences with configurable headers/cells, smooth coordinated scrolling, and external control hooks for richer UX.
- Replaced external
package:sync_scroll_controller/sync_scroll_controller.dartusage withpackage:s_packages/s_sync_scroll_controller/s_sync_scroll_controller.dart. - Added proper disposal of the horizontal sync group in
SSpreadsheetstate lifecycle. - Introduced
SSpreadsheetHorizontalMetricsandSSpreadsheetHorizontalSyncControllerfor external horizontal state/control. - Added
SSpreadsheetHorizontalScrollButtonshelper widget for built-in left/right scrolling controls. - Added
horizontalSyncControllerparameter onSSpreadsheetfor external orchestration.
-
Package surface and dependency updates
- Exported
s_sync_scroll_controllerfroms_packages.dart. - Removed external
sync_scroll_controllerdependency frompubspec.yaml.
- Exported
-
Example app updates
- Added a new
s_spreadsheetexample screen with:- a Basic tab (core spreadsheet usage)
- an Advanced tab (dynamic row/column sizing, metrics reporting, rendering toggles, and behavioral controls)
- Wired the new example into the registry and home package list.
- Added a new
5.0.0 #
-
keystroke_listenerkeyboard handling overhaul:- Refactored
KeystrokeListenerto use Flutter'sActions+Shortcutspipeline as the primary dispatch path, while still exposing raw key-down events viaonKeyEvent. - Added
shortcutsto inject screen-specificShortcutActivator -> Intentmappings. - Added
includeDefaultShortcutsto optionally disable built-in bindings and run in fully custom shortcut mode. - Expanded
actionHandlersbehavior so caller-provided custom intent types are registered and invokable without extra manual wiring. - Added safer focus lifecycle management for owned vs injected
FocusNodeinstances, including listener cleanup and reconfiguration indidUpdateWidget.
- Refactored
-
Behavior updates / migration notes:
- Shortcut resolution is now intentionally extensible: caller-provided
shortcutsare merged after defaults, so app-level overrides take precedence. - Key-down events continue to bubble (
KeyEventResult.ignored) so ancestorShortcuts/Actionscan still react.
- Shortcut resolution is now intentionally extensible: caller-provided
-
Testing:
- Added regression coverage for caller-defined custom shortcut intents and callback dispatch in
test/keystroke_listener_test.dart.
- Added regression coverage for caller-defined custom shortcut intents and callback dispatch in
4.9.0 #
-
s_modoverlaycentralized lifecycle hooks:- Added a new public lifecycle coordinator in
mod_overlay_lifecycle.dartso apps can observe overlay creation and dismissal globally, without wiring everyPopOverlay.addPop(...)orModal.show(...)call individually. - Added
ModOverlay.onInit,ModOverlay.onDismiss,ModOverlay.dispatchInit(...),ModOverlay.dispatchDismiss(...), andModOverlay.clearLifecycleHooks(). - Added the new event model
ModOverlayLifecycleEventplusModOverlayLifecycleSourceso callbacks receive consistent metadata such asid,semanticId, source, modal type/position, stack level, activation order, and visibility.
- Added a new public lifecycle coordinator in
-
pop_overlaylifecycle bridging:PopOverlay.addPop(...)now dispatches the global init hook.- Re-showing an existing invisible pop and refreshing an already visible pop also dispatch the global init hook.
removePop(...),dismissPop(...),replacePop(...),removeMultiplePops(...), andclearAll()now dispatch the global dismiss hook when an overlay is actually dismissed.- Avoided emitting a fake dismiss event during initial creation when
shouldStartInvisibleis used.
-
s_modallifecycle bridging:- Bridged existing modal lifecycle events into the new
ModOverlayglobal lifecycle flow. - Extended
ModalLifecycleEventwithsemanticIdso modal events carry richer identity metadata. - Modal creation now dispatches
ModOverlay.onInit, and modal dismissal now dispatchesModOverlay.onDismiss.
- Bridged existing modal lifecycle events into the new
-
signals_watchupdated forsignals/signals_flutter^7.0.0:- Kept API compatibility while aligning internals with the v7 stack.
- Optimized lifecycle callback dispatch by caching callback invokers instead of repeatedly probing callback signatures at runtime.
- Reduced per-build allocations in multi-signal mode by reusing internal value buffers.
- Improved widget update lifecycle handling when callback wiring or watched signal sources change at runtime.
- Updated selective observer logging to avoid misleading "previous value" output.
-
Testing:
- Added regression coverage for global lifecycle hooks across both popup and modal flows, including
PopOverlay.addPop,PopOverlay.dismissPop,Modal.show(id: ...), andModal.dismissById(...). - Added
signals_watchregression tests for v7 migration behavior, including zero-argonValueUpdatedcallbacks and runtime source-signal switching.
- Added regression coverage for global lifecycle hooks across both popup and modal flows, including
4.8.1 #
s_bounceableno longer using GestureDetector widget internally to handle single, double and long taps --> using the Listener widget instead, for better compatibility with desktop (using mouse) devices on flutter web platform
4.8.0 #
s_bounceable- Improved documentation and ensured all tap/double-tap/long-press logic is robust and consistent.
SBounceablecontinues to support:- Single tap, double tap, and long press callbacks
- Deferred single tap when double tap is present (prevents accidental single tap on double tap)
- Haptic feedback option
- Configurable bounce animation curve, duration, and scale
- All tests pass for tap/double-tap arbitration and animation behavior.
4.7.2 #
s_webview's debug prints removed
4.7.1 #
s_webviewautomatic API proxy rewriting for data-driven SPAs:- Enhanced proxy compatibility script to automatically intercept and rewrite API calls made by proxied pages.
- When a page loaded via CORS proxy makes
fetch(),XMLHttpRequest, orAxiosrequests to cross-origin API endpoints (e.g.,dir.aviapages.com,api.aviapages.com), SWebView now transparently rewrites these requests through the same proxy that loaded the main HTML. - Extracts the CORS proxy base from the injected
<base>tag and uses it to rewrite URLs matching known API domains. - Enables Vue.js and other data-driven single-page applications to successfully populate dynamic content when loaded through a proxy, fixing the "partial render" issue where headers/footers display but main content areas remain blank.
- Solves the class of problem where API calls fail silently with CORS errors from null-origin
data:URLs, preventing Vue hydration and data binding.
4.7.0 #
s_webviewadaptive proxy compatibility for JS-heavy sites:- Hardened proxy rendering for pages that rely on module scripts, import maps, and relative
<base href>values. - Added automatic rewriting of relative
<base href>values to absolute URLs so proxy-loaded pages can resolve assets correctly fromdata:/srcdoc-based rendering. - Added a generic compatibility script that disables service-worker registration, provides a lightweight IndexedDB fallback, suppresses known null-origin history/origin failures, and continuously keeps blocking overlays hidden when the site tries to re-show them.
- NEW: Added automatic API proxy rewriting for cross-origin API calls from pages like aviapages.com. When a proxied page makes
fetch(),XMLHttpRequest, orAxioscalls to*.aviapages.comendpoints, SWebView now transparently rewrites them to use the same CORS proxy that loaded the main page, enabling Vue.js and other data-driven SPAs to successfully populate content. - Added runtime compatibility telemetry (
window.__swebviewCompatStats) so SWebView can detect degraded proxy loads and retry once with an alternate strategy. - Added a one-shot adaptive retry path that can force resource rewriting for similar sites when the initial proxy strategy loads the page but key runtime plugins/features still fail.
- Improved proxy-cache behavior for known restricted hosts so Windy-like sites stay on the proxy path instead of flipping back to direct mode mid-flow.
- Hardened proxy rendering for pages that rely on module scripts, import maps, and relative
4.6.0 #
s_modalbackground transform customization viaModal.appBuilder(...):- Added optional
backgroundVerticalOffset(default:8.5) to control background vertical translation for bottom/top sheets. - Added optional
backgroundSideSheetOffset(default:8.5) to control background horizontal translation when side sheets are shown. - Added optional
backgroundScaleReductionFactor(default:0.02) to control background scaling intensity while sheet transforms are active. - Existing behavior is fully preserved when these new options are not provided.
- Added optional
4.5.0 #
s_bounceableSBounceablenow internally handles single-tap vs double-tap arbitration. When bothonTapandonDoubleTapare supplied:onTapis deferred untilkDoubleTapTimeout.- a second pointer down within Flutter’s double-tap timeout/slop cancels the pending single tap. -->
onDoubleTapruns instead.
- Added
deferTapWhenDoubleTapEnabled, defaulting totrue, so existing users get the safer behavior automatically. - Removed reliance on
GestureDetector.onDoubleTapfor this case and detects the double interaction from pointer-down events instead, which is what fixed the desktop double-click issue.
4.4.2 #
- work on the package's documentation to increase the pub.dev's scoring
4.4.1 #
- Quick maintenance release: cleaned dependency surface (
js_interopremoved), improved dartdoc scoring setup (dartdoc_options.yaml+@nodoclegacy barrels), and documented the current upstream pub advisory parse warning (advisoriesUpdated).
4.4.0 #
s_webviewproxy hardening for challenge pages:- Added detection for proxy-incompatible HTML payloads (e.g. Cloudflare challenge pages containing
__cf_chl_rt_tk,_cf_chl_opt,cdn-cgi/challenge-platform, orhistory.replaceStatepatterns). - In web proxy mode,
SWebViewnow fails fast instead of attempting adata:URL load that triggers a browserSecurityErrordue tonullorigin. - Added
onProxyIncompatibleDocumentcallback toSWebView. When provided it is called (instead ofonIframeBlocked/onError) whenever a proxy-fetched page is detected as challenge/anti-bot incompatible, letting callers trigger a fallback action (e.g. open in new tab) directly. - When
onProxyIncompatibleDocumentis not provided, the widget falls back to the existingonIframeBlocked+onErrorpath. - Added unit tests for proxy-incompatible detection.
- Added detection for proxy-incompatible HTML payloads (e.g. Cloudflare challenge pages containing
4.3.2 #
-
s_universal_html— Stack overflow fix in DOM parsing:- In
src/controller/window_behavior_impl_browser.dart, replacedDomParser().parseFromString('<html></html>', contentType)with directHtmlDocument.internal(...)/XmlDocument.internal(...)constructor calls, eliminating the recursivewindow.documentaccess that caused aStackOverflowError.
- In
-
s_universal_html— Internalsrc/html.dartmarked private:- Added
@Deprecated('Internal library. Import package:s_packages/s_universal_html/html.dart instead.')annotation. - Added
@internalannotation (frompackage:meta).
- Added
-
s_universal_html— Publichtml.dartentry point updated:- Added
export 's_universal_html.dart';soSUniversalHtmlis available to any consumer of the public API.
- Added
-
s_universal_html— New high-level DOM helper classSUniversalHtml:abstract final class SUniversalHtmlwith platform-safe static helpers (no-ops on non-web).- Covers: context menu, window location & navigation, URL parameters, hash/history, document title, window size, resize/visibility/keyboard/mouse/fullscreen events, clipboard read/write, fullscreen, text selection, CSS variables, scroll, file download (text & bytes), window focus/blur/print, and cookies.
- Implemented via
package:web+dart:js_interopon web (JS and WASM compatible); safe no-op stubs on native. preventDefaultContextMenu()returns avoid Function()?cancel callback (nodart:htmltypes exposed).- All event streams return
Stream<void>— platform-agnostic, no event-object types in the public API.
-
s_universal_html— Example app context-menu test:- Added a toggle + right-click target box to the
SUniversalHtmlexample screen to verifypreventDefaultContextMenu()live in the browser.
- Added a toggle + right-click target box to the
4.3.1 #
-
s_universal_htmlweb stability fix:- Fixed a browser-only
StackOverflowErrorcaused by recursivewindowinitialization inwindow_behavior_impl_browser.dart. - Updated browser
newWindow(...)creation to returnWindow.internal(...)directly with current browserhref. - Removed the recursive top-level
windowreference path from the browser implementation.
- Fixed a browser-only
-
s_universal_htmlbrowser API modernization:- Replaced deprecated
dart:htmlusage in browser behavior withpackage:webbindings. - Kept location actions (
reload,replace,assign,currentHref) wired to native browser APIs.
- Replaced deprecated
-
New convenience API for app developers:
- Added
s_universal_html/web_actions.dartwithSUniversalHtmlhelpers:SUniversalHtml.reloadWindow()SUniversalHtml.navigateTo(String url)SUniversalHtml.replaceLocation(String url)SUniversalHtml.currentHref
- On web these delegate to
package:web; on non-web they are safe no-ops.
- Added
-
Example app update:
- Added a new
s_universal_htmlexample screen and registered it in the example app package list.
- Added a new
4.3.0 #
- s_universal_html updated:
- Added browser binding hooks to Location:
- reload
- replace
- assign
- currentHref getter
- Wired those hooks in browser impl to native browser APIs:
- browser.window.location.reload()
- browser.window.location.replace(url)
- browser.window.location.assign(url)
./s_universal_html/src/html/api/navigator.dart:- Replaced hardcoded fallback getters with constructor-backed fields:
- cookieEnabled
- languages
- onLine
- userAgent
- vendor
- vendorSub
- doNotTrack
- maxTouchPoints
- Replaced hardcoded fallback getters with constructor-backed fields:
- Keeps fallback defaults when values aren’t provided.
./s_universal_html/src/controller/window_behavior_impl_browser.dart:- Replaced newNavigator(...) UnsupportedError with real browser-backed construction.
- Reads values from browser.window.navigator and passes them into
- Added browser binding hooks to Location:
4.2.4 #
- quick update to documentation
4.2.3 #
- Lower-bound Flutter compatibility: Replaced
scrollCacheExtent: ScrollCacheExtent.pixels(500)withcacheExtent: 500inindexscroll_listview_builderto support pub.dev downgrade analysis environments whereScrollCacheExtentis unavailable. - Analyzer compatibility on latest Flutter: Added a targeted
// ignore: deprecated_member_useon thecacheExtentline to keep CI/release analysis green while retaining lower-bound SDK compatibility.
4.2.2 #
- Dependency adjustment:
metadowngraded to^1.17.0to pass pub.dev analysis
4.2.1 #
- Dependency refresh: Updated
assorted_layout_widgetsto^12.4.2,dioto^5.9.2, anddart_helper_utilsto^6.0.1. - Lint fixes in
s_universal_html: Added// ignore: invalid_annotation_targetdirective tojs.dart,js_util.dart,svg.dart, andweb_gl.dartto suppress false-positive annotations on library-level@visibleForTesting. - Removed
metadependency override: The pinnedmetaoverride is no longer needed and has been removed frompubspec.yaml.
4.2.0 #
-
Cross-subpackage maintenance and behavior updates:
- Applied internal updates across
time_input,pop_overlay,s_modal,s_modoverlay,s_context_menu, ands_widgetsto improve consistency and maintainability.
- Applied internal updates across
-
Dependency and export updates:
- Replaced
icons_pluswithtabler_icons_plus. - Exported
tabler_icons_plusfrom the package surface for downstream usage. - Refreshed package dependencies for better compatibility.
- Replaced
-
universal_htmlmigration and hardening:- Migrated direct
universal_htmlusage to thes_universal_htmlsubpackage. - Applied follow-up improvements to
s_universal_htmlintegration and internals.
- Migrated direct
-
General internal maintenance:
- Included additional cleanup and maintenance updates in this release cycle.
-
Testing and reliability:
- Fixed an interleaving teardown edge case where
OverlayInterleaveManagercould attempt to insert entries into a disposedOverlayStateduring cleanup flows (notably aroundModal.dismissAll(...)). - Hardened interleaved host resolution/sync guards so only mounted overlays are reused after widget-tree teardown/rebuild cycles.
- Fixed
TimeInputfocus-entry and caret behavior regressions so first-focus taps consistently start at the first editable slot. - Fixed
TimeInputcaret normalization/backspace slot handling so separator skipping and minute-digit clearing remain deterministic. - Verified by passing targeted regression tests (
modal_background_interaction_test.dart,time_input_focus_cursor_test.dart) and the fullflutter testsuite.
- Fixed an interleaving teardown edge case where
4.1.0 #
s_context_menumaintenance and interaction refinements:- Refined internal
TapRegioncomposition in the overlay shell to keep grouped tap handling behavior consistent during outside-tap and right-click interactions. - Applied internal code cleanup/formatting in
lib/s_context_menu/src/s_context_menu.dartfor improved readability and maintainability. - No public API breaking changes.
- Refined internal
4.0.0 #
-
s_modoverlayinterleaving architecture hardening (modal + pop overlay coexistence):- Stabilized shared interleaving behavior between
s_modalandpop_overlayso both systems can coexist in a single overlay stack with deterministic ordering. - Consolidated root-overlay resolution paths to avoid duplicated host-resolution logic and reduce divergence risk.
- Improved host lifecycle safety to avoid duplicate interleaved host installation and unintended layer remounts during overlay reordering.
- Improved layer identity stability in interleaved rendering paths so active overlays (notably snackbars) are not remounted when unrelated layers are added/removed.
- Stabilized shared interleaving behavior between
-
Stack-level synchronization fixes:
- Fixed
pop_overlaystack-level mutations (setStackLevel,bringToFront,sendToBack) so interleaved layers are re-registered with updated effective levels immediately. - Preserved ordering consistency between activation order and stack level across interleaved updates.
- Fixed
-
s_modallifecycle and dismissal robustness improvements:- Improved dialog/sheet/snackbar coordination during dismiss flows to reduce race conditions across mixed overlay scenarios.
- Hardened snackbar-controller lifecycle behavior during interleaved modal transitions.
- Applied additional cleanup/guard logic around dismiss paths to keep active-state transitions deterministic.
-
Lifecycle observability and event filtering API additions:
- Added public lifecycle event types and payloads:
ModalLifecycleEventType,ModalLifecycleEvent. - Added optional
Modal.appBuilder(...)lifecycle hooks:onModalCreated,onModalDismissed. - Added lifecycle filtering in
appBuilder:lifecycleModalTypesandshouldNotify. - Added lifecycle listener management APIs:
Modal.addLifecycleListener(...),Modal.removeLifecycleListener(...), andModal.clearLifecycleListeners().
- Added public lifecycle event types and payloads:
-
Custom modal integration hardening:
- Promoted
ModalType.customto a first-class flow in interleaving/show/dismiss paths. - Added/solidified custom modal state checks and cleanup behavior (
Modal.isCustomActive) to keep mixed-layer dismiss transitions deterministic.
- Promoted
-
Interleaved barrier and host management improvements:
- Added single barrier-owner resolution via
OverlayInterleaveManager.topBarrierOwnerLayerId(...)to avoid compounded backdrop opacity and barrier flicker when multiple layers coexist. - Added
OverlayInterleaveManager.teardownHost(...)for reliable hard-reset cleanup in teardown/test scenarios.
- Added single barrier-owner resolution via
-
Dismiss API coverage expansion:
- Added/solidified targeted dismissal helpers for complex mixed-layer flows:
Modal.dismissCurrentModal(...),Modal.dismissSnackbarAtPosition(...),Modal.dismissByIds(...), andModal.dismissByType(...).
- Added/solidified targeted dismissal helpers for complex mixed-layer flows:
-
Testing and reliability:
- Fixed the hanging snackbar/modal interaction regression in
test/modal_background_interaction_test.dartby using deterministic pump timing around async dismissal flows. - Improved timing stability in modal background interaction tests where long-running animation controllers can make
pumpAndSettle()non-terminating. - Preserved and validated overlay ordering and interleaving behavior through the existing stack-ordering test coverage.
- Added regression coverage for lifecycle callback/listener filtering/removal and barrier-owner policy behavior across interleaved layers.
- Fixed the hanging snackbar/modal interaction regression in
-
Developer-experience cleanup:
- Commented out verbose
s_modoverlayruntime debug logs ([Modal],[OverlayInterleave],[PopOverlay],[snackbar_debug], and escape-key diagnostics) to keep console/test output clean by default.
- Commented out verbose
3.6.0 #
- Popup tap-region coordination upgrade:
- Added a shared
PopOverlayTapRegionScopeso popup content can expose a commonTapRegiongroup to nested overlays. - Updated
pop_overlayframe templates to wrap popup surfaces in the shared tap-region scope when one is available, keeping child interactions from being misclassified as outside taps. - Extended
s_context_menuands_dropdownwith optional tap-region group support so both widgets can live safely inside popups without premature dismissal. - Added regression coverage for the new tap-region inheritance flow, including dropdown and context-menu overlays.
- Added a shared
3.5.1 #
s_dropdownclear-button visibility fix:- The inline clear button now appears only when a real selection is present, including the initial selected item and any user-selected item.
- The clear button stays hidden when the dropdown is showing only the hint state, preventing a no-op clear affordance.
- Added a regression test covering the hint-only state to keep the suffix area behavior stable.
3.5.0 #
-
s_dropdownclear-selection upgrade:- Added a controller API to clear the current selection programmatically, with support for either restoring the initial item or clearing all the way back to the hint state.
- Added an inline clear suffix button powered by
SInkButton, so the current selection can be cleared directly from the dropdown header. - Preserved overlay-open and overlay-closed behavior so clearing works consistently in both states.
- Added focused tests and example updates covering both clear-to-initial and clear-to-hint flows.
-
s_metarlive fetch flexibility upgrade:- Added configurable fetch options for alternate METAR/TAF endpoints.
- Added custom success-code handling for non-standard API responses.
- Added configurable JSON field mapping and item extraction so raw METAR/TAF strings can be read from different response shapes.
- Added a proxy toggle so callers can disable proxy attachment entirely when talking directly to an API.
- Added focused tests covering custom parsing and direct-only fetch behavior.
3.4.0 #
s_ink_buttonhover feedback improvement:- Active
SInkButtonwidgets now show the click cursor on web/desktop hover, giving clearer visual feedback that the widget is interactive. - Disabled
SInkButtonwidgets keep the basic cursor so non-interactive states remain visually distinct.
- Active
3.3.1 #
pop_overlayinteraction and layout refinements:- Added optional
TapRegionintegration toPopOverlayContent(tapRegionGroupId,onTapRegionOutside,onTapRegionInside,tapRegionBehavior,tapRegionConsumeOutsideTaps) so overlay content can participate in grouped inside/outside tap handling. - Updated the overlay activator to inherit the surrounding app theme, scroll behavior, and text direction instead of spinning up a nested
MaterialApp, improving integration inside host applications. - Improved dismissal safety by ensuring delayed removals only dispose the exact overlay instance that started exiting, preventing stale dismiss timers from removing a newer overlay that reused the same ID.
- Improved framed popup sizing with responsive width/height resolution, maximum viewport constraints, and better handling of fractional dimensions for web and constrained layouts.
- Improved drag lifecycle tracking so drag state is reset consistently on drag start/end/cancel for both popup bodies and draggable headers.
- Fixed auto-dismiss behavior to trigger
onDismissedcorrectly when overlays are made invisible on dismiss.
- Added optional
3.3.0 #
-
pop_overlaystack layering upgrade:- Added
stackLeveltoPopOverlayContentwith defaultPopOverlayStackLevels.overlay. - Added stack APIs:
getStackLevel,setStackLevel,bringToFront,sendToBack, andactiveIdsByStackOrder. - Added stack constants helpers:
PopOverlayStackLevelsandPopOverlayStackLevelBands. - Replaced hard-coded priority-only ordering with stable effective-level sorting while preserving legacy priority bonuses for known critical overlays.
- Improved reactivation/update flow for invisible overlays when
offsetToPopFromorstackLevelchanges, including proper replacement cleanup.
- Added
-
s_modalstack layering and runtime robustness improvements:- Added
stackLevelsupport across modal creation/update paths (ModalBuilder,Modal.show,Modal.showSnackbar,Modal.updateParams). - Added stack-level constants and guidance:
ModalStackLevels,ModalStackLevelBands. - Added modal stack APIs:
activeIdsByStackOrder,topMostActiveId,getStackLevel,setStackLevel,bringToFront, andsendToBack. - Added viewport-aware sizing helpers (
_ModalViewportScope,_modalViewportSizeOf) to better handle framed/responsive layouts and swipe thresholds. - Improved dismiss-all scheduling safety by deferring only during frame-critical scheduler phases and preventing duplicate deferred callbacks.
- Improved snackbar visuals and consistency (entrance timing/barrier fade synchronization, viewport-based gesture calculations).
- Added
-
Testing:
- Added
test/overlay_stack_ordering_test.dartcovering overlay stack ordering helpers and modal stack smoke checks.
- Added
3.2.0 #
s_sidebarsub-package bug fix:- Fixed issue where
SSideBarItem.onTapcallback was incorrectly triggered during long presses. - Replaced
InkWellwithSInkButtonwhich usesonTapUpinternally, ensuring the callback only fires on completed taps. - This cleaner solution eliminates the need for wrapper widgets while preserving all visual effects and providing correct tap position data.
- Fixed issue where
3.1.0 #
s_ink_buttonsplash animation enhancement:- Updated splash rendering to a radial-gradient style so the splash is no longer a flat filled circle.
- Added a soft fade in the splash interior (center) for a cleaner ink effect.
- Added a smooth fade on the outer splash edge (border) for more natural ripple falloff.
- Affected sub-packages using
SInkButton:pop_overlay,s_button,s_expendable_menu,s_modal,s_time,week_calendar.
3.0.2 #
-
s_webviewproxy HTML normalization refactor:- Extracted new
SWebViewProxyHtmlUtilsutility class (_proxy_html_utils.dart) to centralize proxy response handling. normalizeProxyHtml()— unwraps known JSON envelopes (e.g. allorigins{ contents: ... }), decodes HTML entities (including doubly-escaped payloads like&lt;html...), strips wrapping quotes, and handles URL-encoded HTML.injectBaseTagIfMissing()— safely injects<base href="...">into the<head>(or prepends it) when none is present, with proper fragment stripping from the base URL.looksLikeHtml()— best-effort HTML-detection heuristic.- Refactored
_SWebViewStateto useSWebViewProxyHtmlUtilsinstead of inline proxy response / base-tag injection logic. - Added unit tests for
SWebViewProxyHtmlUtils(JSON envelope unwrap, double-entity decoding, base tag injection/deduplication).
- Extracted new
-
Example app updates:
- Expanded webview example screen with many more test-URL buttons in a horizontally scrollable row.
- Added basic widget test (
example/test/widget_test.dart).
3.0.1 #
s_webviewfix: restoredwebview_flutter_webdependency that was accidentally removed in 3.0.0, causing URL loading to fail on web platform (no web platform backend registered).
3.0.0 #
- Dependency unbloat (BREAKING): removed convenience-only third-party dependencies that were not required by core
s_packageswidgets/controllers.- Removed from
dependencies:overlay_support,email_validator,regexed_validator,strings,cryptography,roundcheckbox,swipeable_tile,toastification,sync_scroll_controller,animated_list_plus,google_fonts,simple_animations.
- Removed from
- API surface cleanup (BREAKING):
s_packages.dartno longer exportss_packages_extra1.dartby default. - Legacy convenience barrels slimmed:
s_packages_extra1.dartands_packages_extra2.dartnow expose only lightweight/foundational exports and are no longer intended as "install-everything" shortcuts. - Migration note: apps needing removed third-party packages should add them directly in their own
pubspec.yaml.
2.1.1 #
s_modalsub-package improvements:- Removed idempotent guard in
Modal.appBuilder(): Previously, callingappBuildermore than once (e.g. during hot reload) would skip reinstallation to avoid double-nesting_ActivatorWidget. This guard has been removed so thatappBuilderalways installs a fresh activator widget, fixing cases where hot reload could leave the modal system in a stale state. - Code formatting: Applied Dart formatter across the file for consistency.
- Removed idempotent guard in
2.1.0 #
s_modalsub-package improvements:- Synchronized Barrier & Modal Dismissal: The background barrier now fades out in perfect sync with the modal content (Dialogs, BottomSheets, Snackbars). No more lingering barriers or premature disappearances.
- Snappier Animations: Reduced exit animation durations from ~300-400ms to 200ms for a faster, more responsive UI feel.
- Cleanup & Fixes:
- Fixed an issue where the snackbar barrier was not fading out correctly.
- Updated internal logic to wait exactly for the animation duration (200ms) before disposing of the modal controller, preventing race conditions or UI lag.
2.0.0 #
-
pop_overlaysub-package improvements:- Improved overlay bootstrap resolution to prefer the nearest overlay context before falling back to the root overlay.
- Fixed popup positioning for framed/scaled layouts (notably web) by keeping overlays in the same coordinate space as the caller.
-
s_offstagesub-package improvements:- Removed the internal
Sizerwrapper fromSOffstageto avoid forcing an extra layout context around the widget tree. - Improved scale-only transitions: hidden state now scales to
0.0(instead of0.97) for a cleaner and fully smooth disappearance at animation end. - Updated inline documentation examples to use
SOffstagenaming consistently.
- Removed the internal
-
Example app update:
ForcePhoneSizeOnWebnow uses an explicit size (2048 x 2732) inexample/lib/main.dartfor improved demo consistency.
-
Package metadata:
- Bumped package version to
2.0.0and updated README installation snippet accordingly.
- Bumped package version to
1.9.0 #
-
s_webviewmajor upgrade:- Added typed config API with
SWebViewConfig(auto restriction detection, proxy list fallback, host-based cache option, cache TTL, known restricted domains). - Added external controller injection support via
SWebView(controller: ...)with safe ownership/disposal behavior. - Added richer callbacks:
onProgress,onPageStarted,onPageFinished,onUrlChanged,onNavigationRequest,onJavaScriptMessage. - Added navigation decision model (
SWebViewNavigationDecision) and callback type (SWebViewNavigationRequestCallback) to allow/prevent navigation. - Added platform capability model (
SWebViewPlatformCapabilities) on controller.
- Added typed config API with
-
s_webviewbehavior and reliability improvements:- Removed hardcoded navigation blocking and replaced it with callback-driven policy.
- Upgraded JS result handling to use
runJavaScriptReturningResult(...)for title/cookies/search metadata paths. - Reworked web proxy cache with persisted timestamped entries, TTL validation, stale entry invalidation, and backward compatibility for old bool cache format.
- Improved restriction detection using known-domain checks plus header/content hints (
X-Frame-Options, CSPframe-ancestors, body hints). - Added idempotent/concurrency-safe controller initialization to prevent repeated-init crashes (including
LateInitializationErroron reused controllers). - Updated controller navigation helpers to use unified
loadUri(...)flow and aligned desktop support documentation.
-
s_webviewAPI cleanup and internals:- Exported advanced controller extensions from
webview_controller.dart. - Removed duplicate legacy file
webview_controller_clean.dart. - Added shared internal debug logger
_debug_log.dartand routed platform/desktop logs through it. - Added optional pointer-event blocking overlay support to internal WebView widget (
ignorePointerEvents).
- Exported advanced controller extensions from
-
Example app updates (
s_webview_example_screen):- Updated demo to showcase injected controller, typed config, progress/url callbacks, JS message callback, and navigation decision policy toggle.
- Added richer live UI state (progress bar, last seen URL, policy feedback, JS message panel).
1.8.1 #
- CHANGELOG and README updated
1.8.0 #
-
soundsliced_dart_extensionsnew utilities added:- Iterable/List helpers:
none,countWhere,singleWhereOrNull,distinctBy,sortedBy,chunked,windowed,firstWhereOrNull,lastWhereOrNull,firstOrNull,lastOrNull,elementAtOrNull. - Map helpers:
mapKeys,mapValues,filterKeys,filterValues, plus typed accessorsgetString,getIntOrNull,getDoubleOrNull,getBoolOrNull. - String helpers:
isBlank,ifBlank,toIntOrNull,toDoubleOrNull,toTitleCase,removeDiacritics. - Duration helpers:
formatCompactDuration()andtoClockString(). - Date/num helpers:
DateTime.clampTo(...),num?.clampOrNull(...), andnum?.clampToDoubleOrNull(...). - Marked legacy
MyStringExtension.convertStringIntoStringList()as deprecated in favor ofStringExtensions.convertToListString()and the top-level helper.
- Iterable/List helpers:
-
soundsliced_dart_extensionsextension deduplication (BREAKING):- Removed overlapping extensions already provided by exported
nb_utilsto prevent ambiguous extension resolution. - Removed
DateTimemembers from this subpackage:isToday,isYesterday,isTomorrow,isSameDay,startOfDay,endOfDay. - Removed overlapping
Stringmembers from this subpackage:toCamelCase,toSnakeCase. - Removed overlapping
intduration members from this subpackage:seconds,minutes,hours,microseconds. - Migration guidance:
- Use
nb_utilsequivalents for removed overlapping APIs (available transitively vias_packages). - For
intdurations, prefer retained short-hands from this subpackage where desired:sec,min,hr,micSec.
- Use
- Removed overlapping extensions already provided by exported
-
s_packagesexport changes:- Exported
nb_utilsdirectly froms_packages.dart. - Removed duplicate
nb_utilsexport froms_packages_extra1.dart.
- Exported
1.7.2 #
s_metarsub-package improvements:- NEW: Live METAR/TAF fetching:
- Added
MetarTafFetcherclass for fetching live weather data from aviationweather.gov API - Added
MetarTafResultclass for typed fetch results with parsedMetar/Tafobjects and raw data - ICAO code validation: ensures 4-character codes (first char letter, rest alphanumeric) via
isValidIcao() - DateTime validation: rejects future dates and returns descriptive error
- Integration with
s_clientAPI for HTTP requests with automatic retry and error handling
- Added
- CORS proxy support for web builds:
proxyUrlsstatic list for configurable proxy URLs (default: two Cloudflare Workers for redundancy)customProxyUrlsparameter onfetch()for per-request proxy override- Automatic proxy fallback: tries each proxy in order, switches on rate limit (429/503 status codes)
- Direct API fallback when all proxies fail
- Deployment resources:
- Cloudflare Worker implementation in
lib/s_metar/deployment/cloudflare-worker.js - Vercel Edge Function implementation in
lib/s_metar/deployment/vercel-edge-function.js - Comprehensive deployment guide in
lib/s_metar/deployment/README.md - Usage examples in
lib/s_metar/deployment/USAGE_EXAMPLES.dart
- Cloudflare Worker implementation in
- Example app integration:
- Added interactive
s_metarexample screen with 3-tab interface:- METAR tab: preset samples (EGLL, KJFK, Winter, CAVOK) + custom input with live parsing
- TAF tab: editable TAF code with live parsing
- Live Fetch tab: ICAO input, date/time picker, and real-time API fetching
- Expandable cards showing parsed weather data (wind, visibility, clouds, temperatures, pressure)
- Registered in package examples registry under "Networking" category
- Added interactive
- NEW: Live METAR/TAF fetching:
1.7.1 #
s_metarbug fixes:- Fixed
toString()inDistance,Pressure,Temperature(base),MetarTrendIndicator, andTafTemperature—${super}in string interpolation was invokingObject.toString()on the superclass proxy, returning the runtime type string (e.g."Instance of 'Numeric'") instead of the formatted value; changed to${super.toString()}throughout
- Fixed
1.7.0 #
- NEW
s_metarsub-package added:- METAR parsing: Full support for aviation routine weather reports with
Metar(String code)constructor - TAF parsing: Terminal Aerodrome Forecast support with
Taf(String code)constructor - Wind data:
- Speed in multiple units: knots, m/s, km/h, mph via
speedInKnot,speedInMps,speedInKph,speedInMiph - Gust speed in same units via
gustInKnot,gustInMps,gustInKph,gustInMiph - Direction in degrees and cardinal direction (N, NE, E, etc.)
- Wind variation range (from/to degrees)
- Beaufort scale number (0-12) and description via
beaufortandbeaufortDescription isCalmboolean flag for calm wind conditions (00000KT)
- Speed in multiple units: knots, m/s, km/h, mph via
- Visibility:
- Prevailing and minimum visibility in meters, kilometers, sea miles, and feet
isMaximumflag for visibility ≥10 km- CAVOK detection
- Weather phenomena:
- Intensity, descriptor, precipitation, obscuration, and other phenomena
precipitationCodeslist for compound weather (e.g., RASN → ['RA', 'SN'])- Recent weather parsing
- Cloud layers:
- Cover amount with ICAO code (
coverCode: FEW/SCT/BKN/OVC/NSC) and translation - Height in feet, meters, and kilometers
- Cloud type codes (CB, TCU) with
cloudTypeCodeandcloudType - Oktas (eighths of sky coverage)
ceilingproperty (true when ≤1500 ft and BKN/OVC)
- Cover amount with ICAO code (
- Temperature data:
- Temperature and dewpoint in Celsius, Fahrenheit, Kelvin, and Rankine
- Derived meteorological quantities:
relativeHumiditypercentagedewpointSpreadin °CheatIndexin °C (valid when temp ≥27°C and RH ≥40%)windChill(double? windSpeedKph)in °C (valid when temp ≤10°C and wind ≥4.8 km/h)
- Pressure:
- Support for 7 units: hPa, inHg, mbar, Pa, kPa, bar, atm via
inHPa,inInHg,inMbar,inPa,inKPa,inBar,inAtm
- Support for 7 units: hPa, inHg, mbar, Pa, kPa, bar, atm via
- Flight rules: Automatic VFR/MVFR/IFR/LIFR/VLIFR classification via
flightRulesproperty - CAVOK validation:
shouldBeCavok()method checks if conditions meet CAVOK criteria - Additional METAR fields: Runway visual range (RVR), windshear, sea state, runway state, weather trends (TEMPO/BECMG)
- TAF features: Valid period, change indicators (FM/TEMPO/BECMG/PROB), max/min temperature forecasts, change period details
- Serialization:
asMap()method for JSON-serializable output - GroupList utilities:
asList()method for converting group lists (clouds, weather, etc.) toList<Map<String, Object?>> - Flexible parsing: Optional
yearandmonthparameters for accurate timestamp resolution,truncateoption for remark handling - Unparsed groups tracking:
unparsedGroupsproperty lists any METAR/TAF groups that weren't recognized
- METAR parsing: Full support for aviation routine weather reports with
1.6.0 #
s_screenshotsub-package performance improvements:- Fixed
ui.Imagememory leak — native GPU resources are now properly disposed after byte extraction - Base64 encoding is now offloaded to a separate isolate via
compute()on native platforms to avoid blocking the UI thread (falls back to main thread on web where isolates aren't available) - Replaced
Future.microtask(() {})withWidgetsBinding.instance.endOfFramefor more reliable rendering pipeline synchronization - Fixed
ByteDatabuffer view to use preciseoffsetInBytes/lengthInBytesinstead of unboundedasUint8List() - Added
_chunkedBase64Encode()method for chunked base64 encoding on web — processes in 192KB chunks with event loop yields to keep animations running
- Fixed
1.5.3 #
s_clientsub-package improvements:- Stripped Dio
BaseOptionsdown to onlybaseUrlandvalidateStatus— all other configuration (connectTimeout,receiveTimeout,sendTimeout,headers,followRedirects,maxRedirects) is now applied per-request viadio.Options, avoiding web-specific XHR issues (e.g.connectTimeoutsettingxhr.timeout, defaultContent-Typetriggering CORS preflights) connectTimeoutandsendTimeoutare now forwarded to every_perform*method (GET, POST, PUT, PATCH, DELETE, HEAD, download, downloadToFile, uploadFile) — previously onlyreceiveTimeoutwas passed through- Explicitly forwarded
Content-Typefrom request headers todio.Options.contentTypein POST, PUT, and PATCH — ensures Dio's request transformer uses the correct encoder (e.g. form-urlencoded vs JSON) regardless ofBaseOptionsdefaults - Changed
ClientConfig.connectTimeout,receiveTimeout, andsendTimeoutdefaults fromDuration(seconds: 30)tonull(no timeout) - Added
_withTimeout<T>()helper — applies.timeout()only when the duration is non-null, replacing all inline.timeout()calls onhttppackage requests - Applied
maxRedirectsguard (config.followRedirects ? config.maxRedirects : null) consistently to PATCH, DELETE, HEAD, download, downloadToFile, and uploadFile — these methods were previously passingconfig.maxRedirectsunconditionally
- Stripped Dio
1.5.2 #
s_clientsub-package improvements:- Added
autoRedirectStatusCodesparameter toput(),putJson(), and_performPut()— enables manual redirect handling for PUT, POST requests, automatically following theLocationheader with a GET request when the response status code matches (consistent with existing POST redirect behavior) - Fixed
maxRedirectsguard in_performPut()— now only set whenfollowRedirectsis enabled (matching POST behavior)
- Added
1.5.1 #
s_clientsub-package fixes:- Fixed Dio redirect option handling by only setting
maxRedirectswhenfollowRedirectsis enabled - Applied this fix consistently to base Dio options and per-request Dio options in GET and POST flows
- Fixed Dio redirect option handling by only setting
1.5.0 #
s_clientsub-package improvements:- Added
validateStatusparameter (bool Function(int?)?) to all HTTP methods (get,getJson,getJsonList,post,postJson,put,putJson,patch,patchJson,delete,deleteJson,head,download,downloadToFile,uploadFile) — allows per-request control over which status codes are treated as valid - Fixed Dio request options:
followRedirects,maxRedirects, andvalidateStatusare now correctly forwarded to all_perform*methods — previously onlyreceiveTimeoutandheaderswere passed through - flutter/Dart SDKs updated
- Added
1.4.2 #
s_modalsub-package improvements: — Added_appBuilderInstalled = falsein bothdisposeActivator()and_ActivatorWidgetState.dispose(). Without this, after the first test tears down its widget tree, subsequent tests'Modal.appBuildercalls skip creating the_ActivatorWidget, so modals never render.
1.4.1 #
s_connectivitysub-package BREAKING improvements:- BREAKING: Renamed
AppInternetConnectivityclass toSConnectivity— all call sites must be updated (e.g.AppInternetConnectivity.listenable→SConnectivity.listenable) - BREAKING: Renamed source file from
s_connection.darttos_connectivity.dart— direct imports must be updated - Made
toggleConnectivitySnackbar()private (_toggleConnectivitySnackbar) — use theshowNoInternetSnackbarsetter instead for manual snackbar control
- BREAKING: Renamed
1.4.0 #
s_modalsub-package improvements:- Added
Modal.isAppBuilderInstalledpublic getter — allows other packages to check whetherModal.appBuilderhas already been installed in the widget tree - Made
Modal.appBuilderidempotent — calling it more than once now safely returns the child as-is instead of double-nesting the internal_ActivatorWidget
- Added
s_connectivitysub-package improvements:- Added
SConnectivityOverlaywidget — a convenience wrapper that sets up the Modal overlay system so the "No Internet" snackbar works without requiring users to know about or manually callModal.appBuilder - Added
SConnectivityOverlay.appBuilderstatic method — drop-in replacement forModal.appBuilderthat can be passed directly toMaterialApp(builder: ...) - Safe to use alongside an existing
Modal.appBuildercall — double-wrapping is prevented automatically thanks to the idempotentappBuilder
- Added
1.3.0 #
pop_overlaysub-package improvements:PopOverlay.dismissAllPopsadded with optionalincludeInvisibleandexceptparametersPopOverlay.replacePopfor atomically replacing an overlay with a new one- Added query helpers:
isVisibleById,getVisiblePops,getInvisiblePops,visibleCount,invisibleCount - Added
shouldDismissOnEscapeKeyflag onPopOverlayContentto opt out of Escape key dismissal per overlay - Added
onMadeVisiblecallback onPopOverlayContent(counterpart toonMadeInvisible) - Added
onDragStartandonDragEndcallbacks onPopOverlayContent - Added
dragBoundsonPopOverlayContentto constrain dragging within aRect FrameDesignadditions:subtitleproperty for secondary text below the titletitleBarColorandbottomBarColorfor per-popup color customizationheaderTrailingWidgetsfor extra action widgets in the header
bubble_labelsub-package improvements:- Added
animationDurationfor custom show/dismiss timing - Added
showCurveanddismissCurvefor independent animation curves - Added
horizontalOffsetfor horizontal positioning control - Added
showOnHoverflag to trigger label display on mouse hover
- Added
s_bounceablesub-package improvements:- Added
onLongPresscallback - Added
curvefor custom bounce animation curve - Added
enableHapticFeedbackflag for tactile feedback on tap
- Added
s_disabledsub-package improvements:- Added
applyGrayscaleflag to apply a grayscale filter when disabled - Added
disabledSemanticLabelfor custom accessibility label when disabled - Added
disabledChildto show an alternative widget when disabled
- Added
s_bannersub-package improvements:- Added
onTapcallback - Added
gradientfor gradient background support - Added
animateVisibilityto animate show/hide transitions
- Added
s_glowsub-package improvements:- Added
onAnimationCompletecallback to Glow1 and Glow2 - Added
gradientsupport for multi-color glow effects in Glow1
- Added
shakersub-package improvements:- Added
ShakeControllerfor programmatic shake triggering viacontroller.shake()
- Added
s_maintenance_buttonsub-package improvements:- Added
iconfor custom button icon - Added
showConfirmationflag andconfirmationMessagefor confirmation dialog before action
- Added
s_ink_buttonsub-package improvements:- Added
onHoverandonFocusChangecallbacks - Added
hoverColorfor custom hover state color - Added
splashDurationfor custom splash animation timing
- Added
settings_itemsub-package improvements:- Added
subtitle,description, andtrailingtoExpandableParameters - Updated
copyWith,==, andhashCodeaccordingly
- Added
s_error_widgetsub-package improvements:- Converted to
StatefulWidgetfor expandable stack trace state - Added
errorCode,stackTrace(expandable monospace view),showCopyButton, andactions - Copy button copies full error details to clipboard
- Converted to
keystroke_listenersub-package improvements:- Added
actionHandlersmap for customizable intent callbacks per intent type
- Added
s_context_menusub-package improvements:- Added
disabledandshortcutHintfields toSContextMenuItem - Disabled items render at reduced opacity with forbidden cursor
- Shortcut hints display as right-aligned secondary text in menu items
- Added
s_animated_tabssub-package improvements:- Added
tabIconslist for optional per-tab icons - Added
tabBadgeslist for optional per-tab badge pills
- Added
s_expendable_menusub-package improvements:- Added
onExpansionChangedcallback toSExpandableMenu - Added
tooltipanddisabledfields toSExpandableItem - Disabled items render at reduced opacity with null tap handler
- Added
s_future_buttonsub-package improvements:- Added
successDurationanderrorDurationfor configurable state display timing - Added
loadingWidgetfor custom loading indicator replacement
- Added
s_gridviewsub-package improvements:- Added
emptyStateWidgetto display when children list is empty
- Added
ticker_free_circular_progress_indicatorsub-package improvements:- Added
sizeparameter (replaces hardcoded 36.0 diameter)
- Added
soundsliced_tween_animation_buildersub-package improvements:- Added
delayfor pre-animation delay - Added
repeatCountto limit number of auto-repeat cycles
- Added
week_calendarsub-package improvements:- Added
minDateandmaxDatefor date boundary constraints - Added
eventIndicatorDatesandeventIndicatorColorfor event dot indicators on days
- Added
s_clientsub-package improvements:- Added
putJson<T>()typed variant for PUT requests with JSON deserialization - Added
patchJson<T>()typed variant for PATCH requests with JSON deserialization - Added
deleteJson<T>()typed variant for DELETE requests with JSON deserialization
- Added
soundsliced_dart_extensionssub-package improvements:- Added
String.truncate(maxLength, {ellipsis})extension - Added
List<T>.groupBy<K>(keyOf)extension for grouping elements by key
- Added
s_liquid_pull_to_refreshsub-package improvements:- Added
triggerDistancefor customizable drag threshold - Added
onDragProgresscallback reporting drag progress (0.0 to 1.0)
- Added
s_screenshotsub-package performance improvements:- Fixed
ui.Imagememory leak — native GPU resources are now properly disposed after byte extraction - Base64 encoding is now offloaded to a separate isolate via
compute()on native platforms to avoid blocking the UI thread (falls back to main thread on web where isolates aren't available) - Replaced
Future.microtask(() {})withWidgetsBinding.instance.endOfFramefor more reliable rendering pipeline synchronization - Fixed
ByteDatabuffer view to use preciseoffsetInBytes/lengthInBytesinstead of unboundedasUint8List()
- Fixed
s_connectivitysub-package improvements:- BREAKING: Removed
NoInternetConnectionPopupwidget; connectivity warnings now use the Modal snackbar system - Added
showNoInternetSnackbarstatic property to auto-show/dismiss a staggered snackbar on connectivity changes - Added
noInternetSnackbarMessageparameter toinitialiseInternetConnectivityListener()for custom messages - Added
toggleConnectivitySnackbar()static method for manual snackbar control - Removed dependencies on
assorted_layout_widgetsandsizer
- BREAKING: Removed
s_modalsub-package improvements:- BREAKING: Renamed
showSuffixIconparameter toshowCloseIconinModal.showSnackbar() - Replaced barrier
SBounceablewithSInkButtonfor ink-splash feedback and long-press dismiss support - Improved snackbar default layout: text uses
Flexibleinstead ofExpanded, consistent spacing/alignment
- BREAKING: Renamed
signals_watchsub-package improvements:- Metadata is now always stored for signals created via
SignalsWatch.signal(), ensuring.reset()works even without lifecycle callbacks onValueUpdatedcallback now supports zero-parameter signatures (fallback invocation if one-parameter call fails)
- Metadata is now always stored for signals created via
1.2.7 #
s_sidebarsub-package improvements:- Enhanced
SideBarController.activateSideBarwith additional customization options:- Added
dismissBarrierColorparameter for custom barrier colors - Added
shouldBlurDismissBarrierparameter for optional blur effect on barrier - Added
initStatecallback for initialization logic - Added
onDismissedcallback to handle sidebar dismissal events
- Added
- Enhanced
1.2.6 #
pop_overlaysub-package animation improvements:- Added smooth fade-in animations to all popup types; fixes flash issue in
FrameDesignpopups by smoothly animating appearance during auto dynamic dimension calculation time - Extended animation durations for smoother transitions: blur background (400ms → 600ms), barrier fade (0.4-0.5s → 0.8-1.0s), and animated size (300ms → 500ms)
- Added
borderRadiussupport to example demos for better visual consistency - Optimized popup entrance animations with
Curves.fastEaseInToSlowEaseOutfor more natural motion
- Added smooth fade-in animations to all popup types; fixes flash issue in
1.2.5 #
pop_overlaysub-package improvements:- Replaced
pop_overlay's use ofMediaQuery.of(context).sizewithSize(100.w, 100.h)for better responsive sizing using thesizerpackage throughout the overlay system - Improved cross-platform compatibility and responsive behavior
- Replaced
- Example app enhancements:
- Wrapped
MaterialAppwithForcePhoneSizeOnWebfor better web demo experience with consistent phone-sized viewport - Added comprehensive Pop Overlay Demo section in
s_widgets_example_screen.dartshowcasing draggable popup with blur effects, custom styling, and interactive features
- Wrapped
1.2.4 #
s_sidebar&pop_overlaysub-packages upgrades:s_sidebar: Added default left alignment for sidebar activation, allowing the sidebar to stay anchored to the left while minimizing.pop_overlay: Addedalignmentproperty toPopOverlayContent(defaulting toAlignment.center) and updated_PopOverlayActivatorto support popup alignment.
1.2.3 #
- No longer exporting web exclusive packages (
universal_html,web...)
1.2.2 #
- SDK constraint upgrade
1.2.1 #
- no longer depending on
web^1.1.1
1.2.0 #
s_sidebar&pop_overlaysub-packages upgrades:- Added
animateFromOffsettoactivateSideBarto allow animating the sidebar popup from a specific screen position (e.g., button tap location). - Added
curveparameter to customize the animation curve. - Added
animationDurationparameter to control the popup animation speed. - Added
useGlobalPositionparameter toactivateSideBarandPopOverlay, simplifying coordinate handling by automatically converting global tap positions. - Fixed an issue where
SSideBarcould error with infinite height constraints when used in an overlay. - Example app's showcases updated accordingly for both
s_sidebar&pop_overlaysub-packages
- Added
READMEupdated
1.1.4 #
- removed some conflicting dependencies
1.1.3 #
- dependencies upgraded
- new dependencies added not used in this package but included for export convenience, so users don't have to add them separately when using the widgets that depend on them.
1.1.2 #
- all Flutter platforms made enabled
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.1.1 - 2026-02-06 #
- README updated
1.1.0 - 2026-02-06 #
- full restructure of the package and subpackages + subpackages are exported so to be accessible by the
s_packagesusers
1.0.3 - 2026-02-06 #
- s_packages.dart placed in the root folder, and its exports URLs fixed
1.0.2 - 2026-02-06 #
- s_packages.dart created, that exports all included sub packages
1.0.1 - 2026-02-06 #
- README and example gif updated
1.0.0 - 2026-02-05 #
Added #
Initial Release
This is the first public release of s_packages, a comprehensive collection of 43 Flutter packages designed to accelerate development and provide reusable UI components, utilities, and tools.
Package Categories
UI Components (20 packages)
bubble_label- A bubble label widget for displaying tags and labelss_animated_tabs- Animated tab bar with smooth transitionss_banner- Customizable banner widget for notificationss_button- Custom button widget with advanced stylings_context_menu- Context menu widget for right-click interactionss_disabled- Widget wrapper for disabled state managements_dropdown- Dropdown widget with advanced featuress_error_widget- Error display widget with customizable UIs_expendable_menu- Expandable menu widget for hierarchical navigations_future_button- Button with Future-based async operationss_ink_button- Button with ink ripple effectss_liquid_pull_to_refresh- Liquid-style pull to refresh animations_maintenance_button- Button for maintenance mode statess_modal- Modal dialog system with overlay managements_standby- Standby state widget for loading statess_toggle- Toggle switch widgets_widgets- Collection of reusable widgetssettings_item- Settings item widget for configuration screensticker_free_circular_progress_indicator- Progress indicator without ticker dependency
Lists and Collections (2 packages)
indexscroll_listview_builder- ListView with index scrolling capabilitiess_gridview- Enhanced grid view widget
Animations (3 packages)
s_bounceable- Bounceable animation effects for interactive widgetss_glow- Glow effects and visual enhancementsshaker- Shake animations for attention-grabbing effectssoundsliced_tween_animation_builder- Custom tween animation builder
Navigation (3 packages)
pop_overlay- Overlay management for navigationpop_this- Navigation utilities and helperss_sidebar- Sidebar navigation component
Networking (2 packages)
s_client- HTTP client utilities and helperss_connectivity- Connectivity monitoring and status
State Management (2 packages)
signals_watch- Signal watching utilities for reactive programmingstates_rebuilder_extended- Extended state management solutions
Input & Interaction (1 package)
keystroke_listener- Keyboard event listener and handler
Layout (1 package)
s_offstage- Offstage widget utilities for conditional rendering
Platform Integration (1 package)
s_webview- WebView integration for embedded web content
Utilities (4 packages)
post_frame- Post-frame callbacks for timing controls_screenshot- Screenshot capture utilitiess_time- Time utilities and formatterssoundsliced_dart_extensions- Dart language extensions
Calendar (1 package)
week_calendar- Week-based calendar widget
Example Application
- Comprehensive example app showcasing all 43 packages
- Material Design 3 UI with light/dark theme support
- Package browser with search and category filtering
- Interactive demos for each package
- Example assets including GIF demonstrations
Documentation
- Complete README with installation and usage instructions
- Individual package documentation
- Code examples for basic and advanced usage
- GitHub repository with issue tracking
Features #
- ✨ 43 production-ready packages
- 📦 Unified package management
- 🎨 Material Design 3 support
- 🌓 Light and dark theme compatibility
- 📱 Cross-platform support (iOS, Android, Web, Desktop)
- 🔍 Comprehensive example app
- 📚 Extensive documentation
- ⚡ Performance optimized
- 🧪 Tested and validated