@texturehq/edges 1.12.0 → 1.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,7 @@ import React__default, { ReactNode } from 'react';
4
4
  import * as PhosphorIcons from '@phosphor-icons/react';
5
5
  import { IconProps as IconProps$1 } from '@phosphor-icons/react';
6
6
  import { DateValue, DateFieldProps as DateFieldProps$1, ValidationResult, MeterProps as MeterProps$1 } from 'react-aria-components';
7
+ import * as react_map_gl from 'react-map-gl';
7
8
  import { ViewState, MapRef } from 'react-map-gl';
8
9
  import * as d3_scale from 'd3-scale';
9
10
  import { ScaleTime, ScaleLinear } from 'd3-scale';
@@ -995,10 +996,64 @@ interface RasterLayerSpec extends BaseLayerSpec {
995
996
  fadeDuration?: number;
996
997
  };
997
998
  }
999
+ /**
1000
+ * Clustered vector tile layer (Mapbox Vector Tiles with server-side clustering)
1001
+ *
1002
+ * Used for displaying large numbers of point features with automatic clustering.
1003
+ * The backend MVT service pre-clusters points and provides cluster metadata.
1004
+ */
1005
+ interface ClusteredVectorLayerSpec extends Omit<BaseLayerSpec, "tooltip"> {
1006
+ kind: "clusteredVector";
1007
+ /** Mapbox tileset URL (mapbox://...) or HTTP template with {z}/{x}/{y} */
1008
+ tileset: string;
1009
+ /** Source layer name within the tileset */
1010
+ sourceLayer: string;
1011
+ /** ID of the currently selected feature (for highlighting) */
1012
+ selectedId?: string | null;
1013
+ /** Tooltip configuration specific to clustered data */
1014
+ tooltip?: {
1015
+ /** When to show the tooltip (defaults to "hover") */
1016
+ trigger?: "hover" | "click";
1017
+ /** Tooltip content for clusters (receives point count and feature) */
1018
+ cluster?: (count: number, feature: LayerFeature) => React.ReactNode;
1019
+ /** Tooltip content for individual points */
1020
+ point?: (feature: LayerFeature) => React.ReactNode;
1021
+ };
1022
+ /** Style overrides for cluster circles (optional, uses design system defaults) */
1023
+ clusterStyle?: {
1024
+ /** Color for cluster circles */
1025
+ color?: ColorValue;
1026
+ /** Shadow color */
1027
+ shadowColor?: string;
1028
+ /** Size thresholds and radii for different cluster sizes */
1029
+ sizes?: {
1030
+ threshold: number;
1031
+ radius: number;
1032
+ }[];
1033
+ };
1034
+ /** Style overrides for individual points (optional, uses design system defaults) */
1035
+ pointStyle?: {
1036
+ /** Fill color */
1037
+ color?: ColorValue;
1038
+ /** Circle radius in pixels */
1039
+ radius?: number;
1040
+ /** Border width in pixels */
1041
+ borderWidth?: number;
1042
+ /** Border color */
1043
+ borderColor?: string;
1044
+ };
1045
+ /** Style overrides for selected point (optional, uses design system defaults) */
1046
+ selectedStyle?: {
1047
+ /** Fill color */
1048
+ color?: ColorValue;
1049
+ /** Circle radius in pixels */
1050
+ radius?: number;
1051
+ };
1052
+ }
998
1053
  /**
999
1054
  * Union of all layer types
1000
1055
  */
1001
- type LayerSpec = VectorLayerSpec | GeoJsonLayerSpec | CustomPinsSpec | RasterLayerSpec;
1056
+ type LayerSpec = VectorLayerSpec | GeoJsonLayerSpec | CustomPinsSpec | RasterLayerSpec | ClusteredVectorLayerSpec;
1002
1057
 
1003
1058
  /**
1004
1059
  * Unified map style configuration for all map components
@@ -1319,6 +1374,21 @@ interface InteractiveMapProps {
1319
1374
  * controls={false}
1320
1375
  */
1321
1376
  controls?: MapControl[] | "default" | false;
1377
+ /**
1378
+ * Raw Mapbox GL children (Source, Layer, Marker, etc.)
1379
+ * Use for advanced layer configurations not supported by the layers prop
1380
+ */
1381
+ children?: React__default.ReactNode;
1382
+ /**
1383
+ * Layer IDs that should be interactive (clickable/hoverable)
1384
+ * Used when rendering raw Mapbox children that need click/hover events
1385
+ */
1386
+ additionalInteractiveLayerIds?: string[];
1387
+ /**
1388
+ * Handler for map clicks on interactive layers (includes both layers prop and children)
1389
+ * Receives the click event with feature data
1390
+ */
1391
+ onMapClick?: (event: react_map_gl.MapLayerMouseEvent) => void;
1322
1392
  /**
1323
1393
  * Show user location as a blue dot marker (like Google/Apple Maps)
1324
1394
  * This only controls the visibility of the blue dot marker.
@@ -1592,4 +1662,4 @@ declare const isLightColor: (color: string) => boolean;
1592
1662
  */
1593
1663
  declare const getContrastingTextColor: (backgroundColor: string) => string;
1594
1664
 
