@almadar/ui 5.147.0 → 5.148.0

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.
@@ -15328,7 +15328,10 @@ var init_LearningCanvas = __esm({
15328
15328
  ctx.fillRect(0, 0, width, height);
15329
15329
  }
15330
15330
  for (const shape of shapes) {
15331
- drawShape(ctx, shape, width, height);
15331
+ if (shape.type !== "text") drawShape(ctx, shape, width, height);
15332
+ }
15333
+ for (const shape of shapes) {
15334
+ if (shape.type === "text") drawShape(ctx, shape, width, height);
15332
15335
  }
15333
15336
  }, [width, height, backgroundColor, shapes]);
15334
15337
  React94.useEffect(() => {
@@ -16891,7 +16894,7 @@ var init_AlgorithmCanvas = __esm({
16891
16894
  DEFAULT_CELL_COLOR = "#e5e7eb";
16892
16895
  DEFAULT_POINTER_COLOR = "#dc2626";
16893
16896
  POINTER_BAND = 34;
16894
- TOP_PAD = 12;
16897
+ TOP_PAD = 26;
16895
16898
  AlgorithmCanvas = ({
16896
16899
  className,
16897
16900
  width = 600,
@@ -27670,6 +27673,7 @@ var init_FilterGroup = __esm({
27670
27673
  init_Badge();
27671
27674
  init_Stack();
27672
27675
  init_Icon();
27676
+ init_RangeSlider();
27673
27677
  init_useEventBus();
27674
27678
  init_useQuerySingleton();
27675
27679
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
@@ -27864,6 +27868,35 @@ var init_FilterGroup = __esm({
27864
27868
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
27865
27869
  }
27866
27870
  )
27871
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
27872
+ /* @__PURE__ */ jsxRuntime.jsx(
27873
+ RangeSlider,
27874
+ {
27875
+ min: filter.min ?? 0,
27876
+ max: filter.max ?? 100,
27877
+ step: filter.step ?? 1,
27878
+ value: Number(
27879
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
27880
+ ),
27881
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
27882
+ showTooltip: true,
27883
+ "aria-label": t("filterGroup.from")
27884
+ }
27885
+ ),
27886
+ /* @__PURE__ */ jsxRuntime.jsx(
27887
+ RangeSlider,
27888
+ {
27889
+ min: filter.min ?? 0,
27890
+ max: filter.max ?? 100,
27891
+ step: filter.step ?? 1,
27892
+ value: Number(
27893
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
27894
+ ),
27895
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
27896
+ showTooltip: true,
27897
+ "aria-label": t("filterGroup.to")
27898
+ }
27899
+ )
27867
27900
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
27868
27901
  Input,
27869
27902
  {
@@ -27946,6 +27979,36 @@ var init_FilterGroup = __esm({
27946
27979
  className: "text-sm min-w-[100px]"
27947
27980
  }
27948
27981
  )
27982
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
27983
+ /* @__PURE__ */ jsxRuntime.jsx(
27984
+ RangeSlider,
27985
+ {
27986
+ min: filter.min ?? 0,
27987
+ max: filter.max ?? 100,
27988
+ step: filter.step ?? 1,
27989
+ value: Number(
27990
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
27991
+ ),
27992
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
27993
+ className: "min-w-[100px]",
27994
+ "aria-label": t("filterGroup.from")
27995
+ }
27996
+ ),
27997
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
27998
+ /* @__PURE__ */ jsxRuntime.jsx(
27999
+ RangeSlider,
28000
+ {
28001
+ min: filter.min ?? 0,
28002
+ max: filter.max ?? 100,
28003
+ step: filter.step ?? 1,
28004
+ value: Number(
28005
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
28006
+ ),
28007
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
28008
+ className: "min-w-[100px]",
28009
+ "aria-label": t("filterGroup.to")
28010
+ }
28011
+ )
27949
28012
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
27950
28013
  Input,
27951
28014
  {
@@ -28064,6 +28127,38 @@ var init_FilterGroup = __esm({
28064
28127
  className: "min-w-[130px]"
28065
28128
  }
28066
28129
  )
28130
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
28131
+ /* @__PURE__ */ jsxRuntime.jsx(
28132
+ RangeSlider,
28133
+ {
28134
+ min: filter.min ?? 0,
28135
+ max: filter.max ?? 100,
28136
+ step: filter.step ?? 1,
28137
+ value: Number(
28138
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
28139
+ ),
28140
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
28141
+ showTooltip: true,
28142
+ className: "min-w-[130px]",
28143
+ "aria-label": t("filterGroup.from")
28144
+ }
28145
+ ),
28146
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
28147
+ /* @__PURE__ */ jsxRuntime.jsx(
28148
+ RangeSlider,
28149
+ {
28150
+ min: filter.min ?? 0,
28151
+ max: filter.max ?? 100,
28152
+ step: filter.step ?? 1,
28153
+ value: Number(
28154
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
28155
+ ),
28156
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
28157
+ showTooltip: true,
28158
+ className: "min-w-[130px]",
28159
+ "aria-label": t("filterGroup.to")
28160
+ }
28161
+ )
28067
28162
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
28068
28163
  Input,
28069
28164
  {
package/dist/avl/index.js CHANGED
@@ -15252,7 +15252,10 @@ var init_LearningCanvas = __esm({
15252
15252
  ctx.fillRect(0, 0, width, height);
15253
15253
  }
15254
15254
  for (const shape of shapes) {
15255
- drawShape(ctx, shape, width, height);
15255
+ if (shape.type !== "text") drawShape(ctx, shape, width, height);
15256
+ }
15257
+ for (const shape of shapes) {
15258
+ if (shape.type === "text") drawShape(ctx, shape, width, height);
15256
15259
  }
15257
15260
  }, [width, height, backgroundColor, shapes]);
15258
15261
  useEffect(() => {
@@ -16815,7 +16818,7 @@ var init_AlgorithmCanvas = __esm({
16815
16818
  DEFAULT_CELL_COLOR = "#e5e7eb";
16816
16819
  DEFAULT_POINTER_COLOR = "#dc2626";
16817
16820
  POINTER_BAND = 34;
16818
- TOP_PAD = 12;
16821
+ TOP_PAD = 26;
16819
16822
  AlgorithmCanvas = ({
16820
16823
  className,
16821
16824
  width = 600,
@@ -27594,6 +27597,7 @@ var init_FilterGroup = __esm({
27594
27597
  init_Badge();
27595
27598
  init_Stack();
27596
27599
  init_Icon();
27600
+ init_RangeSlider();
27597
27601
  init_useEventBus();
27598
27602
  init_useQuerySingleton();
27599
27603
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
@@ -27788,6 +27792,35 @@ var init_FilterGroup = __esm({
27788
27792
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
27789
27793
  }
27790
27794
  )
27795
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
27796
+ /* @__PURE__ */ jsx(
27797
+ RangeSlider,
27798
+ {
27799
+ min: filter.min ?? 0,
27800
+ max: filter.max ?? 100,
27801
+ step: filter.step ?? 1,
27802
+ value: Number(
27803
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
27804
+ ),
27805
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
27806
+ showTooltip: true,
27807
+ "aria-label": t("filterGroup.from")
27808
+ }
27809
+ ),
27810
+ /* @__PURE__ */ jsx(
27811
+ RangeSlider,
27812
+ {
27813
+ min: filter.min ?? 0,
27814
+ max: filter.max ?? 100,
27815
+ step: filter.step ?? 1,
27816
+ value: Number(
27817
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
27818
+ ),
27819
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
27820
+ showTooltip: true,
27821
+ "aria-label": t("filterGroup.to")
27822
+ }
27823
+ )
27791
27824
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
27792
27825
  Input,
27793
27826
  {
@@ -27870,6 +27903,36 @@ var init_FilterGroup = __esm({
27870
27903
  className: "text-sm min-w-[100px]"
27871
27904
  }
27872
27905
  )
27906
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
27907
+ /* @__PURE__ */ jsx(
27908
+ RangeSlider,
27909
+ {
27910
+ min: filter.min ?? 0,
27911
+ max: filter.max ?? 100,
27912
+ step: filter.step ?? 1,
27913
+ value: Number(
27914
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
27915
+ ),
27916
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
27917
+ className: "min-w-[100px]",
27918
+ "aria-label": t("filterGroup.from")
27919
+ }
27920
+ ),
27921
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
27922
+ /* @__PURE__ */ jsx(
27923
+ RangeSlider,
27924
+ {
27925
+ min: filter.min ?? 0,
27926
+ max: filter.max ?? 100,
27927
+ step: filter.step ?? 1,
27928
+ value: Number(
27929
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
27930
+ ),
27931
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
27932
+ className: "min-w-[100px]",
27933
+ "aria-label": t("filterGroup.to")
27934
+ }
27935
+ )
27873
27936
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
27874
27937
  Input,
27875
27938
  {
@@ -27988,6 +28051,38 @@ var init_FilterGroup = __esm({
27988
28051
  className: "min-w-[130px]"
27989
28052
  }
27990
28053
  )
28054
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
28055
+ /* @__PURE__ */ jsx(
28056
+ RangeSlider,
28057
+ {
28058
+ min: filter.min ?? 0,
28059
+ max: filter.max ?? 100,
28060
+ step: filter.step ?? 1,
28061
+ value: Number(
28062
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
28063
+ ),
28064
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
28065
+ showTooltip: true,
28066
+ className: "min-w-[130px]",
28067
+ "aria-label": t("filterGroup.from")
28068
+ }
28069
+ ),
28070
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
28071
+ /* @__PURE__ */ jsx(
28072
+ RangeSlider,
28073
+ {
28074
+ min: filter.min ?? 0,
28075
+ max: filter.max ?? 100,
28076
+ step: filter.step ?? 1,
28077
+ value: Number(
28078
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
28079
+ ),
28080
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
28081
+ showTooltip: true,
28082
+ className: "min-w-[130px]",
28083
+ "aria-label": t("filterGroup.to")
28084
+ }
28085
+ )
27991
28086
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
27992
28087
  Input,
27993
28088
  {
@@ -8690,7 +8690,10 @@ var init_LearningCanvas = __esm({
8690
8690
  ctx.fillRect(0, 0, width, height);
8691
8691
  }
8692
8692
  for (const shape of shapes) {
8693
- drawShape(ctx, shape, width, height);
8693
+ if (shape.type !== "text") drawShape(ctx, shape, width, height);
8694
+ }
8695
+ for (const shape of shapes) {
8696
+ if (shape.type === "text") drawShape(ctx, shape, width, height);
8694
8697
  }
8695
8698
  }, [width, height, backgroundColor, shapes]);
8696
8699
  React77.useEffect(() => {
@@ -8771,7 +8774,7 @@ var init_AlgorithmCanvas = __esm({
8771
8774
  DEFAULT_CELL_COLOR = "#e5e7eb";
8772
8775
  DEFAULT_POINTER_COLOR = "#dc2626";
8773
8776
  POINTER_BAND = 34;
8774
- TOP_PAD = 12;
8777
+ TOP_PAD = 26;
8775
8778
  exports.AlgorithmCanvas = ({
8776
8779
  className,
8777
8780
  width = 600,
@@ -23756,6 +23759,7 @@ var init_FilterGroup = __esm({
23756
23759
  init_Badge();
23757
23760
  init_Stack();
23758
23761
  init_Icon();
23762
+ init_RangeSlider();
23759
23763
  init_useEventBus();
23760
23764
  init_useQuerySingleton();
23761
23765
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
@@ -23950,6 +23954,35 @@ var init_FilterGroup = __esm({
23950
23954
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
23951
23955
  }
23952
23956
  )
23957
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
23958
+ /* @__PURE__ */ jsxRuntime.jsx(
23959
+ exports.RangeSlider,
23960
+ {
23961
+ min: filter.min ?? 0,
23962
+ max: filter.max ?? 100,
23963
+ step: filter.step ?? 1,
23964
+ value: Number(
23965
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
23966
+ ),
23967
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
23968
+ showTooltip: true,
23969
+ "aria-label": t("filterGroup.from")
23970
+ }
23971
+ ),
23972
+ /* @__PURE__ */ jsxRuntime.jsx(
23973
+ exports.RangeSlider,
23974
+ {
23975
+ min: filter.min ?? 0,
23976
+ max: filter.max ?? 100,
23977
+ step: filter.step ?? 1,
23978
+ value: Number(
23979
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
23980
+ ),
23981
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
23982
+ showTooltip: true,
23983
+ "aria-label": t("filterGroup.to")
23984
+ }
23985
+ )
23953
23986
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
23954
23987
  exports.Input,
23955
23988
  {
@@ -24032,6 +24065,36 @@ var init_FilterGroup = __esm({
24032
24065
  className: "text-sm min-w-[100px]"
24033
24066
  }
24034
24067
  )
24068
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
24069
+ /* @__PURE__ */ jsxRuntime.jsx(
24070
+ exports.RangeSlider,
24071
+ {
24072
+ min: filter.min ?? 0,
24073
+ max: filter.max ?? 100,
24074
+ step: filter.step ?? 1,
24075
+ value: Number(
24076
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
24077
+ ),
24078
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
24079
+ className: "min-w-[100px]",
24080
+ "aria-label": t("filterGroup.from")
24081
+ }
24082
+ ),
24083
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
24084
+ /* @__PURE__ */ jsxRuntime.jsx(
24085
+ exports.RangeSlider,
24086
+ {
24087
+ min: filter.min ?? 0,
24088
+ max: filter.max ?? 100,
24089
+ step: filter.step ?? 1,
24090
+ value: Number(
24091
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
24092
+ ),
24093
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
24094
+ className: "min-w-[100px]",
24095
+ "aria-label": t("filterGroup.to")
24096
+ }
24097
+ )
24035
24098
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
24036
24099
  exports.Input,
24037
24100
  {
@@ -24150,6 +24213,38 @@ var init_FilterGroup = __esm({
24150
24213
  className: "min-w-[130px]"
24151
24214
  }
24152
24215
  )
24216
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "xs", align: "center", children: [
24217
+ /* @__PURE__ */ jsxRuntime.jsx(
24218
+ exports.RangeSlider,
24219
+ {
24220
+ min: filter.min ?? 0,
24221
+ max: filter.max ?? 100,
24222
+ step: filter.step ?? 1,
24223
+ value: Number(
24224
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
24225
+ ),
24226
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
24227
+ showTooltip: true,
24228
+ className: "min-w-[130px]",
24229
+ "aria-label": t("filterGroup.from")
24230
+ }
24231
+ ),
24232
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
24233
+ /* @__PURE__ */ jsxRuntime.jsx(
24234
+ exports.RangeSlider,
24235
+ {
24236
+ min: filter.min ?? 0,
24237
+ max: filter.max ?? 100,
24238
+ step: filter.step ?? 1,
24239
+ value: Number(
24240
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
24241
+ ),
24242
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
24243
+ showTooltip: true,
24244
+ className: "min-w-[130px]",
24245
+ "aria-label": t("filterGroup.to")
24246
+ }
24247
+ )
24153
24248
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
24154
24249
  exports.Input,
24155
24250
  {
@@ -3934,12 +3934,18 @@ type FilterGroupLook = "toolbar" | "chips" | "pills" | "popover-trigger" | "inli
3934
3934
  interface FilterDefinition {
3935
3935
  field: string;
3936
3936
  label: string;
3937
- /** Filter type - 'text' free-text input, 'date' renders a date picker, 'date-range'/'daterange' renders two date pickers */
3938
- filterType?: "text" | "select" | "toggle" | "checkbox" | "date" | "daterange" | "date-range";
3937
+ /** Filter type - 'text' free-text input, 'date' renders a date picker, 'date-range'/'daterange' renders two date pickers, 'number-range'/'numberrange' renders two range sliders */
3938
+ filterType?: "text" | "select" | "toggle" | "checkbox" | "date" | "daterange" | "date-range" | "numberrange" | "number-range";
3939
3939
  /** Alias for filterType (schema compatibility) */
3940
- type?: "text" | "select" | "toggle" | "checkbox" | "date" | "daterange" | "date-range";
3940
+ type?: "text" | "select" | "toggle" | "checkbox" | "date" | "daterange" | "date-range" | "numberrange" | "number-range";
3941
3941
  /** Options for select/toggle filters */
3942
3942
  options?: readonly string[];
3943
+ /** Lower bound for numberrange filters */
3944
+ min?: number;
3945
+ /** Upper bound for numberrange filters */
3946
+ max?: number;
3947
+ /** Step increment for numberrange filters */
3948
+ step?: number;
3943
3949
  }
3944
3950
  /**
3945
3951
  * FilterGroup — a panel of filter controls that narrows a collection by field
@@ -3934,12 +3934,18 @@ type FilterGroupLook = "toolbar" | "chips" | "pills" | "popover-trigger" | "inli
3934
3934
  interface FilterDefinition {
3935
3935
  field: string;
3936
3936
  label: string;
3937
- /** Filter type - 'text' free-text input, 'date' renders a date picker, 'date-range'/'daterange' renders two date pickers */
3938
- filterType?: "text" | "select" | "toggle" | "checkbox" | "date" | "daterange" | "date-range";
3937
+ /** Filter type - 'text' free-text input, 'date' renders a date picker, 'date-range'/'daterange' renders two date pickers, 'number-range'/'numberrange' renders two range sliders */
3938
+ filterType?: "text" | "select" | "toggle" | "checkbox" | "date" | "daterange" | "date-range" | "numberrange" | "number-range";
3939
3939
  /** Alias for filterType (schema compatibility) */
3940
- type?: "text" | "select" | "toggle" | "checkbox" | "date" | "daterange" | "date-range";
3940
+ type?: "text" | "select" | "toggle" | "checkbox" | "date" | "daterange" | "date-range" | "numberrange" | "number-range";
3941
3941
  /** Options for select/toggle filters */
3942
3942
  options?: readonly string[];
3943
+ /** Lower bound for numberrange filters */
3944
+ min?: number;
3945
+ /** Upper bound for numberrange filters */
3946
+ max?: number;
3947
+ /** Step increment for numberrange filters */
3948
+ step?: number;
3943
3949
  }
3944
3950
  /**
3945
3951
  * FilterGroup — a panel of filter controls that narrows a collection by field
@@ -8615,7 +8615,10 @@ var init_LearningCanvas = __esm({
8615
8615
  ctx.fillRect(0, 0, width, height);
8616
8616
  }
8617
8617
  for (const shape of shapes) {
8618
- drawShape(ctx, shape, width, height);
8618
+ if (shape.type !== "text") drawShape(ctx, shape, width, height);
8619
+ }
8620
+ for (const shape of shapes) {
8621
+ if (shape.type === "text") drawShape(ctx, shape, width, height);
8619
8622
  }
8620
8623
  }, [width, height, backgroundColor, shapes]);
8621
8624
  useEffect(() => {
@@ -8696,7 +8699,7 @@ var init_AlgorithmCanvas = __esm({
8696
8699
  DEFAULT_CELL_COLOR = "#e5e7eb";
8697
8700
  DEFAULT_POINTER_COLOR = "#dc2626";
8698
8701
  POINTER_BAND = 34;
8699
- TOP_PAD = 12;
8702
+ TOP_PAD = 26;
8700
8703
  AlgorithmCanvas = ({
8701
8704
  className,
8702
8705
  width = 600,
@@ -23681,6 +23684,7 @@ var init_FilterGroup = __esm({
23681
23684
  init_Badge();
23682
23685
  init_Stack();
23683
23686
  init_Icon();
23687
+ init_RangeSlider();
23684
23688
  init_useEventBus();
23685
23689
  init_useQuerySingleton();
23686
23690
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
@@ -23875,6 +23879,35 @@ var init_FilterGroup = __esm({
23875
23879
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
23876
23880
  }
23877
23881
  )
23882
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
23883
+ /* @__PURE__ */ jsx(
23884
+ RangeSlider,
23885
+ {
23886
+ min: filter.min ?? 0,
23887
+ max: filter.max ?? 100,
23888
+ step: filter.step ?? 1,
23889
+ value: Number(
23890
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
23891
+ ),
23892
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
23893
+ showTooltip: true,
23894
+ "aria-label": t("filterGroup.from")
23895
+ }
23896
+ ),
23897
+ /* @__PURE__ */ jsx(
23898
+ RangeSlider,
23899
+ {
23900
+ min: filter.min ?? 0,
23901
+ max: filter.max ?? 100,
23902
+ step: filter.step ?? 1,
23903
+ value: Number(
23904
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
23905
+ ),
23906
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
23907
+ showTooltip: true,
23908
+ "aria-label": t("filterGroup.to")
23909
+ }
23910
+ )
23878
23911
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
23879
23912
  Input,
23880
23913
  {
@@ -23957,6 +23990,36 @@ var init_FilterGroup = __esm({
23957
23990
  className: "text-sm min-w-[100px]"
23958
23991
  }
23959
23992
  )
23993
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
23994
+ /* @__PURE__ */ jsx(
23995
+ RangeSlider,
23996
+ {
23997
+ min: filter.min ?? 0,
23998
+ max: filter.max ?? 100,
23999
+ step: filter.step ?? 1,
24000
+ value: Number(
24001
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
24002
+ ),
24003
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
24004
+ className: "min-w-[100px]",
24005
+ "aria-label": t("filterGroup.from")
24006
+ }
24007
+ ),
24008
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
24009
+ /* @__PURE__ */ jsx(
24010
+ RangeSlider,
24011
+ {
24012
+ min: filter.min ?? 0,
24013
+ max: filter.max ?? 100,
24014
+ step: filter.step ?? 1,
24015
+ value: Number(
24016
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
24017
+ ),
24018
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
24019
+ className: "min-w-[100px]",
24020
+ "aria-label": t("filterGroup.to")
24021
+ }
24022
+ )
23960
24023
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
23961
24024
  Input,
23962
24025
  {
@@ -24075,6 +24138,38 @@ var init_FilterGroup = __esm({
24075
24138
  className: "min-w-[130px]"
24076
24139
  }
24077
24140
  )
24141
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
24142
+ /* @__PURE__ */ jsx(
24143
+ RangeSlider,
24144
+ {
24145
+ min: filter.min ?? 0,
24146
+ max: filter.max ?? 100,
24147
+ step: filter.step ?? 1,
24148
+ value: Number(
24149
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
24150
+ ),
24151
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
24152
+ showTooltip: true,
24153
+ className: "min-w-[130px]",
24154
+ "aria-label": t("filterGroup.from")
24155
+ }
24156
+ ),
24157
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
24158
+ /* @__PURE__ */ jsx(
24159
+ RangeSlider,
24160
+ {
24161
+ min: filter.min ?? 0,
24162
+ max: filter.max ?? 100,
24163
+ step: filter.step ?? 1,
24164
+ value: Number(
24165
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
24166
+ ),
24167
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
24168
+ showTooltip: true,
24169
+ className: "min-w-[130px]",
24170
+ "aria-label": t("filterGroup.to")
24171
+ }
24172
+ )
24078
24173
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
24079
24174
  Input,
24080
24175
  {
@@ -11853,7 +11853,10 @@ var init_LearningCanvas = __esm({
11853
11853
  ctx.fillRect(0, 0, width, height);
11854
11854
  }
11855
11855
  for (const shape of shapes) {
11856
- drawShape(ctx, shape, width, height);
11856
+ if (shape.type !== "text") drawShape(ctx, shape, width, height);
11857
+ }
11858
+ for (const shape of shapes) {
11859
+ if (shape.type === "text") drawShape(ctx, shape, width, height);
11857
11860
  }
11858
11861
  }, [width, height, backgroundColor, shapes]);
11859
11862
  React87.useEffect(() => {
@@ -13799,7 +13802,7 @@ var init_AlgorithmCanvas = __esm({
13799
13802
  DEFAULT_CELL_COLOR = "#e5e7eb";
13800
13803
  DEFAULT_POINTER_COLOR = "#dc2626";
13801
13804
  POINTER_BAND = 34;
13802
- TOP_PAD = 12;
13805
+ TOP_PAD = 26;
13803
13806
  AlgorithmCanvas = ({
13804
13807
  className,
13805
13808
  width = 600,
@@ -25405,6 +25408,7 @@ var init_FilterGroup = __esm({
25405
25408
  init_Badge();
25406
25409
  init_Stack();
25407
25410
  init_Icon();
25411
+ init_RangeSlider();
25408
25412
  init_useEventBus();
25409
25413
  init_useQuerySingleton();
25410
25414
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
@@ -25599,6 +25603,35 @@ var init_FilterGroup = __esm({
25599
25603
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
25600
25604
  }
25601
25605
  )
25606
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
25607
+ /* @__PURE__ */ jsxRuntime.jsx(
25608
+ RangeSlider,
25609
+ {
25610
+ min: filter.min ?? 0,
25611
+ max: filter.max ?? 100,
25612
+ step: filter.step ?? 1,
25613
+ value: Number(
25614
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25615
+ ),
25616
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25617
+ showTooltip: true,
25618
+ "aria-label": t("filterGroup.from")
25619
+ }
25620
+ ),
25621
+ /* @__PURE__ */ jsxRuntime.jsx(
25622
+ RangeSlider,
25623
+ {
25624
+ min: filter.min ?? 0,
25625
+ max: filter.max ?? 100,
25626
+ step: filter.step ?? 1,
25627
+ value: Number(
25628
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25629
+ ),
25630
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25631
+ showTooltip: true,
25632
+ "aria-label": t("filterGroup.to")
25633
+ }
25634
+ )
25602
25635
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
25603
25636
  Input,
25604
25637
  {
@@ -25681,6 +25714,36 @@ var init_FilterGroup = __esm({
25681
25714
  className: "text-sm min-w-[100px]"
25682
25715
  }
25683
25716
  )
25717
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
25718
+ /* @__PURE__ */ jsxRuntime.jsx(
25719
+ RangeSlider,
25720
+ {
25721
+ min: filter.min ?? 0,
25722
+ max: filter.max ?? 100,
25723
+ step: filter.step ?? 1,
25724
+ value: Number(
25725
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25726
+ ),
25727
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25728
+ className: "min-w-[100px]",
25729
+ "aria-label": t("filterGroup.from")
25730
+ }
25731
+ ),
25732
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
25733
+ /* @__PURE__ */ jsxRuntime.jsx(
25734
+ RangeSlider,
25735
+ {
25736
+ min: filter.min ?? 0,
25737
+ max: filter.max ?? 100,
25738
+ step: filter.step ?? 1,
25739
+ value: Number(
25740
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25741
+ ),
25742
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25743
+ className: "min-w-[100px]",
25744
+ "aria-label": t("filterGroup.to")
25745
+ }
25746
+ )
25684
25747
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
25685
25748
  Input,
25686
25749
  {
@@ -25799,6 +25862,38 @@ var init_FilterGroup = __esm({
25799
25862
  className: "min-w-[130px]"
25800
25863
  }
25801
25864
  )
25865
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
25866
+ /* @__PURE__ */ jsxRuntime.jsx(
25867
+ RangeSlider,
25868
+ {
25869
+ min: filter.min ?? 0,
25870
+ max: filter.max ?? 100,
25871
+ step: filter.step ?? 1,
25872
+ value: Number(
25873
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25874
+ ),
25875
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25876
+ showTooltip: true,
25877
+ className: "min-w-[130px]",
25878
+ "aria-label": t("filterGroup.from")
25879
+ }
25880
+ ),
25881
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
25882
+ /* @__PURE__ */ jsxRuntime.jsx(
25883
+ RangeSlider,
25884
+ {
25885
+ min: filter.min ?? 0,
25886
+ max: filter.max ?? 100,
25887
+ step: filter.step ?? 1,
25888
+ value: Number(
25889
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25890
+ ),
25891
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25892
+ showTooltip: true,
25893
+ className: "min-w-[130px]",
25894
+ "aria-label": t("filterGroup.to")
25895
+ }
25896
+ )
25802
25897
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
25803
25898
  Input,
25804
25899
  {
@@ -11779,7 +11779,10 @@ var init_LearningCanvas = __esm({
11779
11779
  ctx.fillRect(0, 0, width, height);
11780
11780
  }
11781
11781
  for (const shape of shapes) {
11782
- drawShape(ctx, shape, width, height);
11782
+ if (shape.type !== "text") drawShape(ctx, shape, width, height);
11783
+ }
11784
+ for (const shape of shapes) {
11785
+ if (shape.type === "text") drawShape(ctx, shape, width, height);
11783
11786
  }
11784
11787
  }, [width, height, backgroundColor, shapes]);
11785
11788
  useEffect(() => {
@@ -13725,7 +13728,7 @@ var init_AlgorithmCanvas = __esm({
13725
13728
  DEFAULT_CELL_COLOR = "#e5e7eb";
13726
13729
  DEFAULT_POINTER_COLOR = "#dc2626";
13727
13730
  POINTER_BAND = 34;
13728
- TOP_PAD = 12;
13731
+ TOP_PAD = 26;
13729
13732
  AlgorithmCanvas = ({
13730
13733
  className,
13731
13734
  width = 600,
@@ -25331,6 +25334,7 @@ var init_FilterGroup = __esm({
25331
25334
  init_Badge();
25332
25335
  init_Stack();
25333
25336
  init_Icon();
25337
+ init_RangeSlider();
25334
25338
  init_useEventBus();
25335
25339
  init_useQuerySingleton();
25336
25340
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
@@ -25525,6 +25529,35 @@ var init_FilterGroup = __esm({
25525
25529
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
25526
25530
  }
25527
25531
  )
25532
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
25533
+ /* @__PURE__ */ jsx(
25534
+ RangeSlider,
25535
+ {
25536
+ min: filter.min ?? 0,
25537
+ max: filter.max ?? 100,
25538
+ step: filter.step ?? 1,
25539
+ value: Number(
25540
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25541
+ ),
25542
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25543
+ showTooltip: true,
25544
+ "aria-label": t("filterGroup.from")
25545
+ }
25546
+ ),
25547
+ /* @__PURE__ */ jsx(
25548
+ RangeSlider,
25549
+ {
25550
+ min: filter.min ?? 0,
25551
+ max: filter.max ?? 100,
25552
+ step: filter.step ?? 1,
25553
+ value: Number(
25554
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25555
+ ),
25556
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25557
+ showTooltip: true,
25558
+ "aria-label": t("filterGroup.to")
25559
+ }
25560
+ )
25528
25561
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
25529
25562
  Input,
25530
25563
  {
@@ -25607,6 +25640,36 @@ var init_FilterGroup = __esm({
25607
25640
  className: "text-sm min-w-[100px]"
25608
25641
  }
25609
25642
  )
25643
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
25644
+ /* @__PURE__ */ jsx(
25645
+ RangeSlider,
25646
+ {
25647
+ min: filter.min ?? 0,
25648
+ max: filter.max ?? 100,
25649
+ step: filter.step ?? 1,
25650
+ value: Number(
25651
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25652
+ ),
25653
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25654
+ className: "min-w-[100px]",
25655
+ "aria-label": t("filterGroup.from")
25656
+ }
25657
+ ),
25658
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
25659
+ /* @__PURE__ */ jsx(
25660
+ RangeSlider,
25661
+ {
25662
+ min: filter.min ?? 0,
25663
+ max: filter.max ?? 100,
25664
+ step: filter.step ?? 1,
25665
+ value: Number(
25666
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25667
+ ),
25668
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25669
+ className: "min-w-[100px]",
25670
+ "aria-label": t("filterGroup.to")
25671
+ }
25672
+ )
25610
25673
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
25611
25674
  Input,
25612
25675
  {
@@ -25725,6 +25788,38 @@ var init_FilterGroup = __esm({
25725
25788
  className: "min-w-[130px]"
25726
25789
  }
25727
25790
  )
25791
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
25792
+ /* @__PURE__ */ jsx(
25793
+ RangeSlider,
25794
+ {
25795
+ min: filter.min ?? 0,
25796
+ max: filter.max ?? 100,
25797
+ step: filter.step ?? 1,
25798
+ value: Number(
25799
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25800
+ ),
25801
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25802
+ showTooltip: true,
25803
+ className: "min-w-[130px]",
25804
+ "aria-label": t("filterGroup.from")
25805
+ }
25806
+ ),
25807
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
25808
+ /* @__PURE__ */ jsx(
25809
+ RangeSlider,
25810
+ {
25811
+ min: filter.min ?? 0,
25812
+ max: filter.max ?? 100,
25813
+ step: filter.step ?? 1,
25814
+ value: Number(
25815
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25816
+ ),
25817
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25818
+ showTooltip: true,
25819
+ className: "min-w-[130px]",
25820
+ "aria-label": t("filterGroup.to")
25821
+ }
25822
+ )
25728
25823
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
25729
25824
  Input,
25730
25825
  {
@@ -11940,7 +11940,10 @@ var init_LearningCanvas = __esm({
11940
11940
  ctx.fillRect(0, 0, width, height);
11941
11941
  }
11942
11942
  for (const shape of shapes) {
11943
- drawShape(ctx, shape, width, height);
11943
+ if (shape.type !== "text") drawShape(ctx, shape, width, height);
11944
+ }
11945
+ for (const shape of shapes) {
11946
+ if (shape.type === "text") drawShape(ctx, shape, width, height);
11944
11947
  }
11945
11948
  }, [width, height, backgroundColor, shapes]);
11946
11949
  React85.useEffect(() => {
@@ -13503,7 +13506,7 @@ var init_AlgorithmCanvas = __esm({
13503
13506
  DEFAULT_CELL_COLOR = "#e5e7eb";
13504
13507
  DEFAULT_POINTER_COLOR = "#dc2626";
13505
13508
  POINTER_BAND = 34;
13506
- TOP_PAD = 12;
13509
+ TOP_PAD = 26;
13507
13510
  AlgorithmCanvas = ({
13508
13511
  className,
13509
13512
  width = 600,
@@ -24914,6 +24917,7 @@ var init_FilterGroup = __esm({
24914
24917
  init_Badge();
24915
24918
  init_Stack();
24916
24919
  init_Icon();
24920
+ init_RangeSlider();
24917
24921
  init_useEventBus();
24918
24922
  init_useQuerySingleton();
24919
24923
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
@@ -25108,6 +25112,35 @@ var init_FilterGroup = __esm({
25108
25112
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
25109
25113
  }
25110
25114
  )
25115
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
25116
+ /* @__PURE__ */ jsxRuntime.jsx(
25117
+ RangeSlider,
25118
+ {
25119
+ min: filter.min ?? 0,
25120
+ max: filter.max ?? 100,
25121
+ step: filter.step ?? 1,
25122
+ value: Number(
25123
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25124
+ ),
25125
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25126
+ showTooltip: true,
25127
+ "aria-label": t("filterGroup.from")
25128
+ }
25129
+ ),
25130
+ /* @__PURE__ */ jsxRuntime.jsx(
25131
+ RangeSlider,
25132
+ {
25133
+ min: filter.min ?? 0,
25134
+ max: filter.max ?? 100,
25135
+ step: filter.step ?? 1,
25136
+ value: Number(
25137
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25138
+ ),
25139
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25140
+ showTooltip: true,
25141
+ "aria-label": t("filterGroup.to")
25142
+ }
25143
+ )
25111
25144
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
25112
25145
  Input,
25113
25146
  {
@@ -25190,6 +25223,36 @@ var init_FilterGroup = __esm({
25190
25223
  className: "text-sm min-w-[100px]"
25191
25224
  }
25192
25225
  )
25226
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
25227
+ /* @__PURE__ */ jsxRuntime.jsx(
25228
+ RangeSlider,
25229
+ {
25230
+ min: filter.min ?? 0,
25231
+ max: filter.max ?? 100,
25232
+ step: filter.step ?? 1,
25233
+ value: Number(
25234
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25235
+ ),
25236
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25237
+ className: "min-w-[100px]",
25238
+ "aria-label": t("filterGroup.from")
25239
+ }
25240
+ ),
25241
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
25242
+ /* @__PURE__ */ jsxRuntime.jsx(
25243
+ RangeSlider,
25244
+ {
25245
+ min: filter.min ?? 0,
25246
+ max: filter.max ?? 100,
25247
+ step: filter.step ?? 1,
25248
+ value: Number(
25249
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25250
+ ),
25251
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25252
+ className: "min-w-[100px]",
25253
+ "aria-label": t("filterGroup.to")
25254
+ }
25255
+ )
25193
25256
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
25194
25257
  Input,
25195
25258
  {
@@ -25308,6 +25371,38 @@ var init_FilterGroup = __esm({
25308
25371
  className: "min-w-[130px]"
25309
25372
  }
25310
25373
  )
25374
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
25375
+ /* @__PURE__ */ jsxRuntime.jsx(
25376
+ RangeSlider,
25377
+ {
25378
+ min: filter.min ?? 0,
25379
+ max: filter.max ?? 100,
25380
+ step: filter.step ?? 1,
25381
+ value: Number(
25382
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25383
+ ),
25384
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25385
+ showTooltip: true,
25386
+ className: "min-w-[130px]",
25387
+ "aria-label": t("filterGroup.from")
25388
+ }
25389
+ ),
25390
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "-" }),
25391
+ /* @__PURE__ */ jsxRuntime.jsx(
25392
+ RangeSlider,
25393
+ {
25394
+ min: filter.min ?? 0,
25395
+ max: filter.max ?? 100,
25396
+ step: filter.step ?? 1,
25397
+ value: Number(
25398
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25399
+ ),
25400
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25401
+ showTooltip: true,
25402
+ className: "min-w-[130px]",
25403
+ "aria-label": t("filterGroup.to")
25404
+ }
25405
+ )
25311
25406
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsxRuntime.jsx(
25312
25407
  Input,
25313
25408
  {
@@ -11866,7 +11866,10 @@ var init_LearningCanvas = __esm({
11866
11866
  ctx.fillRect(0, 0, width, height);
11867
11867
  }
11868
11868
  for (const shape of shapes) {
11869
- drawShape(ctx, shape, width, height);
11869
+ if (shape.type !== "text") drawShape(ctx, shape, width, height);
11870
+ }
11871
+ for (const shape of shapes) {
11872
+ if (shape.type === "text") drawShape(ctx, shape, width, height);
11870
11873
  }
11871
11874
  }, [width, height, backgroundColor, shapes]);
11872
11875
  useEffect(() => {
@@ -13429,7 +13432,7 @@ var init_AlgorithmCanvas = __esm({
13429
13432
  DEFAULT_CELL_COLOR = "#e5e7eb";
13430
13433
  DEFAULT_POINTER_COLOR = "#dc2626";
13431
13434
  POINTER_BAND = 34;
13432
- TOP_PAD = 12;
13435
+ TOP_PAD = 26;
13433
13436
  AlgorithmCanvas = ({
13434
13437
  className,
13435
13438
  width = 600,
@@ -24840,6 +24843,7 @@ var init_FilterGroup = __esm({
24840
24843
  init_Badge();
24841
24844
  init_Stack();
24842
24845
  init_Icon();
24846
+ init_RangeSlider();
24843
24847
  init_useEventBus();
24844
24848
  init_useQuerySingleton();
24845
24849
  resolveFilterType = (filter) => filter.filterType ?? filter.type;
@@ -25034,6 +25038,35 @@ var init_FilterGroup = __esm({
25034
25038
  onClear: () => handleFilterSelect(`${filter.field}_to`, null)
25035
25039
  }
25036
25040
  )
25041
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
25042
+ /* @__PURE__ */ jsx(
25043
+ RangeSlider,
25044
+ {
25045
+ min: filter.min ?? 0,
25046
+ max: filter.max ?? 100,
25047
+ step: filter.step ?? 1,
25048
+ value: Number(
25049
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25050
+ ),
25051
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25052
+ showTooltip: true,
25053
+ "aria-label": t("filterGroup.from")
25054
+ }
25055
+ ),
25056
+ /* @__PURE__ */ jsx(
25057
+ RangeSlider,
25058
+ {
25059
+ min: filter.min ?? 0,
25060
+ max: filter.max ?? 100,
25061
+ step: filter.step ?? 1,
25062
+ value: Number(
25063
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25064
+ ),
25065
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25066
+ showTooltip: true,
25067
+ "aria-label": t("filterGroup.to")
25068
+ }
25069
+ )
25037
25070
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
25038
25071
  Input,
25039
25072
  {
@@ -25116,6 +25149,36 @@ var init_FilterGroup = __esm({
25116
25149
  className: "text-sm min-w-[100px]"
25117
25150
  }
25118
25151
  )
25152
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
25153
+ /* @__PURE__ */ jsx(
25154
+ RangeSlider,
25155
+ {
25156
+ min: filter.min ?? 0,
25157
+ max: filter.max ?? 100,
25158
+ step: filter.step ?? 1,
25159
+ value: Number(
25160
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25161
+ ),
25162
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25163
+ className: "min-w-[100px]",
25164
+ "aria-label": t("filterGroup.from")
25165
+ }
25166
+ ),
25167
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
25168
+ /* @__PURE__ */ jsx(
25169
+ RangeSlider,
25170
+ {
25171
+ min: filter.min ?? 0,
25172
+ max: filter.max ?? 100,
25173
+ step: filter.step ?? 1,
25174
+ value: Number(
25175
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25176
+ ),
25177
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25178
+ className: "min-w-[100px]",
25179
+ "aria-label": t("filterGroup.to")
25180
+ }
25181
+ )
25119
25182
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
25120
25183
  Input,
25121
25184
  {
@@ -25234,6 +25297,38 @@ var init_FilterGroup = __esm({
25234
25297
  className: "min-w-[130px]"
25235
25298
  }
25236
25299
  )
25300
+ ] }) : resolveFilterType(filter) === "numberrange" || resolveFilterType(filter) === "number-range" ? /* @__PURE__ */ jsxs(HStack, { gap: "xs", align: "center", children: [
25301
+ /* @__PURE__ */ jsx(
25302
+ RangeSlider,
25303
+ {
25304
+ min: filter.min ?? 0,
25305
+ max: filter.max ?? 100,
25306
+ step: filter.step ?? 1,
25307
+ value: Number(
25308
+ selectedValues[`${filter.field}_min`] ?? filter.min ?? 0
25309
+ ),
25310
+ onChange: (v) => handleFilterSelect(`${filter.field}_min`, String(v)),
25311
+ showTooltip: true,
25312
+ className: "min-w-[130px]",
25313
+ "aria-label": t("filterGroup.from")
25314
+ }
25315
+ ),
25316
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "-" }),
25317
+ /* @__PURE__ */ jsx(
25318
+ RangeSlider,
25319
+ {
25320
+ min: filter.min ?? 0,
25321
+ max: filter.max ?? 100,
25322
+ step: filter.step ?? 1,
25323
+ value: Number(
25324
+ selectedValues[`${filter.field}_max`] ?? filter.max ?? 100
25325
+ ),
25326
+ onChange: (v) => handleFilterSelect(`${filter.field}_max`, String(v)),
25327
+ showTooltip: true,
25328
+ className: "min-w-[130px]",
25329
+ "aria-label": t("filterGroup.to")
25330
+ }
25331
+ )
25237
25332
  ] }) : resolveFilterType(filter) === "text" ? /* @__PURE__ */ jsx(
25238
25333
  Input,
25239
25334
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "5.147.0",
3
+ "version": "5.148.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -118,11 +118,11 @@
118
118
  "access": "public"
119
119
  },
120
120
  "dependencies": {
121
- "@almadar/core": "^10.57.0",
122
- "@almadar/evaluator": "^2.40.0",
121
+ "@almadar/core": "^10.58.0",
122
+ "@almadar/evaluator": "^2.41.0",
123
123
  "@almadar/logger": "^1.11.0",
124
124
  "@almadar/runtime": "^6.53.0",
125
- "@almadar/std": "^16.170.0",
125
+ "@almadar/std": "^16.172.0",
126
126
  "@almadar/syntax": "^1.15.0",
127
127
  "@dnd-kit/core": "^6.3.1",
128
128
  "@dnd-kit/sortable": "^10.0.0",