Skip to content

Releases: gohypergiant/standard-toolkit

@accelint/map-toolkit@5.0.0

18 May 19:53
f7fc7dc

Choose a tag to compare

Major Changes

  • c9952a6: Breaking: Reworks how DisplayShapeLayer renders hover and select fill states. The behavior of selectedShapeId, hover state, and the DISPLAY_SELECTION / DISPLAY-hover sublayer ids has changed. Adds optional accessor props for overriding the fill color of the active feature.

    Breaking changes

    • Removed SHAPE_LAYER_IDS.DISPLAY_SELECTION. The selection-overlay sublayer no longer exists, and its id is no longer exported from @accelint/map-toolkit/deckgl/shapes. Any code that referenced this constant for picking-info filtering, layer-id matching, or debug overlays must be updated. The hover sublayer (which had no exported constant; its id was ${layerId}-${SHAPE_LAYER_IDS.DISPLAY}-hover) is also gone.
    • Default fill-color rendering for selected and hovered shapes changed. Previously the active feature's fill was produced by stacking a separate overlay sublayer on top of the main fill, with material-based lighting brightening the result on 3D extruded shapes. Now the main layer's getFillColor accessor returns a brightened color directly per feature, mirroring the existing getLineColor behavior. Pixel-level output differs in four ways:
      • No more alpha-blending stack (the active feature's color is the literal RGBA returned by the accessor; it isn't blended through the dimmed main fill).
      • No more 3D material-lighting variation across surface normals — extruded side faces no longer pick up extra brightness at oblique angles.
      • The brightening factor (1.4× for "hovered or selected", 1.7× for "both") is applied to the un-dimmed base color rather than the applyBaseOpacity-reduced base, so active features read more vividly against their dimmed neighbors.
      • The active fill's alpha is scaled by a new ACTIVE_FILL_OPACITY constant (0.5). Curtain wall hover/select previously used OVERLAY_FILL_OPACITY (0.25) — bumped to 0.5 so polygon and curtain active states share the same opacity, and so the active feature reads more vividly without rendering as a solid block on top of the basemap. The internal helper applyOverlayOpacity was renamed to applyActiveOpacity and OVERLAY_FILL_OPACITY to ACTIVE_FILL_OPACITY to reflect the new role; both were internal-only.

    Migration

    • Replace any SHAPE_LAYER_IDS.DISPLAY_SELECTION reference with SHAPE_LAYER_IDS.DISPLAY_HIGHLIGHT (if you wanted the selection outline) or SHAPE_LAYER_IDS.DISPLAY (if you wanted the layer the active feature now lives on). If you were filtering picking events by sublayer id, the active-fill case is now handled by the main layer.
    • If you had visual regression snapshots or color-sensitive tests on selected/hovered shapes, regenerate them. The new colors are intentional and should read more clearly, but they are different.
    • If you depended on the 3D material-lighting cue specifically, set getHoverFillColor / getSelectFillColor to a brighter color of your choosing, or file an issue describing the use case.

    Added

    • getHoverFillColor prop: (feature: ShapeFeature) => Rgba255Tuple. When set, replaces the default brightening on the hovered feature for: polygon fills, unstyled point fills, and the curtain wall fill of elevated LineStrings (when enableElevation is on). The returned RGBA is used verbatim — no overlay-opacity scaling. No effect on icon-rendered points or non-elevated LineStrings.
    • getSelectFillColor prop: same shape and reach, applied when a feature is selected. The selection outline color is unaffected and is still driven by highlightColor.
    • When a shape is both hovered and selected and both overrides are set, getHoverFillColor wins.