1595
- export { type LayerStyle as $, type ActionItem as A, type BooleanFormat as B, type CurrentFormat as C, type DateFormat as D, type EnergyFormat as E, type FieldValue as F, type GeoJsonLayerSpec as G, type CodeTheme as H, Icon as I, CodeEditor as J, type DateFieldProps as K, type LayerSpec as L, DateField as M, type NumberFormat as N, type FileUploadProps as O, type PhoneFormat as P, FileUpload as Q, type ResistanceFormat as R, Heading as S, type TemperatureUnitString as T, Loader as U, type VoltageFormat as V, Logo as W, type ColorSpec as X, type YFormatType as Y, type InteractiveMapProps as Z, type LayerFeature as _, type FormattedValue as a, type MapPoint as a0, type RenderType as a1, type StaticMapProps as a2, type ZoomStops as a3, InteractiveMap as a4, MAP_TYPES as a5, StaticMap as a6, type MeterProps as a7, Meter as a8, type RichTextEditorProps as a9, isLightColor as aA, type ComponentFormatOptions as aB, formatComponentValue as aC, useComponentFormatter as aD, type BaseFormat as aE, type TextTransform as aF, type TextTruncatePosition as aG, type DateFormatStyle as aH, type EnergyUnit as aI, type PowerUnit as aJ, type VoltageUnit as aK, type CurrentUnit as aL, type ResistanceUnit as aM, type DistanceUnit as aN, type CustomFormat as aO, RichTextEditor as aa, type SegmentedControlProps as ab, type SegmentOption as ac, SegmentedControl as ad, type SideNavItem as ae, type SideNavProps as af, SideNav as ag, TextLink as ah, type TopNavProps as ai, TopNav as aj, type TooltipSeries as ak, ChartContext as al, useChartContext as am, type ChartMargin as an, createXScale as ao, createYScale as ap, defaultMargin as aq, getYFormatSettings as ar, type YFormatSettings as as, clearColorCache as at, createCategoryColorMap as au, getContrastingTextColor as av, getDefaultChartColor as aw, getDefaultColors as ax, getResolvedColor as ay, getThemeCategoricalColors as az, type DistanceFormat as b, type CurrencyFormat as c, type PowerFormat as d, type FormatterFunction as e, type TemperatureUnit as f, type TemperatureFormat as g, type TextFormat as h, type FieldFormat as i, type BaseDataPoint as j, type TooltipData as k, type IconName as l, type ComponentFormatter as m, type CustomPinsSpec as n, type RasterLayerSpec as o, type VectorLayerSpec as p, type ActionMenuProps as q, ActionMenu as r, type AppShellProps as s, AppShell as t, type AvatarProps as u, Avatar as v, type BadgeProps as w, Badge as x, type CodeEditorProps as y, type CodeLanguage as z };
1665
+ export { type LayerFeature as $, type ActionItem as A, type BooleanFormat as B, type CurrentFormat as C, type DateFormat as D, type EnergyFormat as E, type FieldValue as F, type GeoJsonLayerSpec as G, type CodeLanguage as H, Icon as I, type CodeTheme as J, CodeEditor as K, type LayerSpec as L, type DateFieldProps as M, type NumberFormat as N, DateField as O, type PhoneFormat as P, type FileUploadProps as Q, type ResistanceFormat as R, FileUpload as S, type TemperatureUnitString as T, Heading as U, type VoltageFormat as V, Loader as W, Logo as X, type YFormatType as Y, type ColorSpec as Z, type InteractiveMapProps as _, type FormattedValue as a, type LayerStyle as a0, type MapPoint as a1, type RenderType as a2, type StaticMapProps as a3, type ZoomStops as a4, InteractiveMap as a5, MAP_TYPES as a6, StaticMap as a7, type MeterProps as a8, Meter as a9, getThemeCategoricalColors as aA, isLightColor as aB, type ComponentFormatOptions as aC, formatComponentValue as aD, useComponentFormatter as aE, type BaseFormat as aF, type TextTransform as aG, type TextTruncatePosition as aH, type DateFormatStyle as aI, type EnergyUnit as aJ, type PowerUnit as aK, type VoltageUnit as aL, type CurrentUnit as aM, type ResistanceUnit as aN, type DistanceUnit as aO, type CustomFormat as aP, type RichTextEditorProps as aa, RichTextEditor as ab, type SegmentedControlProps as ac, type SegmentOption as ad, SegmentedControl as ae, type SideNavItem as af, type SideNavProps as ag, SideNav as ah, TextLink as ai, type TopNavProps as aj, TopNav as ak, type TooltipSeries as al, ChartContext as am, useChartContext as an, type ChartMargin as ao, createXScale as ap, createYScale as aq, defaultMargin as ar, getYFormatSettings as as, type YFormatSettings as at, clearColorCache as au, createCategoryColorMap as av, getContrastingTextColor as aw, getDefaultChartColor as ax, getDefaultColors as ay, getResolvedColor as az, type DistanceFormat as b, type CurrencyFormat as c, type PowerFormat as d, type FormatterFunction as e, type TemperatureUnit as f, type TemperatureFormat as g, type TextFormat as h, type FieldFormat as i, type BaseDataPoint as j, type TooltipData as k, type IconName as l, type ComponentFormatter as m, type CustomPinsSpec as n, type RasterLayerSpec as o, type VectorLayerSpec as p, type ClusteredVectorLayerSpec as q, type ActionMenuProps as r, ActionMenu as s, type AppShellProps as t, AppShell as u, type AvatarProps as v, Avatar as w, type BadgeProps as x, Badge as y, type CodeEditorProps as z };
@@ -4,6 +4,7 @@ import React__default, { ReactNode } from 'react';
4
4
  import * as PhosphorIcons from '@phosphor-icons/react';
