@odx/foundation 1.0.0-rc.1 → 1.0.0-rc.11

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,85 @@
1
+ ## 1.0.0-rc.11
2
+
3
+ ### Minor Changes
4
+
5
+ - Add `change` callback to `attachDarkModeToggle` options to notify when dark mode toggle is clicked
6
+
7
+ ### Patch Changes
8
+
9
+ - Fix setTheme function not removing dark mode when `mode` is set to `light`
10
+ - Clean up event listeners in `attachDarkModeToggle` cleanup function
11
+ - Prevent dark mode toggle if click event on attached host is prevented by another event listener
12
+
13
+ ## 1.0.0-rc.10
14
+
15
+ ### Patch Changes
16
+
17
+ - Fix types for styles entry point in `package.json` exports
18
+
19
+ ## 1.0.0-rc.9
20
+
21
+ ### Patch Changes
22
+
23
+ - Add `CHANGELOG.md` to package exports
24
+ - Fix exports field in `package.json` to resolve `type` imports first
25
+
26
+ ## 1.0.0-rc.8
27
+
28
+ ### Bug Fixes
29
+
30
+ - Remove scroll lock gutter when scrollbar is not present to prevent unnecessary layout shift
31
+
32
+ ## 1.0.0-rc.7
33
+
34
+ ### Minor Changes
35
+
36
+ - Add `applyScrollLock` and `removeScrollLock` utilities to enable/disable scroll lock on the document
37
+
38
+ ## 1.0.0-rc.6
39
+
40
+ ### Minor Changes
41
+
42
+ - Rename CSS layers to remove dot notation:
43
+ - `odx.reset` to `odx-reset`
44
+ - `odx.base` to `odx-base`
45
+ - `odx.overrides` to `odx-overrides`
46
+
47
+ ### Bug Fixes
48
+
49
+ - Remove debug info from rolldown build output
50
+ - Fix `.odx-cloak` if applied to `:root` element not working correctly
51
+
52
+ ## 1.0.0-rc.5
53
+
54
+ ### Major Changes
55
+
56
+ - Rename CSS utility classes `odx-text-primary|accent|...` to `odx-fg-*` to better reflect their purpose
57
+
58
+ ### Minor Changes
59
+
60
+ - Add `.odx-cloak` class to prevent FOUC (Flash of Unstyled Content) during initial load, use `odx-cloak` class on the root element of your application to enable it
61
+ - Support `:visited` state for native links and anchors with `odx-link` class for better user experience
62
+ - Improve tabbable element detection
63
+
64
+ ## 1.0.0-rc.4
65
+
66
+ ### Bug Fixes
67
+
68
+ - Fix dark/light mode detection logic in `setTheme` function
69
+
70
+ ## 1.0.0-rc.3
71
+
72
+ ### Bug Fixes
73
+
74
+ - Add `package.json` package exports for better tooling support
75
+
76
+ ## 1.0.0-rc.2
77
+
78
+ ### Bug Fixes
79
+
80
+ - Fix default text alignment of title elements
81
+
82
+
1
83
  ## 1.0.0-rc.1
2
84
 
3
85
  ### Bug Fixes
package/README.md CHANGED
@@ -86,6 +86,18 @@ setTheme({
86
86
  });
