Releases: gohypergiant/standard-toolkit
@accelint/map-toolkit@5.0.0
Major Changes
-
c9952a6: Breaking: Reworks how
DisplayShapeLayerrenders hover and select fill states. The behavior ofselectedShapeId, hover state, and theDISPLAY_SELECTION/DISPLAY-hoversublayer 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
getFillColoraccessor returns a brightened color directly per feature, mirroring the existinggetLineColorbehavior. 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 theapplyBaseOpacity-reduced base, so active features read more vividly against their dimmed neighbors. - The active fill's alpha is scaled by a new
ACTIVE_FILL_OPACITYconstant (0.5). Curtain wall hover/select previously usedOVERLAY_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 helperapplyOverlayOpacitywas renamed toapplyActiveOpacityandOVERLAY_FILL_OPACITYtoACTIVE_FILL_OPACITYto reflect the new role; both were internal-only.
Migration
- Replace any
SHAPE_LAYER_IDS.DISPLAY_SELECTIONreference withSHAPE_LAYER_IDS.DISPLAY_HIGHLIGHT(if you wanted the selection outline) orSHAPE_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/getSelectFillColorto a brighter color of your choosing, or file an issue describing the use case.
Added
getHoverFillColorprop:(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 (whenenableElevationis on). The returned RGBA is used verbatim — no overlay-opacity scaling. No effect on icon-rendered points or non-elevated LineStrings.getSelectFillColorprop: same shape and reach, applied when a feature is selected. The selection outline color is unaffected and is still driven byhighlightColor.- When a shape is both hovered and selected and both overrides are set,
getHoverFillColorwins.
- Removed
Minor Changes
-
999bfbf: Adds a
mapLibreOptionsprop toBaseMapthat forwards additional MapLibreMapOptions(e.g.transformRequest,maxBounds,minZoom/maxZoom,locale,interactive,cooperativeGestures) to the underlying map instance.The most common use is
transformRequestfor rewriting tile URLs through a proxy, adding auth headers, or resolvingmapbox://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).
EditShapeLayernow accepts astyleprop 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), pluseditHandleStrokeWidth,editHandleOutline,bboxLineColor,bboxLineWidth, andbboxDashArray. 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' privateScaleModefields (_isScaling,_cornerGuidePoints,_selectedEditHandle,_geometryBeingScaled,_getOppositeScaleHandle,_getUpdatedData,_cursor) to keep the scale origin stable through a rotated drag. The cast boundary is centralized inmodes/utils/scale-mode-internals.ts, but the field names are pinned to the current upstream internals. If@deck.gl-community/editable-layersrenames 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
Minor Changes
- f321eb4: Add support for peer/ classes
- Add support for Tailwind
peer/classes alongside existinggroup/class support - Update documentation to reflect peer/ class support
- Rename internal function from
globalGroupPlugintotailwindCssModulesPlugin - Add comprehensive test coverage (37 tests) with inline snapshots
- Add support for Tailwind
@accelint/map-toolkit@4.1.0
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'sRotateModeconnector 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
EllipseShapechanges from'bounding-transform'to'ellipse-transform'. If you readeditingState.editModeand compare against'bounding-transform'for an ellipse, update those checks to also accept'ellipse-transform'(or rely ongetEditModeForShape/useEditShapeto pick the right mode for you). -
11ac643: Tightened bus event payload types to satisfy
@accelint/bus'sStructuredCloneableconstraint, and tighteneduseDrawShape().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 GeoJSONFeature/Shapedata satisfy the bus'sStructuredCloneableconstraint. GeoJSON data is cloneable at runtime but lacks the index signature that type-fest'sStructuredCloneablerequires 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 fromShapeFeatureTypetoDrawableShapeType. This catches the previously unguarded potential runtime crash wheredraw('WagonWheel')would passundefinedto deck.gl. Callers that already pass concrete enum values (ShapeFeatureType.Circle, etc.) are unaffected; callers passing an arbitraryShapeFeatureTypewill need to narrow toDrawableShapeTypeor handle the wagon-wheel case separately. - Cleared the related TypeScript errors in
useBus<EditShapeEvent>,useBus<DrawShapeEvent>, and the corresponding broadcast/store sites.
- Added
-
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
RectangleShapechanges from'bounding-transform'to'rectangle-transform'. If you readeditingState.editModeand compare against'bounding-transform'for a rectangle, update those checks to also accept'rectangle-transform'(or rely ongetEditModeForShape/useEditShapeto 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
@accelint/design-foundation@3.2.0
Minor Changes
- 38bc715: Updates design tokens to support the light-dark css function and color-scheme property
@accelint/map-toolkit@4.0.0
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,UseCoffinCornerOptionscoffinCornerStore,clearSelection,getSelectedEntityId,getHoveredEntityIdregisterCoffinCornerLayer,unregisterCoffinCornerLayer,defaultGetEntityIdCoffinCornerEvents,CoffinCornerEvent,CoffinCornerEventTypeCoffinCornerSelectedEvent,CoffinCornerDeselectedEvent,CoffinCornerHoveredEvent
New props on
CoffinCornerExtension:selectedEntityIds: ReadonlySet<EntityId>— replacesselectedEntityIdhoveredEntityIds: ReadonlySet<EntityId>— replaceshoveredEntityId
Removed props:
selectedEntityId— useselectedEntityIdswith a Set insteadhoveredEntityId— usehoveredEntityIdswith a Set instead
Minor Changes
- 210f52d: Add rubber band zoom
@accelint/design-toolkit@9.10.0
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
selectionCascadeprop onuseTreeState, 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 togglePinCardandisPinnedadded to the floating card context- New
FloatingCardHeaderActiontype supports'pin'alongside existing'divider'and custom button actions FloatingCardProvideracceptsinitialPinnedto pre-pin cards at mount timeFloatingCardacceptsinitialPosition({ x, y }) to set the starting coordinates of the panelFloatingCardacceptsinitialDimensions({ width, height }) to set the starting size of the panel (defaults to300 × 400)
- Cards can be pinned to disable dragging via a
-
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
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
Minor Changes
- bae93dc: Add
originalShapeto edit store for reliable cancel/revert and emitshapes:feature-editingevents during drag operations
Patch Changes
-
11fe8ce: fix: prevent DrawShapeLayer from breaking map viewport sync on mount
setDrawDistanceUnitwas callingdrawStore.set()on mount even when not
actively drawing. This triggered a re-render that raced with deck.gl's async
device initialization, causingMapboxOverlay.setPropsto overwrite the
wrappedonLoadcallback that registerswatchMapMove. Without
watchMapMove, the deck viewport stayed frozen at the initial zoom and
pan/zoom picking coordinates were wrong.The fix guards
setDrawDistanceUnitto only update the store when a drawing
is active (activeShapeTypeis set).
@accelint/map-toolkit@3.1.1
Patch Changes
- 5554161: fix tsdown config for build re: react-dom/client subpath