Minor Changes

  • 999bfbf: Adds a mapLibreOptions prop to BaseMap that forwards additional MapLibre MapOptions (e.g. transformRequest, maxBounds, minZoom/maxZoom, locale, interactive, cooperativeGestures) to the underlying map instance.

    The most common use is transformRequest for rewriting tile URLs through a proxy, adding auth headers, or resolving mapbox:// URIs against a self-hosted Mapbox-compatible service.

    <BaseMap
      id={MAIN_MAP_ID}
      styleUrl={MAPBOX_STYLE_URL}
      mapLibreOptions={{
        transformRequest: (url) =>
          url.startsWith("mapbox://")
            ? {
                url: url.replace(
                  "mapbox://",
                  "https://tiles.internal.example.com/",
                ),
              }
            : { url },
        maxBounds: [
          [-130, 20],
          [-60, 55],
        ],
        cooperativeGestures: true,
      }}
    />

    Keys BaseMap manages internally are silently stripped before being applied: camera/view state (container, center, bounds, fitBoundsOptions, zoom, pitch, bearing, projection, maxPitch), gestures reserved for Deck.gl picking and the camera state machine (doubleClickZoom, dragRotate, pitchWithRotate, rollEnabled), the WebGL context (canvasContextAttributes), and keys already exposed as dedicated BaseMap props (boxZoom, style).

  • 3fe824d: Refresh the bounding-box and rotation-handle visuals for shape editing.

    • Rotation handles for rectangles and ellipses now lock to the most-northern edge / axis endpoint at edit-session start and stay attached to that shape-local point through every gesture in the session — the handle starts on the visible top of the shape and rides along with rotations rather than hopping back to the new geographic top after each rotate. The lock resets when a different shape is opened for editing.
    • The polygon and line bounding box now renders with a dashed, muted line and a small outward buffer between the box and the shape so vertex handles and scale handles can't visually overlap. Scale corner handles, the rotate handle, and vertex handles each use a distinct color (turquoise / amber / white) so the three affordances are easy to tell apart.
    • The polygon and line bounding box now stays aligned with the shape across rotations — it tracks cumulative rotation since edit-session start and renders as an oriented bounding box rotated to match, instead of snapping back to a north-aligned bounding box after each rotate. Non-uniform scaling on a rotated polygon/line now operates in the polygon's local frame, so dragging a corner stretches the shape along its own axes rather than world X/Y (which previously sheared rotated polygons into slivers).
    • EditShapeLayer now accepts a style prop covering the full edit-handle and bounding-box surface — fill color, outline color, and radius for each of the three handle roles (vertex, scale, rotate), plus editHandleStrokeWidth, editHandleOutline, bboxLineColor, bboxLineWidth, and bboxDashArray. Each field is independently overridable; omitted fields use the package defaults.

    Note for maintainers: The oriented-bounding-box rotation/scale work reaches into @deck.gl-community/editable-layers' private ScaleMode fields (_isScaling, _cornerGuidePoints, _selectedEditHandle, _geometryBeingScaled, _getOppositeScaleHandle, _getUpdatedData, _cursor) to keep the scale origin stable through a rotated drag. The cast boundary is centralized in modes/utils/scale-mode-internals.ts, but the field names are pinned to the current upstream internals. If @deck.gl-community/editable-layers renames or removes any of these, the oriented scaling features break silently (TypeScript can't help — the contract is defined locally, not upstream). Treat any minor-version bump of that dependency as a behavioral regression risk and verify polygon/line rotate+scale manually.

@accelint/postcss-tailwind-css-modules@1.1.0

07 May 22:24
ec41d42

Choose a tag to compare

Minor Changes

  • f321eb4: Add support for peer/ classes
    • Add support for Tailwind peer/ classes alongside existing group/ class support
    • Update documentation to reflect peer/ class support
    • Rename internal function from globalGroupPlugin to tailwindCssModulesPlugin
    • Add comprehensive test coverage (37 tests) with inline snapshots

@accelint/map-toolkit@4.1.0

07 May 22:24
ec41d42

Choose a tag to compare