87
87
  ```
88
88
 
89
+ ### Page Cloak
90
+
91
+ To prevent unstyled content from flashing during the initial load of your application, you can use the `.odx-cloak` CSS class.
92
+ This class will temporarily hide the content of the `.odx-root` element until custom elements are fully loaded.
93
+
94
+ ```html
95
+ <html class="odx-root odx-cloak">
96
+ </html>
97
+ ```
98
+
99
+ > The timeout can be set via the `--odx-cloak-timeout` custom property on the `:root` element, which defaults to `2s`.
100
+
89
101
  ### Documentation
90
102
 
91
- For detailed documentation on how to use the `@odx/foundation` package, including examples and best practices, please visit our <a href="https://ca-odx-storybook-dev.yellowisland-7b13f2d7.westeurope.azurecontainerapps.io/" target="_blank" rel="noopener">storybook documentation</a>.
103
+ For detailed documentation on how to use the `@odx/foundation` package, please visit our <a href="https://ca-odx-storybook-dev.yellowisland-7b13f2d7.westeurope.azurecontainerapps.io/" target="_blank" rel="noopener">storybook documentation</a>.
@@ -1,61 +1,58 @@
1
- import { Signal } from './signals.js';
1
+ import { Signal } from "./signals.js";
2
2
  declare global {
3
- namespace ODX.Breakpoints {
4
- interface Config {
5
- sm: true;
6
- md: true;
7
- lg: true;
8
- xl: true;
9
- xxl: true;
10
- }
3
+ namespace ODX.Breakpoints {
4
+ interface Config {
5
+ sm: true;
6
+ md: true;
7
+ lg: true;
8
+ xl: true;
9
+ xxl: true;
11
10
  }
11
+ }
12
12
  }
13
- type FilteredKeys<T extends object> = {
14
- [K in keyof T as T[K] extends true ? K : never]: T[K];
15
- };
16
- export type BreakpointOperator = '<' | '<=' | '>=' | '>';
17
- export interface BreakpointConfig {
18
- name: keyof FilteredKeys<ODX.Breakpoints.Config>;
19
- min: number;
20
- max: number;
21
- customQuery?: string;
13
+ type FilteredKeys<T extends object> = { [K in keyof T as T[K] extends true ? K : never]: T[K] };
14
+ type BreakpointOperator = '<' | '<=' | '>=' | '>';
15
+ interface BreakpointConfig {
16
+ name: keyof FilteredKeys<ODX.Breakpoints.Config>;
17
+ min: number;
18
+ max: number;
19
+ customQuery?: string;
22
20
  }
23
- export interface Breakpoint extends BreakpointConfig {
24
- id: BreakpointConfig['name'] | `${BreakpointOperator}${BreakpointConfig['name']}`;
25
- query: string;
26
- operator?: BreakpointOperator;
21
+ interface Breakpoint extends BreakpointConfig {
22
+ id: BreakpointConfig['name'] | `${BreakpointOperator}${BreakpointConfig['name']}`;
23
+ query: string;
24
+ operator?: BreakpointOperator;
27
25
  }
28
- export declare const registeredBreakpoints: ReadonlyMap<Breakpoint['id'], Breakpoint>;
29
- export declare const breakpointAttribute = "odx-breakpoint";
30
- export declare const defaultBreakpoints: [{
31
- readonly name: "sm";
32
- readonly min: 0;
33
- readonly max: 479.98;
26
+ declare const registeredBreakpoints: ReadonlyMap<Breakpoint['id'], Breakpoint>;
27
+ declare const breakpointAttribute = "odx-breakpoint";
28
+ declare const defaultBreakpoints: [{
29
+ readonly name: "sm";
30
+ readonly min: 0;
31
+ readonly max: 479.98;
34
32
  }, {
35
- readonly name: "md";
36
- readonly min: 480;
37
- readonly max: 768.98;
33
+ readonly name: "md";
34
+ readonly min: 480;
35
+ readonly max: 768.98;
38
36
  }, {
39
- readonly name: "lg";
40
- readonly min: 769;
41
- readonly max: 990.98;
37
+ readonly name: "lg";
38
+ readonly min: 769;
39
+ readonly max: 990.98;
42
40
  }, {
43
- readonly name: "xl";
44
- readonly min: 991;
45
- readonly max: 1280.98;
41
+ readonly name: "xl";
42
+ readonly min: 991;
43
+ readonly max: 1280.98;
46
44
  }, {
47
- readonly name: "xxl";
48
- readonly min: 1352;
49
- readonly max: number;
45
+ readonly name: "xxl";
46
+ readonly min: 1352;
47
+ readonly max: number;
50
48
  }];
51
- export declare function buildBreakpoint(breakpoint: BreakpointConfig, operator?: BreakpointOperator): Breakpoint;
52
- export declare function expandBreakpoints(...breakpoints: BreakpointConfig[]): Breakpoint[];
53
- export declare function observeBreakpoint(id: Breakpoint['id'], initialValue?: boolean): Signal<Breakpoint & {
54
- matches: boolean;
49
+ declare function buildBreakpoint(breakpoint: BreakpointConfig, operator?: BreakpointOperator): Breakpoint;
50
+ declare function expandBreakpoints(...breakpoints: BreakpointConfig[]): Breakpoint[];
51
+ declare function observeBreakpoint(id: Breakpoint['id'], initialValue?: boolean): Signal<Breakpoint & {
52
+ matches: boolean;
55
53
  }>;
56
- export declare function setupBreakpoints(breakpointsConfig?: BreakpointConfig[]): () => void;
57
- export declare function createBreakpointUpdater(breakpoints: Breakpoint[], update?: (target: HTMLElement, change: Breakpoint & {
58
- matches: boolean;
54
+ declare function setupBreakpoints(breakpointsConfig?: BreakpointConfig[]): () => void;
55
+ declare function createBreakpointUpdater(breakpoints: Breakpoint[], update?: (target: HTMLElement, change: Breakpoint & {
56
+ matches: boolean;
59
57
  }) => void): () => void;
60
- export {};
61
- //# sourceMappingURL=breakpoints.d.ts.map
58
+ export { Breakpoint, BreakpointConfig, BreakpointOperator, breakpointAttribute, buildBreakpoint, createBreakpointUpdater, defaultBreakpoints, expandBreakpoints, observeBreakpoint, registeredBreakpoints, setupBreakpoints };
@@ -1,139 +1,156 @@
1
- import { signal, effect } from './signals.js';
2
- import { observeMedia } from './utils/shared-media-observer.js';
3
-
4
- const operators = ["<", "<=", ">=", ">"];
1
+ import { effect, signal } from "./signals.js";
2
+ import { observeMedia } from "./utils/shared-media-observer.js";
3
+ const operators = [
4
+ "<",
5
+ "<=",
6
+ ">=",
7
+ ">"
8
+ ];
5
9
  const registeredBreakpoints = /* @__PURE__ */ new Map();
6
10
  const breakpointAttribute = "odx-breakpoint";
7
11
  const defaultBreakpoints = [
8
- { name: "sm", min: 0, max: 479.98 },
9
- { name: "md", min: 480, max: 768.98 },
10
- { name: "lg", min: 769, max: 990.98 },
11
- { name: "xl", min: 991, max: 1280.98 },
12
- { name: "xxl", min: 1352, max: Number.MAX_SAFE_INTEGER }
12
+ {
13
+ name: "sm",
14
+ min: 0,
15
+ max: 479.98
16
+ },
17
+ {
18
+ name: "md",
19
+ min: 480,
20
+ max: 768.98
21
+ },
22
+ {
23
+ name: "lg",
24
+ min: 769,
25
+ max: 990.98
26
+ },
27
+ {
28
+ name: "xl",
29
+ min: 991,
30
+ max: 1280.98
31
+ },
32
+ {
33
+ name: "xxl",
34
+ min: 1352,
35
+ max: Number.MAX_SAFE_INTEGER
36
+ }
13
37
  ];
14
38
  function buildBreakpoint(breakpoint, operator) {
15
- const id = operator ? `${operator}${breakpoint.name}` : breakpoint.name;
16
- let query = `(min-width: ${breakpoint.min}px) and (max-width: ${breakpoint.max}px)`;
17
- switch (operator) {
18
- case "<":
19
- query = `(max-width: ${breakpoint.min - 0.02}px)`;
20
- break;
21
- case "<=":
22
- query = `(max-width: ${breakpoint.max}px)`;
23
- break;
24
- case ">=":
25
- query = `(min-width: ${breakpoint.min}px)`;
26
- break;
27
- case ">":
28
- query = `(min-width: ${breakpoint.max + 0.02}px)`;
29
- break;
30
- }
31
- return { ...breakpoint, id, operator, query: [query, breakpoint.customQuery].filter(Boolean).join(" and ") };
39
+ const id = operator ? `${operator}${breakpoint.name}` : breakpoint.name;
40
+ let query = `(min-width: ${breakpoint.min}px) and (max-width: ${breakpoint.max}px)`;
41
+ switch (operator) {
42
+ case "<":
43
+ query = `(max-width: ${breakpoint.min - .02}px)`;
44
+ break;
45
+ case "<=":
46
+ query = `(max-width: ${breakpoint.max}px)`;
47
+ break;
48
+ case ">=":
49
+ query = `(min-width: ${breakpoint.min}px)`;
50
+ break;
51
+ case ">":
52
+ query = `(min-width: ${breakpoint.max + .02}px)`;
53
+ break;
54
+ }
55
+ return {
56
+ ...breakpoint,
57
+ id,
58
+ operator,
59
+ query: [query, breakpoint.customQuery].filter(Boolean).join(" and ")
60
+ };
32
61
  }
33
62
  function expandBreakpoints(...breakpoints) {
34
- return breakpoints.flatMap((breakpoint) => [void 0, ...operators].map((operator) => buildBreakpoint(breakpoint, operator)));
63
+ return breakpoints.flatMap((breakpoint) => [void 0, ...operators].map((operator) => buildBreakpoint(breakpoint, operator)));
35
64
  }
36
65
  function observeBreakpoint(id, initialValue = false) {
37
- const breakpoint = registeredBreakpoints.get(id);
38
- let unobserveMedia;
39
- const state = signal(
40
- { ...breakpoint, matches: initialValue },
41
- {
42
- watched() {
43
- if (!breakpoint) return;
44
- unobserveMedia = observeMedia(breakpoint.query, ({ matches }) => {
45
- state.set({ ...breakpoint, matches });
46
- });
47
- },
48
- unwatched() {
49
- unobserveMedia?.();
50
- unobserveMedia = void 0;
51
- }
52
- }
53
- );
54
- return state;
66
+ const breakpoint = registeredBreakpoints.get(id);
67
+ let unobserveMedia;
68
+ const state = signal({
69
+ ...breakpoint,
70
+ matches: initialValue
71
+ }, {
72
+ watched() {
73
+ if (!breakpoint) return;
74
+ unobserveMedia = observeMedia(breakpoint.query, ({ matches }) => {
75
+ state.set({
76
+ ...breakpoint,
77
+ matches
78
+ });
79
+ });
80
+ },
81
+ unwatched() {
82
+ unobserveMedia?.();
83
+ unobserveMedia = void 0;
84
+ }
85
+ });
86
+ return state;
55
87
  }
56
88
  function setupBreakpoints(breakpointsConfig = []) {
57
- const breakpoints = expandBreakpoints(...defaultBreakpoints, ...breakpointsConfig);
58
- const directiveUpdater = createBreakpointUpdater(breakpoints);
59
- let mutationObserver;
60
- let unobserveBreakpoints = () => {
61
- };
62
- function initBreakpoints() {
63
- destroyBreakpoints();
64
- mutationObserver = new MutationObserver(directiveUpdater);
65
- mutationObserver.observe(document.documentElement, {
66
- attributes: true,
67
- subtree: true,
68
- childList: true,
69
- attributeFilter: [breakpointAttribute]
70
- });
71
- unobserveBreakpoints = effect(directiveUpdater);
72
- }
73
- function destroyBreakpoints() {
74
- unobserveBreakpoints();
75
- mutationObserver?.disconnect();
76
- globalThis.removeEventListener("DOMContentLoaded", initBreakpoints);
77
- }
78
- if (document.readyState === "loading") {
79
- globalThis.addEventListener("DOMContentLoaded", initBreakpoints, { once: true });
80
- } else {
81
- initBreakpoints();
82
- }
83
- return destroyBreakpoints;
89
+ const directiveUpdater = createBreakpointUpdater(expandBreakpoints(...defaultBreakpoints, ...breakpointsConfig));
90
+ let mutationObserver;
91
+ let unobserveBreakpoints = () => {};
92
+ function initBreakpoints() {
93
+ destroyBreakpoints();
94
+ mutationObserver = new MutationObserver(directiveUpdater);
95
+ mutationObserver.observe(document.documentElement, {
96
+ attributes: true,
97
+ subtree: true,
98
+ childList: true,
99
+ attributeFilter: [breakpointAttribute]
100
+ });
101
+ unobserveBreakpoints = effect(directiveUpdater);
102
+ }
103
+ function destroyBreakpoints() {
104
+ unobserveBreakpoints();
105
+ mutationObserver?.disconnect();
106
+ globalThis.removeEventListener("DOMContentLoaded", initBreakpoints);
107
+ }
108
+ if (document.readyState === "loading") globalThis.addEventListener("DOMContentLoaded", initBreakpoints, { once: true });
109
+ else initBreakpoints();
110
+ return destroyBreakpoints;
84
111
  }
85
112
  function updateHostElement(host, active) {
86
- const attributeName = "data-odx-breakpoint-slot";
87
- const classNames = host.getAttribute("odx-breakpoint-class");
88
- if (classNames) {
89
- for (const className of classNames.split(" ")) {
90
- host.classList.toggle(className, active);
91
- }
92
- return;
93
- }
94
- host.hidden = !active;
95
- let initialSlot = host.getAttribute(attributeName);
96
- if (initialSlot == null) {
97
- initialSlot = host.slot;
98
- host.setAttribute(attributeName, initialSlot);
99
- }
100
- if (active) {
101
- host.removeAttribute(attributeName);
102
- if (initialSlot === "") {
103
- host.removeAttribute("slot");
104
- return;
105
- }
106
- host.slot = "";
107
- host.slot = initialSlot;
108
- } else {
109
- host.slot = "_odx_breakpoint_hidden";
110
- }
113
+ const attributeName = "data-odx-breakpoint-slot";
114
+ const classNames = host.getAttribute("odx-breakpoint-class");
115
+ if (classNames) {
116
+ for (const className of classNames.split(" ")) host.classList.toggle(className, active);
117
+ return;
118
+ }
119
+ host.hidden = !active;
120
+ let initialSlot = host.getAttribute(attributeName);
121
+ if (initialSlot == null) {
122
+ initialSlot = host.slot;
123
+ host.setAttribute(attributeName, initialSlot);
124
+ }
125
+ if (active) {
126
+ host.removeAttribute(attributeName);
127
+ if (initialSlot === "") {
128
+ host.removeAttribute("slot");
129
+ return;
130
+ }
131
+ host.slot = "";
132
+ host.slot = initialSlot;
133
+ } else host.slot = "_odx_breakpoint_hidden";
111
134
  }
112
135
  function createBreakpointUpdater(breakpoints, update) {
113
- for (const breakpoint of breakpoints) {
114
- registeredBreakpoints.set(breakpoint.id, breakpoint);
115
- }
116
- const breakpointCache = /* @__PURE__ */ new WeakMap();
117
- const breakpointObservers = breakpoints.map((breakpoint) => observeBreakpoint(breakpoint.id, false));
118
- return () => {
119
- const elements = document.querySelectorAll(`[${breakpointAttribute}]`);
120
- const changes = breakpointObservers.reduce(
121
- (breakpoints2, breakpoint) => {
122
- breakpoints2[breakpoint.get().id] = breakpoint.get();
123
- return breakpoints2;
124
- },
125
- {}
126
- );
127
- let i = elements.length;
128
- while (i--) {
129
- const element = elements[i];
130
- const change = changes[element.getAttribute(breakpointAttribute) || ""];
131
- if (!change || change.matches === breakpointCache.get(element)) continue;
132
- breakpointCache.set(element, change.matches);
133
- updateHostElement(element, change.matches);
134
- update?.(element, change);
135
- }
136
- };
136
+ for (const breakpoint of breakpoints) registeredBreakpoints.set(breakpoint.id, breakpoint);
137
+ const breakpointCache = /* @__PURE__ */ new WeakMap();
138
+ const breakpointObservers = breakpoints.map((breakpoint) => observeBreakpoint(breakpoint.id, false));
139
+ return () => {
140
+ const elements = document.querySelectorAll(`[${breakpointAttribute}]`);
141
+ const changes = breakpointObservers.reduce((breakpoints, breakpoint) => {
142
+ breakpoints[breakpoint.get().id] = breakpoint.get();
143
+ return breakpoints;
144
+ }, {});
145
+ let i = elements.length;
146
+ while (i--) {
147
+ const element = elements[i];
148
+ const change = changes[element.getAttribute("odx-breakpoint") || ""];
149
+ if (!change || change.matches === breakpointCache.get(element)) continue;
150
+ breakpointCache.set(element, change.matches);
151
+ updateHostElement(element, change.matches);
152
+ update?.(element, change);
153
+ }
154
+ };
137
155
  }
138
-
139
156
  export { breakpointAttribute, buildBreakpoint, createBreakpointUpdater, defaultBreakpoints, expandBreakpoints, observeBreakpoint, registeredBreakpoints, setupBreakpoints };
@@ -1,58 +1,57 @@
1
- import { UnitIdentifier } from './models.js';
2
- export interface FormatOptions {
3
- dateTimeFormatOptions?: DateTimeFormatOptions;
4
- numberFormatOptions?: NumberFormatOptions;
5
- listFormatOptions?: ListFormatOptions;
6
- relativeTimeFormatOptions?: RelativeTimeFormatOptions;
1
+ import { UnitIdentifier } from "./models.js";
2
+ interface FormatOptions {
3
+ dateTimeFormatOptions?: DateTimeFormatOptions;
4
+ numberFormatOptions?: NumberFormatOptions;
5
+ listFormatOptions?: ListFormatOptions;
6
+ relativeTimeFormatOptions?: RelativeTimeFormatOptions;
7
7
  }
8
8
  interface BaseFormatOptions {
9
- locale?: Intl.Locale | Intl.UnicodeBCP47LocaleIdentifier;
9
+ locale?: Intl.Locale | Intl.UnicodeBCP47LocaleIdentifier;
10
10
  }
11
- export interface DateTimeFormatOptions extends Omit<Intl.DateTimeFormatOptions, 'dateStyle'>, BaseFormatOptions {
12
- dateStyle?: 'iso8601' | Intl.DateTimeFormatOptions['dateStyle'];
11
+ interface DateTimeFormatOptions extends Omit<Intl.DateTimeFormatOptions, 'dateStyle'>, BaseFormatOptions {
12
+ dateStyle?: 'iso8601' | Intl.DateTimeFormatOptions['dateStyle'];
13
13
  }
14
- export declare function parseDate(value: number | string | Date): Date | null;
15
- export declare function formatDate(input: number | string | Date, options?: DateTimeFormatOptions): string;
16
- export interface NumberFormatOptions extends Intl.NumberFormatOptions, BaseFormatOptions {
17
- unit?: UnitIdentifier;
14
+ declare function parseDate(value: number | string | Date): Date | null;
15
+ declare function formatDate(input: number | string | Date, options?: DateTimeFormatOptions): string;
16
+ interface NumberFormatOptions extends Intl.NumberFormatOptions, BaseFormatOptions {
17
+ unit?: UnitIdentifier;
18
18
  }
19
- export declare function formatNumber(input: number | string, options?: NumberFormatOptions): string;
20
- export interface ListFormatOptions extends Intl.ListFormatOptions, BaseFormatOptions {
21
- }
22
- export declare function formatList(input: string[], options?: ListFormatOptions): string;
19
+ declare function formatNumber(input: number | string, options?: NumberFormatOptions): string;
20
+ interface ListFormatOptions extends Intl.ListFormatOptions, BaseFormatOptions {}
21
+ declare function formatList(input: string[], options?: ListFormatOptions): string;
23
22
  declare const TIME_UNIT_MAP: {
24
- readonly second: {
25
- readonly max: 59000;
26
- readonly value: 1000;
27
- };
28
- readonly minute: {
29
- readonly max: 2760000;
30
- readonly value: 60000;
31
- };
32
- readonly hour: {
33
- readonly max: 72000000;
34
- readonly value: 3600000;
35
- };
36
- readonly day: {
37
- readonly max: 518400000;
38
- readonly value: 86400000;
39
- };
40
- readonly week: {
41
- readonly max: 2419200000;
42
- readonly value: 604800000;
43
- };
44
- readonly month: {
45
- readonly max: 28512000000;
46
- readonly value: 2592000000;
47
- };
48
- readonly year: {
49
- readonly max: number;
50
- readonly value: 31536000000;
51
- };
23
+ readonly second: {
24
+ readonly max: 59000;
25
+ readonly value: 1000;
26
+ };
27
+ readonly minute: {
28
+ readonly max: 2760000;
29
+ readonly value: 60000;
30
+ };
31
+ readonly hour: {
32
+ readonly max: 72000000;
33
+ readonly value: 3600000;
34
+ };
35
+ readonly day: {
36
+ readonly max: 518400000;
37
+ readonly value: 86400000;
38
+ };
39
+ readonly week: {
40
+ readonly max: 2419200000;
41
+ readonly value: 604800000;
42
+ };
43
+ readonly month: {
44
+ readonly max: 28512000000;
45
+ readonly value: 2592000000;
46
+ };
47
+ readonly year: {
48
+ readonly max: number;
49
+ readonly value: 31536000000;
50
+ };
52
51
  };
53
- export interface RelativeTimeFormatOptions extends Intl.RelativeTimeFormatOptions, BaseFormatOptions {
54
- minUnit?: keyof typeof TIME_UNIT_MAP;
52
+ interface RelativeTimeFormatOptions extends Intl.RelativeTimeFormatOptions, BaseFormatOptions {
53
+ minUnit?: keyof typeof TIME_UNIT_MAP;
54
+ start?: number | string | Date;
55
55
  }
56
- export declare function formatRelativeTime(input: number | string | Date, options?: RelativeTimeFormatOptions): string;
57
- export {};
58
- //# sourceMappingURL=format.d.ts.map
56
+ declare function formatRelativeTime(input: number | string | Date, options?: RelativeTimeFormatOptions): string;
57
+ export { DateTimeFormatOptions, FormatOptions, ListFormatOptions, NumberFormatOptions, RelativeTimeFormatOptions, formatDate, formatList, formatNumber, formatRelativeTime, parseDate };