s_packages 5.5.3 copy "s_packages: ^5.5.3" to clipboard
s_packages: ^5.5.3 copied to clipboard

A unified Flutter package which gathers multiple widgets and tools.

5.5.3 #

  • Fix: SSpreadsheet horizontal scroll metrics went stale after a resize
    • SSpreadsheetHorizontalSyncController was only ever fed from a strip's initState post-frame callback and its scroll listener. A resize changes maxScrollExtent without moving the offset, so neither fired and the published metrics kept describing the old viewport — leaving SSpreadsheetHorizontalScrollButtons (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 a Scrollable dispatches 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 whose metrics.axis is not horizontal (a vertical scrollable nested inside a cell) are ignored.
  • Fix: the published ScrollController could 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.controller could 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.
  • Fix: value was replaced on every report, even an identical one
    • update always 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/animateToEnd could act on a detached controller
    • Both now verify the controller is live and has content dimensions, read the extent from the live ScrollPosition rather 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.
  • 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: canScrollRight treated remaining == threshold as not scrollable
    • offset < (maxScrollExtent - threshold) is a strict comparison, so a host that passes threshold: 1 over 1 px of hidden content (or the default 100 over exactly 100 px) still saw the right arrow disabled. Remaining distance is now compared inclusively (remaining >= threshold and remaining > 0).
  • No breaking API changes. update, the SSpreadsheetHorizontalMetricsChanged typedef and SSpreadsheetHorizontalScrollButtons.activationThreshold (still defaulting to 100) are unchanged; hosts that need a tighter boundary keep passing their own threshold.

5.5.2 #

  • SSpreadsheet gains rowHeaderTapSplashColor/columnHeaderTapSplashColor
    • New optional params (both default to Colors.transparent, matching prior behavior) controlling the splash/hover color of enableTapToSelectRowHeader/ enableTapToSelectColumnHeader's tap target. Pass null to fall back to SInkButton'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 own SInkButton wrapper just to get one, on top of what enableTapToSelect*Header already provides.

5.5.1 #

  • Fix: SSpreadsheet.enableTapToSelectRowHeader/enableTapToSelectColumnHeader could be silently blocked by the header's own content
    • The tap catcher was placed as a same-level Stack sibling behind whatever rowHeaderBuilder/columnHeaderBuilder rendered. A Stack'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 is translucent, so interactive descendants (e.g. a lock icon button inside the header) still win their own bounds as before.
    • No API changes.

5.5.0 #

  • SSpreadsheet gains built-in row/column selection + dimming
    • New SSpreadsheetSelectionController: tracks a selected row and/or column by opaque identity key (via the new columnKeyBuilder, mirroring the existing rowKeyBuilder) rather than by raw index, so a selection survives row filtering/reordering that shifts indices. Defaults to exclusive: true (selecting one axis clears the other); pass exclusive: false to allow both at once.
    • New SSpreadsheet params: selectionController, columnKeyBuilder, dimUnselectedOpacity (opt-in — defaults to 1.0, i.e. off), dimAnimationDuration, enableTapToSelectRowHeader, enableTapToSelectColumnHeader, onRowHeaderSelected, onColumnHeaderSelected, onSelectionCleared, onCellTap.
    • When enabled, SSpreadsheet automatically dims every header/cell outside the selected row/column, wires up tap-to-select on headers, and — via a TapRegion group 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, TapRegion groupIds, outside-tap deselection) themselves.
    • Fully backward compatible: all new params default to no-ops/disabled, so existing SSpreadsheet usages are unaffected.

5.4.1 #

  • TimeInput no longer shows an "Empty" validation error for an intentionally empty field
    • When isEmptyWhenTimeNull is true, 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 TimeInput empty after the user tapped out (rather than falling back to a default value) would see a persistent "Empty" error message under the field.

5.4.0 #

  • SInkButton now has a built-in TapRegion
    • New optional params: tapRegionObjectId (→ TapRegion.groupId), tapRegionEnabled, tapRegionBehavior, onTapOutside, onTapInside, onTapUpOutside, onTapUpInside, consumeOutsideTaps, tapRegionDebugLabel — mirroring TapRegion's own constructor 1:1, with TapRegion's own defaults. Callers no longer need to manually nest a TapRegion inside an SInkButton's child to 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.
    • SButton and SExpandableHandles — the other public widgets that wrap SInkButton as their entire tap surface — now expose and forward the same params.