5
5
  import { IconProps as IconProps$1 } from '@phosphor-icons/react';
6
6
  import { DateValue, DateFieldProps as DateFieldProps$1, ValidationResult, MeterProps as MeterProps$1 } from 'react-aria-components';
7
+ import * as react_map_gl from 'react-map-gl';
7
8
  import { ViewState, MapRef } from 'react-map-gl';
8
9
  import * as d3_scale from 'd3-scale';
9
10
  import { ScaleTime, ScaleLinear } from 'd3-scale';
@@ -995,10 +996,64 @@ interface RasterLayerSpec extends BaseLayerSpec {
995
996
  fadeDuration?: number;
996
997
  };
997
998
  }
999
+ /**
1000
+ * Clustered vector tile layer (Mapbox Vector Tiles with server-side clustering)
1001
+ *
1002
+ * Used for displaying large numbers of point features with automatic clustering.
1003
+ * The backend MVT service pre-clusters points and provides cluster metadata.
1004
+ */
1005
+ interface ClusteredVectorLayerSpec extends Omit<BaseLayerSpec, "tooltip"> {
1006
+ kind: "clusteredVector";
1007
+ /** Mapbox tileset URL (mapbox://...) or HTTP template with {z}/{x}/{y} */
1008
+ tileset: string;
1009
+ /** Source layer name within the tileset */
1010
+ sourceLayer: string;
1011
+ /** ID of the currently selected feature (for highlighting) */
1012
+ selectedId?: string | null;
1013
+ /** Tooltip configuration specific to clustered data */
1014
+ tooltip?: {
1015
+ /** When to show the tooltip (defaults to "hover") */
1016
+ trigger?: "hover" | "click";
1017
+ /** Tooltip content for clusters (receives point count and feature) */
1018
+ cluster?: (count: number, feature: LayerFeature) => React.ReactNode;
1019
+ /** Tooltip content for individual points */
1020
+ point?: (feature: LayerFeature) => React.ReactNode;
1021
+ };
1022
+ /** Style overrides for cluster circles (optional, uses design system defaults) */
1023
+ clusterStyle?: {
1024
+ /** Color for cluster circles */
1025
+ color?: ColorValue;
1026
+ /** Shadow color */
1027
+ shadowColor?: string;
1028
+ /** Size thresholds and radii for different cluster sizes */
1029
+ sizes?: {
1030
+ threshold: number;
1031
+ radius: number;
1032
+ }[];
1033
+ };
1034
+ /** Style overrides for individual points (optional, uses design system defaults) */
1035
+ pointStyle?: {
1036
+ /** Fill color */
1037
+ color?: ColorValue;
1038
+ /** Circle radius in pixels */
1039
+ radius?: number;
1040
+ /** Border width in pixels */
1041
+ borderWidth?: number;
1042
+ /** Border color */
1043
+ borderColor?: string;
1044
+ };
1045
+ /** Style overrides for selected point (optional, uses design system defaults) */
1046
+ selectedStyle?: {
1047
+ /** Fill color */
1048
+ color?: ColorValue;
1049
+ /** Circle radius in pixels */
1050
+ radius?: number;
1051
+ };
1052
+ }
998
1053
  /**
999
1054
  * Union of all layer types
1000
1055
  */
1001
- type LayerSpec = VectorLayerSpec | GeoJsonLayerSpec | CustomPinsSpec | RasterLayerSpec;
1056
+ type LayerSpec = VectorLayerSpec | GeoJsonLayerSpec | CustomPinsSpec | RasterLayerSpec | ClusteredVectorLayerSpec;
1002
1057
 
1003
1058
  /**
1004
1059
  * Unified map style configuration for all map components
@@ -1319,6 +1374,21 @@ interface InteractiveMapProps {
1319
1374
  * controls={false}
1320
1375
  */
1321
1376
  controls?: MapControl[] | "default" | false;
1377
+ /**
1378
+ * Raw Mapbox GL children (Source, Layer, Marker, etc.)
1379
+ * Use for advanced layer configurations not supported by the layers prop
1380
+ */
1381
+ children?: React__default.ReactNode;
1382
+ /**
1383
+ * Layer IDs that should be interactive (clickable/hoverable)
1384
+ * Used when rendering raw Mapbox children that need click/hover events
1385
+ */
1386
+ additionalInteractiveLayerIds?: string[];
1387
+ /**
1388
+ * Handler for map clicks on interactive layers (includes both layers prop and children)
1389
+ * Receives the click event with feature data
1390
+ */
1391
+ onMapClick?: (event: react_map_gl.MapLayerMouseEvent) => void;
1322
1392
  /**
1323
1393
  * Show user location as a blue dot marker (like Google/Apple Maps)
1324
1394
  * This only controls the visibility of the blue dot marker.
@@ -1592,4 +1662,4 @@ declare const isLightColor: (color: string) => boolean;
1592
1662
  */
