@chromvoid/headless-ui 0.1.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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +99 -0
  3. package/dist/a11y-contracts/index.d.ts +23 -0
  4. package/dist/a11y-contracts/index.js +1 -0
  5. package/dist/accordion/index.d.ts +78 -0
  6. package/dist/accordion/index.js +264 -0
  7. package/dist/adapters/index.d.ts +9 -0
  8. package/dist/adapters/index.js +1 -0
  9. package/dist/alert/index.d.ts +33 -0
  10. package/dist/alert/index.js +54 -0
  11. package/dist/alert-dialog/index.d.ts +69 -0
  12. package/dist/alert-dialog/index.js +94 -0
  13. package/dist/badge/index.d.ts +48 -0
  14. package/dist/badge/index.js +89 -0
  15. package/dist/breadcrumb/index.d.ts +55 -0
  16. package/dist/breadcrumb/index.js +77 -0
  17. package/dist/button/index.d.ts +46 -0
  18. package/dist/button/index.js +86 -0
  19. package/dist/callout/index.d.ts +41 -0
  20. package/dist/callout/index.js +63 -0
  21. package/dist/card/index.d.ts +54 -0
  22. package/dist/card/index.js +103 -0
  23. package/dist/carousel/index.d.ts +98 -0
  24. package/dist/carousel/index.js +243 -0
  25. package/dist/checkbox/index.d.ts +50 -0
  26. package/dist/checkbox/index.js +87 -0
  27. package/dist/combobox/index.d.ts +114 -0
  28. package/dist/combobox/index.js +431 -0
  29. package/dist/command-palette/index.d.ts +73 -0
  30. package/dist/command-palette/index.js +147 -0
  31. package/dist/context-menu/index.d.ts +111 -0
  32. package/dist/context-menu/index.js +372 -0
  33. package/dist/copy-button/index.d.ts +62 -0
  34. package/dist/copy-button/index.js +183 -0
  35. package/dist/core/index.d.ts +20 -0
  36. package/dist/core/index.js +2 -0
  37. package/dist/core/selection.d.ts +5 -0
  38. package/dist/core/selection.js +39 -0
  39. package/dist/core/value-range.d.ts +49 -0
  40. package/dist/core/value-range.js +134 -0
  41. package/dist/date-picker/index.d.ts +210 -0
  42. package/dist/date-picker/index.js +895 -0
  43. package/dist/dialog/index.d.ts +95 -0
  44. package/dist/dialog/index.js +153 -0
  45. package/dist/disclosure/index.d.ts +52 -0
  46. package/dist/disclosure/index.js +159 -0
  47. package/dist/drawer/index.d.ts +30 -0
  48. package/dist/drawer/index.js +39 -0
  49. package/dist/feed/index.d.ts +77 -0
  50. package/dist/feed/index.js +260 -0
  51. package/dist/grid/index.d.ts +103 -0
  52. package/dist/grid/index.js +415 -0
  53. package/dist/index.d.ts +51 -0
  54. package/dist/index.js +51 -0
  55. package/dist/input/index.d.ts +86 -0
  56. package/dist/input/index.js +156 -0
  57. package/dist/interactions/composite-navigation.d.ts +69 -0
  58. package/dist/interactions/composite-navigation.js +169 -0
  59. package/dist/interactions/index.d.ts +15 -0
  60. package/dist/interactions/index.js +4 -0
  61. package/dist/interactions/keyboard-intents.d.ts +16 -0
  62. package/dist/interactions/keyboard-intents.js +33 -0
  63. package/dist/interactions/overlay-focus.d.ts +40 -0
  64. package/dist/interactions/overlay-focus.js +93 -0
  65. package/dist/interactions/typeahead.d.ts +20 -0
  66. package/dist/interactions/typeahead.js +41 -0
  67. package/dist/landmarks/index.d.ts +39 -0
  68. package/dist/landmarks/index.js +58 -0
  69. package/dist/link/index.d.ts +34 -0
  70. package/dist/link/index.js +39 -0
  71. package/dist/listbox/index.d.ts +92 -0
  72. package/dist/listbox/index.js +337 -0
  73. package/dist/menu/index.d.ts +132 -0
  74. package/dist/menu/index.js +541 -0
  75. package/dist/menu-button/index.d.ts +71 -0
  76. package/dist/menu-button/index.js +121 -0
  77. package/dist/meter/index.d.ts +45 -0
  78. package/dist/meter/index.js +106 -0
  79. package/dist/number/index.d.ts +113 -0
  80. package/dist/number/index.js +252 -0
  81. package/dist/popover/index.d.ts +70 -0
  82. package/dist/popover/index.js +126 -0
  83. package/dist/progress/index.d.ts +49 -0
  84. package/dist/progress/index.js +79 -0
  85. package/dist/radio-group/index.d.ts +61 -0
  86. package/dist/radio-group/index.js +150 -0
  87. package/dist/select/index.d.ts +92 -0
  88. package/dist/select/index.js +239 -0
  89. package/dist/sidebar/index.d.ts +74 -0
  90. package/dist/sidebar/index.js +186 -0
  91. package/dist/slider/index.d.ts +61 -0
  92. package/dist/slider/index.js +150 -0
  93. package/dist/slider-multi-thumb/index.d.ts +70 -0
  94. package/dist/slider-multi-thumb/index.js +222 -0
  95. package/dist/spinbutton/index.d.ts +75 -0
  96. package/dist/spinbutton/index.js +214 -0
  97. package/dist/spinner/index.d.ts +1 -0
  98. package/dist/spinner/index.js +1 -0
  99. package/dist/spinner/spinner.d.ts +23 -0
  100. package/dist/spinner/spinner.js +25 -0
  101. package/dist/switch/index.d.ts +40 -0
  102. package/dist/switch/index.js +61 -0
  103. package/dist/table/index.d.ts +117 -0
  104. package/dist/table/index.js +377 -0
  105. package/dist/tabs/index.d.ts +63 -0
  106. package/dist/tabs/index.js +174 -0
  107. package/dist/textarea/index.d.ts +68 -0
  108. package/dist/textarea/index.js +137 -0
  109. package/dist/toast/index.d.ts +67 -0
  110. package/dist/toast/index.js +145 -0
  111. package/dist/toolbar/index.d.ts +59 -0
  112. package/dist/toolbar/index.js +139 -0
  113. package/dist/tooltip/index.d.ts +52 -0
  114. package/dist/tooltip/index.js +169 -0
  115. package/dist/treegrid/index.d.ts +101 -0
  116. package/dist/treegrid/index.js +463 -0
  117. package/dist/treeview/index.d.ts +68 -0
  118. package/dist/treeview/index.js +370 -0
  119. package/dist/window-splitter/index.d.ts +65 -0
  120. package/dist/window-splitter/index.js +204 -0
  121. package/package.json +92 -0
  122. package/specs/ADR-001-headless-architecture.md +461 -0
  123. package/specs/ADR-002-repo-release-model.md +108 -0
  124. package/specs/ADR-003-public-api-versioning.md +136 -0
  125. package/specs/ADR-004-focus-selection-policy.md +117 -0
  126. package/specs/IMPLEMENTATION-ROADMAP.md +237 -0
  127. package/specs/ISSUE-BACKLOG.md +681 -0
  128. package/specs/RELEASE-CANDIDATE.md +30 -0
  129. package/specs/components/accordion.md +130 -0
  130. package/specs/components/alert-dialog.md +72 -0
  131. package/specs/components/alert.md +65 -0
  132. package/specs/components/badge.md +220 -0
  133. package/specs/components/breadcrumb.md +74 -0
  134. package/specs/components/button.md +115 -0
  135. package/specs/components/callout.md +195 -0
  136. package/specs/components/card.md +280 -0
  137. package/specs/components/carousel.md +140 -0
  138. package/specs/components/checkbox.md +172 -0
  139. package/specs/components/combobox.md +423 -0
  140. package/specs/components/command-palette.md +92 -0
  141. package/specs/components/context-menu.md +556 -0
  142. package/specs/components/copy-button.md +293 -0
  143. package/specs/components/date-picker.md +400 -0
  144. package/specs/components/dialog.md +298 -0
  145. package/specs/components/disclosure.md +257 -0
  146. package/specs/components/drawer.md +353 -0
  147. package/specs/components/feed.md +265 -0
  148. package/specs/components/grid.md +186 -0
  149. package/specs/components/input.md +254 -0
  150. package/specs/components/landmarks.md +136 -0
  151. package/specs/components/link.md +134 -0
  152. package/specs/components/listbox.md +351 -0
  153. package/specs/components/menu-button.md +76 -0
  154. package/specs/components/menu.md +623 -0
  155. package/specs/components/meter.md +149 -0
  156. package/specs/components/number.md +393 -0
  157. package/specs/components/popover.md +252 -0
  158. package/specs/components/progress.md +188 -0
  159. package/specs/components/radio-group.md +151 -0
  160. package/specs/components/select.md +144 -0
  161. package/specs/components/sidebar.md +321 -0
  162. package/specs/components/slider-multi-thumb.md +78 -0
  163. package/specs/components/slider.md +84 -0
  164. package/specs/components/spinbutton.md +140 -0
  165. package/specs/components/spinner.md +132 -0
  166. package/specs/components/switch.md +175 -0
  167. package/specs/components/table.md +403 -0
  168. package/specs/components/tabs.md +265 -0
  169. package/specs/components/textarea.md +185 -0
  170. package/specs/components/toast.md +198 -0
  171. package/specs/components/toolbar.md +278 -0
  172. package/specs/components/tooltip.md +252 -0
  173. package/specs/components/treegrid.md +281 -0
  174. package/specs/components/treeview.md +91 -0
  175. package/specs/components/window-splitter.md +297 -0
  176. package/specs/ops/git-shard-sync.md +107 -0
  177. package/specs/ops/release-checklist.md +76 -0
  178. package/specs/release/GAP-TO-GREEN-ISSUES.md +88 -0
  179. package/specs/release/api-freeze-candidate.md +54 -0
  180. package/specs/release/changelog-automation.md +76 -0
  181. package/specs/release/changelog.generated.md +53 -0
  182. package/specs/release/changelog.patch.generated.md +46 -0
  183. package/specs/release/consumer-integration.md +53 -0
  184. package/specs/release/migration-notes-pre-v1.md +40 -0
  185. package/specs/release/mvp-changelog.md +57 -0
  186. package/specs/release/release-notes-template.md +61 -0
  187. package/specs/release/release-rehearsal.md +113 -0
  188. package/specs/release/semver-deprecation-dry-run.md +89 -0
  189. package/specs/release/shard-release-drill-report.md +50 -0
  190. package/specs/release/shard-release-follow-ups.md +31 -0
  191. package/specs/signals.md +208 -0