5.3.11 #

  • s_client GET/HEAD/bodyless DELETE fix
    • SClient no longer sends a Content-Type header on requests with no body (get, head, and delete when called without a body). Previously defaultHeaders (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_banner measurement fix

    • Removed child instance identity comparison in SBanner.didUpdateWidget to avoid spurious _childSize resets 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 isActive becomes true and size isn't known.
  • 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_button upgraded

    • Added new customization parameters:
      • labelStyle for custom label text styling (merged with the default bold white style)
      • successColor, errorColor, successIcon, errorIcon for completion-state visuals
      • semanticsLabel for explicit accessibility naming
    • Improved lifecycle behavior:
      • Added update handling so changes to label, labelStyle, and icon are reliably reflected while mounted
      • Added stable animated content identity updates to avoid stale content through transitions
    • 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 SFutureButton now forwards a null internal callback to reflect a true non-interactive state
    • Example updates:
      • Updated SFutureButton example to demonstrate labelStyle, icon+label composition, and custom success visuals
    • Added focused lifecycle regression coverage:
      • New test/s_future_button_lifecycle_test.dart verifies label/style updates, content composition, completion customization forwarding, single-flight async behavior, disposal safety, and semantics
  • s_disabled accessibility fix

5.3.8 #

  • s_switcher upgraded
    • breaking change Renamed valueText to value.
    • breaking change converted widget to StatefulWidget: To ensure that SSwitcher catches changes to the value parameter automatically during its lifecycle

5.3.7 #

  • states_rebuilder_extended — zero-rebuild listener extensions for Injected:
    • Added addSideEffectListener(VoidCallback) → returns a disposer VoidCallback. Invokes the callback on every notify() without triggering widget rebuilds. Built on addObserver(isSideEffects: true).
    • Added addListener(VoidCallback) / removeListener(VoidCallback)ValueNotifier-compatible API so Injected instances can be used as drop-in replacements for ValueNotifier without changing listener registration code. Uses an Expando-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.

5.3.6 #

  • upgraded dependencies

5.3.5 #

  • s_spreadsheet — coordinate-to-grid hit-test API:
    • Made _SSpreadsheetState public as SSpreadsheetState so callers can use GlobalKey<SSpreadsheetState>.
    • Added SSpreadsheetHitResult class 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 to SSpreadsheetState — maps a viewport-local position to a grid cell with full visibility context for edge-triggered auto-scroll.
    • Exported SSpreadsheetState and SSpreadsheetHitResult from s_spreadsheet library barrel.

5.3.4 #

  • s_webview upgraded:

    • Visual Dark Mode on Web (CSS Filter): Added a new darkMode configuration parameter. On Flutter Web, this dynamically applies a CSS invert(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 SWebViewConfig with proxyHeaders support to send custom HTTP headers (such as authorization bearer tokens) to private/secure CORS proxies.
    • Premium Fallback UI & builders: Added a customizable fallbackBuilder callback. 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.
  • s_sidebar upgraded:

    • 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(...) and SSideBarItem.divider() to group items under styled, uppercase, muted headers.
    • Custom Indicators & Decorations: Added SideBarIndicatorStyle supporting pill, leftLine, rightLine, or none, and allowed custom backgrounds via selectedItemDecoration and unselectedItemDecoration.
    • Redesigned Collapse Toggles: Added SideBarMinimizeButtonStyle supporting a sleek bottom row button (bottomRow), an overlapping floating edge toggle (floating), and the original legacy arrow.
    • Header & Footer Slots: Added collapsible custom header and footer parameters to host widgets like user profile cards that transition gracefully when minimized.

5.3.3 #

  • s_switcher updated:
    • updated the UI Layout

5.3.2 #

  • s_spreadsheet updated: debugprints removed

5.3.1 #

  • s_spreadsheet updated: quick fix made to autofocus of KeystrokeListener

5.3.0 #

  • s_spreadsheet upgraded
    • Keyboard Shortcuts Support: Added comprehensive keystroke support to the spreadsheet via the new enableKeystrokes parameter (disabled by default for backwards compatibility).
    • Custom Shortcuts & Actions:
      • Introduced keystrokeShortcuts for mapping custom ShortcutActivators to Intents.
      • Added keystrokeActionHandlers to bind intent types to VoidCallback handlers.
      • Exposed includeDefaultKeystrokeShortcuts (default true) 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).
    • Visual HUD Overlay: Added keystrokeHudBuilder and keystrokeHudDuration (default 1s) to show a temporary overlay of the triggered shortcut, using keystrokeActionLabels to map intent types to human-readable action labels.
    • Focus & Refocus Management:
      • Added keystrokeFocusNode for external focus node injection.
      • Added keystrokeRequestFocusOnInit (default true) to request autofocus on initialization.
      • Introduced shouldPauseKeystrokes callback 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 (onPointerDown Listener) to reliably prime the DOM <input> element connection in web browsers.
    • Diagnostics: Added keystrokeDebugLogs (default false) to print key events to console for debugging.

5.2.3 #

  • s_switcher new 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_menu updated to ensure some async algorithms were protected with a mounted check

5.2.1 #

  • meta dependency downgraded due to flutter_test constraints

5.2.0 #

  • s_packages pub dependencies upgraded

5.1.9 #

  • indexscroll_listview_builder upgraded

    • Structural reset detection for filtered data: Added _shouldForceAnimatedListReset heuristic that detects when filtering or bulk data changes produce a substantially different set of rows (>30% key turnover). In such cases the AnimatedList is fully recreated via _resetAnimatedList for correct data binding instead of attempting key-based diffing against stale widgets.
    • Improved declarative vs imperative scroll coexistence: New _isHandlingProgrammaticScroll and _hasRebuiltSinceProgrammaticScroll flags prevent the declarative indexToScrollTo auto-restore from fighting with programmatic controller.scrollToIndex() calls. The auto-restore now only triggers on truly external rebuilds, not the immediate callback-driven rebuild.
    • _isDiffInProgress guard: Prevents _applyKeyBasedAnimatedListDiff from running while a staggered removal or delayed insertion is in progress, avoiding desync with the AnimatedList's internal state.
    • scrollCacheExtent optimization: Both AnimatedList and ListView.builder now use ScrollCacheExtent.pixels(500) for better scroll cache performance.
  • s_spreadsheet upgraded

    • Updated to leverage the enhanced IndexScrollListViewBuilder improvements above (structural reset detection, improved scroll coexistence, and scroll cache optimization) for the vertical body and horizontal per-row strips.
    • Exposed addAutomaticKeepAlives (default false) to control whether body rows are kept alive during scrolling.

5.1.8 #

  • indexscroll_listview_builder upgraded

    • Added built-in row insert/remove animations by optionally using an internal AnimatedList (enabled by default via the new enableRowAnimations parameter).
    • New itemKeyBuilder parameter: supply stable keys (e.g. database IDs or timestamps) so AnimatedList can correctly track and animate items whose indices change (filtering, reordering, etc.). Falls back to index-based keys when omitted.
    • New staggered removal behavior (staggerRowRemovals, default true): 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 new maxStaggerDuration (default 300 ms, individual delays ≤ 100 ms).
    • Added rowAnimationDuration (default 400 ms) and rowAnimationCurve (default Curves.easeOutCubic) for full control over insert and remove animation timing and feel.
    • All existing features (indexed scrolling via IndexedScrollController, auto-scroll, scrollbars, declarative indexToScrollTo, etc.) continue to work when row animations are enabled.
    • The previous 5.1.7 shrinkWrap / unbounded viewport fix for AnimatedList is included.
  • s_spreadsheet upgraded

    • Exposed the new row animation controls from the underlying IndexScrollListViewBuilder:
      • enableRowAnimations (default true)
      • rowKeyBuilder (maps to itemKeyBuilder for stable row identity)
      • rowAnimationDuration
    • Rows now animate in/out when rowCount changes (e.g. live filtering or dynamic data sets) while preserving accurate IndexedScrollController scrolling.

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 AnimatedList to allow animations when list changes (adding, removing, or new list)

5.1.5 #

  • 's_spreadsheet upgraded
    • SSpreadsheet can now scroll to an exact row via IndexedScrollController.scrollToIndex(), making scrolling accurate regardless of variable row heights, dynamic content, or changes to row sizing.
      • replaced both ListView.builder widgets inside SSpreadsheet (vertical body and horizontal per-row strips) with IndexScrollListViewBuilder, added verticalIndexedController (IndexedScrollController?) as the sole vertical scrolling interface (removing the now-redundant verticalController parameter), and re-exported IndexedScrollController from the library export file.

5.1.4 #

  • s_time 's TimeInput widget updated
    • Cursor Positioning Both overwrite and backspace now use _positionAtDigitSlot consistently, which maps a 0-based digit slot index to its formatted-text offset. The unused _positionAfterDigitCount method was removed.

5.1.3 #

  • keystroke_listener updated
    • 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_listener updated
    • Modified _handleFocusChange() in KeystrokeListener to 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.

5.1.1 #

  • s_time
    • TimeInput given a RoleFocusNode optional 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.
  • s_spreadsheet migrated 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.dart usage with package:s_packages/s_sync_scroll_controller/s_sync_scroll_controller.dart.
    • Added proper disposal of the horizontal sync group in SSpreadsheet state lifecycle.
    • Introduced SSpreadsheetHorizontalMetrics and SSpreadsheetHorizontalSyncController for external horizontal state/control.
    • Added SSpreadsheetHorizontalScrollButtons helper widget for built-in left/right scrolling controls.
    • Added horizontalSyncController parameter on SSpreadsheet for external orchestration.
  • Package surface and dependency updates

    • Exported s_sync_scroll_controller from s_packages.dart.
    • Removed external sync_scroll_controller dependency from pubspec.yaml.
  • Example app updates

    • Added a new s_spreadsheet example 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.

5.0.0 #

  • keystroke_listener keyboard handling overhaul:

    • Refactored KeystrokeListener to use Flutter's Actions + Shortcuts pipeline as the primary dispatch path, while still exposing raw key-down events via onKeyEvent.
    • Added shortcuts to inject screen-specific ShortcutActivator -> Intent mappings.
    • Added includeDefaultShortcuts to optionally disable built-in bindings and run in fully custom shortcut mode.
    • Expanded actionHandlers behavior so caller-provided custom intent types are registered and invokable without extra manual wiring.
    • Added safer focus lifecycle management for owned vs injected FocusNode instances, including listener cleanup and reconfiguration in didUpdateWidget.
  • Behavior updates / migration notes:

    • Shortcut resolution is now intentionally extensible: caller-provided shortcuts are merged after defaults, so app-level overrides take precedence.
    • Key-down events continue to bubble (KeyEventResult.ignored) so ancestor Shortcuts/Actions can still react.
  • Testing:

    • Added regression coverage for caller-defined custom shortcut intents and callback dispatch in test/keystroke_listener_test.dart.

4.9.0 #

  • s_modoverlay centralized lifecycle hooks:

    • Added a new public lifecycle coordinator in mod_overlay_lifecycle.dart so apps can observe overlay creation and dismissal globally, without wiring every PopOverlay.addPop(...) or Modal.show(...) call individually.
    • Added ModOverlay.onInit, ModOverlay.onDismiss, ModOverlay.dispatchInit(...), ModOverlay.dispatchDismiss(...), and ModOverlay.clearLifecycleHooks().
    • Added the new event model ModOverlayLifecycleEvent plus ModOverlayLifecycleSource so callbacks receive consistent metadata such as id, semanticId, source, modal type/position, stack level, activation order, and visibility.
  • pop_overlay lifecycle 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(...), and clearAll() now dispatch the global dismiss hook when an overlay is actually dismissed.
    • Avoided emitting a fake dismiss event during initial creation when shouldStartInvisible is used.
  • s_modal lifecycle bridging:

    • Bridged existing modal lifecycle events into the new ModOverlay global lifecycle flow.
    • Extended ModalLifecycleEvent with semanticId so modal events carry richer identity metadata.
    • Modal creation now dispatches ModOverlay.onInit, and modal dismissal now dispatches ModOverlay.onDismiss.
  • signals_watch updated for signals / 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: ...), and Modal.dismissById(...).
    • Added signals_watch regression tests for v7 migration behavior, including zero-arg onValueUpdated callbacks and runtime source-signal switching.