1593
1663
  declare const getContrastingTextColor: (backgroundColor: string) => string;
1594
1664
 
1595
- export { type LayerStyle as $, type ActionItem as A, type BooleanFormat as B, type CurrentFormat as C, type DateFormat as D, type EnergyFormat as E, type FieldValue as F, type GeoJsonLayerSpec as G, type CodeTheme as H, Icon as I, CodeEditor as J, type DateFieldProps as K, type LayerSpec as L, DateField as M, type NumberFormat as N, type FileUploadProps as O, type PhoneFormat as P, FileUpload as Q, type ResistanceFormat as R, Heading as S, type TemperatureUnitString as T, Loader as U, type VoltageFormat as V, Logo as W, type ColorSpec as X, type YFormatType as Y, type InteractiveMapProps as Z, type LayerFeature as _, type FormattedValue as a, type MapPoint as a0, type RenderType as a1, type StaticMapProps as a2, type ZoomStops as a3, InteractiveMap as a4, MAP_TYPES as a5, StaticMap as a6, type MeterProps as a7, Meter as a8, type RichTextEditorProps as a9, isLightColor as aA, type ComponentFormatOptions as aB, formatComponentValue as aC, useComponentFormatter as aD, type BaseFormat as aE, type TextTransform as aF, type TextTruncatePosition as aG, type DateFormatStyle as aH, type EnergyUnit as aI, type PowerUnit as aJ, type VoltageUnit as aK, type CurrentUnit as aL, type ResistanceUnit as aM, type DistanceUnit as aN, type CustomFormat as aO, RichTextEditor as aa, type SegmentedControlProps as ab, type SegmentOption as ac, SegmentedControl as ad, type SideNavItem as ae, type SideNavProps as af, SideNav as ag, TextLink as ah, type TopNavProps as ai, TopNav as aj, type TooltipSeries as ak, ChartContext as al, useChartContext as am, type ChartMargin as an, createXScale as ao, createYScale as ap, defaultMargin as aq, getYFormatSettings as ar, type YFormatSettings as as, clearColorCache as at, createCategoryColorMap as au, getContrastingTextColor as av, getDefaultChartColor as aw, getDefaultColors as ax, getResolvedColor as ay, getThemeCategoricalColors as az, type DistanceFormat as b, type CurrencyFormat as c, type PowerFormat as d, type FormatterFunction as e, type TemperatureUnit as f, type TemperatureFormat as g, type TextFormat as h, type FieldFormat as i, type BaseDataPoint as j, type TooltipData as k, type IconName as l, type ComponentFormatter as m, type CustomPinsSpec as n, type RasterLayerSpec as o, type VectorLayerSpec as p, type ActionMenuProps as q, ActionMenu as r, type AppShellProps as s, AppShell as t, type AvatarProps as u, Avatar as v, type BadgeProps as w, Badge as x, type CodeEditorProps as y, type CodeLanguage as z };
1665
+ export { type LayerFeature as $, type ActionItem as A, type BooleanFormat as B, type CurrentFormat as C, type DateFormat as D, type EnergyFormat as E, type FieldValue as F, type GeoJsonLayerSpec as G, type CodeLanguage as H, Icon as I, type CodeTheme as J, CodeEditor as K, type LayerSpec as L, type DateFieldProps as M, type NumberFormat as N, DateField as O, type PhoneFormat as P, type FileUploadProps as Q, type ResistanceFormat as R, FileUpload as S, type TemperatureUnitString as T, Heading as U, type VoltageFormat as V, Loader as W, Logo as X, type YFormatType as Y, type ColorSpec as Z, type InteractiveMapProps as _, type FormattedValue as a, type LayerStyle as a0, type MapPoint as a1, type RenderType as a2, type StaticMapProps as a3, type ZoomStops as a4, InteractiveMap as a5, MAP_TYPES as a6, StaticMap as a7, type MeterProps as a8, Meter as a9, getThemeCategoricalColors as aA, isLightColor as aB, type ComponentFormatOptions as aC, formatComponentValue as aD, useComponentFormatter as aE, type BaseFormat as aF, type TextTransform as aG, type TextTruncatePosition as aH, type DateFormatStyle as aI, type EnergyUnit as aJ, type PowerUnit as aK, type VoltageUnit as aL, type CurrentUnit as aM, type ResistanceUnit as aN, type DistanceUnit as aO, type CustomFormat as aP, type RichTextEditorProps as aa, RichTextEditor as ab, type SegmentedControlProps as ac, type SegmentOption as ad, SegmentedControl as ae, type SideNavItem as af, type SideNavProps as ag, SideNav as ah, TextLink as ai, type TopNavProps as aj, TopNav as ak, type TooltipSeries as al, ChartContext as am, useChartContext as an, type ChartMargin as ao, createXScale as ap, createYScale as aq, defaultMargin as ar, getYFormatSettings as as, type YFormatSettings as at, clearColorCache as au, createCategoryColorMap as av, getContrastingTextColor as aw, getDefaultChartColor as ax, getDefaultColors as ay, getResolvedColor as az, type DistanceFormat as b, type CurrencyFormat as c, type PowerFormat as d, type FormatterFunction as e, type TemperatureUnit as f, type TemperatureFormat as g, type TextFormat as h, type FieldFormat as i, type BaseDataPoint as j, type TooltipData as k, type IconName as l, type ComponentFormatter as m, type CustomPinsSpec as n, type RasterLayerSpec as o, type VectorLayerSpec as p, type ClusteredVectorLayerSpec as q, type ActionMenuProps as r, ActionMenu as s, type AppShellProps as t, AppShell as u, type AvatarProps as v, Avatar as w, type BadgeProps as x, Badge as y, type CodeEditorProps as z };
package/dist/server.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ActionItem, q as ActionMenuProps, t as AppShell, s as AppShellProps, v as Avatar, u as AvatarProps, w as BadgeProps, j as BaseDataPoint, an as ChartMargin, y as CodeEditorProps, z as CodeLanguage, H as CodeTheme, K as DateFieldProps, O as FileUploadProps, S as Heading, Z as InteractiveMapProps, U as Loader, W as Logo, a0 as MapPoint, a7 as MeterProps, a9 as RichTextEditorProps, ac as SegmentOption, ab as SegmentedControlProps, ag as SideNav, ae as SideNavItem, af as SideNavProps, a2 as StaticMapProps, ah as TextLink, k as TooltipData, ak as TooltipSeries, aj as TopNav, ai as TopNavProps, as as YFormatSettings, Y as YFormatType, at as clearColorCache, au as createCategoryColorMap, ao as createXScale, ap as createYScale, aq as defaultMargin, av as getContrastingTextColor, aw as getDefaultChartColor, ax as getDefaultColors, ay as getResolvedColor, az as getThemeCategoricalColors, ar as getYFormatSettings, aA as isLightColor } from './server-BwR7EOd8.cjs';
1
+ export { A as ActionItem, r as ActionMenuProps, u as AppShell, t as AppShellProps, w as Avatar, v as AvatarProps, x as BadgeProps, j as BaseDataPoint, ao as ChartMargin, z as CodeEditorProps, H as CodeLanguage, J as CodeTheme, M as DateFieldProps, Q as FileUploadProps, U as Heading, _ as InteractiveMapProps, W as Loader, X as Logo, a1 as MapPoint, a8 as MeterProps, aa as RichTextEditorProps, ad as SegmentOption, ac as SegmentedControlProps, ah as SideNav, af as SideNavItem, ag as SideNavProps, a3 as StaticMapProps, ai as TextLink, k as TooltipData, al as TooltipSeries, ak as TopNav, aj as TopNavProps, at as YFormatSettings, Y as YFormatType, au as clearColorCache, av as createCategoryColorMap, ap as createXScale, aq as createYScale, ar as defaultMargin, aw as getContrastingTextColor, ax as getDefaultChartColor, ay as getDefaultColors, az as getResolvedColor, aA as getThemeCategoricalColors, as as getYFormatSettings, aB as isLightColor } from './server-8T44SFVa.cjs';
2
2
  export { BreadcrumbProps, BreadcrumbsProps } from 'react-aria-components';
