@mitcsutt/kiln-ui 0.6.0 → 0.8.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 (184) hide show
  1. package/dist/components/actions/CopyButton/CopyButton.d.ts +58 -0
  2. package/dist/components/actions/CopyButton/CopyButton.js +63 -0
  3. package/dist/components/actions/CopyButton/CopyButton.js.map +1 -0
  4. package/dist/components/actions/CopyButton/CopyButton.module.js +9 -0
  5. package/dist/components/actions/CopyButton/CopyButton.module.js.map +1 -0
  6. package/dist/components/actions/CopyButton/index.d.ts +4 -0
  7. package/dist/components/actions/CopyButton/useClipboard.d.ts +35 -0
  8. package/dist/components/actions/CopyButton/useClipboard.js +62 -0
  9. package/dist/components/actions/CopyButton/useClipboard.js.map +1 -0
  10. package/dist/components/actions/ToggleChip/ToggleChip.d.ts +6 -0
  11. package/dist/components/actions/ToggleChip/ToggleChip.js +26 -24
  12. package/dist/components/actions/ToggleChip/ToggleChip.js.map +1 -1
  13. package/dist/components/display/Badge/Badge.d.ts +6 -0
  14. package/dist/components/display/Badge/Badge.js +16 -15
  15. package/dist/components/display/Badge/Badge.js.map +1 -1
  16. package/dist/components/display/CodeBlock/CodeBlock.js +45 -58
  17. package/dist/components/display/CodeBlock/CodeBlock.js.map +1 -1
  18. package/dist/components/display/Swatch/Swatch.d.ts +52 -0
  19. package/dist/components/display/Swatch/Swatch.js +27 -0
  20. package/dist/components/display/Swatch/Swatch.js.map +1 -0
  21. package/dist/components/display/Swatch/Swatch.module.js +6 -0
  22. package/dist/components/display/Swatch/Swatch.module.js.map +1 -0
  23. package/dist/components/display/Swatch/index.d.ts +2 -0
  24. package/dist/components/display/Tag/Tag.d.ts +7 -0
  25. package/dist/components/display/Tag/Tag.js +31 -26
  26. package/dist/components/display/Tag/Tag.js.map +1 -1
  27. package/dist/components/display/TreeTable/TreeTable.d.ts +69 -0
  28. package/dist/components/display/TreeTable/TreeTable.js +152 -0
  29. package/dist/components/display/TreeTable/TreeTable.js.map +1 -0
  30. package/dist/components/display/TreeTable/TreeTable.module.js +12 -0
  31. package/dist/components/display/TreeTable/TreeTable.module.js.map +1 -0
  32. package/dist/components/display/TreeTable/index.d.ts +2 -0
  33. package/dist/components/feedback/Indicator/Indicator.d.ts +74 -0
  34. package/dist/components/feedback/Indicator/Indicator.js +50 -0
  35. package/dist/components/feedback/Indicator/Indicator.js.map +1 -0
  36. package/dist/components/feedback/Indicator/Indicator.module.js +12 -0
  37. package/dist/components/feedback/Indicator/Indicator.module.js.map +1 -0
  38. package/dist/components/feedback/Indicator/index.d.ts +2 -0
  39. package/dist/components/feedback/Toaster/Toaster.d.ts +71 -0
  40. package/dist/components/feedback/Toaster/Toaster.js +121 -0
  41. package/dist/components/feedback/Toaster/Toaster.js.map +1 -0
  42. package/dist/components/feedback/Toaster/Toaster.module.js +20 -0
  43. package/dist/components/feedback/Toaster/Toaster.module.js.map +1 -0
  44. package/dist/components/feedback/Toaster/index.d.ts +4 -0
  45. package/dist/components/feedback/Toaster/toast.d.ts +96 -0
  46. package/dist/components/feedback/Toaster/toast.js +131 -0
  47. package/dist/components/feedback/Toaster/toast.js.map +1 -0
  48. package/dist/components/inputs/Calendar/Calendar.d.ts +87 -0
  49. package/dist/components/inputs/Calendar/Calendar.js +217 -0
  50. package/dist/components/inputs/Calendar/Calendar.js.map +1 -0
  51. package/dist/components/inputs/Calendar/Calendar.module.js +18 -0
  52. package/dist/components/inputs/Calendar/Calendar.module.js.map +1 -0
  53. package/dist/components/inputs/Calendar/index.d.ts +2 -0
  54. package/dist/components/inputs/Combobox/Combobox.js +36 -44
  55. package/dist/components/inputs/Combobox/Combobox.js.map +1 -1
  56. package/dist/components/inputs/DateField/DateField.d.ts +17 -0
  57. package/dist/components/inputs/DateField/DateField.js +26 -0
  58. package/dist/components/inputs/DateField/DateField.js.map +1 -0
  59. package/dist/components/inputs/DateField/index.d.ts +2 -0
  60. package/dist/components/inputs/DateInput/DateInput.d.ts +75 -0
  61. package/dist/components/inputs/DateInput/DateInput.js +139 -0
  62. package/dist/components/inputs/DateInput/DateInput.js.map +1 -0
  63. package/dist/components/inputs/DateInput/index.d.ts +3 -0
  64. package/dist/components/inputs/DateRangeField/DateRangeField.d.ts +18 -3
  65. package/dist/components/inputs/DateRangeField/DateRangeField.js.map +1 -1
  66. package/dist/components/inputs/DateRangeField/DateRangeField.module.js +8 -3
  67. package/dist/components/inputs/DateRangeField/DateRangeField.module.js.map +1 -1
  68. package/dist/components/inputs/DateRangeField/DateRangePickerField.d.ts +48 -0
  69. package/dist/components/inputs/DateRangeField/DateRangePickerField.js +246 -0
  70. package/dist/components/inputs/DateRangeField/DateRangePickerField.js.map +1 -0
  71. package/dist/components/inputs/DateRangeField/index.d.ts +2 -0
  72. package/dist/components/inputs/DateTimeField/DateTimeField.d.ts +17 -0
  73. package/dist/components/inputs/DateTimeField/DateTimeField.js +26 -0
  74. package/dist/components/inputs/DateTimeField/DateTimeField.js.map +1 -0
  75. package/dist/components/inputs/DateTimeField/index.d.ts +2 -0
  76. package/dist/components/inputs/DateTimeInput/DateTimeInput.d.ts +83 -0
  77. package/dist/components/inputs/DateTimeInput/DateTimeInput.js +216 -0
  78. package/dist/components/inputs/DateTimeInput/DateTimeInput.js.map +1 -0
  79. package/dist/components/inputs/DateTimeInput/index.d.ts +2 -0
  80. package/dist/components/inputs/JsonField/JsonField.d.ts +23 -0
  81. package/dist/components/inputs/JsonField/JsonField.js +33 -0
  82. package/dist/components/inputs/JsonField/JsonField.js.map +1 -0
  83. package/dist/components/inputs/JsonField/index.d.ts +2 -0
  84. package/dist/components/inputs/JsonInput/JsonInput.d.ts +119 -0
  85. package/dist/components/inputs/JsonInput/JsonInput.js +282 -0
  86. package/dist/components/inputs/JsonInput/JsonInput.js.map +1 -0
  87. package/dist/components/inputs/JsonInput/JsonInput.module.js +16 -0
  88. package/dist/components/inputs/JsonInput/JsonInput.module.js.map +1 -0
  89. package/dist/components/inputs/JsonInput/index.d.ts +4 -0
  90. package/dist/components/inputs/JsonInput/json.d.ts +59 -0
  91. package/dist/components/inputs/JsonInput/json.js +231 -0
  92. package/dist/components/inputs/JsonInput/json.js.map +1 -0
  93. package/dist/components/inputs/TagsInput/TagsInput.js +5 -5
  94. package/dist/components/inputs/TimeField/TimeField.d.ts +17 -0
  95. package/dist/components/inputs/TimeField/TimeField.js +26 -0
  96. package/dist/components/inputs/TimeField/TimeField.js.map +1 -0
  97. package/dist/components/inputs/TimeField/index.d.ts +2 -0
  98. package/dist/components/inputs/TimeInput/TimeInput.d.ts +54 -0
  99. package/dist/components/inputs/TimeInput/TimeInput.js +107 -0
  100. package/dist/components/inputs/TimeInput/TimeInput.js.map +1 -0
  101. package/dist/components/inputs/TimeInput/index.d.ts +2 -0
  102. package/dist/components/inputs/internal/DateSegments.d.ts +80 -0
  103. package/dist/components/inputs/internal/DateSegments.js +345 -0
  104. package/dist/components/inputs/internal/DateSegments.js.map +1 -0
  105. package/dist/components/inputs/internal/dates.d.ts +101 -0
  106. package/dist/components/inputs/internal/dates.js +262 -0
  107. package/dist/components/inputs/internal/dates.js.map +1 -0
  108. package/dist/components/inputs/internal/filterOptions.d.ts +22 -1
  109. package/dist/components/inputs/internal/filterOptions.js +32 -1
  110. package/dist/components/inputs/internal/filterOptions.js.map +1 -1
  111. package/dist/components/inputs/internal/picker.d.ts +31 -0
  112. package/dist/components/inputs/internal/picker.js +29 -0
  113. package/dist/components/inputs/internal/picker.js.map +1 -0
  114. package/dist/components/inputs/internal/picker.module.js +15 -0
  115. package/dist/components/inputs/internal/picker.module.js.map +1 -0
  116. package/dist/components/inputs/internal/segments.module.js +10 -0
  117. package/dist/components/inputs/internal/segments.module.js.map +1 -0
  118. package/dist/components/layout/Collapse/Collapse.d.ts +39 -0
  119. package/dist/components/layout/Collapse/Collapse.js +24 -0
  120. package/dist/components/layout/Collapse/Collapse.js.map +1 -0
  121. package/dist/components/layout/Collapse/Collapse.module.js +6 -0
  122. package/dist/components/layout/Collapse/Collapse.module.js.map +1 -0
  123. package/dist/components/layout/Collapse/index.d.ts +2 -0
  124. package/dist/components/layout/Collapse/useHeightMotion.d.ts +16 -0
  125. package/dist/components/layout/Collapse/useHeightMotion.js +60 -0
  126. package/dist/components/layout/Collapse/useHeightMotion.js.map +1 -0
  127. package/dist/components/layout/ShowMore/ShowMore.d.ts +59 -0
  128. package/dist/components/layout/ShowMore/ShowMore.js +114 -0
  129. package/dist/components/layout/ShowMore/ShowMore.js.map +1 -0
  130. package/dist/components/layout/ShowMore/ShowMore.module.js +12 -0
  131. package/dist/components/layout/ShowMore/ShowMore.module.js.map +1 -0
  132. package/dist/components/layout/ShowMore/index.d.ts +2 -0
  133. package/dist/components/layout/Transition/Transition.d.ts +63 -0
  134. package/dist/components/layout/Transition/Transition.js +63 -0
  135. package/dist/components/layout/Transition/Transition.js.map +1 -0
  136. package/dist/components/layout/Transition/Transition.module.js +17 -0
  137. package/dist/components/layout/Transition/Transition.module.js.map +1 -0
  138. package/dist/components/layout/Transition/index.d.ts +2 -0
  139. package/dist/components/navigation/Collapsible/Collapsible.d.ts +49 -0
  140. package/dist/components/navigation/Collapsible/Collapsible.js +83 -0
  141. package/dist/components/navigation/Collapsible/Collapsible.js.map +1 -0
  142. package/dist/components/navigation/Collapsible/Collapsible.module.js +11 -0
  143. package/dist/components/navigation/Collapsible/Collapsible.module.js.map +1 -0
  144. package/dist/components/navigation/Collapsible/index.d.ts +2 -0
  145. package/dist/components/navigation/NavLinks/NavLinks.d.ts +32 -4
  146. package/dist/components/navigation/NavLinks/NavLinks.js +69 -39
  147. package/dist/components/navigation/NavLinks/NavLinks.js.map +1 -1
  148. package/dist/components/navigation/NavLinks/NavLinks.module.js +13 -3
  149. package/dist/components/navigation/NavLinks/NavLinks.module.js.map +1 -1
  150. package/dist/components/navigation/NavLinks/NavLinksGroup.d.ts +49 -0
  151. package/dist/components/navigation/NavLinks/NavLinksGroup.js +185 -0
  152. package/dist/components/navigation/NavLinks/NavLinksGroup.js.map +1 -0
  153. package/dist/components/navigation/NavLinks/context.d.ts +28 -0
  154. package/dist/components/navigation/NavLinks/context.js +13 -0
  155. package/dist/components/navigation/NavLinks/context.js.map +1 -0
  156. package/dist/components/navigation/NavLinks/index.d.ts +2 -0
  157. package/dist/components/navigation/NavLinks/treeKeys.d.ts +8 -0
  158. package/dist/components/navigation/NavLinks/treeKeys.js +57 -0
  159. package/dist/components/navigation/NavLinks/treeKeys.js.map +1 -0
  160. package/dist/components/overlays/CommandPalette/CommandPalette.d.ts +120 -0
  161. package/dist/components/overlays/CommandPalette/CommandPalette.js +386 -0
  162. package/dist/components/overlays/CommandPalette/CommandPalette.js.map +1 -0
  163. package/dist/components/overlays/CommandPalette/CommandPalette.module.js +31 -0
  164. package/dist/components/overlays/CommandPalette/CommandPalette.module.js.map +1 -0
  165. package/dist/components/overlays/CommandPalette/index.d.ts +2 -0
  166. package/dist/components/overlays/CommandPalette/shortcut.d.ts +28 -0
  167. package/dist/components/overlays/CommandPalette/shortcut.js +104 -0
  168. package/dist/components/overlays/CommandPalette/shortcut.js.map +1 -0
  169. package/dist/index.d.ts +42 -4
  170. package/dist/index.js +124 -100
  171. package/dist/styles.css +1 -1
  172. package/dist/themes/fiesta.css +1 -1
  173. package/dist/themes/flightdeck.css +1 -1
  174. package/dist/themes/ledger.css +1 -1
  175. package/dist/themes/monograph.css +1 -1
  176. package/dist/themes/riso.css +1 -1
  177. package/package.json +2 -1
  178. package/skills/custom-theme/SKILL.md +32 -0
  179. package/skills/custom-theme/references/colour.md +20 -0
  180. package/skills/custom-theme/references/motion.md +9 -0
  181. package/skills/custom-theme/references/tokens.md +35 -0
  182. package/skills/design-rules/SKILL.md +5 -2
  183. package/skills/setup-and-theming/SKILL.md +1 -1
  184. package/skills/setup-and-theming/references/paper.md +1 -1