4.8.1 #

  • s_bounceable no 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.
    • SBounceable continues 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_webview automatic 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, or Axios requests 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_webview adaptive 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 from data:/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, or Axios calls to *.aviapages.com endpoints, 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.

4.6.0 #

  • s_modal background transform customization via Modal.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.

4.5.0 #

  • s_bounceable
    • SBounceable now internally handles single-tap vs double-tap arbitration. When both onTap and onDoubleTap are supplied:
      • onTap is deferred until kDoubleTapTimeout.
      • a second pointer down within Flutter’s double-tap timeout/slop cancels the pending single tap. --> onDoubleTap runs instead.
    • Added deferTapWhenDoubleTapEnabled, defaulting to true, so existing users get the safer behavior automatically.
    • Removed reliance on GestureDetector.onDoubleTap for 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_interop removed), improved dartdoc scoring setup (dartdoc_options.yaml + @nodoc legacy barrels), and documented the current upstream pub advisory parse warning (advisoriesUpdated).

4.4.0 #

  • s_webview proxy 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, or history.replaceState patterns).
    • In web proxy mode, SWebView now fails fast instead of attempting a data: URL load that triggers a browser SecurityError due to null origin.
    • Added onProxyIncompatibleDocument callback to SWebView. When provided it is called (instead of onIframeBlocked/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 onProxyIncompatibleDocument is not provided, the widget falls back to the existing onIframeBlocked + onError path.
    • Added unit tests for proxy-incompatible detection.

4.3.2 #

  • s_universal_html — Stack overflow fix in DOM parsing:

    • In src/controller/window_behavior_impl_browser.dart, replaced DomParser().parseFromString('<html></html>', contentType) with direct HtmlDocument.internal(...) / XmlDocument.internal(...) constructor calls, eliminating the recursive window.document access that caused a StackOverflowError.
  • s_universal_html — Internal src/html.dart marked private:

    • Added @Deprecated('Internal library. Import package:s_packages/s_universal_html/html.dart instead.') annotation.
    • Added @internal annotation (from package:meta).
  • s_universal_html — Public html.dart entry point updated:

    • Added export 's_universal_html.dart'; so SUniversalHtml is available to any consumer of the public API.
  • s_universal_html — New high-level DOM helper class SUniversalHtml:

    • abstract final class SUniversalHtml with 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_interop on web (JS and WASM compatible); safe no-op stubs on native.
    • preventDefaultContextMenu() returns a void Function()? cancel callback (no dart:html types 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 SUniversalHtml example screen to verify preventDefaultContextMenu() live in the browser.

4.3.1 #

  • s_universal_html web stability fix:

    • Fixed a browser-only StackOverflowError caused by recursive window initialization in window_behavior_impl_browser.dart.
    • Updated browser newWindow(...) creation to return Window.internal(...) directly with current browser href.
    • Removed the recursive top-level window reference path from the browser implementation.
  • s_universal_html browser API modernization:

    • Replaced deprecated dart:html usage in browser behavior with package:web bindings.
    • Kept location actions (reload, replace, assign, currentHref) wired to native browser APIs.
  • New convenience API for app developers:

    • Added s_universal_html/web_actions.dart with SUniversalHtml helpers:
      • 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.
  • Example app update:

    • Added a new s_universal_html example screen and registered it in the example app package list.

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
      • 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

4.2.4 #

  • quick update to documentation

4.2.3 #

  • Lower-bound Flutter compatibility: Replaced scrollCacheExtent: ScrollCacheExtent.pixels(500) with cacheExtent: 500 in indexscroll_listview_builder to support pub.dev downgrade analysis environments where ScrollCacheExtent is unavailable.
  • Analyzer compatibility on latest Flutter: Added a targeted // ignore: deprecated_member_use on the cacheExtent line to keep CI/release analysis green while retaining lower-bound SDK compatibility.

4.2.2 #

  • Dependency adjustment: meta downgraded to ^1.17.0 to pass pub.dev analysis

4.2.1 #

  • Dependency refresh: Updated assorted_layout_widgets to ^12.4.2, dio to ^5.9.2, and dart_helper_utils to ^6.0.1.
  • Lint fixes in s_universal_html: Added // ignore: invalid_annotation_target directive to js.dart, js_util.dart, svg.dart, and web_gl.dart to suppress false-positive annotations on library-level @visibleForTesting.
  • Removed meta dependency override: The pinned meta override is no longer needed and has been removed from pubspec.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, and s_widgets to improve consistency and maintainability.
  • Dependency and export updates:

    • Replaced icons_plus with tabler_icons_plus.
    • Exported tabler_icons_plus from the package surface for downstream usage.
    • Refreshed package dependencies for better compatibility.
  • universal_html migration and hardening:

    • Migrated direct universal_html usage to the s_universal_html subpackage.
    • Applied follow-up improvements to s_universal_html integration and internals.
  • General internal maintenance:

    • Included additional cleanup and maintenance updates in this release cycle.
  • Testing and reliability:

    • Fixed an interleaving teardown edge case where OverlayInterleaveManager could attempt to insert entries into a disposed OverlayState during cleanup flows (notably around Modal.dismissAll(...)).
    • Hardened interleaved host resolution/sync guards so only mounted overlays are reused after widget-tree teardown/rebuild cycles.
    • Fixed TimeInput focus-entry and caret behavior regressions so first-focus taps consistently start at the first editable slot.
    • Fixed TimeInput caret 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 full flutter test suite.

4.1.0 #

  • s_context_menu maintenance and interaction refinements:
    • Refined internal TapRegion composition 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.dart for improved readability and maintainability.
    • No public API breaking changes.

4.0.0 #

  • s_modoverlay interleaving architecture hardening (modal + pop overlay coexistence):

    • Stabilized shared interleaving behavior between s_modal and pop_overlay so 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.
  • Stack-level synchronization fixes:

    • Fixed pop_overlay stack-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.
  • s_modal lifecycle 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: lifecycleModalTypes and shouldNotify.
    • Added lifecycle listener management APIs: Modal.addLifecycleListener(...), Modal.removeLifecycleListener(...), and Modal.clearLifecycleListeners().
  • Custom modal integration hardening:

    • Promoted ModalType.custom to 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.
  • 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.
  • Dismiss API coverage expansion:

    • Added/solidified targeted dismissal helpers for complex mixed-layer flows: Modal.dismissCurrentModal(...), Modal.dismissSnackbarAtPosition(...), Modal.dismissByIds(...), and Modal.dismissByType(...).
  • Testing and reliability:

    • Fixed the hanging snackbar/modal interaction regression in test/modal_background_interaction_test.dart by 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.
  • Developer-experience cleanup:

    • Commented out verbose s_modoverlay runtime debug logs ([Modal], [OverlayInterleave], [PopOverlay], [snackbar_debug], and escape-key diagnostics) to keep console/test output clean by default.

3.6.0 #

  • Popup tap-region coordination upgrade:
    • Added a shared PopOverlayTapRegionScope so popup content can expose a common TapRegion group to nested overlays.
    • Updated pop_overlay frame 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_menu and s_dropdown with 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.

3.5.1 #

  • s_dropdown clear-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_dropdown clear-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_metar live 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_button hover feedback improvement:
    • Active SInkButton widgets now show the click cursor on web/desktop hover, giving clearer visual feedback that the widget is interactive.
    • Disabled SInkButton widgets keep the basic cursor so non-interactive states remain visually distinct.

3.3.1 #

  • pop_overlay interaction and layout refinements:
    • Added optional TapRegion integration to PopOverlayContent (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 onDismissed correctly when overlays are made invisible on dismiss.

3.3.0 #

  • pop_overlay stack layering upgrade:

    • Added stackLevel to PopOverlayContent with default PopOverlayStackLevels.overlay.
    • Added stack APIs: getStackLevel, setStackLevel, bringToFront, sendToBack, and activeIdsByStackOrder.
    • Added stack constants helpers: PopOverlayStackLevels and PopOverlayStackLevelBands.
    • 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 offsetToPopFrom or stackLevel changes, including proper replacement cleanup.
  • s_modal stack layering and runtime robustness improvements:

    • Added stackLevel support 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, and sendToBack.
    • 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).
  • Testing:

    • Added test/overlay_stack_ordering_test.dart covering overlay stack ordering helpers and modal stack smoke checks.

3.2.0 #

  • s_sidebar sub-package bug fix:
    • Fixed issue where SSideBarItem.onTap callback was incorrectly triggered during long presses.
    • Replaced InkWell with SInkButton which uses onTapUp internally, 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.

3.1.0 #

  • s_ink_button splash 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_webview proxy HTML normalization refactor:

    • Extracted new SWebViewProxyHtmlUtils utility 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 &amp;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 _SWebViewState to use SWebViewProxyHtmlUtils instead of inline proxy response / base-tag injection logic.
    • Added unit tests for SWebViewProxyHtmlUtils (JSON envelope unwrap, double-entity decoding, base tag injection/deduplication).
  • 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_webview fix: restored webview_flutter_web dependency 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_packages widgets/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.
  • API surface cleanup (BREAKING): s_packages.dart no longer exports s_packages_extra1.dart by default.
  • Legacy convenience barrels slimmed: s_packages_extra1.dart and s_packages_extra2.dart now 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_modal sub-package improvements:
    • Removed idempotent guard in Modal.appBuilder(): Previously, calling appBuilder more than once (e.g. during hot reload) would skip reinstallation to avoid double-nesting _ActivatorWidget. This guard has been removed so that appBuilder always 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.

2.1.0 #

  • s_modal sub-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_overlay sub-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_offstage sub-package improvements:

    • Removed the internal Sizer wrapper from SOffstage to avoid forcing an extra layout context around the widget tree.
    • Improved scale-only transitions: hidden state now scales to 0.0 (instead of 0.97) for a cleaner and fully smooth disappearance at animation end.
    • Updated inline documentation examples to use SOffstage naming consistently.
  • Example app update:

    • ForcePhoneSizeOnWeb now uses an explicit size (2048 x 2732) in example/lib/main.dart for improved demo consistency.
  • Package metadata:

    • Bumped package version to 2.0.0 and updated README installation snippet accordingly.

1.9.0 #

  • s_webview major 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.
  • s_webview behavior 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, CSP frame-ancestors, body hints).
    • Added idempotent/concurrency-safe controller initialization to prevent repeated-init crashes (including LateInitializationError on reused controllers).
    • Updated controller navigation helpers to use unified loadUri(...) flow and aligned desktop support documentation.
  • s_webview API 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.dart and routed platform/desktop logs through it.
    • Added optional pointer-event blocking overlay support to internal WebView widget (ignorePointerEvents).
  • 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_extensions new 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 accessors getString, getIntOrNull, getDoubleOrNull, getBoolOrNull.
    • String helpers: isBlank, ifBlank, toIntOrNull, toDoubleOrNull, toTitleCase, removeDiacritics.
    • Duration helpers: formatCompactDuration() and toClockString().
    • Date/num helpers: DateTime.clampTo(...), num?.clampOrNull(...), and num?.clampToDoubleOrNull(...).
    • Marked legacy MyStringExtension.convertStringIntoStringList() as deprecated in favor of StringExtensions.convertToListString() and the top-level helper.
  • soundsliced_dart_extensions extension deduplication (BREAKING):

    • Removed overlapping extensions already provided by exported nb_utils to prevent ambiguous extension resolution.
    • Removed DateTime members from this subpackage: isToday, isYesterday, isTomorrow, isSameDay, startOfDay, endOfDay.
    • Removed overlapping String members from this subpackage: toCamelCase, toSnakeCase.
    • Removed overlapping int duration members from this subpackage: seconds, minutes, hours, microseconds.
    • Migration guidance:
      • Use nb_utils equivalents for removed overlapping APIs (available transitively via s_packages).
      • For int durations, prefer retained short-hands from this subpackage where desired: sec, min, hr, micSec.
  • s_packages export changes:

    • Exported nb_utils directly from s_packages.dart.
    • Removed duplicate nb_utils export from s_packages_extra1.dart.

1.7.2 #

  • s_metar sub-package improvements:
    • NEW: Live METAR/TAF fetching:
      • Added MetarTafFetcher class for fetching live weather data from aviationweather.gov API
      • Added MetarTafResult class for typed fetch results with parsed Metar/Taf objects 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_client API for HTTP requests with automatic retry and error handling
    • CORS proxy support for web builds:
      • proxyUrls static list for configurable proxy URLs (default: two Cloudflare Workers for redundancy)
      • customProxyUrls parameter on fetch() 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
    • Example app integration:
      • Added interactive s_metar example 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

1.7.1 #

  • s_metar bug fixes:
    • Fixed toString() in Distance, Pressure, Temperature (base), MetarTrendIndicator, and TafTemperature${super} in string interpolation was invoking Object.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

1.7.0 #

  • NEW s_metar sub-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 beaufort and beaufortDescription
      • isCalm boolean flag for calm wind conditions (00000KT)
    • Visibility:
      • Prevailing and minimum visibility in meters, kilometers, sea miles, and feet
      • isMaximum flag for visibility ≥10 km
      • CAVOK detection
    • Weather phenomena:
      • Intensity, descriptor, precipitation, obscuration, and other phenomena
      • precipitationCodes list 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 cloudTypeCode and cloudType
      • Oktas (eighths of sky coverage)
      • ceiling property (true when ≤1500 ft and BKN/OVC)
    • Temperature data:
      • Temperature and dewpoint in Celsius, Fahrenheit, Kelvin, and Rankine
      • Derived meteorological quantities:
        • relativeHumidity percentage
        • dewpointSpread in °C
        • heatIndex in °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
    • Flight rules: Automatic VFR/MVFR/IFR/LIFR/VLIFR classification via flightRules property
    • 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.) to List<Map<String, Object?>>
    • Flexible parsing: Optional year and month parameters for accurate timestamp resolution, truncate option for remark handling
    • Unparsed groups tracking: unparsedGroups property lists any METAR/TAF groups that weren't recognized