3
3
  import 'react/jsx-runtime';
4
4
  import 'react';
package/dist/server.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ActionItem, q as ActionMenuProps, t as AppShell, s as AppShellProps, v as Avatar, u as AvatarProps, w as BadgeProps, j as BaseDataPoint, an as ChartMargin, y as CodeEditorProps, z as CodeLanguage, H as CodeTheme, K as DateFieldProps, O as FileUploadProps, S as Heading, Z as InteractiveMapProps, U as Loader, W as Logo, a0 as MapPoint, a7 as MeterProps, a9 as RichTextEditorProps, ac as SegmentOption, ab as SegmentedControlProps, ag as SideNav, ae as SideNavItem, af as SideNavProps, a2 as StaticMapProps, ah as TextLink, k as TooltipData, ak as TooltipSeries, aj as TopNav, ai as TopNavProps, as as YFormatSettings, Y as YFormatType, at as clearColorCache, au as createCategoryColorMap, ao as createXScale, ap as createYScale, aq as defaultMargin, av as getContrastingTextColor, aw as getDefaultChartColor, ax as getDefaultColors, ay as getResolvedColor, az as getThemeCategoricalColors, ar as getYFormatSettings, aA as isLightColor } from './server-BwR7EOd8.js';
1
+ export { A as ActionItem, r as ActionMenuProps, u as AppShell, t as AppShellProps, w as Avatar, v as AvatarProps, x as BadgeProps, j as BaseDataPoint, ao as ChartMargin, z as CodeEditorProps, H as CodeLanguage, J as CodeTheme, M as DateFieldProps, Q as FileUploadProps, U as Heading, _ as InteractiveMapProps, W as Loader, X as Logo, a1 as MapPoint, a8 as MeterProps, aa as RichTextEditorProps, ad as SegmentOption, ac as SegmentedControlProps, ah as SideNav, af as SideNavItem, ag as SideNavProps, a3 as StaticMapProps, ai as TextLink, k as TooltipData, al as TooltipSeries, ak as TopNav, aj as TopNavProps, at as YFormatSettings, Y as YFormatType, au as clearColorCache, av as createCategoryColorMap, ap as createXScale, aq as createYScale, ar as defaultMargin, aw as getContrastingTextColor, ax as getDefaultChartColor, ay as getDefaultColors, az as getResolvedColor, aA as getThemeCategoricalColors, as as getYFormatSettings, aB as isLightColor } from './server-8T44SFVa.js';
2
2
  export { BreadcrumbProps, BreadcrumbsProps } from 'react-aria-components';
