@tcn/ui-time-selector 1.0.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.
Files changed (63) hide show
  1. package/dist/components/date_range_panel/date_range_panel.d.ts +13 -0
  2. package/dist/components/date_range_panel/date_range_panel.d.ts.map +1 -0
  3. package/dist/components/date_range_panel/date_range_panel.js +71 -0
  4. package/dist/components/date_range_panel/date_range_panel.js.map +1 -0
  5. package/dist/components/date_range_panel/date_range_panel_presenter.d.ts +14 -0
  6. package/dist/components/date_range_panel/date_range_panel_presenter.d.ts.map +1 -0
  7. package/dist/components/date_range_panel/date_range_panel_presenter.js +24 -0
  8. package/dist/components/date_range_panel/date_range_panel_presenter.js.map +1 -0
  9. package/dist/components/preset_panel/preset_panel.d.ts +11 -0
  10. package/dist/components/preset_panel/preset_panel.d.ts.map +1 -0
  11. package/dist/components/preset_panel/preset_panel.js +52 -0
  12. package/dist/components/preset_panel/preset_panel.js.map +1 -0
  13. package/dist/components/preset_panel/preset_panel_presenter.d.ts +24 -0
  14. package/dist/components/preset_panel/preset_panel_presenter.d.ts.map +1 -0
  15. package/dist/components/preset_panel/preset_panel_presenter.js +39 -0
  16. package/dist/components/preset_panel/preset_panel_presenter.js.map +1 -0
  17. package/dist/components/time_selector/time_selector.d.ts +12 -0
  18. package/dist/components/time_selector/time_selector.d.ts.map +1 -0
  19. package/dist/components/time_selector/time_selector.js +105 -0
  20. package/dist/components/time_selector/time_selector.js.map +1 -0
  21. package/dist/components/time_selector/time_selector_presenter.d.ts +28 -0
  22. package/dist/components/time_selector/time_selector_presenter.d.ts.map +1 -0
  23. package/dist/components/time_selector/time_selector_presenter.js +66 -0
  24. package/dist/components/time_selector/time_selector_presenter.js.map +1 -0
  25. package/dist/components/timezone_footer/timezone_footer.d.ts +9 -0
  26. package/dist/components/timezone_footer/timezone_footer.d.ts.map +1 -0
  27. package/dist/components/timezone_footer/timezone_footer.js +78 -0
  28. package/dist/components/timezone_footer/timezone_footer.js.map +1 -0
  29. package/dist/components/timezone_footer/timezone_footer_presenter.d.ts +23 -0
  30. package/dist/components/timezone_footer/timezone_footer_presenter.d.ts.map +1 -0
  31. package/dist/components/timezone_footer/timezone_footer_presenter.js +56 -0
  32. package/dist/components/timezone_footer/timezone_footer_presenter.js.map +1 -0
  33. package/dist/components/utils.d.ts +32 -0
  34. package/dist/components/utils.d.ts.map +1 -0
  35. package/dist/components/utils.js +62 -0
  36. package/dist/components/utils.js.map +1 -0
  37. package/dist/date_range_panel.css +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +5 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/preset_panel.css +1 -0
  43. package/dist/time_selector.css +1 -0
  44. package/dist/timezone_footer.css +1 -0
  45. package/package.json +72 -0
  46. package/src/__stories__/time_selector.stories.tsx +99 -0
  47. package/src/components/date_range_panel/date_range_panel.module.css +31 -0
  48. package/src/components/date_range_panel/date_range_panel.tsx +87 -0
  49. package/src/components/date_range_panel/date_range_panel_presenter.ts +35 -0
  50. package/src/components/preset_panel/preset_panel.module.css +35 -0
  51. package/src/components/preset_panel/preset_panel.tsx +74 -0
  52. package/src/components/preset_panel/preset_panel_presenter.ts +68 -0
  53. package/src/components/time_selector/time_selector.module.css +27 -0
  54. package/src/components/time_selector/time_selector.tsx +100 -0
  55. package/src/components/time_selector/time_selector_presenter.ts +116 -0
  56. package/src/components/timezone_footer/timezone_footer.module.css +28 -0
  57. package/src/components/timezone_footer/timezone_footer.tsx +109 -0
  58. package/src/components/timezone_footer/timezone_footer_presenter.ts +83 -0
  59. package/src/components/utils.ts +95 -0
  60. package/src/index.ts +5 -0
  61. package/tsconfig.json +7 -0
  62. package/types/file_types.d.ts +54 -0
  63. package/types/react_color.d.ts +61 -0
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Returns the timezone offset in minutes using the same sign convention as
3
+ * Date.getTimezoneOffset(): positive = behind UTC (e.g. CDT/UTC-5 → +300),
4
+ * negative = ahead of UTC (e.g. CEST/UTC+2 → -120).
5
+ */
6
+ export function getTimezoneOffsetMinutes(iana: string, date: Date): number {
7
+ const parts = new Intl.DateTimeFormat('en-US', {
8
+ timeZone: iana,
9
+ year: 'numeric',
10
+ month: '2-digit',
11
+ day: '2-digit',
12
+ hour: '2-digit',
13
+ minute: '2-digit',
14
+ second: '2-digit',
15
+ hour12: false,
16
+ }).formatToParts(date);
17
+ const get = (type: string) =>
18
+ parseInt(parts.find(p => p.type === type)?.value ?? '0', 10);
19
+ const hour = get('hour') % 24; // handle 24 → 0
20
+ const tzMs = Date.UTC(
21
+ get('year'),
22
+ get('month') - 1,
23
+ get('day'),
24
+ hour,
25
+ get('minute'),
26
+ get('second')
27
+ );
28
+ return Math.round((date.getTime() - tzMs) / 60000);
29
+ }
30
+
31
+ /** Returns the short timezone abbreviation, e.g. "CDT", "CEST", "UTC". */
32
+ export function getTimezoneAbbreviation(iana: string, date: Date): string {
33
+ const parts = new Intl.DateTimeFormat('en-US', {
34
+ timeZone: iana,
35
+ timeZoneName: 'short',
36
+ }).formatToParts(date);
37
+ return parts.find(p => p.type === 'timeZoneName')?.value ?? iana;
38
+ }
39
+
40
+ /**
41
+ * Formats an offset (in getTimezoneOffset sign convention) as "UTC+HH:MM" or "UTC-HH:MM".
42
+ * Positive offsetMinutes (behind UTC) → negative sign in display (e.g. +300 → "UTC-05:00").
43
+ */
44
+ export function formatUTCOffset(offsetMinutes: number): string {
45
+ const sign = offsetMinutes <= 0 ? '+' : '-';
46
+ const abs = Math.abs(offsetMinutes);
47
+ const hours = Math.floor(abs / 60)
48
+ .toString()
49
+ .padStart(2, '0');
50
+ const mins = (abs % 60).toString().padStart(2, '0');
51
+ return `UTC${sign}${hours}:${mins}`;
52
+ }
53
+
54
+ /**
55
+ * Shifts a real UTC moment so that DatePickerInput (which always renders in the
56
+ * browser's local timezone) visually displays the wall-clock time of `targetIana`.
57
+ */
58
+ export function shiftForDisplay(date: Date, targetIana: string): Date {
59
+ const browserOffsetMin = date.getTimezoneOffset();
60
+ const targetOffsetMin = getTimezoneOffsetMinutes(targetIana, date);
61
+ const shiftMs = (browserOffsetMin - targetOffsetMin) * 60000;
62
+ return new Date(date.getTime() + shiftMs);
63
+ }
64
+
65
+ /**
66
+ * Reverses shiftForDisplay: given a display date (shifted), recovers the real UTC moment.
67
+ */
68
+ export function unshiftFromDisplay(displayDate: Date, targetIana: string): Date {
69
+ const browserOffsetMin = displayDate.getTimezoneOffset();
70
+ const targetOffsetMin = getTimezoneOffsetMinutes(targetIana, displayDate);
71
+ const shiftMs = (browserOffsetMin - targetOffsetMin) * 60000;
72
+ return new Date(displayDate.getTime() - shiftMs);
73
+ }
74
+
75
+ export function formatDate(date: Date): string {
76
+ return date.toLocaleString('en-US', {
77
+ month: 'short',
78
+ day: 'numeric',
79
+ year: 'numeric',
80
+ hour: '2-digit',
81
+ minute: '2-digit',
82
+ hour12: false,
83
+ });
84
+ }
85
+
86
+ export interface PresetItem {
87
+ label: string;
88
+ minutes: number;
89
+ }
90
+
91
+ export function datesFromPreset(item: PresetItem): { start: Date; end: Date } {
92
+ const end = new Date();
93
+ const start = new Date(end.getTime() - item.minutes * 60 * 1000);
94
+ return { start, end };
95
+ }
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { TimeSelector } from './components/time_selector/time_selector.js';
2
+ export type {
3
+ TimeSelectorProps,
4
+ TimeSelectorOwnProps,
5
+ } from './components/time_selector/time_selector.js';
package/tsconfig.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "."
5
+ },
6
+ "include": ["src/**/*", ".storybook/**/*", "types/**/*", "package.json"]
7
+ }
@@ -0,0 +1,54 @@
1
+ declare module '*.css' {
2
+ const content: { [className: string]: string };
3
+ export default content;
4
+ }
5
+
6
+ declare module '*.module.css' {
7
+ const classes: { [key: string]: string };
8
+ export default classes;
9
+ }
10
+
11
+ declare module '*.css?url' {
12
+ const url: string;
13
+ export default url;
14
+ }
15
+
16
+ declare module '*.css?raw' {
17
+ const url: string;
18
+ export default url;
19
+ }
20
+
21
+ declare module '*.svg' {
22
+ const content: any;
23
+ export default content;
24
+ }
25
+
26
+ declare module '*.jpg' {
27
+ const content: any;
28
+ export default content;
29
+ }
30
+
31
+ declare module '*.png' {
32
+ const content: any;
33
+ export default content;
34
+ }
35
+
36
+ declare module '*.pdf' {
37
+ const content: any;
38
+ export default content;
39
+ }
40
+
41
+ declare module '*.wasm' {
42
+ const content: any;
43
+ export default content;
44
+ }
45
+
46
+ declare module '*.prql' {
47
+ const content: string;
48
+ export default content;
49
+ }
50
+
51
+ declare module '*.wav' {
52
+ const content: string;
53
+ export default content;
54
+ }
@@ -0,0 +1,61 @@
1
+ declare module 'react-color' {
2
+ export type Color =
3
+ | string
4
+ | {
5
+ hex: string;
6
+ rgb: {
7
+ r: number;
8
+ g: number;
9
+ b: number;
10
+ a?: number;
11
+ };
12
+ hsl: {
13
+ h: number;
14
+ s: number;
15
+ l: number;
16
+ a?: number;
17
+ };
18
+ };
19
+
20
+ export interface ColorResult {
21
+ hex: string;
22
+ rgb: {
23
+ r: number;
24
+ g: number;
25
+ b: number;
26
+ a?: number;
27
+ };
28
+ hsl: {
29
+ h: number;
30
+ s: number;
31
+ l: number;
32
+ a?: number;
33
+ };
34
+ }
35
+
36
+ export interface ColorState {
37
+ hex: string;
38
+ rgb: {
39
+ r: number;
40
+ g: number;
41
+ b: number;
42
+ a?: number;
43
+ };
44
+ hsl: {
45
+ h: number;
46
+ s: number;
47
+ l: number;
48
+ a?: number;
49
+ };
50
+ }
51
+
52
+ export interface ChromePickerProps {
53
+ color?: Color | string;
54
+ onChange?: (color: ColorResult) => void;
55
+ onChangeComplete?: (color: ColorResult) => void;
56
+ disableAlpha?: boolean;
57
+ [key: string]: unknown;
58
+ }
59
+
60
+ export const ChromePicker: React.ComponentType<ChromePickerProps>;
61
+ }