1.6.0 #

  • s_screenshot sub-package performance improvements:
    • Fixed ui.Image memory 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(() {}) with WidgetsBinding.instance.endOfFrame for more reliable rendering pipeline synchronization
    • Fixed ByteData buffer view to use precise offsetInBytes/lengthInBytes instead of unbounded asUint8List()
    • Added _chunkedBase64Encode() method for chunked base64 encoding on web — processes in 192KB chunks with event loop yields to keep animations running

1.5.3 #

  • s_client sub-package improvements:
    • Stripped Dio BaseOptions down to only baseUrl and validateStatus — all other configuration (connectTimeout, receiveTimeout, sendTimeout, headers, followRedirects, maxRedirects) is now applied per-request via dio.Options, avoiding web-specific XHR issues (e.g. connectTimeout setting xhr.timeout, default Content-Type triggering CORS preflights)
    • connectTimeout and sendTimeout are now forwarded to every _perform* method (GET, POST, PUT, PATCH, DELETE, HEAD, download, downloadToFile, uploadFile) — previously only receiveTimeout was passed through
    • Explicitly forwarded Content-Type from request headers to dio.Options.contentType in POST, PUT, and PATCH — ensures Dio's request transformer uses the correct encoder (e.g. form-urlencoded vs JSON) regardless of BaseOptions defaults
    • Changed ClientConfig.connectTimeout, receiveTimeout, and sendTimeout defaults from Duration(seconds: 30) to null (no timeout)
    • Added _withTimeout<T>() helper — applies .timeout() only when the duration is non-null, replacing all inline .timeout() calls on http package requests
    • Applied maxRedirects guard (config.followRedirects ? config.maxRedirects : null) consistently to PATCH, DELETE, HEAD, download, downloadToFile, and uploadFile — these methods were previously passing config.maxRedirects unconditionally

