@studio-piot/native-ui 0.1.0 → 0.2.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.
Files changed (76) hide show
  1. package/README.md +3 -1
  2. package/dist/components/Select/Select.d.ts +3 -1
  3. package/dist/components/Select/Select.d.ts.map +1 -1
  4. package/dist/components/Select/Select.js +81 -19
  5. package/dist/components/Select/Select.js.map +1 -1
  6. package/dist/components/Select/SelectCloseButton.d.ts +9 -2
  7. package/dist/components/Select/SelectCloseButton.d.ts.map +1 -1
  8. package/dist/components/Select/SelectCloseButton.js +14 -6
  9. package/dist/components/Select/SelectCloseButton.js.map +1 -1
  10. package/dist/components/Select/index.d.ts +3 -3
  11. package/dist/components/Select/index.d.ts.map +1 -1
  12. package/dist/components/Select/index.js +2 -1
  13. package/dist/components/Select/index.js.map +1 -1
  14. package/dist/components/Select/presentSelectSheet.d.ts +7 -0
  15. package/dist/components/Select/presentSelectSheet.d.ts.map +1 -0
  16. package/dist/components/Select/presentSelectSheet.js +14 -0
  17. package/dist/components/Select/presentSelectSheet.js.map +1 -0
  18. package/dist/components/Select/resolveSelectDetentIndex.d.ts +2 -0
  19. package/dist/components/Select/resolveSelectDetentIndex.d.ts.map +1 -1
  20. package/dist/components/Select/resolveSelectDetentIndex.js +5 -0
  21. package/dist/components/Select/resolveSelectDetentIndex.js.map +1 -1
  22. package/dist/components/Select/selectThemeRoles.d.ts +1 -1
  23. package/dist/components/Select/selectThemeRoles.js +1 -1
  24. package/dist/components/Select/selectThemeRoles.js.map +1 -1
  25. package/dist/components/Select/trueSheetReanimated.d.ts +13 -0
  26. package/dist/components/Select/trueSheetReanimated.d.ts.map +1 -0
  27. package/dist/components/Select/trueSheetReanimated.js +14 -0
  28. package/dist/components/Select/trueSheetReanimated.js.map +1 -0
  29. package/dist/components/Select/types.d.ts +3 -1
  30. package/dist/components/Select/types.d.ts.map +1 -1
  31. package/dist/components/Slider/Slider.d.ts +3 -0
  32. package/dist/components/Slider/Slider.d.ts.map +1 -0
  33. package/dist/components/Slider/Slider.js +46 -0
  34. package/dist/components/Slider/Slider.js.map +1 -0
  35. package/dist/components/Slider/index.d.ts +4 -0
  36. package/dist/components/Slider/index.d.ts.map +1 -0
  37. package/dist/components/Slider/index.js +8 -0
  38. package/dist/components/Slider/index.js.map +1 -0
  39. package/dist/components/Slider/sliderThemeRoles.d.ts +8 -0
  40. package/dist/components/Slider/sliderThemeRoles.d.ts.map +1 -0
  41. package/dist/components/Slider/sliderThemeRoles.js +10 -0
  42. package/dist/components/Slider/sliderThemeRoles.js.map +1 -0
  43. package/dist/components/Slider/types.d.ts +18 -0
  44. package/dist/components/Slider/types.d.ts.map +1 -0
  45. package/dist/components/Slider/types.js +3 -0
  46. package/dist/components/Slider/types.js.map +1 -0
  47. package/dist/components/index.d.ts +2 -1
  48. package/dist/components/index.d.ts.map +1 -1
  49. package/dist/components/index.js +5 -1
  50. package/dist/components/index.js.map +1 -1
  51. package/dist/index.d.ts +3 -2
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +6 -2
  54. package/dist/index.js.map +1 -1
  55. package/docs/components/select.md +32 -10
  56. package/docs/components/slider.md +65 -0
  57. package/docs/superpowers/plans/2026-09-25-select.md +26 -8
  58. package/docs/superpowers/plans/2026-09-25-slider.md +35 -0
  59. package/docs/superpowers/specs/2026-09-25-select-design.md +39 -67
  60. package/docs/superpowers/specs/2026-09-25-slider-design.md +117 -0
  61. package/package.json +12 -4
  62. package/src/components/Select/Select.tsx +188 -75
  63. package/src/components/Select/SelectCloseButton.tsx +32 -7
  64. package/src/components/Select/index.ts +6 -2
  65. package/src/components/Select/resolveSelectDetentIndex.test.ts +15 -1
  66. package/src/components/Select/resolveSelectDetentIndex.ts +5 -0
  67. package/src/components/Select/selectThemeRoles.test.ts +16 -0
  68. package/src/components/Select/selectThemeRoles.ts +1 -1
  69. package/src/components/Select/types.ts +3 -1
  70. package/src/components/Slider/Slider.tsx +95 -0
  71. package/src/components/Slider/index.ts +6 -0
  72. package/src/components/Slider/sliderThemeRoles.test.ts +12 -0
  73. package/src/components/Slider/sliderThemeRoles.ts +8 -0
  74. package/src/components/Slider/types.ts +18 -0
  75. package/src/components/index.ts +8 -1
  76. package/src/index.ts +9 -2