3
3
  import 'react/jsx-runtime';
4
4
  import 'react';
@@ -14,3 +14,22 @@
14
14
  display: none;
15
15
  }
16
16
  }
17
+
18
+ /**
19
+ * Accessibility: Remove focus outlines from container elements
20
+ * These elements get programmatic focus but shouldn't show visual focus rings.
21
+ * Interactive elements inside them will still show focus indicators via focus-visible.
22
+ */
23
+ [role="dialog"],
24
+ [role="menu"],
25
+ [role="listbox"],
26
+ [data-react-aria-dialog],
27
+ [data-react-aria-modal] {
28
+ outline: none;
29
+ }
30
+
31
+ /* Ensure focus-visible still works for interactive elements */
32
+ :focus-visible {
33
+ outline: 2px solid var(--color-action-default);
34
+ outline-offset: 2px;
35
+ }
package/dist/styles.css CHANGED
@@ -92,7 +92,6 @@
92
92
  --radius-md: 0.375rem;
93
93
  --radius-lg: 0.5rem;
94
94
  --radius-xl: 0.75rem;
95
- --radius-2xl: 1rem;
96
95
  --radius-full: 9999px;
97
96
  --font-weight-light: 300;
98
97
  --font-weight-normal: 400;
@@ -493,9 +492,9 @@
493
492
  --color-action-brand: #7a8ee1;
494
493
  --color-action-brand-hover: #6a6fcc;
495
494
  --color-action-brand-text: #ffffff;
496
- --color-action-default: #374151;
497
- --color-action-default-hover: #4b5563;
498
- --color-action-default-text: #ffffff;
495
+ --color-action-default: #ededef;
496
+ --color-action-default-hover: #ffffff;
497
+ --color-action-default-text: #111827;
499
498
  --color-state-charging: #581c87;
500
499
  --color-state-charging-border: #a855f7;
501
500
  --color-state-charging-text: #e9d5ff;
@@ -1035,6 +1034,13 @@
1035
1034
  display: none;
1036
1035
  }
1037
1036
  }
1037
+ [role="dialog"], [role="menu"], [role="listbox"], [data-react-aria-dialog], [data-react-aria-modal] {
1038
+ outline: none;
1039
+ }
1040
+ :focus-visible {
1041
+ outline: 2px solid var(--color-action-default);
1042
+ outline-offset: 2px;
1043
+ }
1038
1044
  @layer theme, base, components, utilities;
1039
1045
  @layer theme;