@@ -0,0 +1,131 @@
1
+ import { isValidElement as e } from "react";
2
+ //#region src/components/feedback/Toaster/toast.ts
3
+ var t = [], n = /* @__PURE__ */ new Set(), r = 0, i = 1e3;
4
+ function a(e) {
5
+ t = e;
6
+ for (let e of n) e();
7
+ }
8
+ function o(e) {
9
+ return n.add(e), () => {
10
+ n.delete(e);
11
+ };
12
+ }
13
+ function s() {
14
+ return t;
15
+ }
16
+ var c = [];
17
+ function l() {
18
+ return c;
19
+ }
20
+ function u(e, t) {
21
+ return [
22
+ "title",
23
+ "description",
24
+ "tone",
25
+ "loading"
26
+ ].some((n) => n in t && t[n] !== e[n]);
27
+ }
28
+ function d(e) {
29
+ let n = e.id ?? `toast-${String(++r)}`, i = t.find((e) => e.id === n && e.open);
30
+ if (i) {
31
+ let r = u(i, e) ? i.version + 1 : i.version;
32
+ a(t.map((t) => t === i ? {
33
+ ...t,
34
+ ...e,
35
+ id: n,
36
+ version: r
37
+ } : t));
38
+ } else a([...t.filter((e) => e.id !== n), {
39
+ ...e,
40
+ id: n,
41
+ open: !0,
42
+ version: 0
43
+ }]);
44
+ return n;
45
+ }
46
+ function f(e) {
47
+ let n = t.filter((t) => t.open && (e === void 0 || t.id === e));
48
+ if (n.length !== 0) {
49
+ a(t.map((e) => n.includes(e) ? {
50
+ ...e,
51
+ open: !1
52
+ } : e));
53
+ for (let e of n) e.onDismiss?.();
54
+ setTimeout(() => {
55
+ a(t.filter((e) => !n.some((t) => t.id === e.id && !e.open)));
56
+ }, i);
57
+ }
58
+ }
59
+ function p(t) {
60
+ return typeof t == "object" && !!t && !e(t) && !Array.isArray(t);
61
+ }
62
+ function m(e, t) {
63
+ let n = typeof e == "function" ? e(t) : e;
64
+ return p(n) ? n : { title: n };
65
+ }
66
+ function h(e) {
67
+ return d(p(e) ? e : { title: e });
68
+ }
69
+ h.update = (e, n) => {
70
+ t.some((t) => t.id === e && t.open) && d({
71
+ ...n,
72
+ id: e
73
+ });
74
+ }, h.dismiss = (e) => {
75
+ f(e);
76
+ }, h.promise = (e, t) => {
77
+ let n = d({
78
+ ...m(t.loading, void 0),
79
+ loading: !0,
80
+ dismissible: !1
81
+ });
82
+ return e.then((e) => {
83
+ d({
84
+ tone: "positive",
85
+ duration: void 0,
86
+ title: void 0,
87
+ description: void 0,
88
+ action: void 0,
89
+ onDismiss: void 0,
90
+ ...m(t.success, e),
91
+ id: n,
92
+ loading: !1,
93
+ dismissible: !0
94
+ });
95
+ }, (e) => {
96
+ d({
97
+ tone: "critical",
98
+ duration: void 0,
99
+ title: void 0,
100
+ description: void 0,
101
+ action: void 0,
102
+ onDismiss: void 0,
103
+ ...m(t.error, e),
104
+ id: n,
105
+ loading: !1,
106
+ dismissible: !0
107
+ });
108
+ }), e;
109
+ };
110
+ var g = [], _ = /* @__PURE__ */ new Set();
111
+ function v(e) {
112
+ g.push(e);
113
+ for (let e of _) e();
114
+ return () => {
115
+ let t = g.indexOf(e);
116
+ t >= 0 && g.splice(t, 1);
117
+ for (let e of _) e();
118
+ };
119
+ }
120
+ function y(e) {
121
+ return _.add(e), () => {
122
+ _.delete(e);
123
+ };
124
+ }
125
+ function b() {
126
+ return g[0];
127
+ }
128
+ //#endregion
129
+ export { l as getServerToasts, s as getToasts, b as primaryToaster, v as registerToaster, y as subscribeToasters, o as subscribeToasts, h as toast };
130
+
131
+ //# sourceMappingURL=toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.js","names":["toasts","listeners","nextId","REMOVE_AFTER_MS","emit","next","listener","subscribeToasts","getToasts","EMPTY","getServerToasts","changesMessage","key","options","record","upsert","id","existing","version","close","closing","closed","isOptions","message","isValidElement","toOptions","resolved","value","toast","messages","promise","error","toasters","toasterListeners","registerToaster","token","index","subscribeToasters","primaryToaster"],"sources":["../../../../src/components/feedback/Toaster/toast.ts"],"sourcesContent":["import { isValidElement, type ReactNode } from 'react'\n\nexport type ToastTone = 'neutral' | 'info' | 'positive' | 'caution' | 'critical'\n\nexport interface ToastAction {\n /** The button's label: \"Undo\", \"Retry\", \"View invoice\". */\n label: string\n /** Runs when the button is pressed. The toast closes afterwards. */\n onClick: () => void\n /**\n * What a screen reader user hears about how to do this without the toast, since it may have\n * gone by the time they reach it: \"Undo from the Trash page\". Default: the label.\n */\n altText?: string\n}\n\nexport interface ToastOptions {\n /**\n * Names the toast. Raising a toast with the `id` of one still on screen updates it instead of\n * stacking a second, so a repeated \"Sync failed\" shows once.\n */\n id?: string\n /** The short message, read first: \"Invoice sent\". */\n title?: ReactNode\n /** One more sentence when the title needs it: \"Kittiwake Ltd, £1,240.00\". */\n description?: ReactNode\n /** Meaning: the glyph and the tab on the top edge. `critical` and `caution` interrupt. Default `neutral`. */\n tone?: ToastTone\n /** Shows a spinner in place of the glyph, for work still in progress. */\n loading?: boolean\n /** One button, such as Undo or Retry. */\n action?: ToastAction\n /**\n * How long it stays, in milliseconds. `Infinity` keeps it until it's dismissed. Default 5000,\n * 8000 for `caution`, and `Infinity` for `critical` and `loading`, so errors wait to be read.\n * The timer pauses while the pointer or focus is on the toasts, and while the window is in the\n * background.\n */\n duration?: number\n /** Show the close button. Default `true`. */\n dismissible?: boolean\n /** Runs when the toast closes: on a timer, a swipe, Escape or the close button. */\n onDismiss?: () => void\n}\n\n/** A toast as the `Toaster` sees it. */\nexport interface ToastRecord extends ToastOptions {\n id: string\n /** `false` once it's dismissed: it plays its exit and is then removed. */\n open: boolean\n /** Goes up each time the message changes, so the change is announced again. */\n version: number\n}\n\ntype Listener = () => void\n\nlet toasts: ToastRecord[] = []\nconst listeners = new Set<Listener>()\nlet nextId = 0\n\nconst REMOVE_AFTER_MS = 1000\n\nfunction emit(next: ToastRecord[]) {\n toasts = next\n for (const listener of listeners) listener()\n}\n\n/** @internal The `Toaster`'s subscription. */\nexport function subscribeToasts(listener: Listener): () => void {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\n/** @internal The current toasts, oldest first. */\nexport function getToasts(): ToastRecord[] {\n return toasts\n}\n\nconst EMPTY: ToastRecord[] = []\n/** @internal The server snapshot: nothing is raised during a server render. */\nexport function getServerToasts(): ToastRecord[] {\n return EMPTY\n}\n\nfunction changesMessage(record: ToastRecord, options: ToastOptions): boolean {\n return (['title', 'description', 'tone', 'loading'] as const).some(\n (key) => key in options && options[key] !== record[key],\n )\n}\n\nfunction upsert(options: ToastOptions): string {\n const id = options.id ?? `toast-${String(++nextId)}`\n const existing = toasts.find((record) => record.id === id && record.open)\n if (existing) {\n const version = changesMessage(existing, options) ? existing.version + 1 : existing.version\n emit(\n toasts.map((record) =>\n record === existing ? { ...record, ...options, id, version } : record,\n ),\n )\n } else {\n emit([\n ...toasts.filter((record) => record.id !== id),\n { ...options, id, open: true, version: 0 },\n ])\n }\n return id\n}\n\nfunction close(id?: string) {\n const closing = toasts.filter((record) => record.open && (id === undefined || record.id === id))\n if (closing.length === 0) return\n emit(toasts.map((record) => (closing.includes(record) ? { ...record, open: false } : record)))\n for (const record of closing) record.onDismiss?.()\n // Long enough for the exit animation; then the record goes.\n setTimeout(() => {\n emit(\n toasts.filter((record) => !closing.some((closed) => closed.id === record.id && !record.open)),\n )\n }, REMOVE_AFTER_MS)\n}\n\n/** A message for one stage of `toast.promise`: text, full options, or either worked out from the result. */\nexport type ToastPromiseMessage<T> =\n ReactNode | ToastOptions | ((value: T) => ReactNode | ToastOptions)\n\nexport interface ToastPromiseMessages<T> {\n /** While it's pending. Shown with a spinner. */\n loading: ReactNode | ToastOptions\n /** When it resolves. Shown in the `positive` tone. */\n success: ToastPromiseMessage<T>\n /** When it rejects, with the error. Shown in the `critical` tone. */\n error: ToastPromiseMessage<unknown>\n}\n\nfunction isOptions(message: unknown): message is ToastOptions {\n return (\n typeof message === 'object' &&\n message !== null &&\n !isValidElement(message) &&\n !Array.isArray(message)\n )\n}\n\nfunction toOptions<T>(message: ToastPromiseMessage<T>, value: T): ToastOptions {\n const resolved = typeof message === 'function' ? message(value) : message\n return isOptions(resolved) ? resolved : { title: resolved }\n}\n\n/**\n * Raises a toast and returns its id. Takes the message as text, or full options.\n *\n * @remarks\n * Call it from anywhere, inside React or out of it: an event handler, a query's error callback, a\n * socket listener. A {@link Toaster | Toaster} mounted once near the root shows it.\n *\n * - `toast.update(id, options)` changes a toast on screen, such as a retry count.\n * - `toast.dismiss(id)` closes one; `toast.dismiss()` closes them all.\n * - `toast.promise(promise, { loading, success, error })` shows a loading toast that turns into\n * the success or error message when the promise settles, and returns the same promise.\n */\nexport function toast(message: ReactNode | ToastOptions): string {\n return upsert(isOptions(message) ? message : { title: message })\n}\n\n/** Changes a toast that's on screen. Does nothing if it has gone. */\ntoast.update = (id: string, options: ToastOptions): void => {\n if (toasts.some((record) => record.id === id && record.open)) upsert({ ...options, id })\n}\n\n/** Closes one toast, or every toast when no id is given. */\ntoast.dismiss = (id?: string): void => {\n close(id)\n}\n\n/**\n * Shows a loading toast while `promise` is pending, then the success or error message in its\n * place. Returns `promise`, so you can still await it.\n */\ntoast.promise = <T>(promise: Promise<T>, messages: ToastPromiseMessages<T>): Promise<T> => {\n const id = upsert({\n ...toOptions(messages.loading, undefined),\n loading: true,\n dismissible: false,\n })\n promise.then(\n (value) => {\n upsert({\n tone: 'positive',\n duration: undefined,\n title: undefined,\n description: undefined,\n action: undefined,\n onDismiss: undefined,\n ...toOptions(messages.success, value),\n id,\n loading: false,\n dismissible: true,\n })\n },\n (error: unknown) => {\n upsert({\n tone: 'critical',\n duration: undefined,\n title: undefined,\n description: undefined,\n action: undefined,\n onDismiss: undefined,\n ...toOptions(messages.error, error),\n id,\n loading: false,\n dismissible: true,\n })\n },\n )\n return promise\n}\n\nconst toasters: object[] = []\nconst toasterListeners = new Set<Listener>()\n\n/**\n * @internal Registers a mounted `Toaster`. Only the first one registered shows toasts, so a page\n * that mounts two (a docs page with several examples) doesn't show each toast twice.\n */\nexport function registerToaster(token: object): () => void {\n toasters.push(token)\n for (const listener of toasterListeners) listener()\n return () => {\n const index = toasters.indexOf(token)\n if (index >= 0) toasters.splice(index, 1)\n for (const listener of toasterListeners) listener()\n }\n}\n\n/** @internal Subscribes to changes in which `Toaster` shows toasts. */\nexport function subscribeToasters(listener: Listener): () => void {\n toasterListeners.add(listener)\n return () => {\n toasterListeners.delete(listener)\n }\n}\n\n/** @internal The `Toaster` that shows toasts, if any is mounted. */\nexport function primaryToaster(): object | undefined {\n return toasters[0]\n}\n\n/** @internal Clears every toast at once, with no exit. For tests. */\nexport function resetToasts(): void {\n emit([])\n}\n"],"mappings":";;AAwDA,IAAIA,IAAwB,CAAC,GACvBC,oBAAY,IAAI,IAAc,GAChCC,IAAS,GAEPC,IAAkB;AAExB,SAASC,EAAK,GAAqB;CACjC,IAASC;CACT,KAAK,IAAMC,KAAYL,GAAW,EAAS;AAC7C;AAGA,SAAgBM,EAAgB,GAAgC;CAE9D,OADAN,EAAU,IAAIK,CAAQ,SACT;EACX,EAAU,OAAOA,CAAQ;CAC3B;AACF;AAGA,SAAgBE,IAA2B;CACzC,OAAOR;AACT;AAEA,IAAMS,IAAuB,CAAC;AAE9B,SAAgBC,IAAiC;CAC/C,OAAOD;AACT;AAEA,SAASE,EAAe,GAAqB,GAAgC;CAC3E,OAAQ;EAAC;EAAS;EAAe;EAAQ;CAAS,CAAC,CAAW,MAC3D,MAAQC,KAAOC,KAAWA,EAAQD,OAASE,EAAOF,EACrD;AACF;AAEA,SAASG,EAAO,GAA+B;CAC7C,IAAMC,IAAKH,EAAQ,MAAM,SAAS,OAAO,EAAEX,CAAM,KAC3Ce,IAAWjB,EAAO,MAAM,MAAWc,EAAO,OAAOE,KAAMF,EAAO,IAAI;CACxE,IAAIG,GAAU;EACZ,IAAMC,IAAUP,EAAeM,GAAUJ,CAAO,IAAII,EAAS,UAAU,IAAIA,EAAS;EACpF,EACEjB,EAAO,KAAK,MACVc,MAAWG,IAAW;GAAE,GAAGH;GAAQ,GAAGD;GAAS;GAAI;EAAQ,IAAIC,CACjE,CACF;CACF,OACE,EAAK,CACH,GAAGd,EAAO,QAAQ,MAAWc,EAAO,OAAOE,CAAE,GAC7C;EAAE,GAAGH;EAAS;EAAI,MAAM;EAAM,SAAS;CAAE,CAC3C,CAAC;CAEH,OAAOG;AACT;AAEA,SAASG,EAAM,GAAa;CAC1B,IAAMC,IAAUpB,EAAO,QAAQ,MAAWc,EAAO,SAASE,MAAO,KAAA,KAAaF,EAAO,OAAOE,EAAG;CAC/F,IAAII,EAAQ,WAAW,GACvB;IAAKpB,EAAO,KAAK,MAAYoB,EAAQ,SAASN,CAAM,IAAI;GAAE,GAAGA;GAAQ,MAAM;EAAM,IAAIA,CAAO,CAAC;EAC7F,KAAK,IAAMA,KAAUM,GAAS,EAAO,YAAY;EAEjD,iBAAiB;GACf,EACEpB,EAAO,QAAQ,MAAW,CAACoB,EAAQ,MAAM,MAAWC,EAAO,OAAOP,EAAO,MAAM,CAACA,EAAO,IAAI,CAAC,CAC9F;EACF,GAAGX,CAAe;CAP2E;AAQ/F;AAeA,SAASmB,EAAU,GAA2C;CAC5D,OACE,OAAOC,KAAY,cACnBA,KACA,CAACC,EAAeD,CAAO,KACvB,CAAC,MAAM,QAAQA,CAAO;AAE1B;AAEA,SAASE,EAAa,GAAiC,GAAwB;CAC7E,IAAMC,IAAW,OAAOH,KAAY,aAAaA,EAAQI,CAAK,IAAIJ;CAClE,OAAOD,EAAUI,CAAQ,IAAIA,IAAW,EAAE,OAAOA,EAAS;AAC5D;AAcA,SAAgBE,EAAM,GAA2C;CAC/D,OAAOb,EAAOO,EAAUC,CAAO,IAAIA,IAAU,EAAE,OAAOA,EAAQ,CAAC;AACjE;AAGA,EAAM,UAAU,GAAY,MAAgC;CAC1D,AAAIvB,EAAO,MAAM,MAAWc,EAAO,OAAOE,KAAMF,EAAO,IAAI,KAAGC,EAAO;EAAE,GAAGF;EAAS;CAAG,CAAC;AACzF,GAGA,EAAM,WAAW,MAAsB;CACrC,EAAMG,CAAE;AACV,GAMA,EAAM,WAAc,GAAqB,MAAkD;CACzF,IAAMA,IAAKD,EAAO;EAChB,GAAGU,EAAUI,EAAS,SAAS,KAAA,CAAS;EACxC,SAAS;EACT,aAAa;CACf,CAAC;CA+BD,OA9BAC,EAAQ,MACL,MAAU;EACT,EAAO;GACL,MAAM;GACN,UAAU,KAAA;GACV,OAAO,KAAA;GACP,aAAa,KAAA;GACb,QAAQ,KAAA;GACR,WAAW,KAAA;GACX,GAAGL,EAAUI,EAAS,SAASF,CAAK;GACpC;GACA,SAAS;GACT,aAAa;EACf,CAAC;CACH,IACC,MAAmB;EAClB,EAAO;GACL,MAAM;GACN,UAAU,KAAA;GACV,OAAO,KAAA;GACP,aAAa,KAAA;GACb,QAAQ,KAAA;GACR,WAAW,KAAA;GACX,GAAGF,EAAUI,EAAS,OAAOE,CAAK;GAClC;GACA,SAAS;GACT,aAAa;EACf,CAAC;CACH,CACF,GACOD;AACT;AAEA,IAAME,IAAqB,CAAC,GACtBC,oBAAmB,IAAI,IAAc;AAM3C,SAAgBC,EAAgB,GAA2B;CACzD,EAAS,KAAKC,CAAK;CACnB,KAAK,IAAM7B,KAAY2B,GAAkB,EAAS;CAClD,aAAa;EACX,IAAMG,IAAQJ,EAAS,QAAQG,CAAK;EACpC,AAAIC,KAAS,KAAGJ,EAAS,OAAOI,GAAO,CAAC;EACxC,KAAK,IAAM9B,KAAY2B,GAAkB,EAAS;CACpD;AACF;AAGA,SAAgBI,EAAkB,GAAgC;CAEhE,OADAJ,EAAiB,IAAI3B,CAAQ,SAChB;EACX,EAAiB,OAAOA,CAAQ;CAClC;AACF;AAGA,SAAgBgC,IAAqC;CACnD,OAAON,EAAS;AAClB"}
@@ -0,0 +1,87 @@
1
+ import { type HTMLAttributes } from 'react';
2
+ import type { DateRangeValue } from '../DateRangeField/index.js';
3
+ /** Accessible names of the calendar's own buttons. */
4
+ export interface CalendarLabels {
5
+ /** Default `'Previous month'`. */
6
+ previousMonth: string;
7
+ /** Default `'Next month'`. */
8
+ nextMonth: string;
9
+ }
10
+ interface CalendarCommonProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {
11
+ /** Earliest date that can be picked (`YYYY-MM-DD`). */
12
+ min?: string;
13
+ /** Latest date that can be picked (`YYYY-MM-DD`). */
14
+ max?: string;
15
+ /** Marks other dates unavailable: weekends, public holidays, booked nights. */
16
+ isDateDisabled?: (date: string) => boolean;
17
+ /** 0 (Sunday) to 6 (Saturday). Defaults to the locale's own week. */
18
+ firstDayOfWeek?: number;
19
+ /** BCP 47 locale for month and weekday names. Default `en-AU`. */
20
+ locale?: string;
21
+ /** The zone "today" is read in. Defaults to the device's. */
22
+ timeZone?: string;
23
+ /** How many months to show side by side (they wrap when narrow). Default `1`. */
24
+ months?: 1 | 2;
25
+ /** The first month shown (`YYYY-MM`). Controlled. */
26
+ month?: string;
27
+ /** The first month shown at first (`YYYY-MM`). Defaults to the selected or current month. */
28
+ defaultMonth?: string;
29
+ onMonthChange?: (month: string) => void;
30
+ disabled?: boolean;
31
+ /** Dates can be focused and read but not picked. */
32
+ readOnly?: boolean;
33
+ /** Focus the current day once mounted, as a picker's popover does. */
34
+ autoFocus?: boolean;
35
+ labels?: Partial<CalendarLabels>;
36
+ }
37
+ export interface CalendarSingleProps extends CalendarCommonProps {
38
+ /** `single` (default) picks one date; `range` picks a start and an end. */
39
+ mode?: 'single';
40
+ /** `YYYY-MM-DD`, or `''` for none. */
41
+ value?: string;
42
+ defaultValue?: string;
43
+ onValueChange?: (value: string) => void;
44
+ }
45
+ export interface CalendarRangeProps extends CalendarCommonProps {
46
+ mode: 'range';
47
+ /** The first click sets `start` (and clears `end`), the second sets `end`. */
48
+ value?: DateRangeValue;
49
+ defaultValue?: DateRangeValue;
50
+ onValueChange?: (value: DateRangeValue) => void;
51
+ }
52
+ export type CalendarProps = CalendarSingleProps | CalendarRangeProps;
53
+ /**
54
+ * A month grid for picking a date or a range, with the full keyboard of a date grid.
55
+ *
56
+ * @remarks
57
+ * `Calendar` shows one or two months as a grid of days. Click a day or move with the arrow keys
58
+ * and press Enter. In `range` mode the first pick is the start and the second the end, with the
59
+ * days between shaded as you go. `min`, `max` and `isDateDisabled` mark days that can't be picked;
60
+ * they stay focusable, so a screen reader can still say why a date is missing. Month and weekday
61
+ * names come from `locale`, and so does the first day of the week unless you set
62
+ * `firstDayOfWeek`.
63
+ *
64
+ * {@link DateInput | DateInput}, {@link DateTimeInput | DateTimeInput} and
65
+ * {@link DateRangePickerField | DateRangePickerField} open it in a popover. Use it on its own for a calendar
66
+ * that's always visible, such as a booking page.
67
+ *
68
+ * ## Keyboard
69
+ *
70
+ * | Key | Moves to |
71
+ * | --- | --- |
72
+ * | Arrow keys | The previous or next day, or the same day in the previous or next week |
73
+ * | Home / End | The first or last day of the week |
74
+ * | Page Up / Page Down | The same day in the previous or next month |
75
+ * | Shift + Page Up / Page Down | The same day in the previous or next year |
76
+ * | Enter / Space | Picks the focused day |
77
+ *
78
+ * @privateRemarks
79
+ * ARIA grid pattern: one `<table role="grid">` per month, labelled by its title, with a roving
80
+ * tabindex on the day cells (the focused date is the only tab stop). Cells outside the month are
81
+ * empty, so two months side by side never show a date twice. Values are ISO strings; all date
82
+ * maths goes through `internal/dates` (ADR 0042).
83
+ *
84
+ * <Calendar mode="range" months={2} value={stay} onValueChange={setStay} />
85
+ */
86
+ export declare const Calendar: import("react").ForwardRefExoticComponent<CalendarProps & import("react").RefAttributes<HTMLDivElement>>;
87
+ export {};
@@ -0,0 +1,217 @@
1
+ import { cx as e } from "../../../utils/cx.js";
2
+ import { ChevronLeftIcon as t, ChevronRightIcon as n } from "../../../icons/icons.js";
3
+ import { useMergedRefs as r } from "../internal/refs.js";
4
+ import { useLatest as i } from "../internal/useLatest.js";
5
+ import { IconButton as a } from "../../actions/IconButton/IconButton.js";
6
+ import { DEFAULT_LOCALE as o, addDays as s, addMonths as c, clampDate as l, compareDates as u, dayOfWeek as d, daysInMonth as f, defaultFirstDayOfWeek as ee, formatDate as p, formatFullDate as te, formatMonthYear as ne, isSameDay as m, pad as h, parseDate as g, todayIn as re, weekdayNames as ie } from "../internal/dates.js";
7
+ import _ from "./Calendar.module.js";
8
+ import { forwardRef as v, useEffect as ae, useId as oe, useRef as y, useState as b } from "react";
9
+ import { jsx as x, jsxs as S } from "react/jsx-runtime";
10
+ //#region src/components/inputs/Calendar/Calendar.tsx
11
+ var se = {
12
+ previousMonth: "Previous month",
13
+ nextMonth: "Next month"
14
+ }, C = (e) => e.year * 12 + e.month - 1, w = (e) => ({
15
+ year: Math.floor(e / 12),
16
+ month: e % 12 + 1
17
+ }), T = (e) => {
18
+ let t = e ? /^(\d{4})-(\d{2})$/.exec(e) : null;
19
+ if (!t) return null;
20
+ let n = Number(t[2]);
21
+ return n >= 1 && n <= 12 ? {
22
+ year: Number(t[1]),
23
+ month: n
24
+ } : null;
25
+ }, E = (e) => `${h(e.year, 4)}-${h(e.month)}`;
26
+ function ce(e, t) {
27
+ let n = {
28
+ year: e.year,
29
+ month: e.month,
30
+ day: 1
31
+ }, r = (d(n) - t + 7) % 7, i = f(e.year, e.month);
32
+ return Array.from({ length: 6 }, (e, t) => Array.from({ length: 7 }, (e, a) => {
33
+ let o = t * 7 + a - r + 1;
34
+ return o >= 1 && o <= i ? {
35
+ ...n,
36
+ day: o
37
+ } : null;
38
+ }));
39
+ }
40
+ var D = v(function(h, v) {
41
+ let { mode: D = "single", value: O, defaultValue: ue, onValueChange: de, min: fe, max: pe, isDateDisabled: me, firstDayOfWeek: he, locale: k = o, timeZone: ge, months: A = 1, month: j, defaultMonth: _e, onMonthChange: ve, disabled: M = !1, readOnly: ye = !1, autoFocus: be = !1, labels: xe, className: Se, ...Ce } = h, N = {
42
+ ...se,
43
+ ...xe
44
+ }, we = oe(), P = y(null), Te = r(v, P), Ee = i(de), [De, Oe] = b(ue ?? (D === "range" ? le : "")), F = O ?? De, I = typeof F == "string" ? {
45
+ start: g(F),
46
+ end: g(F)
47
+ } : {
48
+ start: g(F.start),
49
+ end: g(F.end)
50
+ }, L = g(fe ?? ""), R = g(pe ?? ""), z = re(ge), B = (he ?? ee(k)) % 7, ke = !M && !ye, [V, H] = b(() => l(I.start ?? z, L, R)), [Ae, je] = b(() => T(_e) ?? {
51
+ year: V.year,
52
+ month: V.month
53
+ }), U = T(j) ?? Ae, [W, G] = b(null), K = y(be), q = (e) => {
54
+ C(e) !== C(U) && (j === void 0 && je(e), ve?.(E(e)));
55
+ }, J = (e) => L !== null && u(e, L) < 0 || R !== null && u(e, R) > 0 || (me?.(p(e)) ?? !1), Me = (e) => {
56
+ let t = l(e, L, R), n = C(U), r = C(t);
57
+ r < n ? q(w(r)) : r > n + A - 1 && q(w(r - A + 1)), K.current = !0, H(t);
58
+ }, Y = C(U), X = C(V);
59
+ if (X < Y || X > Y + A - 1) {
60
+ let e = Math.min(V.day, f(U.year, U.month)), t = l({
61
+ ...U,
62
+ day: e
63
+ }, L, R), n = C(t);
64
+ H(n < Y || n > Y + A - 1 ? {
65
+ ...U,
66
+ day: e
67
+ } : t);
68
+ }
69
+ ae(() => {
70
+ K.current && (K.current = !1, P.current?.querySelector(`[data-date="${p(V)}"]`)?.focus());
71
+ }, [V, U]);
72
+ let Ne = (e) => {
73
+ if (H(e), !ke || J(e)) return;
74
+ let t = p(e), n;
75
+ n = D === "single" ? t : !I.start || I.end ? {
76
+ start: t,
77
+ end: ""
78
+ } : u(e, I.start) < 0 ? {
79
+ start: t,
80
+ end: p(I.start)
81
+ } : {
82
+ start: p(I.start),
83
+ end: t
84
+ }, O === void 0 && Oe(n), Ee.current?.(n);
85
+ }, Pe = (e) => {
86
+ let t = P.current && getComputedStyle(P.current).direction === "rtl" ? -1 : 1, n = (d(V) - B + 7) % 7, r = {
87
+ ArrowLeft: () => s(V, -t),
88
+ ArrowRight: () => s(V, t),
89
+ ArrowUp: () => s(V, -7),
90
+ ArrowDown: () => s(V, 7),
91
+ Home: () => s(V, -n),
92
+ End: () => s(V, 6 - n),
93
+ PageUp: () => c(V, e.shiftKey ? -12 : -1),
94
+ PageDown: () => c(V, e.shiftKey ? 12 : 1)
95
+ }[e.key];
96
+ if (r) {
97
+ e.preventDefault();
98
+ let t = r();
99
+ Me(t), D === "range" && G(t);
100
+ return;
101
+ }
102
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), Ne(V));
103
+ }, Fe = (e) => {
104
+ let t = w(C(U) + e);
105
+ q(t);
106
+ let n = w(C(V) + e);
107
+ H(l({
108
+ ...n,
109
+ day: Math.min(V.day, f(n.year, n.month))
110
+ }, L, R));
111
+ }, Z = D === "range" && I.start !== null && I.end === null, Q = D === "range" ? I.start : null, $ = D === "range" ? I.end : null;
112
+ Z && W && I.start && ([Q, $] = u(W, I.start) < 0 ? [W, I.start] : [I.start, W]);
113
+ let Ie = ie(k, B), Le = Array.from({ length: A }, (e, t) => w(C(U) + t)), Re = !L || C(U) > C(L), ze = !R || C(U) + A - 1 < C(R);
114
+ return /* @__PURE__ */ x("div", {
115
+ ref: Te,
116
+ role: "group",
117
+ className: e(_.root, Se),
118
+ "data-mode": D,
119
+ "data-months": A,
120
+ "data-disabled": M || void 0,
121
+ "aria-disabled": M || void 0,
122
+ ...Ce,
123
+ children: /* @__PURE__ */ x("div", {
124
+ className: _.months,
125
+ children: Le.map((e, r) => {
126
+ let i = `${we}-title-${String(r)}`, o = r === A - 1;
127
+ return /* @__PURE__ */ S("div", {
128
+ className: _.month,
129
+ children: [/* @__PURE__ */ S("div", {
130
+ className: _.header,
131
+ children: [/* @__PURE__ */ x("div", {
132
+ id: i,
133
+ className: _.title,
134
+ "aria-live": "polite",
135
+ children: ne(k, e.year, e.month)
136
+ }), o ? /* @__PURE__ */ S("div", {
137
+ className: _.nav,
138
+ children: [/* @__PURE__ */ x(a, {
139
+ variant: "ghost",
140
+ size: "sm",
141
+ label: N.previousMonth,
142
+ icon: /* @__PURE__ */ x(t, {}),
143
+ disabled: M || !Re,
144
+ onClick: () => {
145
+ Fe(-1);
146
+ }
147
+ }), /* @__PURE__ */ x(a, {
148
+ variant: "ghost",
149
+ size: "sm",
150
+ label: N.nextMonth,
151
+ icon: /* @__PURE__ */ x(n, {}),
152
+ disabled: M || !ze,
153
+ onClick: () => {
154
+ Fe(1);
155
+ }
156
+ })]
157
+ }) : null]
158
+ }), /* @__PURE__ */ S("table", {
159
+ role: "grid",
160
+ className: _.grid,
161
+ "aria-labelledby": i,
162
+ children: [/* @__PURE__ */ x("thead", { children: /* @__PURE__ */ x("tr", { children: Ie.map((e) => /* @__PURE__ */ x("th", {
163
+ scope: "col",
164
+ abbr: e.long,
165
+ className: _.weekday,
166
+ children: e.short
167
+ }, e.long)) }) }), /* @__PURE__ */ x("tbody", { children: ce(e, B).map((e, t) => /* @__PURE__ */ x("tr", { children: e.map((e, t) => {
168
+ if (!e) return /* @__PURE__ */ x("td", {
169
+ role: "gridcell",
170
+ className: _.empty
171
+ }, t);
172
+ let n = p(e), r = J(e), i = m(e, Q), a = m(e, $), o = Q !== null && $ !== null && u(e, Q) >= 0 && u(e, $) <= 0, s = D === "single" ? m(e, I.start) : m(e, I.start) || m(e, I.end) || !Z && o, c = m(e, V);
173
+ return /* @__PURE__ */ x("td", {
174
+ role: "gridcell",
175
+ className: _.day,
176
+ "data-date": n,
177
+ tabIndex: M ? void 0 : c ? 0 : -1,
178
+ "aria-label": te(k, e),
179
+ "aria-selected": s,
180
+ "aria-disabled": M || r || void 0,
181
+ "aria-current": m(e, z) ? "date" : void 0,
182
+ "data-today": m(e, z) || void 0,
183
+ "data-selected": s || void 0,
184
+ "data-unavailable": r || void 0,
185
+ "data-range-start": o && i || void 0,
186
+ "data-range-end": o && a || void 0,
187
+ "data-in-range": o || void 0,
188
+ "data-preview": Z && o || void 0,
189
+ onClick: () => {
190
+ Ne(e);
191
+ },
192
+ onKeyDown: Pe,
193
+ onFocus: () => {
194
+ c || H(e);
195
+ },
196
+ onPointerEnter: () => {
197
+ Z && G(e);
198
+ },
199
+ children: /* @__PURE__ */ x("span", {
200
+ className: _.dayText,
201
+ children: e.day
202
+ })
203
+ }, t);
204
+ }) }, t)) })]
205
+ })]
206
+ }, E(e));
207
+ })
208
+ })
209
+ });
210
+ }), le = {
211
+ start: "",
212
+ end: ""
213
+ };
214
+ //#endregion
215
+ export { D as Calendar };
216
+
217
+ //# sourceMappingURL=Calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Calendar.js","names":["styles","Calendar_module_default","DEFAULT_LABELS","monthIndex","m","monthFromIndex","index","parseMonth","match","text","month","formatMonth","pad","monthGrid","first","offset","dayOfWeek","firstDay","length","daysInMonth","day","row","column","Calendar","forwardRef","valueProp","DEFAULT_LOCALE","monthProp","labelsProp","rest","props","labels","autoId","useId","rootRef","useRef","composedRef","useMergedRefs","ref","onValueChangeRef","useLatest","onValueChange","internal","setInternal","useState","defaultValue","mode","EMPTY_RANGE","value","range","parseDate","minDate","min","maxDate","max","today","todayIn","timeZone","firstDayOfWeek","defaultFirstDayOfWeek","locale","interactive","disabled","readOnly","focused","setFocused","clampDate","internalMonth","setInternalMonth","defaultMonth","visible","hovered","setHovered","shouldFocus","autoFocus","setMonth","next","onMonthChange","isUnavailable","compareDates","date","isDateDisabled","formatDate","moveFocus","months","firstVisible","focusedIndex","select","iso","handleKeyDown","ahead","weekStart","move","addDays","addMonths","event","turnPage","step","targetMonth","pending","spanStart","spanEnd","weekdays","weekdayNames","visibleMonths","i","canGoBack","canGoForward","cx","className","titleId","monthNumber","last","formatMonthYear","IconButton","ChevronLeftIcon","ChevronRightIcon","weekday","week","unavailable","isStart","isSameDay","isEnd","inSpan","selected","isFocused","formatFullDate"],"sources":["../../../../src/components/inputs/Calendar/Calendar.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { ChevronLeftIcon, ChevronRightIcon } from '#icons'\nimport { cx } from '#utils/cx'\nimport { IconButton } from '#components/actions/IconButton'\nimport type { DateRangeValue } from '#components/inputs/DateRangeField'\nimport { useMergedRefs } from '#components/inputs/internal/refs'\nimport { useLatest } from '#components/inputs/internal/useLatest'\nimport {\n DEFAULT_LOCALE,\n addDays,\n addMonths,\n clampDate,\n compareDates,\n dayOfWeek,\n daysInMonth,\n defaultFirstDayOfWeek,\n formatDate,\n formatFullDate,\n formatMonthYear,\n isSameDay,\n pad,\n parseDate,\n todayIn,\n weekdayNames,\n type CalendarDate,\n} from '#components/inputs/internal/dates'\nimport styles from './Calendar.module.css'\n\n/** Accessible names of the calendar's own buttons. */\nexport interface CalendarLabels {\n /** Default `'Previous month'`. */\n previousMonth: string\n /** Default `'Next month'`. */\n nextMonth: string\n}\n\nconst DEFAULT_LABELS: CalendarLabels = {\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n}\n\ninterface CalendarCommonProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /** Earliest date that can be picked (`YYYY-MM-DD`). */\n min?: string\n /** Latest date that can be picked (`YYYY-MM-DD`). */\n max?: string\n /** Marks other dates unavailable: weekends, public holidays, booked nights. */\n isDateDisabled?: (date: string) => boolean\n /** 0 (Sunday) to 6 (Saturday). Defaults to the locale's own week. */\n firstDayOfWeek?: number\n /** BCP 47 locale for month and weekday names. Default `en-AU`. */\n locale?: string\n /** The zone \"today\" is read in. Defaults to the device's. */\n timeZone?: string\n /** How many months to show side by side (they wrap when narrow). Default `1`. */\n months?: 1 | 2\n /** The first month shown (`YYYY-MM`). Controlled. */\n month?: string\n /** The first month shown at first (`YYYY-MM`). Defaults to the selected or current month. */\n defaultMonth?: string\n onMonthChange?: (month: string) => void\n disabled?: boolean\n /** Dates can be focused and read but not picked. */\n readOnly?: boolean\n /** Focus the current day once mounted, as a picker's popover does. */\n autoFocus?: boolean\n labels?: Partial<CalendarLabels>\n}\n\nexport interface CalendarSingleProps extends CalendarCommonProps {\n /** `single` (default) picks one date; `range` picks a start and an end. */\n mode?: 'single'\n /** `YYYY-MM-DD`, or `''` for none. */\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n}\n\nexport interface CalendarRangeProps extends CalendarCommonProps {\n mode: 'range'\n /** The first click sets `start` (and clears `end`), the second sets `end`. */\n value?: DateRangeValue\n defaultValue?: DateRangeValue\n onValueChange?: (value: DateRangeValue) => void\n}\n\nexport type CalendarProps = CalendarSingleProps | CalendarRangeProps\n\ninterface Month {\n year: number\n month: number\n}\n\nconst monthIndex = (m: Month) => m.year * 12 + m.month - 1\nconst monthFromIndex = (index: number): Month => ({\n year: Math.floor(index / 12),\n month: (index % 12) + 1,\n})\nconst parseMonth = (text: string | undefined): Month | null => {\n const match = text ? /^(\\d{4})-(\\d{2})$/.exec(text) : null\n if (!match) return null\n const month = Number(match[2])\n return month >= 1 && month <= 12 ? { year: Number(match[1]), month } : null\n}\nconst formatMonth = (m: Month) => `${pad(m.year, 4)}-${pad(m.month)}`\n\n/** Six rows of seven: every month the same height, so a popover never jumps. */\nfunction monthGrid(month: Month, firstDay: number): (CalendarDate | null)[][] {\n const first = { year: month.year, month: month.month, day: 1 }\n const offset = (dayOfWeek(first) - firstDay + 7) % 7\n const length = daysInMonth(month.year, month.month)\n return Array.from({ length: 6 }, (_, row) =>\n Array.from({ length: 7 }, (_, column) => {\n const day = row * 7 + column - offset + 1\n return day >= 1 && day <= length ? { ...first, day } : null\n }),\n )\n}\n\n/**\n * A month grid for picking a date or a range, with the full keyboard of a date grid.\n *\n * @remarks\n * `Calendar` shows one or two months as a grid of days. Click a day or move with the arrow keys\n * and press Enter. In `range` mode the first pick is the start and the second the end, with the\n * days between shaded as you go. `min`, `max` and `isDateDisabled` mark days that can't be picked;\n * they stay focusable, so a screen reader can still say why a date is missing. Month and weekday\n * names come from `locale`, and so does the first day of the week unless you set\n * `firstDayOfWeek`.\n *\n * {@link DateInput | DateInput}, {@link DateTimeInput | DateTimeInput} and\n * {@link DateRangePickerField | DateRangePickerField} open it in a popover. Use it on its own for a calendar\n * that's always visible, such as a booking page.\n *\n * ## Keyboard\n *\n * | Key | Moves to |\n * | --- | --- |\n * | Arrow keys | The previous or next day, or the same day in the previous or next week |\n * | Home / End | The first or last day of the week |\n * | Page Up / Page Down | The same day in the previous or next month |\n * | Shift + Page Up / Page Down | The same day in the previous or next year |\n * | Enter / Space | Picks the focused day |\n *\n * @privateRemarks\n * ARIA grid pattern: one `<table role=\"grid\">` per month, labelled by its title, with a roving\n * tabindex on the day cells (the focused date is the only tab stop). Cells outside the month are\n * empty, so two months side by side never show a date twice. Values are ISO strings; all date\n * maths goes through `internal/dates` (ADR 0042).\n *\n * <Calendar mode=\"range\" months={2} value={stay} onValueChange={setStay} />\n */\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>(function Calendar(props, ref) {\n const {\n mode = 'single',\n value: valueProp,\n defaultValue,\n onValueChange,\n min,\n max,\n isDateDisabled,\n firstDayOfWeek,\n locale = DEFAULT_LOCALE,\n timeZone,\n months = 1,\n month: monthProp,\n defaultMonth,\n onMonthChange,\n disabled = false,\n readOnly = false,\n autoFocus = false,\n labels: labelsProp,\n className,\n ...rest\n } = props as CalendarCommonProps & {\n mode?: 'single' | 'range'\n value?: string | DateRangeValue\n defaultValue?: string | DateRangeValue\n onValueChange?: (value: string & DateRangeValue) => void\n }\n const labels = { ...DEFAULT_LABELS, ...labelsProp }\n const autoId = useId()\n const rootRef = useRef<HTMLDivElement>(null)\n const composedRef = useMergedRefs(ref, rootRef)\n const onValueChangeRef = useLatest(onValueChange)\n\n const [internal, setInternal] = useState(defaultValue ?? (mode === 'range' ? EMPTY_RANGE : ''))\n const value = valueProp ?? internal\n const range =\n typeof value === 'string'\n ? { start: parseDate(value), end: parseDate(value) }\n : { start: parseDate(value.start), end: parseDate(value.end) }\n const minDate = parseDate(min ?? '')\n const maxDate = parseDate(max ?? '')\n const today = todayIn(timeZone)\n const firstDay = (firstDayOfWeek ?? defaultFirstDayOfWeek(locale)) % 7\n const interactive = !disabled && !readOnly\n\n const [focused, setFocused] = useState<CalendarDate>(() =>\n clampDate(range.start ?? today, minDate, maxDate),\n )\n const [internalMonth, setInternalMonth] = useState<Month>(\n () => parseMonth(defaultMonth) ?? { year: focused.year, month: focused.month },\n )\n const visible = parseMonth(monthProp) ?? internalMonth\n const [hovered, setHovered] = useState<CalendarDate | null>(null)\n const shouldFocus = useRef(autoFocus)\n\n const setMonth = (next: Month) => {\n if (monthIndex(next) === monthIndex(visible)) return\n if (monthProp === undefined) setInternalMonth(next)\n onMonthChange?.(formatMonth(next))\n }\n\n const isUnavailable = (date: CalendarDate) =>\n (minDate !== null && compareDates(date, minDate) < 0) ||\n (maxDate !== null && compareDates(date, maxDate) > 0) ||\n (isDateDisabled?.(formatDate(date)) ?? false)\n\n // Keep the focused date on screen: arrowing past the last visible month turns the page.\n const moveFocus = (next: CalendarDate) => {\n const date = clampDate(next, minDate, maxDate)\n const first = monthIndex(visible)\n const index = monthIndex(date)\n if (index < first) setMonth(monthFromIndex(index))\n else if (index > first + months - 1) setMonth(monthFromIndex(index - months + 1))\n shouldFocus.current = true\n setFocused(date)\n }\n\n // A controlled month moving elsewhere takes the focused date with it.\n const firstVisible = monthIndex(visible)\n const focusedIndex = monthIndex(focused)\n if (focusedIndex < firstVisible || focusedIndex > firstVisible + months - 1) {\n const day = Math.min(focused.day, daysInMonth(visible.year, visible.month))\n const date = clampDate({ ...visible, day }, minDate, maxDate)\n const index = monthIndex(date)\n setFocused(\n index < firstVisible || index > firstVisible + months - 1 ? { ...visible, day } : date,\n )\n }\n\n useEffect(() => {\n if (!shouldFocus.current) return\n shouldFocus.current = false\n rootRef.current?.querySelector<HTMLElement>(`[data-date=\"${formatDate(focused)}\"]`)?.focus()\n }, [focused, visible])\n\n const select = (date: CalendarDate) => {\n setFocused(date)\n if (!interactive || isUnavailable(date)) return\n const iso = formatDate(date)\n let next: string | DateRangeValue\n if (mode === 'single') {\n next = iso\n } else if (!range.start || range.end) {\n next = { start: iso, end: '' }\n } else if (compareDates(date, range.start) < 0) {\n next = { start: iso, end: formatDate(range.start) }\n } else {\n next = { start: formatDate(range.start), end: iso }\n }\n if (valueProp === undefined) setInternal(next)\n onValueChangeRef.current?.(next as string & DateRangeValue)\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n const rtl = rootRef.current ? getComputedStyle(rootRef.current).direction === 'rtl' : false\n const ahead = rtl ? -1 : 1\n const weekStart = (dayOfWeek(focused) - firstDay + 7) % 7\n const moves: Record<string, () => CalendarDate> = {\n ArrowLeft: () => addDays(focused, -ahead),\n ArrowRight: () => addDays(focused, ahead),\n ArrowUp: () => addDays(focused, -7),\n ArrowDown: () => addDays(focused, 7),\n Home: () => addDays(focused, -weekStart),\n End: () => addDays(focused, 6 - weekStart),\n PageUp: () => addMonths(focused, event.shiftKey ? -12 : -1),\n PageDown: () => addMonths(focused, event.shiftKey ? 12 : 1),\n }\n const move = moves[event.key]\n if (move) {\n event.preventDefault()\n const next = move()\n moveFocus(next)\n if (mode === 'range') setHovered(next)\n return\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n select(focused)\n }\n }\n\n const turnPage = (step: 1 | -1) => {\n const next = monthFromIndex(monthIndex(visible) + step)\n setMonth(next)\n const target = monthIndex(focused) + step\n const targetMonth = monthFromIndex(target)\n setFocused(\n clampDate(\n {\n ...targetMonth,\n day: Math.min(focused.day, daysInMonth(targetMonth.year, targetMonth.month)),\n },\n minDate,\n maxDate,\n ),\n )\n }\n\n // The shaded span: the chosen range, or start → the hovered day while the end is pending.\n const pending = mode === 'range' && range.start !== null && range.end === null\n let spanStart = mode === 'range' ? range.start : null\n let spanEnd = mode === 'range' ? range.end : null\n if (pending && hovered && range.start) {\n ;[spanStart, spanEnd] =\n compareDates(hovered, range.start) < 0 ? [hovered, range.start] : [range.start, hovered]\n }\n\n const weekdays = weekdayNames(locale, firstDay)\n const visibleMonths = Array.from({ length: months }, (_, i) =>\n monthFromIndex(monthIndex(visible) + i),\n )\n const canGoBack = !minDate || monthIndex(visible) > monthIndex(minDate)\n const canGoForward = !maxDate || monthIndex(visible) + months - 1 < monthIndex(maxDate)\n\n return (\n <div\n ref={composedRef}\n role=\"group\"\n className={cx(styles.root, className)}\n data-mode={mode}\n data-months={months}\n data-disabled={disabled || undefined}\n aria-disabled={disabled || undefined}\n {...rest}\n >\n <div className={styles.months}>\n {visibleMonths.map((month, monthNumber) => {\n const titleId = `${autoId}-title-${String(monthNumber)}`\n const last = monthNumber === months - 1\n return (\n <div key={formatMonth(month)} className={styles.month}>\n <div className={styles.header}>\n <div id={titleId} className={styles.title} aria-live=\"polite\">\n {formatMonthYear(locale, month.year, month.month)}\n </div>\n {last ? (\n <div className={styles.nav}>\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n label={labels.previousMonth}\n icon={<ChevronLeftIcon />}\n disabled={disabled || !canGoBack}\n onClick={() => {\n turnPage(-1)\n }}\n />\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n label={labels.nextMonth}\n icon={<ChevronRightIcon />}\n disabled={disabled || !canGoForward}\n onClick={() => {\n turnPage(1)\n }}\n />\n </div>\n ) : null}\n </div>\n <table role=\"grid\" className={styles.grid} aria-labelledby={titleId}>\n <thead>\n <tr>\n {weekdays.map((weekday) => (\n <th\n key={weekday.long}\n scope=\"col\"\n abbr={weekday.long}\n className={styles.weekday}\n >\n {weekday.short}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {monthGrid(month, firstDay).map((week, row) => (\n <tr key={row}>\n {week.map((date, column) => {\n if (!date)\n return <td key={column} role=\"gridcell\" className={styles.empty} />\n const iso = formatDate(date)\n const unavailable = isUnavailable(date)\n const isStart = isSameDay(date, spanStart)\n const isEnd = isSameDay(date, spanEnd)\n const inSpan =\n spanStart !== null &&\n spanEnd !== null &&\n compareDates(date, spanStart) >= 0 &&\n compareDates(date, spanEnd) <= 0\n const selected =\n mode === 'single'\n ? isSameDay(date, range.start)\n : isSameDay(date, range.start) ||\n isSameDay(date, range.end) ||\n (!pending && inSpan)\n const isFocused = isSameDay(date, focused)\n return (\n <td\n key={column}\n role=\"gridcell\"\n className={styles.day}\n data-date={iso}\n tabIndex={disabled ? undefined : isFocused ? 0 : -1}\n aria-label={formatFullDate(locale, date)}\n aria-selected={selected}\n aria-disabled={disabled || unavailable || undefined}\n aria-current={isSameDay(date, today) ? 'date' : undefined}\n data-today={isSameDay(date, today) || undefined}\n data-selected={selected || undefined}\n data-unavailable={unavailable || undefined}\n data-range-start={(inSpan && isStart) || undefined}\n data-range-end={(inSpan && isEnd) || undefined}\n data-in-range={inSpan || undefined}\n data-preview={(pending && inSpan) || undefined}\n onClick={() => {\n select(date)\n }}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n if (!isFocused) setFocused(date)\n }}\n onPointerEnter={() => {\n if (pending) setHovered(date)\n }}\n >\n <span className={styles.dayText}>{date.day}</span>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n })}\n </div>\n </div>\n )\n})\n\nconst EMPTY_RANGE: DateRangeValue = { start: '', end: '' }\n"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ //#region src/components/inputs/Calendar/Calendar.module.css
2
+ var e = "kiln-Calendar__root", t = "kiln-Calendar__months", n = "kiln-Calendar__month", r = "kiln-Calendar__header", i = "kiln-Calendar__title", a = "kiln-Calendar__nav", o = "kiln-Calendar__grid", s = "kiln-Calendar__weekday", c = "kiln-Calendar__empty", l = "kiln-Calendar__day", u = "kiln-Calendar__dayText", d = {
3
+ root: e,
4
+ months: t,
5
+ month: n,
6
+ header: r,
7
+ title: i,
8
+ nav: a,
9
+ grid: o,
10
+ weekday: s,
11
+ empty: c,
12
+ day: l,
13
+ dayText: u
14
+ };
15
+ //#endregion
16
+ export { l as day, u as dayText, d as default, c as empty, o as grid, r as header, n as month, t as months, a as nav, e as root, i as title, s as weekday };
17
+
18
+ //# sourceMappingURL=Calendar.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Calendar.module.js","names":["root","months","month","header","title","nav","grid","weekday","empty","day","dayText","Calendar_module_default"],"sources":["../../../../src/components/inputs/Calendar/Calendar.module.css"],"sourcesContent":["/*\n * A month (or two) of days. Figures are tabular in the theme's numeric face so columns line\n * up; the picked day takes the accent, a range's days between take the soft accent as one\n * continuous band, and today is underlined rather than coloured, so it never reads as picked.\n *\n * Component tokens:\n * --calendar-cell-size default var(--control-md)\n * --calendar-day-radius default var(--radius-action)\n * --calendar-selected-bg default var(--color-accent)\n * --calendar-selected-ink default var(--color-accent-ink)\n * --calendar-range-bg default var(--color-accent-soft)\n */\n.root {\n --_cell: var(--calendar-cell-size, var(--control-md));\n\n display: inline-flex;\n flex-direction: column;\n max-inline-size: 100%;\n color: var(--color-ink);\n font-family: var(--font-text);\n}\n\n.months {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-5);\n}\n\n.month {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n min-block-size: var(--control-sm);\n padding-inline-start: var(--space-2);\n}\n\n.title {\n font-family: var(--heading-font);\n font-size: var(--text-md);\n font-weight: var(--heading-weight);\n letter-spacing: var(--heading-tracking);\n font-variant-numeric: tabular-nums lining-nums;\n}\n\n.nav {\n display: inline-flex;\n gap: var(--space-1);\n}\n\n.grid {\n border-collapse: collapse;\n border-spacing: 0;\n table-layout: fixed;\n}\n\n.weekday {\n inline-size: var(--_cell);\n padding-block-end: var(--space-1);\n color: var(--color-ink-muted);\n font-size: var(--text-xs);\n font-weight: var(--label-weight);\n letter-spacing: var(--label-tracking);\n text-align: center;\n text-transform: var(--label-transform);\n}\n\n.empty,\n.day {\n inline-size: var(--_cell);\n block-size: var(--_cell);\n padding: 0;\n}\n\n.day {\n position: relative;\n outline: none;\n font-family: var(--font-numeric);\n font-size: var(--text-sm);\n font-stretch: var(--numeric-stretch);\n font-variant-numeric: tabular-nums lining-nums;\n text-align: center;\n cursor: pointer;\n}\n\n.dayText {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n inline-size: 100%;\n block-size: 100%;\n border-radius: var(--calendar-day-radius, var(--radius-action));\n transition:\n background-color var(--dur-1) var(--ease-out),\n color var(--dur-1) var(--ease-out);\n}\n\n@media (hover: hover) {\n .day:hover:not([aria-disabled='true'], [data-selected]) .dayText {\n background-color: var(--color-surface-sunken);\n }\n}\n\n.day:focus-visible {\n z-index: 2;\n}\n.day:focus-visible .dayText {\n outline: 2px solid var(--color-focus);\n outline-offset: 2px;\n}\n\n/* Today: an underline, not a fill, so it never reads as the picked day. */\n.day[data-today] .dayText {\n text-decoration: underline;\n text-decoration-thickness: 2px;\n text-underline-offset: 0.3em;\n}\n\n/* The band between a range's ends; at each end it reaches only the inner half. */\n.day[data-in-range]::before {\n position: absolute;\n inset: 0;\n background-color: var(--calendar-range-bg, var(--color-accent-soft));\n content: '';\n}\n.day[data-range-start]::before {\n inset-inline-start: 50%;\n}\n.day[data-range-end]::before {\n inset-inline-end: 50%;\n}\n.day[data-range-start][data-range-end]::before {\n content: none;\n}\n\n.day[data-selected] .dayText,\n.day[data-preview][data-range-start] .dayText,\n.day[data-preview][data-range-end] .dayText {\n background-color: var(--calendar-selected-bg, var(--color-accent));\n color: var(--calendar-selected-ink, var(--color-accent-ink));\n}\n.day[data-in-range][data-selected]:not([data-range-start], [data-range-end]) .dayText {\n background-color: transparent;\n color: var(--color-ink);\n}\n\n/* Unavailable: struck through as well as faded, so it doesn't rest on colour alone. */\n.day[aria-disabled='true'] {\n color: var(--color-ink-subtle);\n cursor: not-allowed;\n}\n.day[data-unavailable] .dayText {\n text-decoration: line-through;\n}\n\n.root[data-disabled] {\n opacity: 0.6;\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export { Calendar } from './Calendar.js';
2
+ export type { CalendarProps, CalendarSingleProps, CalendarRangeProps, CalendarLabels, } from './Calendar.js';