@@ -0,0 +1,71 @@
1
+ import { type Atom } from '@reatom/core';
2
+ import { type MenuItem } from '../menu/index.js';
3
+ export interface CreateMenuButtonOptions {
4
+ items: readonly MenuItem[];
5
+ idBase?: string;
6
+ ariaLabel?: string;
7
+ initialOpen?: boolean;
8
+ initialActiveId?: string | null;
9
+ closeOnSelect?: boolean;
10
+ }
11
+ export interface MenuButtonState {
12
+ isOpen: Atom<boolean>;
13
+ activeId: Atom<string | null>;
14
+ restoreTargetId: Atom<string | null>;
15
+ }
16
+ export interface MenuButtonKeyboardEventLike {
17
+ key: string;
18
+ shiftKey?: boolean;
19
+ ctrlKey?: boolean;
20
+ metaKey?: boolean;
21
+ altKey?: boolean;
22
+ }
23
+ export interface MenuButtonActions {
24
+ open(): void;
25
+ close(): void;
26
+ toggle(): void;
27
+ select(id: string): void;
28
+ handleOutsidePointer(): void;
29
+ handleKeyDown(event: MenuButtonKeyboardEventLike): void;
30
+ }
31
+ export interface MenuButtonTriggerProps {
32
+ id: string;
33
+ role: 'button';
34
+ tabindex: '0';
35
+ 'aria-haspopup': 'menu';
36
+ 'aria-expanded': 'true' | 'false';
37
+ 'aria-controls': string;
38
+ 'aria-label'?: string;
39
+ onClick: () => void;
40
+ onKeyDown: (event: MenuButtonKeyboardEventLike) => void;
41
+ }
42
+ export interface MenuButtonMenuProps {
43
+ id: string;
44
+ role: 'menu';
45
+ tabindex: '-1';
46
+ 'aria-label'?: string;
47
+ hidden: boolean;
48
+ onKeyDown: (event: MenuButtonKeyboardEventLike) => void;
49
+ }
50
+ export interface MenuButtonItemProps {
51
+ id: string;
52
+ role: 'menuitem' | 'menuitemcheckbox' | 'menuitemradio';
53
+ tabindex: '-1';
54
+ 'aria-disabled'?: 'true';
55
+ 'data-active': 'true' | 'false';
56
+ 'aria-checked'?: 'true' | 'false';
57
+ 'aria-haspopup'?: 'menu';
58
+ 'aria-expanded'?: 'true' | 'false';
59
+ onClick: () => void;
60
+ }
61
+ export interface MenuButtonContracts {
62
+ getTriggerProps(): MenuButtonTriggerProps;
63
+ getMenuProps(): MenuButtonMenuProps;
64
+ getItemProps(id: string): MenuButtonItemProps;
65
+ }
66
+ export interface MenuButtonModel {
67
+ readonly state: MenuButtonState;
68
+ readonly actions: MenuButtonActions;
69
+ readonly contracts: MenuButtonContracts;
70
+ }
71
+ export declare function createMenuButton(options: CreateMenuButtonOptions): MenuButtonModel;
@@ -0,0 +1,121 @@
1
+ import { action, atom } from '@reatom/core';
2
+ import { createMenu } from '../menu/index.js';
3
+ const withModifierDefaults = (event) => ({
4
+ key: event.key,
5
+ shiftKey: event.shiftKey ?? false,
6
+ ctrlKey: event.ctrlKey ?? false,
7
+ metaKey: event.metaKey ?? false,
8
+ altKey: event.altKey ?? false,
9
+ });
10
+ export function createMenuButton(options) {
11
+ const idBase = options.idBase ?? 'menu-button';
12
+ const menu = createMenu({
13
+ idBase,
14
+ items: options.items,
15
+ ariaLabel: options.ariaLabel,
16
+ initialOpen: options.initialOpen,
17
+ initialActiveId: options.initialActiveId,
18
+ closeOnSelect: options.closeOnSelect,
19
+ });
20
+ const restoreTargetIdAtom = atom(null, `${idBase}.restoreTargetId`);
21
+ const closeInternal = (reason) => {
22
+ menu.actions.close();
23
+ if (reason === 'escape' || reason === 'select') {
24
+ restoreTargetIdAtom.set(`${idBase}-trigger`);
25
+ return;
26
+ }
27
+ restoreTargetIdAtom.set(null);
28
+ };
29
+ const open = action(() => {
30
+ menu.actions.open('programmatic');
31
+ restoreTargetIdAtom.set(null);
32
+ }, `${idBase}.open`);
33
+ const close = action(() => {
34
+ closeInternal('programmatic');
35
+ }, `${idBase}.close`);
36
+ const toggle = action(() => {
37
+ if (menu.state.isOpen()) {
38
+ closeInternal('programmatic');
39
+ return;
40
+ }
41
+ menu.actions.toggle('pointer');
42
+ restoreTargetIdAtom.set(null);
43
+ }, `${idBase}.toggle`);
44
+ const select = action((id) => {
45
+ const wasOpen = menu.state.isOpen();
46
+ menu.actions.select(id);
47
+ if (wasOpen && !menu.state.isOpen()) {
48
+ restoreTargetIdAtom.set(`${idBase}-trigger`);
49
+ }
50
+ }, `${idBase}.select`);
51
+ const handleOutsidePointer = action(() => {
52
+ if (!menu.state.isOpen())
53
+ return;
54
+ closeInternal('outside-pointer');
55
+ }, `${idBase}.handleOutsidePointer`);
56
+ const handleKeyDown = action((event) => {
57
+ if (!menu.state.isOpen()) {
58
+ if (event.key === 'Enter' || event.key === ' ') {
59
+ menu.actions.open('keyboard');
60
+ menu.actions.moveFirst();
61
+ restoreTargetIdAtom.set(null);
62
+ return;
63
+ }
64
+ menu.actions.handleTriggerKeyDown({ key: event.key });
65
+ return;
66
+ }
67
+ if (event.key === 'Escape') {
68
+ closeInternal('escape');
69
+ return;
70
+ }
71
+ if (event.key === 'Tab') {
72
+ closeInternal('tab');
73
+ return;
74
+ }
75
+ menu.actions.handleMenuKeyDown(withModifierDefaults(event));
76
+ }, `${idBase}.handleKeyDown`);
77
+ const actions = {
78
+ open,
79
+ close,
80
+ toggle,
81
+ select,
82
+ handleOutsidePointer,
83
+ handleKeyDown,
84
+ };
85
+ const contracts = {
86
+ getTriggerProps() {
87
+ const trigger = menu.contracts.getTriggerProps();
88
+ return {
89
+ ...trigger,
90
+ role: 'button',
91
+ onClick: toggle,
92
+ onKeyDown: handleKeyDown,
93
+ };
94
+ },
95
+ getMenuProps() {
96
+ const menuProps = menu.contracts.getMenuProps();
97
+ return {
98
+ ...menuProps,
99
+ hidden: !menu.state.isOpen(),
100
+ onKeyDown: handleKeyDown,
101
+ };
102
+ },
103
+ getItemProps(id) {
104
+ const item = menu.contracts.getItemProps(id);
105
+ return {
106
+ ...item,
107
+ onClick: () => select(id),
108
+ };
109
+ },
110
+ };
111
+ const state = {
112
+ isOpen: menu.state.isOpen,
113
+ activeId: menu.state.activeId,
114
+ restoreTargetId: restoreTargetIdAtom,
115
+ };
116
+ return {
117
+ state,
118
+ actions,
119
+ contracts,
120
+ };
121
+ }
@@ -0,0 +1,45 @@
1
+ import { type Atom, type Computed } from '@reatom/core';
2
+ export type MeterStatus = 'low' | 'high' | 'optimum' | 'normal';
3
+ export interface CreateMeterOptions {
4
+ idBase?: string;
5
+ value?: number;
6
+ min?: number;
7
+ max?: number;
8
+ low?: number;
9
+ high?: number;
10
+ optimum?: number;
11
+ ariaLabel?: string;
12
+ ariaLabelledBy?: string;
13
+ ariaDescribedBy?: string;
14
+ formatValueText?: (value: number) => string;
15
+ }
16
+ export interface MeterState {
17
+ value: Atom<number>;
18
+ min: Atom<number>;
19
+ max: Atom<number>;
20
+ percentage: Computed<number>;
21
+ status: Computed<MeterStatus>;
22
+ }
23
+ export interface MeterActions {
24
+ setValue(value: number): void;
25
+ }
26
+ export interface MeterProps {
27
+ id: string;
28
+ role: 'meter';
29
+ 'aria-valuenow': string;
30
+ 'aria-valuemin': string;
31
+ 'aria-valuemax': string;
32
+ 'aria-valuetext'?: string;
33
+ 'aria-label'?: string;
34
+ 'aria-labelledby'?: string;
35
+ 'aria-describedby'?: string;
36
+ }
37
+ export interface MeterContracts {
38
+ getMeterProps(): MeterProps;
39
+ }
40
+ export interface MeterModel {
41
+ readonly state: MeterState;
42
+ readonly actions: MeterActions;
43
+ readonly contracts: MeterContracts;
44
+ }
45
+ export declare function createMeter(options?: CreateMeterOptions): MeterModel;
@@ -0,0 +1,106 @@
1
+ import { action, atom, computed } from '@reatom/core';
2
+ const clamp = (value, min, max) => {
3
+ if (value < min)
4
+ return min;
5
+ if (value > max)
6
+ return max;
7
+ return value;
8
+ };
9
+ const normalizeThresholds = (min, max, low, high, optimum) => {
10
+ let normalizedLow = null;
11
+ let normalizedHigh = null;
12
+ let normalizedOptimum = null;
13
+ if (low != null && Number.isFinite(low)) {
14
+ normalizedLow = clamp(low, min, max);
15
+ }
16
+ if (high != null && Number.isFinite(high)) {
17
+ normalizedHigh = clamp(high, min, max);
18
+ }
19
+ if (normalizedLow != null && normalizedHigh != null && normalizedLow > normalizedHigh) {
20
+ const low = normalizedLow;
21
+ normalizedLow = normalizedHigh;
22
+ normalizedHigh = low;
23
+ }
24
+ if (optimum != null && Number.isFinite(optimum)) {
25
+ normalizedOptimum = clamp(optimum, min, max);
26
+ }
27
+ return { low: normalizedLow, high: normalizedHigh, optimum: normalizedOptimum };
28
+ };
29
+ const getMeterStatus = (value, low, high, optimum) => {
30
+ if (low == null && high == null)
31
+ return 'normal';
32
+ const isInLowRegion = low != null && value < low;
33
+ const isInHighRegion = high != null && value > high;
34
+ if (optimum != null) {
35
+ const optimumInLow = low != null && optimum < low;
36
+ const optimumInHigh = high != null && optimum > high;
37
+ const optimumInNormal = !optimumInLow && !optimumInHigh;
38
+ if (optimumInLow && isInLowRegion)
39
+ return 'optimum';
40
+ if (optimumInHigh && isInHighRegion)
41
+ return 'optimum';
42
+ if (optimumInNormal && !isInLowRegion && !isInHighRegion)
43
+ return 'optimum';
44
+ }
45
+ if (isInLowRegion)
46
+ return 'low';
47
+ if (isInHighRegion)
48
+ return 'high';
49
+ return 'normal';
50
+ };
51
+ export function createMeter(options = {}) {
52
+ const idBase = options.idBase ?? 'meter';
53
+ const rawMin = options.min ?? 0;
54
+ const rawMax = options.max ?? 100;
55
+ const minVal = Math.min(rawMin, rawMax);
56
+ const maxVal = Math.max(rawMin, rawMax);
57
+ const minAtom = atom(minVal, `${idBase}.min`);
58
+ const maxAtom = atom(maxVal, `${idBase}.max`);
59
+ const valueAtom = atom(clamp(options.value ?? minVal, minVal, maxVal), `${idBase}.value`);
60
+ const thresholds = normalizeThresholds(minVal, maxVal, options.low, options.high, options.optimum);
61
+ const percentageAtom = computed(() => {
62
+ const min = minAtom();
63
+ const max = maxAtom();
64
+ const span = max - min;
65
+ if (span <= 0)
66
+ return 0;
67
+ const clamped = clamp(valueAtom(), min, max);
68
+ return Number((((clamped - min) / span) * 100).toFixed(4));
69
+ }, `${idBase}.percentage`);
70
+ const statusAtom = computed(() => {
71
+ return getMeterStatus(valueAtom(), thresholds.low, thresholds.high, thresholds.optimum);
72
+ }, `${idBase}.status`);
73
+ const actions = {
74
+ setValue: action((value) => {
75
+ valueAtom.set(clamp(value, minAtom(), maxAtom()));
76
+ }, `${idBase}.setValue`),
77
+ };
78
+ const contracts = {
79
+ getMeterProps() {
80
+ const value = valueAtom();
81
+ return {
82
+ id: `${idBase}-root`,
83
+ role: 'meter',
84
+ 'aria-valuenow': String(value),
85
+ 'aria-valuemin': String(minAtom()),
86
+ 'aria-valuemax': String(maxAtom()),
87
+ 'aria-valuetext': options.formatValueText?.(value),
88
+ 'aria-label': options.ariaLabel,
89
+ 'aria-labelledby': options.ariaLabelledBy,
90
+ 'aria-describedby': options.ariaDescribedBy,
91
+ };
92
+ },
93
+ };
94
+ const state = {
95
+ value: valueAtom,
96
+ min: minAtom,
97
+ max: maxAtom,
98
+ percentage: percentageAtom,
99
+ status: statusAtom,
100
+ };
101
+ return {
102
+ state,
103
+ actions,
104
+ contracts,
105
+ };
106
+ }
@@ -0,0 +1,113 @@
1
+ import { type Atom } from '@reatom/core';
2
+ export type NumberKeyboardEventLike = Pick<KeyboardEvent, 'key'> & {
3
+ preventDefault?: () => void;
4
+ };
5
+ export interface CreateNumberOptions {
6
+ idBase?: string;
7
+ value?: number;
8
+ defaultValue?: number;
9
+ min?: number;
10
+ max?: number;
11
+ step?: number;
12
+ largeStep?: number;
13
+ disabled?: boolean;
14
+ readonly?: boolean;
15
+ required?: boolean;
16
+ clearable?: boolean;
17
+ stepper?: boolean;
18
+ placeholder?: string;
19
+ ariaLabel?: string;
20
+ ariaLabelledBy?: string;
21
+ ariaDescribedBy?: string;
22
+ formatValueText?: (value: number) => string;
23
+ onValueChange?: (value: number) => void;
24
+ onClear?: () => void;
25
+ }
26
+ export interface NumberState {
27
+ value: Atom<number>;
28
+ min: Atom<number | undefined>;
29
+ max: Atom<number | undefined>;
30
+ step: Atom<number>;
31
+ largeStep: Atom<number>;
32
+ isDisabled: Atom<boolean>;
33
+ isReadOnly: Atom<boolean>;
34
+ hasMin(): boolean;
35
+ hasMax(): boolean;
36
+ focused: Atom<boolean>;
37
+ filled(): boolean;
38
+ clearable: Atom<boolean>;
39
+ showClearButton(): boolean;
40
+ stepper: Atom<boolean>;
41
+ draftText: Atom<string | null>;
42
+ placeholder: Atom<string>;
43
+ required: Atom<boolean>;
44
+ defaultValue: Atom<number>;
45
+ }
46
+ export interface NumberActions {
47
+ setValue(value: number): void;
48
+ increment(): void;
49
+ decrement(): void;
50
+ incrementLarge(): void;
51
+ decrementLarge(): void;
52
+ setFirst(): void;
53
+ setLast(): void;
54
+ handleKeyDown(event: NumberKeyboardEventLike): void;
55
+ setDisabled(v: boolean): void;
56
+ setReadOnly(v: boolean): void;
57
+ setRequired(v: boolean): void;
58
+ setClearable(v: boolean): void;
59
+ setStepper(v: boolean): void;
60
+ setFocused(v: boolean): void;
61
+ setPlaceholder(v: string): void;
62
+ setDraftText(v: string | null): void;
63
+ commitDraft(): void;
64
+ clear(): void;
65
+ handleInput(text: string): void;
66
+ }
67
+ export interface NumberInputProps {
68
+ id: string;
69
+ role: 'spinbutton';
70
+ tabindex: '0' | '-1';
71
+ inputmode: 'decimal';
72
+ 'aria-valuenow': string;
73
+ 'aria-valuemin'?: string;
74
+ 'aria-valuemax'?: string;
75
+ 'aria-valuetext'?: string;
76
+ 'aria-disabled'?: 'true';
77
+ 'aria-readonly'?: 'true';
78
+ 'aria-required'?: 'true';
79
+ 'aria-label'?: string;
80
+ 'aria-labelledby'?: string;
81
+ 'aria-describedby'?: string;
82
+ placeholder?: string;
83
+ autocomplete: 'off';
84
+ }
85
+ export interface NumberButtonProps {
86
+ id: string;
87
+ tabindex: '-1';
88
+ 'aria-label': string;
89
+ 'aria-disabled'?: 'true';
90
+ hidden?: true;
91
+ 'aria-hidden'?: 'true';
92
+ onClick: () => void;
93
+ }
94
+ export interface NumberClearButtonProps {
95
+ role: 'button';
96
+ 'aria-label': string;
97
+ tabindex: '-1';
98
+ hidden?: true;
99
+ 'aria-hidden'?: 'true';
100
+ onClick: () => void;
101
+ }
102
+ export interface NumberContracts {
103
+ getInputProps(): NumberInputProps;
104
+ getIncrementButtonProps(): NumberButtonProps;
105
+ getDecrementButtonProps(): NumberButtonProps;
106
+ getClearButtonProps(): NumberClearButtonProps;
107
+ }
108
+ export interface NumberModel {
109
+ readonly state: NumberState;
110
+ readonly actions: NumberActions;
111
+ readonly contracts: NumberContracts;
112
+ }
113
+ export declare function createNumber(options?: CreateNumberOptions): NumberModel;