1040
1046
  @layer base {
@@ -1702,6 +1708,9 @@
1702
1708
  .h-\[var\(--control-xl-height\)\] {
1703
1709
  height: var(--control-xl-height);
1704
1710
  }
1711
+ .h-auto {
1712
+ height: auto;
1713
+ }
1705
1714
  .h-full {
1706
1715
  height: 100%;
1707
1716
  }
@@ -2518,10 +2527,6 @@
2518
2527
  .rounded-xl {
2519
2528
  border-radius: var(--radius-xl);
2520
2529
  }
2521
- .rounded-t-2xl {
2522
- border-top-left-radius: var(--radius-2xl);
2523
- border-top-right-radius: var(--radius-2xl);
2524
- }
2525
2530
  .rounded-t-none {
2526
2531
  border-top-left-radius: var(--radius-none);
2527
2532
  border-top-right-radius: var(--radius-none);
@@ -3012,10 +3017,10 @@
3012
3017
  --tw-gradient-from: var(--color-action-brand);
3013
3018
  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
3014
3019
  }
3015
- .from-black\/60 {
3016
- --tw-gradient-from: color-mix(in srgb, #000000 60%, transparent);
3020
+ .from-black\/40 {
3021
+ --tw-gradient-from: color-mix(in srgb, #000000 40%, transparent);
3017
3022
  @supports (color: color-mix(in lab, red, red)) {
3018
- --tw-gradient-from: color-mix(in oklab, var(--color-black) 60%, transparent);
3023
+ --tw-gradient-from: color-mix(in oklab, var(--color-black) 40%, transparent);
3019
3024
  }
3020
3025
  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
3021
3026
  }
@@ -3036,10 +3041,10 @@
3036
3041
  --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
3037
3042
  --tw-gradient-stops: var(--tw-gradient-via-stops);
3038
3043
  }
3039
- .via-black\/50 {
3040
- --tw-gradient-via: color-mix(in srgb, #000000 50%, transparent);
3044
+ .via-black\/30 {
3045
+ --tw-gradient-via: color-mix(in srgb, #000000 30%, transparent);
3041
3046
  @supports (color: color-mix(in lab, red, red)) {
3042
- --tw-gradient-via: color-mix(in oklab, var(--color-black) 50%, transparent);
3047
+ --tw-gradient-via: color-mix(in oklab, var(--color-black) 30%, transparent);
3043
3048
  }
3044
3049
  --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
3045
3050
  --tw-gradient-stops: var(--tw-gradient-via-stops);
@@ -3048,10 +3053,10 @@
3048
3053
  --tw-gradient-to: var(--color-skeleton-base);
3049
3054
  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
3050
3055
  }
3051
- .to-black\/60 {
3052
- --tw-gradient-to: color-mix(in srgb, #000000 60%, transparent);
3056
+ .to-black\/40 {
3057
+ --tw-gradient-to: color-mix(in srgb, #000000 40%, transparent);
3053
3058
  @supports (color: color-mix(in lab, red, red)) {
3054
- --tw-gradient-to: color-mix(in oklab, var(--color-black) 60%, transparent);
3059
+ --tw-gradient-to: color-mix(in oklab, var(--color-black) 40%, transparent);
3055
3060
  }
3056
3061
  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
3057
3062
  }
@@ -3286,12 +3291,6 @@
3286
3291
  .pr-9 {
3287
3292
  padding-right: var(--spacing-9);
3288
3293
  }
3289
- .pb-0 {
3290
- padding-bottom: var(--spacing-0);
3291
- }
3292
- .pb-1 {
3293
- padding-bottom: var(--spacing-1);
3294
- }
3295
3294
  .pb-1\.5 {
3296
3295
  padding-bottom: calc(var(--spacing) * 1.5);
3297
3296
  }
@@ -3493,6 +3492,9 @@
3493
3492
  .whitespace-nowrap {
3494
3493
  white-space: nowrap;
3495
3494
  }
3495
+ .whitespace-pre-line {
3496
+ white-space: pre-line;
3497
+ }
3496
3498
  .\!text-action-brand {
3497
3499
  color: var(--color-action-brand) !important;
3498
3500
  }
@@ -4738,11 +4740,11 @@
4738
4740
  background-color: var(--color-gray-100);
4739
4741
  }
4740
4742
  }
4741
- .supports-\[backdrop-filter\]\:bg-black\/40 {
4743
+ .supports-\[backdrop-filter\]\:bg-black\/25 {
4742
4744
  @supports (backdrop-filter: var(--tw)) {
4743
- background-color: color-mix(in srgb, #000000 40%, transparent);
4745
+ background-color: color-mix(in srgb, #000000 25%, transparent);
4744
4746
  @supports (color: color-mix(in lab, red, red)) {
4745
- background-color: color-mix(in oklab, var(--color-black) 40%, transparent);
4747
+ background-color: color-mix(in oklab, var(--color-black) 25%, transparent);
4746
4748
  }
4747
4749
  }
4748
4750
  }
@@ -5061,11 +5063,6 @@
5061
5063
  height: 100%;
5062
5064
  }
5063
5065
  }
5064
- .md\:max-h-\[85vh\] {
5065
- @media (width >= 48rem) {
5066
- max-height: 85vh;
5067
- }
5068
- }
5069
5066
  .md\:w-10 {
5070
5067
  @media (width >= 48rem) {
5071
5068
  width: var(--spacing-10);
@@ -5162,11 +5159,6 @@
5162
5159
  flex-direction: row;
5163
5160
  }
5164
5161
  }
5165
- .md\:items-center {
5166
- @media (width >= 48rem) {
5167
- align-items: center;
5168
- }
5169
- }
5170
5162
  .md\:items-start {
5171
5163
  @media (width >= 48rem) {
5172
5164
  align-items: flex-start;
@@ -5186,16 +5178,6 @@
5186
5178
  }
5187
5179
  }
5188
5180
  }
5189
- .md\:rounded-xl {
5190
- @media (width >= 48rem) {
5191
- border-radius: var(--radius-xl);
5192
- }
5193
- }
5194
- .md\:p-4 {
5195
- @media (width >= 48rem) {
5196
- padding: var(--spacing-4);
5197
- }
5198
- }
5199
5181
  .md\:px-6 {
5200
5182
  @media (width >= 48rem) {
5201
5183
  padding-inline: var(--spacing-6);
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.12.0",
3
- "generatedAt": "2025-10-23T13:32:23.564Z",
2
+ "version": "1.12.2",
3
+ "generatedAt": "2025-10-25T13:46:35.400Z",
4
4
  "categories": {
5
5
  "hooks": {
6
6
  "description": "React hooks for common functionality like breakpoints, debouncing, local storage, and media queries",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@texturehq/edges",
3
- "version": "1.12.0",
3
+ "version": "1.12.2",
4
4
  "author": "Nicholas Brown <nick@texturehq.com>",
5
5
  "description": "A shared component library for Texture",
6
6
  "type": "module",
@@ -82,7 +82,10 @@ function findComponentFile(relPath) {
82
82
  function findStorybookFile(relPath) {
83
83
  const base = path.join(SRC_DIR, "components", relPath);
84
84
  const componentName = relPath.split("/").pop();
85
- const candidates = [path.join(base, `${componentName}.stories.tsx`), path.join(base, `${componentName}.stories.ts`)];
85
+ const candidates = [
86
+ path.join(base, `${componentName}.stories.tsx`),
87
+ path.join(base, `${componentName}.stories.ts`),
88
+ ];
86
89
  for (const f of candidates) {
87
90
  if (fs.existsSync(f)) return f;
88
91
  }
@@ -140,15 +143,19 @@ function getJsdocAbove(content, idx) {
140
143
  function extractProps(content, componentName) {
141
144
  const ifaceRe = new RegExp(
142
145
  `export\\s+interface\\s+${componentName}Props\\s*(?:extends\\s+[^{]+)?\\{([\\s\\S]*?)\\}`,
143
- "m",
146
+ "m"
144
147
  );
145
148
  let m = ifaceRe.exec(content);
146
149
  if (!m) {
147
- const anyIfaceRe = /export\s+interface\s+([A-Za-z0-9_]+Props)\s*(?:extends\s+[^{]+)?\{([\s\S]*?)\}/m;
150
+ const anyIfaceRe =
151
+ /export\s+interface\s+([A-Za-z0-9_]+Props)\s*(?:extends\s+[^{]+)?\{([\s\S]*?)\}/m;
148
152
  m = anyIfaceRe.exec(content);
149
153
  }
150
154
  if (!m) {
151
- const typeRe = new RegExp(`export\\s+type\\s+${componentName}Props\\s*=\\s*(?:[^{&]+&\s*)?([\\s\\S]*?)\\}`, "m");
155
+ const typeRe = new RegExp(
156
+ `export\\s+type\\s+${componentName}Props\\s*=\\s*(?:[^{&]+&\s*)?([\\s\\S]*?)\\}`,
157
+ "m"
158
+ );
152
159
  m = typeRe.exec(content);
153
160
  }
154
161
  const props = [];
@@ -290,7 +297,9 @@ function generateComponentsManifest() {
290
297
  ensureDir(DIST_DIR);
291
298
  writeFile(path.join(DIST_DIR, "components.manifest.json"), JSON.stringify(manifest, null, 2));
292
299
 
293
- console.log(` Found ${components.length} components in ${Object.keys(categories).length} categories`);
300
+ console.log(
301
+ ` Found ${components.length} components in ${Object.keys(categories).length} categories`
302
+ );
294
303
  return manifest;
295
304
  }
296
305
 
@@ -300,7 +309,10 @@ function generateComponentsManifest() {
300
309
 
301
310
  function extractJSDoc(content, functionName) {
302
311
  const patterns = [
303
- new RegExp(`\\/\\*\\*([^*]|\\*(?!\\/))*\\*\\/\\s*export\\s+(?:async\\s+)?function\\s+${functionName}\\b`, "s"),
312
+ new RegExp(
313
+ `\\/\\*\\*([^*]|\\*(?!\\/))*\\*\\/\\s*export\\s+(?:async\\s+)?function\\s+${functionName}\\b`,
314
+ "s"
315
+ ),
304
316
  new RegExp(`\\/\\*\\*([^*]|\\*(?!\\/))*\\*\\/\\s*export\\s+const\\s+${functionName}\\s*=`, "s"),
305
317
  ];
306
318
 
@@ -344,7 +356,10 @@ function extractExportsFromFile(filePath) {
344
356
  const constPattern = /export\s+const\s+(\w+)\s*(?::\s*[^=]+)?\s*=/g;
345
357
  while ((match = constPattern.exec(content))) {
346
358
  const name = match[1];
347
- const afterMatch = content.slice(match.index + match[0].length, match.index + match[0].length + 50);
359
+ const afterMatch = content.slice(
360
+ match.index + match[0].length,
361
+ match.index + match[0].length + 50
362
+ );
348
363
  const isFunction = afterMatch.includes("=>") || afterMatch.includes("function");
349
364
 
350
365
  utilities.push({
@@ -450,12 +465,17 @@ function generateUtilitiesManifest() {
450
465
  };
451
466
  }
452
467
 
453
- const totalUtilities = Object.values(manifest.categories).reduce((sum, cat) => sum + cat.utilities.length, 0);
468
+ const totalUtilities = Object.values(manifest.categories).reduce(
469
+ (sum, cat) => sum + cat.utilities.length,
470
+ 0
471
+ );
454
472
 
455
473
  ensureDir(DIST_DIR);
456
474
  writeFile(path.join(DIST_DIR, "utilities.manifest.json"), JSON.stringify(manifest, null, 2));
457
475
 
458
- console.log(` Found ${totalUtilities} utilities in ${Object.keys(manifest.categories).length} categories`);
476
+ console.log(
477
+ ` Found ${totalUtilities} utilities in ${Object.keys(manifest.categories).length} categories`
478
+ );
459
479
  return manifest;
460
480
  }
461
481
 
@@ -983,7 +1003,9 @@ async function main() {
983
1003
  stdio: "inherit",
984
1004
  });
985
1005
  } catch (err) {
986
- console.log("⚠️ Note: Could not merge agent instructions (merge script may not be available yet)");
1006
+ console.log(
1007
+ "⚠️ Note: Could not merge agent instructions (merge script may not be available yet)"
1008
+ );
987
1009
  }
988
1010
 
989
1011
  console.log("\n✅ Edges AI context generation complete!");