@@ -0,0 +1,95 @@
1
+ import { StyleSheet, Text, View } from "react-native";
2
+ import CommunitySlider from "@react-native-community/slider";
3
+ import { useResolvedFieldColor } from "../Field/useResolvedFieldColor";
4
+ import { SLIDER_THEME_ROLES } from "./sliderThemeRoles";
5
+ import type { SliderProps } from "./types";
6
+
7
+ export function Slider({
8
+ value,
9
+ onChange,
10
+ minimumValue,
11
+ maximumValue,
12
+ step,
13
+ label,
14
+ formatValue = String,
15
+ disabled = false,
16
+ labelColor: labelColorProp,
17
+ valueColor: valueColorProp,
18
+ highlightColor: highlightColorProp,
19
+ trackColor: trackColorProp,
20
+ style,
21
+ }: SliderProps) {
22
+ const labelColor = useResolvedFieldColor(
23
+ labelColorProp,
24
+ SLIDER_THEME_ROLES.labelColor,
25
+ );
26
+ const valueColor = useResolvedFieldColor(
27
+ valueColorProp,
28
+ SLIDER_THEME_ROLES.valueColor,
29
+ );
30
+ const highlightColor = useResolvedFieldColor(
31
+ highlightColorProp,
32
+ SLIDER_THEME_ROLES.highlightColor,
33
+ );
34
+ const trackColor = useResolvedFieldColor(
35
+ trackColorProp,
36
+ SLIDER_THEME_ROLES.trackColor,
37
+ );
38
+
39
+ const display = formatValue(value);
40
+ const accessibilityLabel = label ? `${label}. ${display}` : display;
41
+
42
+ return (
43
+ <View style={[styles.column, disabled && styles.blocked, style]}>
44
+ <View style={styles.header}>
45
+ {label ? (
46
+ <Text style={[styles.label, { color: labelColor, flex: 1 }]}>
47
+ {label}
48
+ </Text>
49
+ ) : (
50
+ <View style={{ flex: 1 }} />
51
+ )}
52
+ <Text style={[styles.value, { color: valueColor }]}>{display}</Text>
53
+ </View>
54
+ <CommunitySlider
55
+ accessibilityLabel={accessibilityLabel}
56
+ disabled={disabled}
57
+ maximumTrackTintColor={trackColor}
58
+ maximumValue={maximumValue}
59
+ minimumTrackTintColor={highlightColor}
60
+ minimumValue={minimumValue}
61
+ onValueChange={onChange}
62
+ step={step}
63
+ style={styles.track}
64
+ thumbTintColor={highlightColor}
65
+ value={value}
66
+ />
67
+ </View>
68
+ );
69
+ }
70
+
71
+ const styles = StyleSheet.create({
72
+ column: {
73
+ width: "100%",
74
+ gap: 6,
75
+ },
76
+ blocked: {
77
+ opacity: 0.4,
78
+ },
79
+ header: {
80
+ flexDirection: "row",
81
+ alignItems: "center",
82
+ gap: 12,
83
+ },
84
+ label: {
85
+ fontSize: 13,
86
+ fontWeight: "600",
87
+ },
88
+ value: {
89
+ fontSize: 17,
90
+ },
91
+ track: {
92
+ width: "100%",
93
+ height: 40,
94
+ },
95
+ });
@@ -0,0 +1,6 @@
1
+ export { Slider } from "./Slider";
2
+ export {
3
+ SLIDER_THEME_ROLES,
4
+ type SliderThemeColorProp,
5
+ } from "./sliderThemeRoles";
6
+ export type { SliderProps } from "./types";
@@ -0,0 +1,12 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it } from "node:test";
3
+ import { SLIDER_THEME_ROLES } from "./sliderThemeRoles.ts";
4
+
5
+ describe("SLIDER_THEME_ROLES", () => {
6
+ it("maps colour props to Field roles plus fieldSliderHighlight", () => {
7
+ assert.equal(SLIDER_THEME_ROLES.labelColor, "fieldLabel");
8
+ assert.equal(SLIDER_THEME_ROLES.valueColor, "fieldText");
9
+ assert.equal(SLIDER_THEME_ROLES.highlightColor, "fieldSliderHighlight");
10
+ assert.equal(SLIDER_THEME_ROLES.trackColor, "fieldBorder");
11
+ });
12
+ });
@@ -0,0 +1,8 @@
1
+ export const SLIDER_THEME_ROLES = {
2
+ labelColor: "fieldLabel",
3
+ valueColor: "fieldText",
4
+ highlightColor: "fieldSliderHighlight",
5
+ trackColor: "fieldBorder",
6
+ } as const;
7
+
8
+ export type SliderThemeColorProp = keyof typeof SLIDER_THEME_ROLES;
@@ -0,0 +1,18 @@
1
+ import type { StyleProp, ViewStyle } from "react-native";
2
+
3
+ export type SliderProps = {
4
+ value: number;
5
+ onChange: (value: number) => void;
6
+ minimumValue: number;
7
+ maximumValue: number;
8
+ step?: number;
9
+ label?: string;
10
+ /** Defaults to `String(value)`. */
11
+ formatValue?: (value: number) => string;
12
+ disabled?: boolean;
13
+ labelColor?: string;
14
+ valueColor?: string;
15
+ highlightColor?: string;
16
+ trackColor?: string;
17
+ style?: StyleProp<ViewStyle>;
18
+ };
@@ -34,9 +34,16 @@ export {
34
34
  SELECT_THEME_ROLES,
35
35
  DEFAULT_SELECT_DETENTS,
36
36
  DEFAULT_SELECT_INITIAL_DETENT,
37
+ detentsToSnapPoints,
37
38
  resolveSelectDetentIndex,
38
39
  type SelectThemeColorProp,
40
+ type SelectCloseButtonSlot,
39
41
  type SelectOption,
40
42
  type SelectProps,
41
- type SelectCloseButtonProp,
42
43
  } from "./Select";
44
+ export {
45
+ Slider,
46
+ SLIDER_THEME_ROLES,
47
+ type SliderThemeColorProp,
48
+ type SliderProps,
49
+ } from "./Slider";
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- export const version = "0.1.0";
1
+ export const version = "0.2.2";
2
2
 
3
3
  export * from "./theme";
4
4
  export {
@@ -41,10 +41,17 @@ export {
41
41
  SELECT_THEME_ROLES,
42
42
  DEFAULT_SELECT_DETENTS,
43
43
  DEFAULT_SELECT_INITIAL_DETENT,
44
+ detentsToSnapPoints,
44
45
  resolveSelectDetentIndex,
45
46
  type SelectThemeColorProp,
47
+ type SelectCloseButtonSlot,
46
48
  type SelectOption,
47
49
  type SelectProps,
48
- type SelectCloseButtonProp,
49
50
  } from "./components/Select";
51
+ export {
52
+ Slider,
53
+ SLIDER_THEME_ROLES,
54
+ type SliderThemeColorProp,
55
+ type SliderProps,
56
+ } from "./components/Slider";
50
57
  export * as components from "./components";