1.5.2 #

  • s_client sub-package improvements:
    • Added autoRedirectStatusCodes parameter to put(), putJson(), and _performPut() — enables manual redirect handling for PUT, POST requests, automatically following the Location header with a GET request when the response status code matches (consistent with existing POST redirect behavior)
    • Fixed maxRedirects guard in _performPut() — now only set when followRedirects is enabled (matching POST behavior)

1.5.1 #

  • s_client sub-package fixes:
    • Fixed Dio redirect option handling by only setting maxRedirects when followRedirects is enabled
    • Applied this fix consistently to base Dio options and per-request Dio options in GET and POST flows

1.5.0 #

  • s_client sub-package improvements:
    • Added validateStatus parameter (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, and validateStatus are now correctly forwarded to all _perform* methods — previously only receiveTimeout and headers were passed through
    • flutter/Dart SDKs updated

1.4.2 #

  • s_modal sub-package improvements: — Added _appBuilderInstalled = false in both disposeActivator() and _ActivatorWidgetState.dispose(). Without this, after the first test tears down its widget tree, subsequent tests' Modal.appBuilder calls skip creating the _ActivatorWidget, so modals never render.

1.4.1 #

  • s_connectivity sub-package BREAKING improvements:
    • BREAKING: Renamed AppInternetConnectivity class to SConnectivity — all call sites must be updated (e.g. AppInternetConnectivity.listenableSConnectivity.listenable)
    • BREAKING: Renamed source file from s_connection.dart to s_connectivity.dart — direct imports must be updated
    • Made toggleConnectivitySnackbar() private (_toggleConnectivitySnackbar) — use the showNoInternetSnackbar setter instead for manual snackbar control

1.4.0 #

  • s_modal sub-package improvements:
    • Added Modal.isAppBuilderInstalled public getter — allows other packages to check whether Modal.appBuilder has already been installed in the widget tree
    • Made Modal.appBuilder idempotent — calling it more than once now safely returns the child as-is instead of double-nesting the internal _ActivatorWidget
  • s_connectivity sub-package improvements:
    • Added SConnectivityOverlay widget — a convenience wrapper that sets up the Modal overlay system so the "No Internet" snackbar works without requiring users to know about or manually call Modal.appBuilder
    • Added SConnectivityOverlay.appBuilder static method — drop-in replacement for Modal.appBuilder that can be passed directly to MaterialApp(builder: ...)
    • Safe to use alongside an existing Modal.appBuilder call — double-wrapping is prevented automatically thanks to the idempotent appBuilder

1.3.0 #

  • pop_overlay sub-package improvements:
    • PopOverlay.dismissAllPops added with optional includeInvisible and except parameters
    • PopOverlay.replacePop for atomically replacing an overlay with a new one
    • Added query helpers: isVisibleById, getVisiblePops, getInvisiblePops, visibleCount, invisibleCount
    • Added shouldDismissOnEscapeKey flag on PopOverlayContent to opt out of Escape key dismissal per overlay
    • Added onMadeVisible callback on PopOverlayContent (counterpart to onMadeInvisible)
    • Added onDragStart and onDragEnd callbacks on PopOverlayContent
    • Added dragBounds on PopOverlayContent to constrain dragging within a Rect
    • FrameDesign additions:
      • subtitle property for secondary text below the title
      • titleBarColor and bottomBarColor for per-popup color customization
      • headerTrailingWidgets for extra action widgets in the header
  • bubble_label sub-package improvements:
    • Added animationDuration for custom show/dismiss timing
    • Added showCurve and dismissCurve for independent animation curves
    • Added horizontalOffset for horizontal positioning control
    • Added showOnHover flag to trigger label display on mouse hover
  • s_bounceable sub-package improvements:
    • Added onLongPress callback
    • Added curve for custom bounce animation curve
    • Added enableHapticFeedback flag for tactile feedback on tap
  • s_disabled sub-package improvements:
    • Added applyGrayscale flag to apply a grayscale filter when disabled
    • Added disabledSemanticLabel for custom accessibility label when disabled
    • Added disabledChild to show an alternative widget when disabled
  • s_banner sub-package improvements:
    • Added onTap callback
    • Added gradient for gradient background support
    • Added animateVisibility to animate show/hide transitions
  • s_glow sub-package improvements:
    • Added onAnimationComplete callback to Glow1 and Glow2
    • Added gradient support for multi-color glow effects in Glow1
  • shaker sub-package improvements:
    • Added ShakeController for programmatic shake triggering via controller.shake()
  • s_maintenance_button sub-package improvements:
    • Added icon for custom button icon
    • Added showConfirmation flag and confirmationMessage for confirmation dialog before action
  • s_ink_button sub-package improvements:
    • Added onHover and onFocusChange callbacks
    • Added hoverColor for custom hover state color
    • Added splashDuration for custom splash animation timing
  • settings_item sub-package improvements:
    • Added subtitle, description, and trailing to ExpandableParameters
    • Updated copyWith, ==, and hashCode accordingly
  • s_error_widget sub-package improvements:
    • Converted to StatefulWidget for expandable stack trace state
    • Added errorCode, stackTrace (expandable monospace view), showCopyButton, and actions
    • Copy button copies full error details to clipboard
  • keystroke_listener sub-package improvements:
    • Added actionHandlers map for customizable intent callbacks per intent type
  • s_context_menu sub-package improvements:
    • Added disabled and shortcutHint fields to SContextMenuItem
    • Disabled items render at reduced opacity with forbidden cursor
    • Shortcut hints display as right-aligned secondary text in menu items
  • s_animated_tabs sub-package improvements:
    • Added tabIcons list for optional per-tab icons
    • Added tabBadges list for optional per-tab badge pills
  • s_expendable_menu sub-package improvements:
    • Added onExpansionChanged callback to SExpandableMenu
    • Added tooltip and disabled fields to SExpandableItem
    • Disabled items render at reduced opacity with null tap handler
  • s_future_button sub-package improvements:
    • Added successDuration and errorDuration for configurable state display timing
    • Added loadingWidget for custom loading indicator replacement
  • s_gridview sub-package improvements:
    • Added emptyStateWidget to display when children list is empty
  • ticker_free_circular_progress_indicator sub-package improvements:
    • Added size parameter (replaces hardcoded 36.0 diameter)
  • soundsliced_tween_animation_builder sub-package improvements:
    • Added delay for pre-animation delay
    • Added repeatCount to limit number of auto-repeat cycles
  • week_calendar sub-package improvements:
    • Added minDate and maxDate for date boundary constraints
    • Added eventIndicatorDates and eventIndicatorColor for event dot indicators on days
  • s_client sub-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
  • soundsliced_dart_extensions sub-package improvements:
    • Added String.truncate(maxLength, {ellipsis}) extension
    • Added List<T>.groupBy<K>(keyOf) extension for grouping elements by key
  • s_liquid_pull_to_refresh sub-package improvements:
    • Added triggerDistance for customizable drag threshold
    • Added onDragProgress callback reporting drag progress (0.0 to 1.0)
  • s_screenshot sub-package performance improvements:
    • Fixed ui.Image memory 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(() {}) with WidgetsBinding.instance.endOfFrame for more reliable rendering pipeline synchronization
    • Fixed ByteData buffer view to use precise offsetInBytes/lengthInBytes instead of unbounded asUint8List()
  • s_connectivity sub-package improvements:
    • BREAKING: Removed NoInternetConnectionPopup widget; connectivity warnings now use the Modal snackbar system
    • Added showNoInternetSnackbar static property to auto-show/dismiss a staggered snackbar on connectivity changes
    • Added noInternetSnackbarMessage parameter to initialiseInternetConnectivityListener() for custom messages
    • Added toggleConnectivitySnackbar() static method for manual snackbar control
    • Removed dependencies on assorted_layout_widgets and sizer
  • s_modal sub-package improvements:
    • BREAKING: Renamed showSuffixIcon parameter to showCloseIcon in Modal.showSnackbar()
    • Replaced barrier SBounceable with SInkButton for ink-splash feedback and long-press dismiss support
    • Improved snackbar default layout: text uses Flexible instead of Expanded, consistent spacing/alignment
  • signals_watch sub-package improvements:
    • Metadata is now always stored for signals created via SignalsWatch.signal(), ensuring .reset() works even without lifecycle callbacks
    • onValueUpdated callback now supports zero-parameter signatures (fallback invocation if one-parameter call fails)

1.2.7 #

  • s_sidebar sub-package improvements:
    • Enhanced SideBarController.activateSideBar with additional customization options:
      • Added dismissBarrierColor parameter for custom barrier colors
      • Added shouldBlurDismissBarrier parameter for optional blur effect on barrier
      • Added initState callback for initialization logic
      • Added onDismissed callback to handle sidebar dismissal events

1.2.6 #

  • pop_overlay sub-package animation improvements:
    • Added smooth fade-in animations to all popup types; fixes flash issue in FrameDesign popups 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 borderRadius support to example demos for better visual consistency
    • Optimized popup entrance animations with Curves.fastEaseInToSlowEaseOut for more natural motion

1.2.5 #

  • pop_overlay sub-package improvements:
    • Replaced pop_overlay's use of MediaQuery.of(context).size with Size(100.w, 100.h) for better responsive sizing using the sizer package throughout the overlay system
    • Improved cross-platform compatibility and responsive behavior
  • Example app enhancements:
    • Wrapped MaterialApp with ForcePhoneSizeOnWeb for better web demo experience with consistent phone-sized viewport
    • Added comprehensive Pop Overlay Demo section in s_widgets_example_screen.dart showcasing draggable popup with blur effects, custom styling, and interactive features

1.2.4 #

  • s_sidebar & pop_overlay sub-packages upgrades:
    • s_sidebar: Added default left alignment for sidebar activation, allowing the sidebar to stay anchored to the left while minimizing.
    • pop_overlay: Added alignment property to PopOverlayContent (defaulting to Alignment.center) and updated _PopOverlayActivator to 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_overlay sub-packages upgrades:
    • Added animateFromOffset to activateSideBar to allow animating the sidebar popup from a specific screen position (e.g., button tap location).
    • Added curve parameter to customize the animation curve.
    • Added animationDuration parameter to control the popup animation speed.
    • Added useGlobalPosition parameter to activateSideBar and PopOverlay, simplifying coordinate handling by automatically converting global tap positions.
    • Fixed an issue where SSideBar could error with infinite height constraints when used in an overlay.
    • Example app's showcases updated accordingly for both s_sidebar & pop_overlay sub-packages
  • README updated

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_packages users

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 labels
  • s_animated_tabs - Animated tab bar with smooth transitions
  • s_banner - Customizable banner widget for notifications
  • s_button - Custom button widget with advanced styling
  • s_context_menu - Context menu widget for right-click interactions
  • s_disabled - Widget wrapper for disabled state management
  • s_dropdown - Dropdown widget with advanced features
  • s_error_widget - Error display widget with customizable UI
  • s_expendable_menu - Expandable menu widget for hierarchical navigation
  • s_future_button - Button with Future-based async operations
  • s_ink_button - Button with ink ripple effects
  • s_liquid_pull_to_refresh - Liquid-style pull to refresh animation
  • s_maintenance_button - Button for maintenance mode states
  • s_modal - Modal dialog system with overlay management
  • s_standby - Standby state widget for loading states
  • s_toggle - Toggle switch widget
  • s_widgets - Collection of reusable widgets
  • settings_item - Settings item widget for configuration screens
  • ticker_free_circular_progress_indicator - Progress indicator without ticker dependency

Lists and Collections (2 packages)

  • indexscroll_listview_builder - ListView with index scrolling capabilities
  • s_gridview - Enhanced grid view widget

Animations (3 packages)

  • s_bounceable - Bounceable animation effects for interactive widgets
  • s_glow - Glow effects and visual enhancements
  • shaker - Shake animations for attention-grabbing effects
  • soundsliced_tween_animation_builder - Custom tween animation builder

Navigation (3 packages)

  • pop_overlay - Overlay management for navigation
  • pop_this - Navigation utilities and helpers
  • s_sidebar - Sidebar navigation component

Networking (2 packages)

  • s_client - HTTP client utilities and helpers
  • s_connectivity - Connectivity monitoring and status

State Management (2 packages)

  • signals_watch - Signal watching utilities for reactive programming
  • states_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 control
  • s_screenshot - Screenshot capture utilities
  • s_time - Time utilities and formatters
  • soundsliced_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