@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,13 @@
1
+ import { DateRangePanelPresenter } from './date_range_panel_presenter.js';
2
+ export interface DateRangePanelOwnProps {
3
+ presenter: DateRangePanelPresenter;
4
+ focused: boolean;
5
+ startDateMin?: Date | null;
6
+ startDateMax?: Date | null;
7
+ endDateMin?: Date | null;
8
+ endDateMax?: Date | null;
9
+ onApply: () => void;
10
+ }
11
+ export type DateRangePanelProps = DateRangePanelOwnProps;
12
+ export declare function DateRangePanel({ presenter, focused, startDateMin, startDateMax, endDateMin, endDateMax, onApply, }: DateRangePanelProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=date_range_panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date_range_panel.d.ts","sourceRoot":"","sources":["../../../src/components/date_range_panel/date_range_panel.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,uBAAuB,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AAEzD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,GACR,EAAE,mBAAmB,2CAwDrB"}
@@ -0,0 +1,71 @@
1
+ import { jsxs as i, jsx as e } from "react/jsx-runtime";
2
+ import { useSignalValue as l } from "@tcn/state";
3
+ import { VStack as r, Spacer as y } from "@tcn/ui/stacks";
4
+ import { BodyText as s } from "@tcn/ui/typography";
5
+ import { DatePickerInput as d } from "@tcn/ui/inputs";
6
+ import { Button as _ } from "@tcn/ui/actions";
7
+ import { useRef as g, useEffect as P } from "react";
8
+ import { IteratorIcon as x } from "@tcn/icons/iterator_icon.js";
9
+ import '../../date_range_panel.css';const N = "_date-picker-panel_1e6c441", v = "_date-picker-panel-title_bc33101", w = "_date-picker-section_90f5c3a", S = "_date-picker-label_113ebb5", T = "_apply_05ed9af", a = { "date-picker-panel": N, "date-picker-panel-title": v, "date-picker-section": w, "date-picker-label": S, apply: T };
10
+ function V({
11
+ presenter: t,
12
+ focused: o,
13
+ startDateMin: p,
14
+ startDateMax: m,
15
+ endDateMin: h,
16
+ endDateMax: k,
17
+ onApply: f
18
+ }) {
19
+ const n = g(null), u = l(t.startDate.broadcast), b = l(t.endDate.broadcast), D = l(t.broadcasts.isApplyDisabled);
20
+ return P(() => {
21
+ o && n.current?.focus();
22
+ }, [o]), /* @__PURE__ */ i(r, { className: a["date-picker-panel"], height: "auto", children: [
23
+ /* @__PURE__ */ e(s, { className: a["date-picker-panel-title"], selectable: !1, children: "Absolute time range" }),
24
+ /* @__PURE__ */ i(r, { className: a["date-picker-section"], height: "auto", width: "auto", children: [
25
+ /* @__PURE__ */ e(s, { className: a["date-picker-label"], selectable: !1, children: "From" }),
26
+ /* @__PURE__ */ e(
27
+ d,
28
+ {
29
+ ref: n,
30
+ showTime: !0,
31
+ value: u,
32
+ onChange: (c) => t.setStartDate(c),
33
+ min: p ?? void 0,
34
+ max: m ?? void 0
35
+ }
36
+ )
37
+ ] }),
38
+ /* @__PURE__ */ i(r, { className: a["date-picker-section"], height: "auto", width: "auto", children: [
39
+ /* @__PURE__ */ e(s, { className: a["date-picker-label"], selectable: !1, children: "To" }),
40
+ /* @__PURE__ */ e(
41
+ d,
42
+ {
43
+ showTime: !0,
44
+ value: b,
45
+ onChange: (c) => t.setEndDate(c),
46
+ min: h ?? void 0,
47
+ max: k ?? void 0
48
+ }
49
+ )
50
+ ] }),
51
+ /* @__PURE__ */ i(
52
+ _,
53
+ {
54
+ size: "sm",
55
+ hierarchy: "primary",
56
+ disabled: D,
57
+ onClick: f,
58
+ className: a.apply,
59
+ children: [
60
+ "Apply time range",
61
+ /* @__PURE__ */ e(y, { width: "8px" }),
62
+ /* @__PURE__ */ e(x, { size: "sm" })
63
+ ]
64
+ }
65
+ )
66
+ ] });
67
+ }
68
+ export {
69
+ V as DateRangePanel
70
+ };
71
+ //# sourceMappingURL=date_range_panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date_range_panel.js","sources":["../../../src/components/date_range_panel/date_range_panel.tsx"],"sourcesContent":["import { useSignalValue } from '@tcn/state';\nimport { Spacer, VStack } from '@tcn/ui/stacks';\nimport { BodyText } from '@tcn/ui/typography';\nimport { DatePickerInput } from '@tcn/ui/inputs';\nimport { Button } from '@tcn/ui/actions';\nimport { useEffect, useRef } from 'react';\nimport { IteratorIcon } from '@tcn/icons/iterator_icon.js';\nimport { DateRangePanelPresenter } from './date_range_panel_presenter.js';\nimport styles from './date_range_panel.module.css';\n\nexport interface DateRangePanelOwnProps {\n presenter: DateRangePanelPresenter;\n focused: boolean;\n startDateMin?: Date | null;\n startDateMax?: Date | null;\n endDateMin?: Date | null;\n endDateMax?: Date | null;\n onApply: () => void;\n}\n\nexport type DateRangePanelProps = DateRangePanelOwnProps;\n\nexport function DateRangePanel({\n presenter,\n focused,\n startDateMin,\n startDateMax,\n endDateMin,\n endDateMax,\n onApply,\n}: DateRangePanelProps) {\n const startDateRef = useRef<HTMLButtonElement>(null);\n\n const startDate = useSignalValue(presenter.startDate.broadcast);\n const endDate = useSignalValue(presenter.endDate.broadcast);\n const isApplyDisabled = useSignalValue(presenter.broadcasts.isApplyDisabled);\n\n useEffect(() => {\n if (focused) {\n startDateRef.current?.focus();\n }\n }, [focused]);\n\n return (\n <VStack className={styles['date-picker-panel']} height=\"auto\">\n <BodyText className={styles['date-picker-panel-title']} selectable={false}>\n Absolute time range\n </BodyText>\n <VStack className={styles['date-picker-section']} height=\"auto\" width=\"auto\">\n <BodyText className={styles['date-picker-label']} selectable={false}>\n From\n </BodyText>\n <DatePickerInput\n ref={startDateRef}\n showTime\n value={startDate}\n onChange={(date: Date | null) => presenter.setStartDate(date)}\n min={startDateMin ?? undefined}\n max={startDateMax ?? undefined}\n />\n </VStack>\n <VStack className={styles['date-picker-section']} height=\"auto\" width=\"auto\">\n <BodyText className={styles['date-picker-label']} selectable={false}>\n To\n </BodyText>\n <DatePickerInput\n showTime\n value={endDate}\n onChange={(date: Date | null) => presenter.setEndDate(date)}\n min={endDateMin ?? undefined}\n max={endDateMax ?? undefined}\n />\n </VStack>\n <Button\n size=\"sm\"\n hierarchy=\"primary\"\n disabled={isApplyDisabled}\n onClick={onApply}\n className={styles['apply']}\n >\n Apply time range\n <Spacer width=\"8px\" />\n <IteratorIcon size=\"sm\" />\n </Button>\n </VStack>\n );\n}\n"],"names":["DateRangePanel","presenter","focused","startDateMin","startDateMax","endDateMin","endDateMax","onApply","startDateRef","useRef","startDate","useSignalValue","endDate","isApplyDisabled","useEffect","VStack","styles","jsx","BodyText","jsxs","DatePickerInput","date","Button","Spacer","IteratorIcon"],"mappings":";;;;;;;;;AAsBO,SAASA,EAAe;AAAA,EAC7B,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC;AACF,GAAwB;AACtB,QAAMC,IAAeC,EAA0B,IAAI,GAE7CC,IAAYC,EAAeV,EAAU,UAAU,SAAS,GACxDW,IAAUD,EAAeV,EAAU,QAAQ,SAAS,GACpDY,IAAkBF,EAAeV,EAAU,WAAW,eAAe;AAE3E,SAAAa,EAAU,MAAM;AACd,IAAIZ,KACFM,EAAa,SAAS,MAAA;AAAA,EAE1B,GAAG,CAACN,CAAO,CAAC,qBAGTa,GAAA,EAAO,WAAWC,EAAO,mBAAmB,GAAG,QAAO,QACrD,UAAA;AAAA,IAAA,gBAAAC,EAACC,KAAS,WAAWF,EAAO,yBAAyB,GAAG,YAAY,IAAO,UAAA,uBAE3E;AAAA,IACA,gBAAAG,EAACJ,KAAO,WAAWC,EAAO,qBAAqB,GAAG,QAAO,QAAO,OAAM,QACpE,UAAA;AAAA,MAAA,gBAAAC,EAACC,KAAS,WAAWF,EAAO,mBAAmB,GAAG,YAAY,IAAO,UAAA,QAErE;AAAA,MACA,gBAAAC;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,KAAKZ;AAAA,UACL,UAAQ;AAAA,UACR,OAAOE;AAAA,UACP,UAAU,CAACW,MAAsBpB,EAAU,aAAaoB,CAAI;AAAA,UAC5D,KAAKlB,KAAgB;AAAA,UACrB,KAAKC,KAAgB;AAAA,QAAA;AAAA,MAAA;AAAA,IACvB,GACF;AAAA,IACA,gBAAAe,EAACJ,KAAO,WAAWC,EAAO,qBAAqB,GAAG,QAAO,QAAO,OAAM,QACpE,UAAA;AAAA,MAAA,gBAAAC,EAACC,KAAS,WAAWF,EAAO,mBAAmB,GAAG,YAAY,IAAO,UAAA,MAErE;AAAA,MACA,gBAAAC;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,UAAQ;AAAA,UACR,OAAOR;AAAA,UACP,UAAU,CAACS,MAAsBpB,EAAU,WAAWoB,CAAI;AAAA,UAC1D,KAAKhB,KAAc;AAAA,UACnB,KAAKC,KAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IACrB,GACF;AAAA,IACA,gBAAAa;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,UAAUT;AAAA,QACV,SAASN;AAAA,QACT,WAAWS,EAAO;AAAA,QACnB,UAAA;AAAA,UAAA;AAAA,UAEC,gBAAAC,EAACM,GAAA,EAAO,OAAM,MAAA,CAAM;AAAA,UACpB,gBAAAN,EAACO,GAAA,EAAa,MAAK,KAAA,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAC1B,GACF;AAEJ;"}
@@ -0,0 +1,14 @@
1
+ import { Signal } from '@tcn/state';
2
+ export declare class DateRangePanelPresenter {
3
+ readonly startDate: Signal<Date | null>;
4
+ readonly endDate: Signal<Date | null>;
5
+ private _isApplyDisabled;
6
+ readonly broadcasts: {
7
+ isApplyDisabled: Signal<boolean>['broadcast'];
8
+ };
9
+ constructor(startDate: Signal<Date | null>, endDate: Signal<Date | null>);
10
+ private _updateApplyDisabled;
11
+ setStartDate(date: Date | null): void;
12
+ setEndDate(date: Date | null): void;
13
+ }
14
+ //# sourceMappingURL=date_range_panel_presenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date_range_panel_presenter.d.ts","sourceRoot":"","sources":["../../../src/components/date_range_panel/date_range_panel_presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,qBAAa,uBAAuB;IAQhC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IARvC,OAAO,CAAC,gBAAgB,CAA8B;IAEtD,QAAQ,CAAC,UAAU,EAAE;QACnB,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;KAC/C,CAAC;gBAGS,SAAS,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,EAC9B,OAAO,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IAQvC,OAAO,CAAC,oBAAoB;IAM5B,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAK9B,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAI7B"}
@@ -0,0 +1,24 @@
1
+ import { Signal as e } from "@tcn/state";
2
+ class l {
3
+ constructor(t, s) {
4
+ this.startDate = t, this.endDate = s, this.broadcasts = {
5
+ isApplyDisabled: this._isApplyDisabled.broadcast
6
+ }, this._updateApplyDisabled();
7
+ }
8
+ _isApplyDisabled = new e(!1);
9
+ broadcasts;
10
+ _updateApplyDisabled() {
11
+ const t = this.startDate.get(), s = this.endDate.get();
12
+ this._isApplyDisabled.set(t == null || s == null || s <= t);
13
+ }
14
+ setStartDate(t) {
15
+ this.startDate.set(t), this._updateApplyDisabled();
16
+ }
17
+ setEndDate(t) {
18
+ this.endDate.set(t), this._updateApplyDisabled();
19
+ }
20
+ }
21
+ export {
22
+ l as DateRangePanelPresenter
23
+ };
24
+ //# sourceMappingURL=date_range_panel_presenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date_range_panel_presenter.js","sources":["../../../src/components/date_range_panel/date_range_panel_presenter.ts"],"sourcesContent":["import { Signal } from '@tcn/state';\n\nexport class DateRangePanelPresenter {\n private _isApplyDisabled = new Signal<boolean>(false);\n\n readonly broadcasts: {\n isApplyDisabled: Signal<boolean>['broadcast'];\n };\n\n constructor(\n readonly startDate: Signal<Date | null>,\n readonly endDate: Signal<Date | null>\n ) {\n this.broadcasts = {\n isApplyDisabled: this._isApplyDisabled.broadcast,\n };\n this._updateApplyDisabled();\n }\n\n private _updateApplyDisabled() {\n const start = this.startDate.get();\n const end = this.endDate.get();\n this._isApplyDisabled.set(start == null || end == null || end <= start);\n }\n\n setStartDate(date: Date | null) {\n this.startDate.set(date);\n this._updateApplyDisabled();\n }\n\n setEndDate(date: Date | null) {\n this.endDate.set(date);\n this._updateApplyDisabled();\n }\n}\n"],"names":["DateRangePanelPresenter","startDate","endDate","Signal","start","end","date"],"mappings":";AAEO,MAAMA,EAAwB;AAAA,EAOnC,YACWC,GACAC,GACT;AAFS,SAAA,YAAAD,GACA,KAAA,UAAAC,GAET,KAAK,aAAa;AAAA,MAChB,iBAAiB,KAAK,iBAAiB;AAAA,IAAA,GAEzC,KAAK,qBAAA;AAAA,EACP;AAAA,EAdQ,mBAAmB,IAAIC,EAAgB,EAAK;AAAA,EAE3C;AAAA,EAcD,uBAAuB;AAC7B,UAAMC,IAAQ,KAAK,UAAU,IAAA,GACvBC,IAAM,KAAK,QAAQ,IAAA;AACzB,SAAK,iBAAiB,IAAID,KAAS,QAAQC,KAAO,QAAQA,KAAOD,CAAK;AAAA,EACxE;AAAA,EAEA,aAAaE,GAAmB;AAC9B,SAAK,UAAU,IAAIA,CAAI,GACvB,KAAK,qBAAA;AAAA,EACP;AAAA,EAEA,WAAWA,GAAmB;AAC5B,SAAK,QAAQ,IAAIA,CAAI,GACrB,KAAK,qBAAA;AAAA,EACP;AACF;"}
@@ -0,0 +1,11 @@
1
+ import { PresetItem } from '../utils.js';
2
+ import { PresetPanelPresenter } from './preset_panel_presenter.js';
3
+ export interface PresetPanelOwnProps {
4
+ presenter: PresetPanelPresenter;
5
+ selectedPreset: PresetItem | null;
6
+ focused: boolean;
7
+ onSelect: (item: PresetItem) => void;
8
+ }
9
+ export type PresetPanelProps = PresetPanelOwnProps;
10
+ export declare function PresetPanel({ presenter, selectedPreset, focused, onSelect, }: PresetPanelProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=preset_panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset_panel.d.ts","sourceRoot":"","sources":["../../../src/components/preset_panel/preset_panel.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,oBAAoB,CAAC;IAChC,cAAc,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEnD,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,OAAO,EACP,QAAQ,GACT,EAAE,gBAAgB,2CAkDlB"}
@@ -0,0 +1,52 @@
1
+ import { jsxs as b, jsx as l } from "react/jsx-runtime";
2
+ import { useSignalValue as c } from "@tcn/state";
3
+ import { VStack as f, HStack as I } from "@tcn/ui/stacks";
4
+ import { BodyText as _ } from "@tcn/ui/typography";
5
+ import { Input as x } from "@tcn/ui/inputs";
6
+ import { useRef as m, useEffect as d } from "react";
7
+ import '../../preset_panel.css';const k = "_presets-panel_7e3238f", y = "_preset-search_113ae3a", S = "_preset-list_191d980", w = "_preset-item_aa39cec", r = { "presets-panel": k, "preset-search": y, "preset-list": S, "preset-item": w };
8
+ function C({
9
+ presenter: s,
10
+ selectedPreset: n,
11
+ focused: o,
12
+ onSelect: i
13
+ }) {
14
+ const h = m(null), p = m(null), u = c(s.broadcasts.search), g = c(s.broadcasts.filteredItems), a = c(s.broadcasts.highlightedIndex);
15
+ return d(() => {
16
+ o && h.current?.focus();
17
+ }, [o]), d(() => {
18
+ const e = p.current;
19
+ if (e == null) return;
20
+ e.children[a]?.scrollIntoView({ block: "nearest" });
21
+ }, [a]), /* @__PURE__ */ b(f, { className: r["presets-panel"], height: "auto", children: [
22
+ /* @__PURE__ */ l(
23
+ x,
24
+ {
25
+ ref: h,
26
+ className: r["preset-search"],
27
+ value: u,
28
+ onChange: (e) => s.setSearch(e),
29
+ placeholder: "Search quick ranges",
30
+ onKeyDown: (e) => {
31
+ const t = s.handleKeyDown(e.key);
32
+ t.preventDefault && e.preventDefault(), t.selectedItem != null && i(t.selectedItem);
33
+ }
34
+ }
35
+ ),
36
+ /* @__PURE__ */ l(f, { ref: p, className: r["preset-list"], height: "290px", width: "100%", children: g.map((e, t) => /* @__PURE__ */ l(
37
+ I,
38
+ {
39
+ className: r["preset-item"],
40
+ "data-selected": n != null && e.label === n.label,
41
+ "data-highlighted": t === a,
42
+ onClick: () => i(e),
43
+ children: /* @__PURE__ */ l(_, { selectable: !1, children: e.label })
44
+ },
45
+ e.label
46
+ )) })
47
+ ] });
48
+ }
49
+ export {
50
+ C as PresetPanel
51
+ };
52
+ //# sourceMappingURL=preset_panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset_panel.js","sources":["../../../src/components/preset_panel/preset_panel.tsx"],"sourcesContent":["import { useSignalValue } from '@tcn/state';\nimport { HStack, VStack } from '@tcn/ui/stacks';\nimport { BodyText } from '@tcn/ui/typography';\nimport { Input } from '@tcn/ui/inputs';\nimport { useEffect, useRef } from 'react';\nimport { type PresetItem } from '../utils.js';\nimport { PresetPanelPresenter } from './preset_panel_presenter.js';\nimport styles from './preset_panel.module.css';\n\nexport interface PresetPanelOwnProps {\n presenter: PresetPanelPresenter;\n selectedPreset: PresetItem | null;\n focused: boolean;\n onSelect: (item: PresetItem) => void;\n}\n\nexport type PresetPanelProps = PresetPanelOwnProps;\n\nexport function PresetPanel({\n presenter,\n selectedPreset,\n focused,\n onSelect,\n}: PresetPanelProps) {\n const searchRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const search = useSignalValue(presenter.broadcasts.search);\n const filteredItems = useSignalValue(presenter.broadcasts.filteredItems);\n const highlightedIndex = useSignalValue(presenter.broadcasts.highlightedIndex);\n\n useEffect(() => {\n if (focused) {\n searchRef.current?.focus();\n }\n }, [focused]);\n\n useEffect(() => {\n const list = listRef.current;\n if (list == null) return;\n const item = list.children[highlightedIndex] as HTMLElement | undefined;\n item?.scrollIntoView({ block: 'nearest' });\n }, [highlightedIndex]);\n\n return (\n <VStack className={styles['presets-panel']} height=\"auto\">\n <Input\n ref={searchRef}\n className={styles['preset-search']}\n value={search}\n onChange={v => presenter.setSearch(v)}\n placeholder=\"Search quick ranges\"\n onKeyDown={e => {\n const result = presenter.handleKeyDown(e.key);\n if (result.preventDefault) e.preventDefault();\n if (result.selectedItem != null) onSelect(result.selectedItem);\n }}\n />\n <VStack ref={listRef} className={styles['preset-list']} height=\"290px\" width=\"100%\">\n {filteredItems.map((item, index) => (\n <HStack\n key={item.label}\n className={styles['preset-item']}\n data-selected={selectedPreset != null && item.label === selectedPreset.label}\n data-highlighted={index === highlightedIndex}\n onClick={() => onSelect(item)}\n >\n <BodyText selectable={false}>{item.label}</BodyText>\n </HStack>\n ))}\n </VStack>\n </VStack>\n );\n}\n"],"names":["PresetPanel","presenter","selectedPreset","focused","onSelect","searchRef","useRef","listRef","search","useSignalValue","filteredItems","highlightedIndex","useEffect","list","VStack","styles","jsx","Input","v","result","item","index","HStack","BodyText"],"mappings":";;;;;;;AAkBO,SAASA,EAAY;AAAA,EAC1B,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AACF,GAAqB;AACnB,QAAMC,IAAYC,EAAyB,IAAI,GACzCC,IAAUD,EAAuB,IAAI,GAErCE,IAASC,EAAeR,EAAU,WAAW,MAAM,GACnDS,IAAgBD,EAAeR,EAAU,WAAW,aAAa,GACjEU,IAAmBF,EAAeR,EAAU,WAAW,gBAAgB;AAE7E,SAAAW,EAAU,MAAM;AACd,IAAIT,KACFE,EAAU,SAAS,MAAA;AAAA,EAEvB,GAAG,CAACF,CAAO,CAAC,GAEZS,EAAU,MAAM;AACd,UAAMC,IAAON,EAAQ;AACrB,QAAIM,KAAQ,KAAM;AAElB,IADaA,EAAK,SAASF,CAAgB,GACrC,eAAe,EAAE,OAAO,UAAA,CAAW;AAAA,EAC3C,GAAG,CAACA,CAAgB,CAAC,qBAGlBG,GAAA,EAAO,WAAWC,EAAO,eAAe,GAAG,QAAO,QACjD,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAKZ;AAAA,QACL,WAAWU,EAAO,eAAe;AAAA,QACjC,OAAOP;AAAA,QACP,UAAU,CAAAU,MAAKjB,EAAU,UAAUiB,CAAC;AAAA,QACpC,aAAY;AAAA,QACZ,WAAW,CAAA,MAAK;AACd,gBAAMC,IAASlB,EAAU,cAAc,EAAE,GAAG;AAC5C,UAAIkB,EAAO,kBAAgB,EAAE,eAAA,GACzBA,EAAO,gBAAgB,QAAMf,EAASe,EAAO,YAAY;AAAA,QAC/D;AAAA,MAAA;AAAA,IAAA;AAAA,sBAEDL,GAAA,EAAO,KAAKP,GAAS,WAAWQ,EAAO,aAAa,GAAG,QAAO,SAAQ,OAAM,QAC1E,UAAAL,EAAc,IAAI,CAACU,GAAMC,MACxB,gBAAAL;AAAA,MAACM;AAAA,MAAA;AAAA,QAEC,WAAWP,EAAO,aAAa;AAAA,QAC/B,iBAAeb,KAAkB,QAAQkB,EAAK,UAAUlB,EAAe;AAAA,QACvE,oBAAkBmB,MAAUV;AAAA,QAC5B,SAAS,MAAMP,EAASgB,CAAI;AAAA,QAE5B,UAAA,gBAAAJ,EAACO,GAAA,EAAS,YAAY,IAAQ,YAAK,MAAA,CAAM;AAAA,MAAA;AAAA,MANpCH,EAAK;AAAA,IAAA,CAQb,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
@@ -0,0 +1,24 @@
1
+ import { Signal, derive } from '@tcn/state';
2
+ import { PresetItem } from '../utils.js';
3
+ export declare class PresetPanelPresenter {
4
+ private readonly _items;
5
+ private _search;
6
+ private _highlightedIndex;
7
+ private _filteredItems;
8
+ readonly broadcasts: {
9
+ search: Signal<string>['broadcast'];
10
+ highlightedIndex: Signal<number>['broadcast'];
11
+ filteredItems: ReturnType<typeof derive<string, PresetItem[]>>['broadcast'];
12
+ };
13
+ constructor(_items: PresetItem[]);
14
+ setSearch(query: string): void;
15
+ moveHighlight(direction: 1 | -1): void;
16
+ getHighlightedItem(): PresetItem | null;
17
+ handleKeyDown(key: string): {
18
+ preventDefault: boolean;
19
+ selectedItem?: PresetItem;
20
+ escape?: boolean;
21
+ };
22
+ reset(): void;
23
+ }
24
+ //# sourceMappingURL=preset_panel_presenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset_panel_presenter.d.ts","sourceRoot":"","sources":["../../../src/components/preset_panel/preset_panel_presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,qBAAa,oBAAoB;IAWnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVnC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,cAAc,CAAkD;IAExE,QAAQ,CAAC,UAAU,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;QACpC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;QAC9C,aAAa,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;KAC7E,CAAC;gBAE2B,MAAM,EAAE,UAAU,EAAE;IAYjD,SAAS,CAAC,KAAK,EAAE,MAAM;IAKvB,aAAa,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IAO/B,kBAAkB,IAAI,UAAU,GAAG,IAAI;IAKvC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;QAC1B,cAAc,EAAE,OAAO,CAAC;QACxB,YAAY,CAAC,EAAE,UAAU,CAAC;QAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IAgBD,KAAK;CAIN"}
@@ -0,0 +1,39 @@
1
+ import { derive as h, Signal as i } from "@tcn/state";
2
+ class n {
3
+ constructor(e) {
4
+ this._items = e, this._filteredItems = h(
5
+ this._search,
6
+ (t) => e.filter((s) => s.label.toLowerCase().includes(t.toLowerCase()))
7
+ ), this.broadcasts = {
8
+ search: this._search.broadcast,
9
+ highlightedIndex: this._highlightedIndex.broadcast,
10
+ filteredItems: this._filteredItems.broadcast
11
+ };
12
+ }
13
+ _search = new i("");
14
+ _highlightedIndex = new i(0);
15
+ _filteredItems;
16
+ broadcasts;
17
+ setSearch(e) {
18
+ this._search.set(e), this._highlightedIndex.set(0);
19
+ }
20
+ moveHighlight(e) {
21
+ const t = this._filteredItems.get().length;
22
+ if (t === 0) return;
23
+ const s = (this._highlightedIndex.get() + e + t) % t;
24
+ this._highlightedIndex.set(s);
25
+ }
26
+ getHighlightedItem() {
27
+ return this._filteredItems.get()[this._highlightedIndex.get()] ?? null;
28
+ }
29
+ handleKeyDown(e) {
30
+ return e === "ArrowDown" ? (this.moveHighlight(1), { preventDefault: !0 }) : e === "ArrowUp" ? (this.moveHighlight(-1), { preventDefault: !0 }) : e === "Enter" ? { preventDefault: !0, selectedItem: this.getHighlightedItem() ?? void 0 } : e === "Escape" ? { preventDefault: !1, escape: !0 } : { preventDefault: !1 };
31
+ }
32
+ reset() {
33
+ this._search.set(""), this._highlightedIndex.set(0);
34
+ }
35
+ }
36
+ export {
37
+ n as PresetPanelPresenter
38
+ };
39
+ //# sourceMappingURL=preset_panel_presenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset_panel_presenter.js","sources":["../../../src/components/preset_panel/preset_panel_presenter.ts"],"sourcesContent":["import { Signal, derive } from '@tcn/state';\nimport { type PresetItem } from '../utils.js';\n\nexport class PresetPanelPresenter {\n private _search = new Signal<string>('');\n private _highlightedIndex = new Signal<number>(0);\n private _filteredItems: ReturnType<typeof derive<string, PresetItem[]>>;\n\n readonly broadcasts: {\n search: Signal<string>['broadcast'];\n highlightedIndex: Signal<number>['broadcast'];\n filteredItems: ReturnType<typeof derive<string, PresetItem[]>>['broadcast'];\n };\n\n constructor(private readonly _items: PresetItem[]) {\n this._filteredItems = derive(this._search, search =>\n _items.filter(item => item.label.toLowerCase().includes(search.toLowerCase()))\n );\n\n this.broadcasts = {\n search: this._search.broadcast,\n highlightedIndex: this._highlightedIndex.broadcast,\n filteredItems: this._filteredItems.broadcast,\n };\n }\n\n setSearch(query: string) {\n this._search.set(query);\n this._highlightedIndex.set(0);\n }\n\n moveHighlight(direction: 1 | -1) {\n const count = this._filteredItems.get().length;\n if (count === 0) return;\n const next = (this._highlightedIndex.get() + direction + count) % count;\n this._highlightedIndex.set(next);\n }\n\n getHighlightedItem(): PresetItem | null {\n const items = this._filteredItems.get();\n return items[this._highlightedIndex.get()] ?? null;\n }\n\n handleKeyDown(key: string): {\n preventDefault: boolean;\n selectedItem?: PresetItem;\n escape?: boolean;\n } {\n if (key === 'ArrowDown') {\n this.moveHighlight(1);\n return { preventDefault: true };\n } else if (key === 'ArrowUp') {\n this.moveHighlight(-1);\n return { preventDefault: true };\n } else if (key === 'Enter') {\n const item = this.getHighlightedItem();\n return { preventDefault: true, selectedItem: item ?? undefined };\n } else if (key === 'Escape') {\n return { preventDefault: false, escape: true };\n }\n return { preventDefault: false };\n }\n\n reset() {\n this._search.set('');\n this._highlightedIndex.set(0);\n }\n}\n"],"names":["PresetPanelPresenter","_items","derive","search","item","Signal","query","direction","count","next","key"],"mappings":";AAGO,MAAMA,EAAqB;AAAA,EAWhC,YAA6BC,GAAsB;AAAtB,SAAA,SAAAA,GAC3B,KAAK,iBAAiBC;AAAA,MAAO,KAAK;AAAA,MAAS,CAAAC,MACzCF,EAAO,OAAO,CAAAG,MAAQA,EAAK,MAAM,YAAA,EAAc,SAASD,EAAO,YAAA,CAAa,CAAC;AAAA,IAAA,GAG/E,KAAK,aAAa;AAAA,MAChB,QAAQ,KAAK,QAAQ;AAAA,MACrB,kBAAkB,KAAK,kBAAkB;AAAA,MACzC,eAAe,KAAK,eAAe;AAAA,IAAA;AAAA,EAEvC;AAAA,EApBQ,UAAU,IAAIE,EAAe,EAAE;AAAA,EAC/B,oBAAoB,IAAIA,EAAe,CAAC;AAAA,EACxC;AAAA,EAEC;AAAA,EAkBT,UAAUC,GAAe;AACvB,SAAK,QAAQ,IAAIA,CAAK,GACtB,KAAK,kBAAkB,IAAI,CAAC;AAAA,EAC9B;AAAA,EAEA,cAAcC,GAAmB;AAC/B,UAAMC,IAAQ,KAAK,eAAe,IAAA,EAAM;AACxC,QAAIA,MAAU,EAAG;AACjB,UAAMC,KAAQ,KAAK,kBAAkB,QAAQF,IAAYC,KAASA;AAClE,SAAK,kBAAkB,IAAIC,CAAI;AAAA,EACjC;AAAA,EAEA,qBAAwC;AAEtC,WADc,KAAK,eAAe,IAAA,EACrB,KAAK,kBAAkB,IAAA,CAAK,KAAK;AAAA,EAChD;AAAA,EAEA,cAAcC,GAIZ;AACA,WAAIA,MAAQ,eACV,KAAK,cAAc,CAAC,GACb,EAAE,gBAAgB,GAAA,KAChBA,MAAQ,aACjB,KAAK,cAAc,EAAE,GACd,EAAE,gBAAgB,GAAA,KAChBA,MAAQ,UAEV,EAAE,gBAAgB,IAAM,cADlB,KAAK,mBAAA,KACmC,OAAA,IAC5CA,MAAQ,WACV,EAAE,gBAAgB,IAAO,QAAQ,GAAA,IAEnC,EAAE,gBAAgB,GAAA;AAAA,EAC3B;AAAA,EAEA,QAAQ;AACN,SAAK,QAAQ,IAAI,EAAE,GACnB,KAAK,kBAAkB,IAAI,CAAC;AAAA,EAC9B;AACF;"}
@@ -0,0 +1,12 @@
1
+ export interface TimeSelectorOwnProps {
2
+ onChange?: (start: Date, end: Date) => void;
3
+ onTimezoneChange?: (timezone: string) => void;
4
+ startDateMin?: Date | null;
5
+ startDateMax?: Date | null;
6
+ endDateMin?: Date | null;
7
+ endDateMax?: Date | null;
8
+ timezones?: string[];
9
+ }
10
+ export type TimeSelectorProps = TimeSelectorOwnProps;
11
+ export declare function TimeSelector({ onChange, onTimezoneChange, startDateMin, startDateMax, endDateMin, endDateMax, timezones, }: TimeSelectorProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=time_selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time_selector.d.ts","sourceRoot":"","sources":["../../../src/components/time_selector/time_selector.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC;IAC5C,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAErD,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,SAAS,GACV,EAAE,iBAAiB,2CAoEnB"}
@@ -0,0 +1,105 @@
1
+ import { jsxs as r, Fragment as v, jsx as t } from "react/jsx-runtime";
2
+ import { useSignalValue as o } from "@tcn/state";
3
+ import { ElementPopper as S } from "@tcn/ui/overlay";
4
+ import { HStack as p, VStack as _ } from "@tcn/ui/stacks";
5
+ import { BodyText as m } from "@tcn/ui/typography";
6
+ import { useState as x, useRef as A } from "react";
7
+ import { TimeSelectorPresenter as R } from "./time_selector_presenter.js";
8
+ import { PresetPanel as T } from "../preset_panel/preset_panel.js";
9
+ import { DateRangePanel as k } from "../date_range_panel/date_range_panel.js";
10
+ import { TimezoneFooter as w } from "../timezone_footer/timezone_footer.js";
11
+ import '../../time_selector.css';const z = "_trigger-abbreviation_8e22c20", F = "_trigger_1096f0b", V = "_popper-content_9403264", a = { "trigger-abbreviation": z, trigger: F, "popper-content": V };
12
+ function q({
13
+ onChange: l,
14
+ onTimezoneChange: d,
15
+ startDateMin: g,
16
+ startDateMax: f,
17
+ endDateMin: b,
18
+ endDateMax: h,
19
+ timezones: u
20
+ }) {
21
+ const [e] = x(() => new R()), c = A(null), n = o(e.broadcasts.isOpen), s = o(e.broadcasts.selectedPreset), P = o(e.broadcasts.displayValue), y = o(
22
+ e.timezoneFooterPresenter.broadcasts.timezoneAbbreviation
23
+ );
24
+ return /* @__PURE__ */ r(v, { children: [
25
+ /* @__PURE__ */ t(
26
+ "div",
27
+ {
28
+ ref: c,
29
+ className: a.trigger,
30
+ onClick: () => e.toggleOpen(),
31
+ children: /* @__PURE__ */ r(p, { height: "auto", width: "auto", gap: "4px", children: [
32
+ /* @__PURE__ */ r(m, { selectable: !1, children: [
33
+ P,
34
+ ","
35
+ ] }),
36
+ /* @__PURE__ */ t(
37
+ m,
38
+ {
39
+ selectable: !1,
40
+ style: { fontWeight: 700 },
41
+ className: a["trigger-abbreviation"],
42
+ children: y
43
+ }
44
+ )
45
+ ] })
46
+ }
47
+ ),
48
+ /* @__PURE__ */ t(
49
+ S,
50
+ {
51
+ anchorElement: c,
52
+ open: n,
53
+ onDismissal: () => e.close(),
54
+ dismissals: [],
55
+ children: /* @__PURE__ */ r(
56
+ _,
57
+ {
58
+ className: a["popper-content"],
59
+ height: "auto",
60
+ onKeyDown: (i) => {
61
+ i.key === "Escape" && e.close();
62
+ },
63
+ children: [
64
+ /* @__PURE__ */ r(p, { height: "auto", width: "100%", vAlign: "start", children: [
65
+ /* @__PURE__ */ t(
66
+ k,
67
+ {
68
+ presenter: e.dateRangePanelPresenter,
69
+ focused: n && s == null,
70
+ startDateMin: g,
71
+ startDateMax: f,
72
+ endDateMin: b,
73
+ endDateMax: h,
74
+ onApply: () => e.applyTimeRange(l)
75
+ }
76
+ ),
77
+ /* @__PURE__ */ t(
78
+ T,
79
+ {
80
+ presenter: e.presetPanelPresenter,
81
+ selectedPreset: s,
82
+ focused: n && s != null,
83
+ onSelect: (i) => e.handlePresetSelect(i, l)
84
+ }
85
+ )
86
+ ] }),
87
+ /* @__PURE__ */ t(
88
+ w,
89
+ {
90
+ presenter: e.timezoneFooterPresenter,
91
+ timezones: u,
92
+ onTimezoneChange: d
93
+ }
94
+ )
95
+ ]
96
+ }
97
+ )
98
+ }
99
+ )
100
+ ] });
101
+ }
102
+ export {
103
+ q as TimeSelector
104
+ };
105
+ //# sourceMappingURL=time_selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time_selector.js","sources":["../../../src/components/time_selector/time_selector.tsx"],"sourcesContent":["import { useSignalValue } from '@tcn/state';\nimport { ElementPopper } from '@tcn/ui/overlay';\nimport { HStack, VStack } from '@tcn/ui/stacks';\nimport { BodyText } from '@tcn/ui/typography';\nimport { useRef, useState } from 'react';\nimport { TimeSelectorPresenter } from './time_selector_presenter.js';\nimport { PresetPanel } from '../preset_panel/preset_panel.js';\nimport { DateRangePanel } from '../date_range_panel/date_range_panel.js';\nimport { TimezoneFooter } from '../timezone_footer/timezone_footer.js';\nimport styles from './time_selector.module.css';\n\nexport interface TimeSelectorOwnProps {\n onChange?: (start: Date, end: Date) => void;\n onTimezoneChange?: (timezone: string) => void;\n startDateMin?: Date | null;\n startDateMax?: Date | null;\n endDateMin?: Date | null;\n endDateMax?: Date | null;\n timezones?: string[];\n}\n\nexport type TimeSelectorProps = TimeSelectorOwnProps;\n\nexport function TimeSelector({\n onChange,\n onTimezoneChange,\n startDateMin,\n startDateMax,\n endDateMin,\n endDateMax,\n timezones,\n}: TimeSelectorProps) {\n const [presenter] = useState(() => new TimeSelectorPresenter());\n const anchorRef = useRef<HTMLDivElement>(null);\n\n const isOpen = useSignalValue(presenter.broadcasts.isOpen);\n const selectedPreset = useSignalValue(presenter.broadcasts.selectedPreset);\n const displayValue = useSignalValue(presenter.broadcasts.displayValue);\n const displayAbbreviation = useSignalValue(\n presenter.timezoneFooterPresenter.broadcasts.timezoneAbbreviation\n );\n\n return (\n <>\n <div\n ref={anchorRef}\n className={styles.trigger}\n onClick={() => presenter.toggleOpen()}\n >\n <HStack height=\"auto\" width=\"auto\" gap=\"4px\">\n <BodyText selectable={false}>{displayValue},</BodyText>\n <BodyText\n selectable={false}\n style={{ fontWeight: 700 }}\n className={styles['trigger-abbreviation']}\n >\n {displayAbbreviation}\n </BodyText>\n </HStack>\n </div>\n <ElementPopper\n anchorElement={anchorRef}\n open={isOpen}\n onDismissal={() => presenter.close()}\n dismissals={[]}\n >\n <VStack\n className={styles['popper-content']}\n height=\"auto\"\n onKeyDown={e => {\n if (e.key === 'Escape') presenter.close();\n }}\n >\n <HStack height=\"auto\" width=\"100%\" vAlign=\"start\">\n <DateRangePanel\n presenter={presenter.dateRangePanelPresenter}\n focused={isOpen && selectedPreset == null}\n startDateMin={startDateMin}\n startDateMax={startDateMax}\n endDateMin={endDateMin}\n endDateMax={endDateMax}\n onApply={() => presenter.applyTimeRange(onChange)}\n />\n <PresetPanel\n presenter={presenter.presetPanelPresenter}\n selectedPreset={selectedPreset}\n focused={isOpen && selectedPreset != null}\n onSelect={item => presenter.handlePresetSelect(item, onChange)}\n />\n </HStack>\n <TimezoneFooter\n presenter={presenter.timezoneFooterPresenter}\n timezones={timezones}\n onTimezoneChange={onTimezoneChange}\n />\n </VStack>\n </ElementPopper>\n </>\n );\n}\n"],"names":["TimeSelector","onChange","onTimezoneChange","startDateMin","startDateMax","endDateMin","endDateMax","timezones","presenter","useState","TimeSelectorPresenter","anchorRef","useRef","isOpen","useSignalValue","selectedPreset","displayValue","displayAbbreviation","jsxs","Fragment","jsx","styles","HStack","BodyText","ElementPopper","VStack","e","DateRangePanel","PresetPanel","item","TimezoneFooter"],"mappings":";;;;;;;;;;;AAuBO,SAASA,EAAa;AAAA,EAC3B,UAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AACF,GAAsB;AACpB,QAAM,CAACC,CAAS,IAAIC,EAAS,MAAM,IAAIC,GAAuB,GACxDC,IAAYC,EAAuB,IAAI,GAEvCC,IAASC,EAAeN,EAAU,WAAW,MAAM,GACnDO,IAAiBD,EAAeN,EAAU,WAAW,cAAc,GACnEQ,IAAeF,EAAeN,EAAU,WAAW,YAAY,GAC/DS,IAAsBH;AAAA,IAC1BN,EAAU,wBAAwB,WAAW;AAAA,EAAA;AAG/C,SACE,gBAAAU,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKT;AAAA,QACL,WAAWU,EAAO;AAAA,QAClB,SAAS,MAAMb,EAAU,WAAA;AAAA,QAEzB,4BAACc,GAAA,EAAO,QAAO,QAAO,OAAM,QAAO,KAAI,OACrC,UAAA;AAAA,UAAA,gBAAAJ,EAACK,GAAA,EAAS,YAAY,IAAQ,UAAA;AAAA,YAAAP;AAAA,YAAa;AAAA,UAAA,GAAC;AAAA,UAC5C,gBAAAI;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,YAAY;AAAA,cACZ,OAAO,EAAE,YAAY,IAAA;AAAA,cACrB,WAAWF,EAAO,sBAAsB;AAAA,cAEvC,UAAAJ;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,gBAAAG;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,eAAeb;AAAA,QACf,MAAME;AAAA,QACN,aAAa,MAAML,EAAU,MAAA;AAAA,QAC7B,YAAY,CAAA;AAAA,QAEZ,UAAA,gBAAAU;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,WAAWJ,EAAO,gBAAgB;AAAA,YAClC,QAAO;AAAA,YACP,WAAW,CAAAK,MAAK;AACd,cAAIA,EAAE,QAAQ,YAAUlB,EAAU,MAAA;AAAA,YACpC;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAAU,EAACI,KAAO,QAAO,QAAO,OAAM,QAAO,QAAO,SACxC,UAAA;AAAA,gBAAA,gBAAAF;AAAA,kBAACO;AAAA,kBAAA;AAAA,oBACC,WAAWnB,EAAU;AAAA,oBACrB,SAASK,KAAUE,KAAkB;AAAA,oBACrC,cAAAZ;AAAA,oBACA,cAAAC;AAAA,oBACA,YAAAC;AAAA,oBACA,YAAAC;AAAA,oBACA,SAAS,MAAME,EAAU,eAAeP,CAAQ;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAElD,gBAAAmB;AAAA,kBAACQ;AAAA,kBAAA;AAAA,oBACC,WAAWpB,EAAU;AAAA,oBACrB,gBAAAO;AAAA,oBACA,SAASF,KAAUE,KAAkB;AAAA,oBACrC,UAAU,CAAAc,MAAQrB,EAAU,mBAAmBqB,GAAM5B,CAAQ;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAC/D,GACF;AAAA,cACA,gBAAAmB;AAAA,gBAACU;AAAA,gBAAA;AAAA,kBACC,WAAWtB,EAAU;AAAA,kBACrB,WAAAD;AAAA,kBACA,kBAAAL;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;"}
@@ -0,0 +1,28 @@
1
+ import { Signal } from '@tcn/state';
2
+ import { PresetItem } from '../utils.js';
3
+ import { PresetPanelPresenter } from '../preset_panel/preset_panel_presenter.js';
4
+ import { DateRangePanelPresenter } from '../date_range_panel/date_range_panel_presenter.js';
5
+ import { TimezoneFooterPresenter } from '../timezone_footer/timezone_footer_presenter.js';
6
+ export type { PresetItem };
7
+ export declare const PRESET_ITEMS: PresetItem[];
8
+ export declare class TimeSelectorPresenter {
9
+ private _isOpen;
10
+ private _selectedPreset;
11
+ private _displayValue;
12
+ private _startDate;
13
+ private _endDate;
14
+ readonly presetPanelPresenter: PresetPanelPresenter;
15
+ readonly dateRangePanelPresenter: DateRangePanelPresenter;
16
+ readonly timezoneFooterPresenter: TimezoneFooterPresenter;
17
+ readonly broadcasts: {
18
+ isOpen: Signal<boolean>['broadcast'];
19
+ selectedPreset: Signal<PresetItem | null>['broadcast'];
20
+ displayValue: Signal<string>['broadcast'];
21
+ };
22
+ constructor();
23
+ handlePresetSelect(item: PresetItem, onChange?: (start: Date, end: Date) => void): void;
24
+ applyTimeRange(onChange?: (start: Date, end: Date) => void): void;
25
+ toggleOpen(): void;
26
+ close(): void;
27
+ }
28
+ //# sourceMappingURL=time_selector_presenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time_selector_presenter.d.ts","sourceRoot":"","sources":["../../../src/components/time_selector/time_selector_presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,mDAAmD,CAAC;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAE1F,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,eAAO,MAAM,YAAY,EAAE,UAAU,EAYpC,CAAC;AAEF,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,QAAQ,CAAsB;IAEtC,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;IACpD,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;IAC1D,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;IAE1D,QAAQ,CAAC,UAAU,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;QACrC,cAAc,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;QACvD,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;KAC3C,CAAC;;IA4BF,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI;IAchF,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI;IAkB1D,UAAU;IAQV,KAAK;CAIN"}
@@ -0,0 +1,66 @@
1
+ import { Signal as n } from "@tcn/state";
2
+ import { datesFromPreset as o, shiftForDisplay as i, unshiftFromDisplay as h, formatDate as m } from "../utils.js";
3
+ import { PresetPanelPresenter as c } from "../preset_panel/preset_panel_presenter.js";
4
+ import { DateRangePanelPresenter as p } from "../date_range_panel/date_range_panel_presenter.js";
5
+ import { TimezoneFooterPresenter as P } from "../timezone_footer/timezone_footer_presenter.js";
6
+ const l = [
7
+ { label: "Last 5 mins", minutes: 5 },
8
+ { label: "Last 15 mins", minutes: 15 },
9
+ { label: "Last 30 mins", minutes: 30 },
10
+ { label: "Last 1 hour", minutes: 60 },
11
+ { label: "Last 3 hours", minutes: 180 },
12
+ { label: "Last 6 hours", minutes: 360 },
13
+ { label: "Last 12 hours", minutes: 720 },
14
+ { label: "Last 24 hours", minutes: 1440 },
15
+ { label: "Last 2 days", minutes: 2880 },
16
+ { label: "Last 7 days", minutes: 10080 },
17
+ { label: "Last 30 days", minutes: 43200 }
18
+ ];
19
+ class g {
20
+ _isOpen = new n(!1);
21
+ _selectedPreset = new n(l[0]);
22
+ _displayValue;
23
+ _startDate;
24
+ _endDate;
25
+ presetPanelPresenter;
26
+ dateRangePanelPresenter;
27
+ timezoneFooterPresenter;
28
+ broadcasts;
29
+ constructor() {
30
+ const e = Intl.DateTimeFormat().resolvedOptions().timeZone, { start: s, end: t } = o(l[0]);
31
+ this._startDate = new n(i(s, e)), this._endDate = new n(i(t, e)), this.presetPanelPresenter = new c(l), this.dateRangePanelPresenter = new p(
32
+ this._startDate,
33
+ this._endDate
34
+ ), this.timezoneFooterPresenter = new P(
35
+ this._startDate,
36
+ this._endDate
37
+ ), this._displayValue = new n(l[0].label), this.broadcasts = {
38
+ isOpen: this._isOpen.broadcast,
39
+ selectedPreset: this._selectedPreset.broadcast,
40
+ displayValue: this._displayValue.broadcast
41
+ };
42
+ }
43
+ handlePresetSelect(e, s) {
44
+ this._selectedPreset.set(e);
45
+ const { start: t, end: a } = o(e), r = this.timezoneFooterPresenter.getTimezone();
46
+ this._startDate.set(i(t, r)), this._endDate.set(i(a, r)), this._displayValue.set(e.label), s?.(t, a), this.close();
47
+ }
48
+ applyTimeRange(e) {
49
+ const s = this._startDate.get(), t = this._endDate.get();
50
+ if (s != null && t != null) {
51
+ const a = this.timezoneFooterPresenter.getTimezone(), r = h(s, a), d = h(t, a);
52
+ this._selectedPreset.set(null), this._displayValue.set(`${m(s)} to ${m(t)}`), e?.(r, d), this.close();
53
+ }
54
+ }
55
+ toggleOpen() {
56
+ this._isOpen.get() ? this.close() : this._isOpen.set(!0);
57
+ }
58
+ close() {
59
+ this._isOpen.set(!1), this.presetPanelPresenter.reset();
60
+ }
61
+ }
62
+ export {
63
+ l as PRESET_ITEMS,
64
+ g as TimeSelectorPresenter
65
+ };
66
+ //# sourceMappingURL=time_selector_presenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time_selector_presenter.js","sources":["../../../src/components/time_selector/time_selector_presenter.ts"],"sourcesContent":["import { Signal } from '@tcn/state';\nimport {\n formatDate,\n datesFromPreset,\n shiftForDisplay,\n unshiftFromDisplay,\n type PresetItem,\n} from '../utils.js';\nimport { PresetPanelPresenter } from '../preset_panel/preset_panel_presenter.js';\nimport { DateRangePanelPresenter } from '../date_range_panel/date_range_panel_presenter.js';\nimport { TimezoneFooterPresenter } from '../timezone_footer/timezone_footer_presenter.js';\n\nexport type { PresetItem };\n\nexport const PRESET_ITEMS: PresetItem[] = [\n { label: 'Last 5 mins', minutes: 5 },\n { label: 'Last 15 mins', minutes: 15 },\n { label: 'Last 30 mins', minutes: 30 },\n { label: 'Last 1 hour', minutes: 60 },\n { label: 'Last 3 hours', minutes: 180 },\n { label: 'Last 6 hours', minutes: 360 },\n { label: 'Last 12 hours', minutes: 720 },\n { label: 'Last 24 hours', minutes: 1440 },\n { label: 'Last 2 days', minutes: 2880 },\n { label: 'Last 7 days', minutes: 10080 },\n { label: 'Last 30 days', minutes: 43200 },\n];\n\nexport class TimeSelectorPresenter {\n private _isOpen = new Signal<boolean>(false);\n private _selectedPreset = new Signal<PresetItem | null>(PRESET_ITEMS[0]);\n private _displayValue: Signal<string>;\n private _startDate: Signal<Date | null>;\n private _endDate: Signal<Date | null>;\n\n readonly presetPanelPresenter: PresetPanelPresenter;\n readonly dateRangePanelPresenter: DateRangePanelPresenter;\n readonly timezoneFooterPresenter: TimezoneFooterPresenter;\n\n readonly broadcasts: {\n isOpen: Signal<boolean>['broadcast'];\n selectedPreset: Signal<PresetItem | null>['broadcast'];\n displayValue: Signal<string>['broadcast'];\n };\n\n constructor() {\n const browserTz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const { start, end } = datesFromPreset(PRESET_ITEMS[0]);\n\n this._startDate = new Signal<Date | null>(shiftForDisplay(start, browserTz));\n this._endDate = new Signal<Date | null>(shiftForDisplay(end, browserTz));\n\n this.presetPanelPresenter = new PresetPanelPresenter(PRESET_ITEMS);\n this.dateRangePanelPresenter = new DateRangePanelPresenter(\n this._startDate,\n this._endDate\n );\n this.timezoneFooterPresenter = new TimezoneFooterPresenter(\n this._startDate,\n this._endDate\n );\n\n this._displayValue = new Signal<string>(PRESET_ITEMS[0].label);\n\n this.broadcasts = {\n isOpen: this._isOpen.broadcast,\n selectedPreset: this._selectedPreset.broadcast,\n displayValue: this._displayValue.broadcast,\n };\n }\n\n handlePresetSelect(item: PresetItem, onChange?: (start: Date, end: Date) => void) {\n this._selectedPreset.set(item);\n\n const { start, end } = datesFromPreset(item);\n const tz = this.timezoneFooterPresenter.getTimezone();\n\n this._startDate.set(shiftForDisplay(start, tz));\n this._endDate.set(shiftForDisplay(end, tz));\n\n this._displayValue.set(item.label);\n onChange?.(start, end);\n this.close();\n }\n\n applyTimeRange(onChange?: (start: Date, end: Date) => void) {\n const displayStart = this._startDate.get();\n const displayEnd = this._endDate.get();\n\n if (displayStart != null && displayEnd != null) {\n const tz = this.timezoneFooterPresenter.getTimezone();\n const realStart = unshiftFromDisplay(displayStart, tz);\n const realEnd = unshiftFromDisplay(displayEnd, tz);\n\n this._selectedPreset.set(null);\n this._displayValue.set(`${formatDate(displayStart)} to ${formatDate(displayEnd)}`);\n\n onChange?.(realStart, realEnd);\n\n this.close();\n }\n }\n\n toggleOpen() {\n if (this._isOpen.get()) {\n this.close();\n } else {\n this._isOpen.set(true);\n }\n }\n\n close() {\n this._isOpen.set(false);\n this.presetPanelPresenter.reset();\n }\n}\n"],"names":["PRESET_ITEMS","TimeSelectorPresenter","Signal","browserTz","start","end","datesFromPreset","shiftForDisplay","PresetPanelPresenter","DateRangePanelPresenter","TimezoneFooterPresenter","item","onChange","tz","displayStart","displayEnd","realStart","unshiftFromDisplay","realEnd","formatDate"],"mappings":";;;;;AAcO,MAAMA,IAA6B;AAAA,EACxC,EAAE,OAAO,eAAe,SAAS,EAAA;AAAA,EACjC,EAAE,OAAO,gBAAgB,SAAS,GAAA;AAAA,EAClC,EAAE,OAAO,gBAAgB,SAAS,GAAA;AAAA,EAClC,EAAE,OAAO,eAAe,SAAS,GAAA;AAAA,EACjC,EAAE,OAAO,gBAAgB,SAAS,IAAA;AAAA,EAClC,EAAE,OAAO,gBAAgB,SAAS,IAAA;AAAA,EAClC,EAAE,OAAO,iBAAiB,SAAS,IAAA;AAAA,EACnC,EAAE,OAAO,iBAAiB,SAAS,KAAA;AAAA,EACnC,EAAE,OAAO,eAAe,SAAS,KAAA;AAAA,EACjC,EAAE,OAAO,eAAe,SAAS,MAAA;AAAA,EACjC,EAAE,OAAO,gBAAgB,SAAS,MAAA;AACpC;AAEO,MAAMC,EAAsB;AAAA,EACzB,UAAU,IAAIC,EAAgB,EAAK;AAAA,EACnC,kBAAkB,IAAIA,EAA0BF,EAAa,CAAC,CAAC;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAMT,cAAc;AACZ,UAAMG,IAAY,KAAK,eAAA,EAAiB,kBAAkB,UACpD,EAAE,OAAAC,GAAO,KAAAC,EAAA,IAAQC,EAAgBN,EAAa,CAAC,CAAC;AAEtD,SAAK,aAAa,IAAIE,EAAoBK,EAAgBH,GAAOD,CAAS,CAAC,GAC3E,KAAK,WAAW,IAAID,EAAoBK,EAAgBF,GAAKF,CAAS,CAAC,GAEvE,KAAK,uBAAuB,IAAIK,EAAqBR,CAAY,GACjE,KAAK,0BAA0B,IAAIS;AAAA,MACjC,KAAK;AAAA,MACL,KAAK;AAAA,IAAA,GAEP,KAAK,0BAA0B,IAAIC;AAAA,MACjC,KAAK;AAAA,MACL,KAAK;AAAA,IAAA,GAGP,KAAK,gBAAgB,IAAIR,EAAeF,EAAa,CAAC,EAAE,KAAK,GAE7D,KAAK,aAAa;AAAA,MAChB,QAAQ,KAAK,QAAQ;AAAA,MACrB,gBAAgB,KAAK,gBAAgB;AAAA,MACrC,cAAc,KAAK,cAAc;AAAA,IAAA;AAAA,EAErC;AAAA,EAEA,mBAAmBW,GAAkBC,GAA6C;AAChF,SAAK,gBAAgB,IAAID,CAAI;AAE7B,UAAM,EAAE,OAAAP,GAAO,KAAAC,MAAQC,EAAgBK,CAAI,GACrCE,IAAK,KAAK,wBAAwB,YAAA;AAExC,SAAK,WAAW,IAAIN,EAAgBH,GAAOS,CAAE,CAAC,GAC9C,KAAK,SAAS,IAAIN,EAAgBF,GAAKQ,CAAE,CAAC,GAE1C,KAAK,cAAc,IAAIF,EAAK,KAAK,GACjCC,IAAWR,GAAOC,CAAG,GACrB,KAAK,MAAA;AAAA,EACP;AAAA,EAEA,eAAeO,GAA6C;AAC1D,UAAME,IAAe,KAAK,WAAW,IAAA,GAC/BC,IAAa,KAAK,SAAS,IAAA;AAEjC,QAAID,KAAgB,QAAQC,KAAc,MAAM;AAC9C,YAAMF,IAAK,KAAK,wBAAwB,YAAA,GAClCG,IAAYC,EAAmBH,GAAcD,CAAE,GAC/CK,IAAUD,EAAmBF,GAAYF,CAAE;AAEjD,WAAK,gBAAgB,IAAI,IAAI,GAC7B,KAAK,cAAc,IAAI,GAAGM,EAAWL,CAAY,CAAC,OAAOK,EAAWJ,CAAU,CAAC,EAAE,GAEjFH,IAAWI,GAAWE,CAAO,GAE7B,KAAK,MAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEA,aAAa;AACX,IAAI,KAAK,QAAQ,QACf,KAAK,MAAA,IAEL,KAAK,QAAQ,IAAI,EAAI;AAAA,EAEzB;AAAA,EAEA,QAAQ;AACN,SAAK,QAAQ,IAAI,EAAK,GACtB,KAAK,qBAAqB,MAAA;AAAA,EAC5B;AACF;"}
@@ -0,0 +1,9 @@
1
+ import { TimezoneFooterPresenter } from './timezone_footer_presenter.js';
2
+ export interface TimezoneFooterOwnProps {
3
+ presenter: TimezoneFooterPresenter;
4
+ timezones?: string[];
5
+ onTimezoneChange?: (tz: string) => void;
6
+ }
7
+ export type TimezoneFooterProps = TimezoneFooterOwnProps;
8
+ export declare function TimezoneFooter({ presenter, timezones, onTimezoneChange, }: TimezoneFooterProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=timezone_footer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timezone_footer.d.ts","sourceRoot":"","sources":["../../../src/components/timezone_footer/timezone_footer.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAUzE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,uBAAuB,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AAEzD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,SAAS,EACT,gBAAgB,GACjB,EAAE,mBAAmB,2CAyErB"}