Minor Changes

  • 5d224fb: Fix rotated ellipses being stretched into non-ellipse shapes during edit. Ellipses now use a new 'ellipse-transform' edit mode (EllipseTransformMode + EllipseScaleMode) that places scale handles on the curve at the four axis endpoints (where the major and minor axes meet the boundary), projects axis-endpoint drags onto the dragged axis in Mercator space, and regenerates the polygon parametrically — so a rotated ellipse stays a clean rotated ellipse through any scale gesture. Hold Shift while dragging an axis endpoint to scale both axes uniformly (preserve aspect ratio).

    The rotate handle for ellipses is repositioned outside whichever axis endpoint is currently most-northern, with a short connector stem extending outward along that axis (perpendicular to the curve's tangent at that point). The same connector-stem treatment is also applied to the rectangle rotate handle in this release: rectangles' rotate handle now sits outside the most-northern edge with a stem perpendicular to that edge in Mercator space, replacing the bare on-edge placement that shipped with 'rectangle-transform'. Both stems use the same fixed geographic length matching @deck.gl-community's RotateMode connector formula, so the rotate handles read consistently across rectangle and ellipse at any zoom level.

    Note for consumers: the edit-mode value the store assigns to an EllipseShape changes from 'bounding-transform' to 'ellipse-transform'. If you read editingState.editMode and compare against 'bounding-transform' for an ellipse, update those checks to also accept 'ellipse-transform' (or rely on getEditModeForShape / useEditShape to pick the right mode for you).

  • 11ac643: Tightened bus event payload types to satisfy @accelint/bus's StructuredCloneable constraint, and tightened useDrawShape().draw() to reject undrawable shape types.

    • Added BusCloneable<T> (re-exported from @accelint/map-toolkit/deckgl/shapes): type-level helper that lets event payloads carrying GeoJSON Feature/Shape data satisfy the bus's StructuredCloneable constraint. GeoJSON data is cloneable at runtime but lacks the index signature that type-fest's StructuredCloneable requires of plain object types; BusCloneable<T> adds that signature via intersection. Use it when defining custom event payloads that carry shape data.
    • Added DrawableShapeType (re-exported from @accelint/map-toolkit/deckgl/shapes): Exclude<ShapeFeatureType, 'WagonWheel'>. Wagon wheels can't be interactively drawn — they need additional metadata (spokes, orientation, range rings) that a draw interaction can't collect, so they're constructed programmatically and edited via the EditShapeLayer.
    • Narrowed useDrawShape().draw() parameter from ShapeFeatureType to DrawableShapeType. This catches the previously unguarded potential runtime crash where draw('WagonWheel') would pass undefined to deck.gl. Callers that already pass concrete enum values (ShapeFeatureType.Circle, etc.) are unaffected; callers passing an arbitrary ShapeFeatureType will need to narrow to DrawableShapeType or handle the wagon-wheel case separately.
    • Cleared the related TypeScript errors in useBus<EditShapeEvent>, useBus<DrawShapeEvent>, and the corresponding broadcast/store sites.
  • 5d224fb: Fix rotated rectangles distorting into parallelograms during edit. Rectangles now use a new 'rectangle-transform' edit mode (RectangleTransformMode + RectangleScaleMode) that places scale handles at the rectangle's actual rotated corners and projects corner drags onto the rectangle's local edges in Mercator space, so rotation is preserved through any scale gesture. The rotate handle now sits on the rectangle's currently-northern edge midpoint instead of the axis-aligned bbox. Hold Shift while dragging a corner to scale uniformly (preserve aspect ratio) - same Shift behavior as before.

    Note for consumers: the edit-mode value the store assigns to a RectangleShape changes from 'bounding-transform' to 'rectangle-transform'. If you read editingState.editMode and compare against 'bounding-transform' for a rectangle, update those checks to also accept 'rectangle-transform' (or rely on getEditModeForShape / useEditShape to pick the right mode for you).

  • a23674d: Pressing ESC while editing a shape now cancels editing. Previously the editable-layers library only honored Escape in draw modes — transform/translate/rotate/scale modes ignored it.

Patch Changes

  • b3db30f: Draw shapes layer no longer shows stale tooltip until first mouse event (bug) on subsequent draw actions.

@accelint/design-toolkit@9.11.0

07 May 22:24
ec41d42

Choose a tag to compare

Minor Changes

  • 348cc56: Update react-aria-components and simplify dependencies

Patch Changes

  • 3d1cdbd: Small performance improvements to Tree component and additional documentation
  • 537f9f7: adjusted floating card header styling so that the title does not interfere with the drag handle
  • Updated dependencies [38bc715]
    • @accelint/design-foundation@3.2.0

@accelint/design-foundation@3.2.0

07 May 22:24
ec41d42

Choose a tag to compare

Minor Changes

  • 38bc715: Updates design tokens to support the light-dark css function and color-scheme property

@accelint/map-toolkit@4.0.0

21 Apr 21:32
5e163a6

Choose a tag to compare

Major Changes

  • 9819890: Refactor CoffinCornerExtension to a pure rendering primitive

    The coffin corner store (coffinCornerStore), hook (useCoffinCorner), layer registry, and domain events have been removed. The extension now accepts entity IDs directly as props — selection policy belongs in the consuming application (e.g. via SelectionManager).

    Removed exports:

    • useCoffinCorner, UseCoffinCornerReturn, UseCoffinCornerOptions
    • coffinCornerStore, clearSelection, getSelectedEntityId, getHoveredEntityId
    • registerCoffinCornerLayer, unregisterCoffinCornerLayer, defaultGetEntityId
    • CoffinCornerEvents, CoffinCornerEvent, CoffinCornerEventType
    • CoffinCornerSelectedEvent, CoffinCornerDeselectedEvent, CoffinCornerHoveredEvent

    New props on CoffinCornerExtension:

    • selectedEntityIds: ReadonlySet<EntityId> — replaces selectedEntityId
    • hoveredEntityIds: ReadonlySet<EntityId> — replaces hoveredEntityId

    Removed props:

    • selectedEntityId — use selectedEntityIds with a Set instead
    • hoveredEntityId — use hoveredEntityIds with a Set instead

Minor Changes

@accelint/design-toolkit@9.10.0

21 Apr 21:32
5e163a6

Choose a tag to compare

Minor Changes

  • 690fb19: Gantt component implementation feature branch. Makes component available to library consumers.

  • 7042d56: Add semantic cascade selection mode to Tree component. When enabled via selectionCascade prop on useTreeState, selecting a parent node automatically selects all descendants, and parent checkboxes show indeterminate state when partially selected. Includes performance optimizations for large trees and automatic cascade state synchronization after drag-and-drop operations.

  • 62c5a63: - Adds new design system animation tokens for duration and easing for consistent animation effects

    • Adds light built-in animation to the following components: Accordion, Button, ComboboxField, Dialog, Drawer, Menu, Notice, Popover, Sidenav, Switch, Tooltip
    • Guidelines and best practices documentation for using animation
  • 166bc49: Add floating card pinning feature and new placement props.

    • Cards can be pinned to disable dragging via a 'pin' header action
    • togglePinCard and isPinned added to the floating card context
    • New FloatingCardHeaderAction type supports 'pin' alongside existing 'divider' and custom button actions
    • FloatingCardProvider accepts initialPinned to pre-pin cards at mount time
    • FloatingCard accepts initialPosition ({ x, y }) to set the starting coordinates of the panel
    • FloatingCard accepts initialDimensions ({ width, height }) to set the starting size of the panel (defaults to 300 × 400)
  • 118174a: Adds the Carousel component. Displays a timeline of navigatable items for display in one central viewing area.

Patch Changes

  • Updated dependencies [62c5a63]
    • @accelint/design-foundation@3.1.0

@accelint/design-foundation@3.1.0

21 Apr 21:32
5e163a6

Choose a tag to compare

Minor Changes

  • 62c5a63: - Adds new design system animation tokens for duration and easing for consistent animation effects
    • Adds light built-in animation to the following components: Accordion, Button, ComboboxField, Dialog, Drawer, Menu, Notice, Popover, Sidenav, Switch, Tooltip
    • Guidelines and best practices documentation for using animation

@accelint/map-toolkit@3.2.0

03 Apr 16:41
f2dbd56

Choose a tag to compare

Minor Changes

  • bae93dc: Add originalShape to edit store for reliable cancel/revert and emit shapes:feature-editing events during drag operations

Patch Changes

  • 11fe8ce: fix: prevent DrawShapeLayer from breaking map viewport sync on mount

    setDrawDistanceUnit was calling drawStore.set() on mount even when not
    actively drawing. This triggered a re-render that raced with deck.gl's async
    device initialization, causing MapboxOverlay.setProps to overwrite the
    wrapped onLoad callback that registers watchMapMove. Without
    watchMapMove, the deck viewport stayed frozen at the initial zoom and
    pan/zoom picking coordinates were wrong.

    The fix guards setDrawDistanceUnit to only update the store when a drawing
    is active (activeShapeType is set).

@accelint/map-toolkit@3.1.1

01 Apr 17:49
a459a68

Choose a tag to compare

Patch Changes

  • 5554161: fix tsdown config for build re: react-dom/client subpath