@sixthshift/design-system 0.7.0 → 0.9.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 (177) hide show
  1. package/README.md +5 -4
  2. package/dist/components/Badge/Badge.d.ts +17 -35
  3. package/dist/components/Badge/Badge.d.ts.map +1 -1
  4. package/dist/components/Badge/Badge.js +19 -22
  5. package/dist/components/Badge/Badge.js.map +1 -1
  6. package/dist/components/Badge/index.d.ts +1 -1
  7. package/dist/components/Badge/index.d.ts.map +1 -1
  8. package/dist/components/Badge/index.js +1 -1
  9. package/dist/components/Badge/index.js.map +1 -1
  10. package/dist/components/Button/Button.d.ts +23 -41
  11. package/dist/components/Button/Button.d.ts.map +1 -1
  12. package/dist/components/Button/Button.js +28 -35
  13. package/dist/components/Button/Button.js.map +1 -1
  14. package/dist/components/Button/index.d.ts +1 -1
  15. package/dist/components/Button/index.d.ts.map +1 -1
  16. package/dist/components/Button/index.js +1 -1
  17. package/dist/components/Button/index.js.map +1 -1
  18. package/dist/components/Card/Card.d.ts +2 -2
  19. package/dist/components/Card/Card.js +1 -1
  20. package/dist/components/Card/Card.js.map +1 -1
  21. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +20 -16
  22. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  23. package/dist/components/CheckboxGroup/CheckboxGroup.js +12 -10
  24. package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
  25. package/dist/components/Code/Workspace/Toolbar.d.ts +2 -1
  26. package/dist/components/Code/Workspace/Toolbar.d.ts.map +1 -1
  27. package/dist/components/Code/Workspace/Toolbar.js.map +1 -1
  28. package/dist/components/DataTable/DataTable.d.ts +89 -0
  29. package/dist/components/DataTable/DataTable.d.ts.map +1 -0
  30. package/dist/components/DataTable/DataTable.js +107 -0
  31. package/dist/components/DataTable/DataTable.js.map +1 -0
  32. package/dist/components/DataTable/index.d.ts +2 -0
  33. package/dist/components/DataTable/index.d.ts.map +1 -0
  34. package/dist/components/DataTable/index.js +2 -0
  35. package/dist/components/DataTable/index.js.map +1 -0
  36. package/dist/components/FileDropzone/FileDropzone.d.ts +87 -0
  37. package/dist/components/FileDropzone/FileDropzone.d.ts.map +1 -0
  38. package/dist/components/FileDropzone/FileDropzone.js +146 -0
  39. package/dist/components/FileDropzone/FileDropzone.js.map +1 -0
  40. package/dist/components/FileDropzone/index.d.ts +2 -0
  41. package/dist/components/FileDropzone/index.d.ts.map +1 -0
  42. package/dist/components/FileDropzone/index.js +2 -0
  43. package/dist/components/FileDropzone/index.js.map +1 -0
  44. package/dist/components/FormField/FormField.d.ts +3 -1
  45. package/dist/components/FormField/FormField.d.ts.map +1 -1
  46. package/dist/components/FormField/FormField.js.map +1 -1
  47. package/dist/components/ImageGallery/ImageGallery.d.ts +93 -0
  48. package/dist/components/ImageGallery/ImageGallery.d.ts.map +1 -0
  49. package/dist/components/ImageGallery/ImageGallery.js +121 -0
  50. package/dist/components/ImageGallery/ImageGallery.js.map +1 -0
  51. package/dist/components/ImageGallery/index.d.ts +2 -0
  52. package/dist/components/ImageGallery/index.d.ts.map +1 -0
  53. package/dist/components/ImageGallery/index.js +2 -0
  54. package/dist/components/ImageGallery/index.js.map +1 -0
  55. package/dist/components/Input/Input.d.ts +3 -3
  56. package/dist/components/Input/Input.js +3 -3
  57. package/dist/components/Markdown/Markdown.js +1 -1
  58. package/dist/components/Markdown/Markdown.js.map +1 -1
  59. package/dist/components/NumberStepper/NumberStepper.d.ts +78 -0
  60. package/dist/components/NumberStepper/NumberStepper.d.ts.map +1 -0
  61. package/dist/components/NumberStepper/NumberStepper.js +129 -0
  62. package/dist/components/NumberStepper/NumberStepper.js.map +1 -0
  63. package/dist/components/NumberStepper/index.d.ts +2 -0
  64. package/dist/components/NumberStepper/index.d.ts.map +1 -0
  65. package/dist/components/NumberStepper/index.js +2 -0
  66. package/dist/components/NumberStepper/index.js.map +1 -0
  67. package/dist/components/ProgressBar/ProgressBar.d.ts +11 -0
  68. package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
  69. package/dist/components/ProgressBar/ProgressBar.js +6 -2
  70. package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
  71. package/dist/components/ProgressBar/index.d.ts +1 -1
  72. package/dist/components/ProgressBar/index.d.ts.map +1 -1
  73. package/dist/components/ProgressBar/index.js.map +1 -1
  74. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts +19 -16
  75. package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -1
  76. package/dist/components/RadioButtonGroup/RadioButtonGroup.js +13 -12
  77. package/dist/components/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
  78. package/dist/components/SearchInput/SearchInput.d.ts +3 -2
  79. package/dist/components/SearchInput/SearchInput.d.ts.map +1 -1
  80. package/dist/components/SearchInput/SearchInput.js +13 -8
  81. package/dist/components/SearchInput/SearchInput.js.map +1 -1
  82. package/dist/components/Sparkline/Sparkline.d.ts +8 -4
  83. package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
  84. package/dist/components/Sparkline/Sparkline.js +1 -1
  85. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  86. package/dist/components/Sparkline/index.d.ts +1 -1
  87. package/dist/components/Sparkline/index.d.ts.map +1 -1
  88. package/dist/components/Sparkline/index.js.map +1 -1
  89. package/dist/components/Steps/Steps.d.ts +65 -0
  90. package/dist/components/Steps/Steps.d.ts.map +1 -0
  91. package/dist/components/Steps/Steps.js +62 -0
  92. package/dist/components/Steps/Steps.js.map +1 -0
  93. package/dist/components/Steps/index.d.ts +2 -0
  94. package/dist/components/Steps/index.d.ts.map +1 -0
  95. package/dist/components/Steps/index.js +2 -0
  96. package/dist/components/Steps/index.js.map +1 -0
  97. package/dist/components/TagChip/TagChip.d.ts +0 -13
  98. package/dist/components/TagChip/TagChip.d.ts.map +1 -1
  99. package/dist/components/TagChip/TagChip.js +10 -4
  100. package/dist/components/TagChip/TagChip.js.map +1 -1
  101. package/dist/components/TextInline/TextInline.d.ts +2 -2
  102. package/dist/components/Toast/Toast.js +1 -1
  103. package/dist/components/Toast/Toast.js.map +1 -1
  104. package/dist/components/Toggle/Toggle.d.ts +29 -18
  105. package/dist/components/Toggle/Toggle.d.ts.map +1 -1
  106. package/dist/components/Toggle/Toggle.js +48 -11
  107. package/dist/components/Toggle/Toggle.js.map +1 -1
  108. package/dist/components/Toggle/index.d.ts +1 -1
  109. package/dist/components/Toggle/index.d.ts.map +1 -1
  110. package/dist/components/Toggle/index.js +1 -1
  111. package/dist/components/Toggle/index.js.map +1 -1
  112. package/dist/components/ToggleGroup/ToggleGroup.d.ts +4 -4
  113. package/dist/components/ToggleGroup/ToggleGroup.js +4 -4
  114. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts +1 -1
  115. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts.map +1 -1
  116. package/dist/components/ToggleGroup/ToggleGroupItem.js +37 -7
  117. package/dist/components/ToggleGroup/ToggleGroupItem.js.map +1 -1
  118. package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +3 -3
  119. package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +3 -3
  120. package/dist/components/ToggleGroup/index.d.ts +1 -1
  121. package/dist/components/ToggleGroup/index.d.ts.map +1 -1
  122. package/dist/components/ToggleGroup/toggleGroup.types.d.ts +18 -16
  123. package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
  124. package/dist/typography/Code.js +1 -1
  125. package/dist/typography/Code.js.map +1 -1
  126. package/package.json +22 -1
  127. package/src/components/Badge/Badge.tsx +38 -45
  128. package/src/components/Badge/badge.recipe.css +20 -101
  129. package/src/components/Badge/index.ts +0 -1
  130. package/src/components/Button/Button.tsx +57 -51
  131. package/src/components/Button/button.recipe.css +39 -122
  132. package/src/components/Button/index.ts +0 -1
  133. package/src/components/Card/Card.tsx +1 -1
  134. package/src/components/CheckboxGroup/CheckboxGroup.tsx +17 -15
  135. package/src/components/Code/Workspace/Toolbar.tsx +2 -2
  136. package/src/components/DataTable/DataTable.tsx +261 -0
  137. package/src/components/DataTable/data-table.recipe.css +28 -0
  138. package/src/components/DataTable/index.ts +10 -0
  139. package/src/components/FileDropzone/FileDropzone.tsx +239 -0
  140. package/src/components/FileDropzone/file-dropzone.recipe.css +38 -0
  141. package/src/components/FileDropzone/index.ts +1 -0
  142. package/src/components/FormField/FormField.tsx +3 -2
  143. package/src/components/ImageGallery/ImageGallery.tsx +285 -0
  144. package/src/components/ImageGallery/image-gallery.recipe.css +50 -0
  145. package/src/components/ImageGallery/index.ts +7 -0
  146. package/src/components/Input/Input.tsx +3 -3
  147. package/src/components/Markdown/Markdown.tsx +1 -1
  148. package/src/components/Message/message.recipe.css +13 -28
  149. package/src/components/NumberStepper/NumberStepper.tsx +227 -0
  150. package/src/components/NumberStepper/index.ts +1 -0
  151. package/src/components/NumberStepper/number-stepper.recipe.css +31 -0
  152. package/src/components/ProgressBar/ProgressBar.tsx +16 -4
  153. package/src/components/ProgressBar/index.ts +1 -1
  154. package/src/components/ProgressBar/progress-bar.recipe.css +29 -0
  155. package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +18 -17
  156. package/src/components/SearchInput/SearchInput.tsx +34 -20
  157. package/src/components/SearchInput/search-input.recipe.css +14 -6
  158. package/src/components/Sparkline/Sparkline.tsx +9 -4
  159. package/src/components/Sparkline/index.ts +1 -1
  160. package/src/components/Steps/Steps.tsx +149 -0
  161. package/src/components/Steps/index.ts +1 -0
  162. package/src/components/Steps/steps.recipe.css +51 -0
  163. package/src/components/TagChip/TagChip.tsx +17 -8
  164. package/src/components/TagChip/tag-chip.recipe.css +12 -12
  165. package/src/components/Toast/Toast.tsx +1 -1
  166. package/src/components/Toggle/Toggle.tsx +67 -21
  167. package/src/components/Toggle/index.ts +9 -1
  168. package/src/components/Toggle/toggle.recipe.css +45 -73
  169. package/src/components/ToggleGroup/ToggleGroup.tsx +4 -4
  170. package/src/components/ToggleGroup/ToggleGroupItem.tsx +46 -11
  171. package/src/components/ToggleGroup/index.ts +9 -1
  172. package/src/components/ToggleGroup/toggle-group.recipe.css +62 -0
  173. package/src/components/ToggleGroup/toggleGroup.types.ts +18 -16
  174. package/src/theme/linen/theme.css +21 -0
  175. package/src/theming/intents.css +112 -0
  176. package/src/theming/tailwind.css +22 -1
  177. package/src/typography/Code.tsx +1 -1
@@ -0,0 +1,146 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cva } from "class-variance-authority";
4
+ import { Upload } from "lucide-react";
5
+ import * as React from "react";
6
+ /**
7
+ * Geometry only. Every colour reads a `--file-dropzone-*` component token
8
+ * whose value is decided by src/components/FileDropzone/file-dropzone.recipe.css.
9
+ *
10
+ * `size` is the target's footprint: `sm` sits inline in a form row beside other
11
+ * fields, `md` is a panel of its own (an image manager's "add photos" tile).
12
+ */
13
+ const fileDropzoneVariants = cva(
14
+ // One literal, deliberately — see Button.tsx for why a `+` concatenation is a trap.
15
+ "file-dropzone border-(color:--file-dropzone-border) focus-visible:ring-(color:--file-dropzone-ring) relative flex w-full cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed bg-(--file-dropzone-bg) text-center text-(--file-dropzone-fg) transition-colors hover:bg-(--file-dropzone-bg-hovered) focus-visible:outline-hidden focus-visible:ring-2 data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-50", {
16
+ variants: {
17
+ size: {
18
+ sm: "min-h-20 gap-1 px-4 py-3 text-xs [&_svg]:size-4",
19
+ md: "min-h-36 gap-2 px-6 py-6 text-sm [&_svg]:size-6",
20
+ },
21
+ },
22
+ defaultVariants: {
23
+ size: "md",
24
+ },
25
+ });
26
+ function matchesAccept(file, accept) {
27
+ if (!accept)
28
+ return true;
29
+ const rules = accept
30
+ .split(",")
31
+ .map((rule) => rule.trim().toLowerCase())
32
+ .filter(Boolean);
33
+ if (rules.length === 0)
34
+ return true;
35
+ const name = file.name.toLowerCase();
36
+ const type = file.type.toLowerCase();
37
+ return rules.some((rule) => {
38
+ if (rule.startsWith("."))
39
+ return name.endsWith(rule);
40
+ if (rule.endsWith("/*"))
41
+ return type.startsWith(rule.slice(0, -1));
42
+ return type === rule;
43
+ });
44
+ }
45
+ /**
46
+ * A drop target for files that doubles as a file-picker button — product
47
+ * photos, attachments, imports.
48
+ *
49
+ * The whole surface is one control: `role="button"`, a tab stop, and `Enter`
50
+ * or `Space` opens the native picker, the same as a click. Dragging files over
51
+ * it sets `data-state="active"`, which the recipe styles. The hidden `<input
52
+ * type="file">` is the real picker, so `accept`, `multiple` and `name` behave
53
+ * natively; `accept` and `maxSize` are also enforced on drop, where the
54
+ * browser does not, and failures go to `onFilesRejected` rather than being
55
+ * silently dropped. Without `multiple`, a drop of several files keeps the first.
56
+ *
57
+ * `pending` shows a spinner-free busy state (`aria-busy`) and ignores new
58
+ * files while an upload runs, without leaving the tab order — the same split
59
+ * Switch makes between `pending` and `disabled`.
60
+ *
61
+ * The component holds no file list of its own: it reports files and the
62
+ * caller decides what to show, so there is no value/defaultValue triad.
63
+ */
64
+ export const FileDropzone = React.forwardRef(({ className, size = "md", onFilesChange, onFilesRejected, accept, multiple = false, maxSize, disabled = false, pending = false, label = "Drop files here or click to browse", hint, icon, name, onKeyDown, onClick, ...props }, ref) => {
65
+ const inputRef = React.useRef(null);
66
+ const [active, setActive] = React.useState(false);
67
+ // dragenter/dragleave fire for every child crossed; count them so the state does not flicker.
68
+ const depth = React.useRef(0);
69
+ const labelId = React.useId();
70
+ const hintId = React.useId();
71
+ const interactive = !disabled && !pending;
72
+ const handleFiles = (list) => {
73
+ if (!list || !interactive)
74
+ return;
75
+ const files = Array.from(list);
76
+ const accepted = [];
77
+ const rejected = [];
78
+ for (const file of files) {
79
+ if (!matchesAccept(file, accept))
80
+ rejected.push({ file, reason: "type" });
81
+ else if (maxSize !== undefined && file.size > maxSize)
82
+ rejected.push({ file, reason: "size" });
83
+ else
84
+ accepted.push(file);
85
+ }
86
+ const kept = multiple ? accepted : accepted.slice(0, 1);
87
+ if (rejected.length > 0)
88
+ onFilesRejected?.(rejected);
89
+ if (kept.length > 0)
90
+ onFilesChange(kept);
91
+ };
92
+ const openPicker = () => {
93
+ if (interactive)
94
+ inputRef.current?.click();
95
+ };
96
+ const handleKeyDown = (event) => {
97
+ onKeyDown?.(event);
98
+ if (event.defaultPrevented || event.target !== event.currentTarget)
99
+ return;
100
+ if (event.key === "Enter" || event.key === " ") {
101
+ event.preventDefault();
102
+ openPicker();
103
+ }
104
+ };
105
+ const handleDragEnter = (event) => {
106
+ event.preventDefault();
107
+ if (!interactive)
108
+ return;
109
+ depth.current += 1;
110
+ setActive(true);
111
+ };
112
+ const handleDragLeave = (event) => {
113
+ event.preventDefault();
114
+ depth.current = Math.max(0, depth.current - 1);
115
+ if (depth.current === 0)
116
+ setActive(false);
117
+ };
118
+ const handleDragOver = (event) => {
119
+ event.preventDefault();
120
+ event.dataTransfer.dropEffect = interactive ? "copy" : "none";
121
+ };
122
+ const handleDrop = (event) => {
123
+ event.preventDefault();
124
+ depth.current = 0;
125
+ setActive(false);
126
+ handleFiles(event.dataTransfer.files);
127
+ };
128
+ return (
129
+ // biome-ignore lint/a11y/useSemanticElements: the target holds the native file <input>, and interactive content is not allowed inside a <button>; role="button" with Enter/Space handling is the WAI-ARIA button pattern
130
+ _jsxs("div", { ref: ref, role: "button", tabIndex: disabled ? -1 : 0, "aria-disabled": disabled || undefined, "aria-busy": pending || undefined, "aria-labelledby": labelId, "aria-describedby": hint ? hintId : undefined, "data-state": active ? "active" : "idle", "data-disabled": disabled, className: fileDropzoneVariants({ size, className }), onClick: (event) => {
131
+ onClick?.(event);
132
+ if (!event.defaultPrevented)
133
+ openPicker();
134
+ }, onKeyDown: handleKeyDown, onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, ...props, children: [icon === undefined ? _jsx(Upload, { "aria-hidden": "true", className: "text-(--file-dropzone-icon-fg)" }) : icon, _jsx("span", { id: labelId, className: "font-medium", children: label }), hint && (_jsx("span", { id: hintId, className: "text-(--file-dropzone-hint-fg)", children: hint })), _jsx("input", { ref: inputRef, type: "file",
135
+ // `hidden`, not `sr-only`: a rendered input inside role="button" is a nested
136
+ // interactive control (axe `nested-interactive`). `click()` and form submission
137
+ // still work on a display:none file input.
138
+ hidden: true, accept: accept, multiple: multiple, name: name, disabled: disabled, onClick: (event) => event.stopPropagation(), onChange: (event) => {
139
+ handleFiles(event.target.files);
140
+ // Reset so picking the same file again still fires change.
141
+ event.target.value = "";
142
+ } })] }));
143
+ });
144
+ FileDropzone.displayName = "FileDropzone";
145
+ export { fileDropzoneVariants };
146
+ //# sourceMappingURL=FileDropzone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileDropzone.js","sourceRoot":"","sources":["../../../src/components/FileDropzone/FileDropzone.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { FileDropzone, type FileDropzoneProps, type FileDropzoneRejection, type FileDropzoneSize, fileDropzoneVariants } from "./FileDropzone.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FileDropzone/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { FileDropzone, fileDropzoneVariants } from "./FileDropzone.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/FileDropzone/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6E,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,7 +1,9 @@
1
+ import { type MessageIntentName } from "@sixthshift/design-system/message";
1
2
  import * as React from "react";
2
3
  export type FormFieldFeedback = {
3
4
  message: string;
4
- intent: "danger" | "success" | "warning";
5
+ /** Message's intents, less `neutral` — feedback always reports an outcome. */
6
+ intent: Exclude<MessageIntentName, "neutral">;
5
7
  };
6
8
  export type FormFieldProps = React.HTMLAttributes<HTMLDivElement> & {
7
9
  label: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"FormField.d.ts","sourceRoot":"","sources":["../../../src/components/FormField/FormField.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IAClE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,MAAM,qBAAqB,GAAG;IAClC,yEAAyE;IACzE,EAAE,EAAE,MAAM,CAAC;IACX,sHAAsH;IACtH,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,yFAAyF;IACzF,OAAO,EAAE,OAAO,CAAC;IACjB,kFAAkF;IAClF,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAIF;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,oCAA2C,CAAC;AAErE;;;;;;;;;;;;;;;;GAgBG;AACH,QAAA,MAAM,SAAS;WA9CN,KAAK,CAAC,SAAS;kBACR,KAAK,CAAC,SAAS;eAClB,iBAAiB;eACjB,OAAO;wCAqGnB,CAAC;AAGF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"FormField.d.ts","sourceRoot":"","sources":["../../../src/components/FormField/FormField.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAGpF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IAClE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,MAAM,qBAAqB,GAAG;IAClC,yEAAyE;IACzE,EAAE,EAAE,MAAM,CAAC;IACX,sHAAsH;IACtH,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,yFAAyF;IACzF,OAAO,EAAE,OAAO,CAAC;IACjB,kFAAkF;IAClF,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAIF;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,oCAA2C,CAAC;AAErE;;;;;;;;;;;;;;;;GAgBG;AACH,QAAA,MAAM,SAAS;WA9CN,KAAK,CAAC,SAAS;kBACR,KAAK,CAAC,SAAS;eAClB,iBAAiB;eACjB,OAAO;wCAqGnB,CAAC;AAGF,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FormField.js","sourceRoot":"","sources":["../../../src/components/FormField/FormField.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FormField.js","sourceRoot":"","sources":["../../../src/components/FormField/FormField.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { type VariantProps } from "class-variance-authority";
2
+ import * as React from "react";
3
+ /**
4
+ * Geometry only. Every colour reads an `--image-gallery-*` component token
5
+ * whose value is decided by src/components/ImageGallery/image-gallery.recipe.css.
6
+ *
7
+ * `ratio` is the frame's shape, not the images': every slide is cropped to it
8
+ * with `object-cover`, so a mixed set of uploads still produces a steady
9
+ * frame that does not jump as you swipe. `portrait` is 4:5, the tallest crop
10
+ * Instagram allows in a feed — photography shot for the feed lands on it
11
+ * uncropped.
12
+ */
13
+ declare const frameVariants: (props?: ({
14
+ ratio?: "square" | "portrait" | "landscape" | "wide" | null | undefined;
15
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
16
+ export type ImageGalleryRatio = NonNullable<VariantProps<typeof frameVariants>["ratio"]>;
17
+ export type ImageGalleryImage = {
18
+ src: string;
19
+ /** Required: describe the photo. The gallery adds position ("2 of 5") on its own. */
20
+ alt: string;
21
+ srcSet?: string;
22
+ sizes?: string;
23
+ width?: number;
24
+ height?: number;
25
+ };
26
+ export type ImageGalleryProps = Omit<React.HTMLAttributes<HTMLElement>, "onChange"> & VariantProps<typeof frameVariants> & {
27
+ images: readonly ImageGalleryImage[];
28
+ /** Controlled index of the image shown. */
29
+ index?: number;
30
+ /** Initial index in uncontrolled mode. */
31
+ defaultIndex?: number;
32
+ /** Called when the shown image changes — by swipe, arrow, key or thumbnail. */
33
+ onIndexChange?: (index: number) => void;
34
+ /**
35
+ * What sits under the frame: a strip of `thumbnails`, a row of `dots`, or
36
+ * `none`. Only rendered when there is more than one image.
37
+ */
38
+ indicator?: "thumbnails" | "dots" | "none";
39
+ /** Accessible name for the carousel, e.g. the product's name. */
40
+ label?: string;
41
+ /** Accessible name for the previous-image button. */
42
+ previousLabel?: string;
43
+ /** Accessible name for the next-image button. */
44
+ nextLabel?: string;
45
+ /** Shown in the frame when `images` is empty. */
46
+ placeholder?: React.ReactNode;
47
+ };
48
+ /**
49
+ * A product photo carousel: one frame, swipeable on touch, with previous/next
50
+ * buttons, arrow-key navigation and an optional thumbnail strip or dots.
51
+ *
52
+ * Swiping is native scrolling — a horizontal `scroll-snap` track, not a
53
+ * pointer-event reimplementation — so it has the platform's own momentum and
54
+ * edge behaviour on phones. The shown index follows the scroll position, and
55
+ * setting the index (by button, key, thumbnail or a controlled `index`)
56
+ * scrolls the track. Both directions meet at one rule: the effect only scrolls
57
+ * when the track is not already showing the index, so a swipe that updates
58
+ * the index never fights itself.
59
+ *
60
+ * Controlled or uncontrolled through `index`/`defaultIndex`/`onIndexChange`.
61
+ *
62
+ * Follows the WAI-ARIA carousel pattern: the root is a `<section>` with
63
+ * `aria-roledescription="carousel"` (a landmark region once `label` names
64
+ * it), each slide a group named "n of total", and slides out of view are
65
+ * `aria-hidden`. The first image loads eagerly and
66
+ * the rest lazily, so a gallery of ten costs one download up front.
67
+ */
68
+ export declare const ImageGallery: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "onChange"> & VariantProps<(props?: ({
69
+ ratio?: "square" | "portrait" | "landscape" | "wide" | null | undefined;
70
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
71
+ images: readonly ImageGalleryImage[];
72
+ /** Controlled index of the image shown. */
73
+ index?: number;
74
+ /** Initial index in uncontrolled mode. */
75
+ defaultIndex?: number;
76
+ /** Called when the shown image changes — by swipe, arrow, key or thumbnail. */
77
+ onIndexChange?: (index: number) => void;
78
+ /**
79
+ * What sits under the frame: a strip of `thumbnails`, a row of `dots`, or
80
+ * `none`. Only rendered when there is more than one image.
81
+ */
82
+ indicator?: "thumbnails" | "dots" | "none";
83
+ /** Accessible name for the carousel, e.g. the product's name. */
84
+ label?: string;
85
+ /** Accessible name for the previous-image button. */
86
+ previousLabel?: string;
87
+ /** Accessible name for the next-image button. */
88
+ nextLabel?: string;
89
+ /** Shown in the frame when `images` is empty. */
90
+ placeholder?: React.ReactNode;
91
+ } & React.RefAttributes<HTMLElement>>;
92
+ export { frameVariants as imageGalleryFrameVariants };
93
+ //# sourceMappingURL=ImageGallery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageGallery.d.ts","sourceRoot":"","sources":["../../../src/components/ImageGallery/ImageGallery.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;;;;GASG;AACH,QAAA,MAAM,aAAa;;8EAYjB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,GACjF,YAAY,CAAC,OAAO,aAAa,CAAC,GAAG;IACnC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACrC,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,SAAS,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;IAC3C,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC/B,CAAC;AAMJ;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,YAAY;;;YA9Cb,SAAS,iBAAiB,EAAE;IACpC,2CAA2C;YACnC,MAAM;IACd,0CAA0C;mBAC3B,MAAM;IACrB,+EAA+E;oBAC/D,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IACvC;;;OAGG;gBACS,YAAY,GAAG,MAAM,GAAG,MAAM;IAC1C,iEAAiE;YACzD,MAAM;IACd,qDAAqD;oBACrC,MAAM;IACtB,iDAAiD;gBACrC,MAAM;IAClB,iDAAiD;kBACnC,KAAK,CAAC,SAAS;qCAwNhC,CAAC;AAGF,OAAO,EAAE,aAAa,IAAI,yBAAyB,EAAE,CAAC"}
@@ -0,0 +1,121 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useControllableState } from "@sixthshift/design-system/hooks";
4
+ import { cn } from "@sixthshift/design-system/utils";
5
+ import { cva } from "class-variance-authority";
6
+ import { ChevronLeft, ChevronRight } from "lucide-react";
7
+ import * as React from "react";
8
+ /**
9
+ * Geometry only. Every colour reads an `--image-gallery-*` component token
10
+ * whose value is decided by src/components/ImageGallery/image-gallery.recipe.css.
11
+ *
12
+ * `ratio` is the frame's shape, not the images': every slide is cropped to it
13
+ * with `object-cover`, so a mixed set of uploads still produces a steady
14
+ * frame that does not jump as you swipe. `portrait` is 4:5, the tallest crop
15
+ * Instagram allows in a feed — photography shot for the feed lands on it
16
+ * uncropped.
17
+ */
18
+ const frameVariants = cva("relative overflow-hidden rounded-lg bg-(--image-gallery-bg)", {
19
+ variants: {
20
+ ratio: {
21
+ square: "aspect-square",
22
+ portrait: "aspect-[4/5]",
23
+ landscape: "aspect-[4/3]",
24
+ wide: "aspect-video",
25
+ },
26
+ },
27
+ defaultVariants: {
28
+ ratio: "square",
29
+ },
30
+ });
31
+ function prefersReducedMotion() {
32
+ return typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches === true;
33
+ }
34
+ /**
35
+ * A product photo carousel: one frame, swipeable on touch, with previous/next
36
+ * buttons, arrow-key navigation and an optional thumbnail strip or dots.
37
+ *
38
+ * Swiping is native scrolling — a horizontal `scroll-snap` track, not a
39
+ * pointer-event reimplementation — so it has the platform's own momentum and
40
+ * edge behaviour on phones. The shown index follows the scroll position, and
41
+ * setting the index (by button, key, thumbnail or a controlled `index`)
42
+ * scrolls the track. Both directions meet at one rule: the effect only scrolls
43
+ * when the track is not already showing the index, so a swipe that updates
44
+ * the index never fights itself.
45
+ *
46
+ * Controlled or uncontrolled through `index`/`defaultIndex`/`onIndexChange`.
47
+ *
48
+ * Follows the WAI-ARIA carousel pattern: the root is a `<section>` with
49
+ * `aria-roledescription="carousel"` (a landmark region once `label` names
50
+ * it), each slide a group named "n of total", and slides out of view are
51
+ * `aria-hidden`. The first image loads eagerly and
52
+ * the rest lazily, so a gallery of ten costs one download up front.
53
+ */
54
+ export const ImageGallery = React.forwardRef(({ className, images, index: controlledIndex, defaultIndex = 0, onIndexChange, ratio = "square", indicator = "thumbnails", label, previousLabel = "Previous image", nextLabel = "Next image", placeholder, onKeyDown, ...props }, ref) => {
55
+ const count = images.length;
56
+ const [rawIndex, setIndex] = useControllableState({
57
+ value: controlledIndex,
58
+ defaultValue: defaultIndex,
59
+ onChange: onIndexChange,
60
+ });
61
+ const index = count === 0 ? 0 : Math.min(Math.max(rawIndex, 0), count - 1);
62
+ const trackRef = React.useRef(null);
63
+ // The slide a programmatic scroll is heading for. While set, the slides it
64
+ // passes on the way are not reported — jumping from 1 to 4 reports 4, not
65
+ // 2, 3 and 4. Any touch, wheel or pointer on the track hands control back.
66
+ const scrollTargetRef = React.useRef(null);
67
+ // Index → scroll. Skipped when the track already shows `index`, which is
68
+ // always the case right after a swipe reported it.
69
+ React.useEffect(() => {
70
+ const track = trackRef.current;
71
+ if (!track || track.clientWidth === 0)
72
+ return;
73
+ if (Math.round(track.scrollLeft / track.clientWidth) === index)
74
+ return;
75
+ scrollTargetRef.current = index;
76
+ track.scrollTo({ left: index * track.clientWidth, behavior: prefersReducedMotion() ? "auto" : "smooth" });
77
+ }, [index]);
78
+ // Scroll → index. Rounds, so the index flips at the halfway point of a swipe.
79
+ const handleScroll = () => {
80
+ const track = trackRef.current;
81
+ if (!track || track.clientWidth === 0)
82
+ return;
83
+ const shown = Math.round(track.scrollLeft / track.clientWidth);
84
+ if (scrollTargetRef.current !== null) {
85
+ if (shown !== scrollTargetRef.current)
86
+ return;
87
+ scrollTargetRef.current = null;
88
+ }
89
+ if (shown !== index && shown >= 0 && shown < count)
90
+ setIndex(shown);
91
+ };
92
+ const releaseScroll = () => {
93
+ scrollTargetRef.current = null;
94
+ };
95
+ const go = (next) => {
96
+ if (next >= 0 && next < count && next !== index)
97
+ setIndex(next);
98
+ };
99
+ const handleKeyDown = (event) => {
100
+ onKeyDown?.(event);
101
+ if (event.defaultPrevented)
102
+ return;
103
+ const targets = { ArrowLeft: index - 1, ArrowRight: index + 1, Home: 0, End: count - 1 };
104
+ const target = targets[event.key];
105
+ if (target === undefined)
106
+ return;
107
+ event.preventDefault();
108
+ go(target);
109
+ };
110
+ const controlClass = "image-gallery-control focus-visible:ring-(color:--image-gallery-control-ring) absolute top-1/2 flex size-9 -translate-y-1/2 cursor-pointer items-center justify-center rounded-full bg-(--image-gallery-control-bg) text-(--image-gallery-control-fg) shadow transition-opacity hover:bg-(--image-gallery-control-bg-hovered) focus-visible:outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-0 max-sm:hidden [&_svg]:size-5";
111
+ return (_jsxs("section", { ref: ref, "aria-roledescription": "carousel", "aria-label": label, className: cn("image-gallery flex flex-col gap-3", className), onKeyDown: handleKeyDown, ...props, children: [_jsxs("div", { className: frameVariants({ ratio }), children: [count === 0 ? (_jsx("div", { className: "flex h-full w-full items-center justify-center text-(--image-gallery-placeholder-fg) text-sm", children: placeholder })) : (_jsx("div", { ref: trackRef, onScroll: handleScroll, onPointerDown: releaseScroll, onTouchStart: releaseScroll, onWheel: releaseScroll,
112
+ // Focusable so the arrow keys work without first reaching a button,
113
+ // and because a scrollable region must be keyboard-reachable.
114
+ // biome-ignore lint/a11y/noNoninteractiveTabindex: scrollable regions must be focusable (axe `scrollable-region-focusable`)
115
+ tabIndex: 0, className: "focus-visible:ring-(color:--image-gallery-control-ring) flex h-full w-full snap-x snap-mandatory overflow-x-auto overscroll-x-contain [scrollbar-width:none] focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-inset [&::-webkit-scrollbar]:hidden", children: images.map((image, i) => (
116
+ // biome-ignore lint/a11y/useSemanticElements: the WAI-ARIA carousel pattern names each slide a `group`; a <fieldset> is for form controls
117
+ _jsx("div", { role: "group", "aria-roledescription": "slide", "aria-label": `${i + 1} of ${count}`, "aria-hidden": i !== index, className: "h-full w-full shrink-0 snap-center snap-always", children: _jsx("img", { src: image.src, srcSet: image.srcSet, sizes: image.sizes, width: image.width, height: image.height, alt: image.alt, loading: i === 0 ? "eager" : "lazy", decoding: "async", draggable: false, className: "h-full w-full select-none object-cover" }) }, i))) })), count > 1 && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", "aria-label": previousLabel, disabled: index === 0, onClick: () => go(index - 1), className: cn(controlClass, "left-2"), children: _jsx(ChevronLeft, { "aria-hidden": "true" }) }), _jsx("button", { type: "button", "aria-label": nextLabel, disabled: index === count - 1, onClick: () => go(index + 1), className: cn(controlClass, "right-2"), children: _jsx(ChevronRight, { "aria-hidden": "true" }) })] }))] }), count > 1 && indicator === "thumbnails" && (_jsx("div", { className: "flex gap-2 overflow-x-auto p-0.5", children: images.map((image, i) => (_jsx("button", { type: "button", "aria-label": `Show image ${i + 1} of ${count}`, "aria-current": i === index ? "true" : undefined, "data-selected": i === index, onClick: () => go(i), className: "image-gallery-thumb border-(color:--image-gallery-thumb-border) focus-visible:ring-(color:--image-gallery-control-ring) hover:border-(color:--image-gallery-thumb-border-hovered) size-16 shrink-0 cursor-pointer overflow-hidden rounded-md border-2 transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-offset-2", children: _jsx("img", { src: image.src, srcSet: image.srcSet, sizes: "64px", alt: "", loading: "lazy", decoding: "async", draggable: false, className: "h-full w-full object-cover" }) }, i))) })), count > 1 && indicator === "dots" && (_jsx("div", { className: "flex justify-center gap-1.5", children: images.map((_, i) => (_jsx("button", { type: "button", "aria-label": `Show image ${i + 1} of ${count}`, "aria-current": i === index ? "true" : undefined, "data-selected": i === index, onClick: () => go(i), className: "image-gallery-dot focus-visible:ring-(color:--image-gallery-control-ring) flex size-6 cursor-pointer items-center justify-center rounded-full focus-visible:outline-hidden focus-visible:ring-2", children: _jsx("span", { "aria-hidden": "true", className: "block size-2 rounded-full bg-(--image-gallery-dot-bg) transition-colors" }) }, i))) }))] }));
118
+ });
119
+ ImageGallery.displayName = "ImageGallery";
120
+ export { frameVariants as imageGalleryFrameVariants };
121
+ //# sourceMappingURL=ImageGallery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageGallery.js","sourceRoot":"","sources":["../../../src/components/ImageGallery/ImageGallery.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { ImageGallery, type ImageGalleryImage, type ImageGalleryProps, type ImageGalleryRatio, imageGalleryFrameVariants, } from "./ImageGallery.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ImageGallery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ImageGallery, imageGalleryFrameVariants, } from "./ImageGallery.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ImageGallery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAIZ,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC"}
@@ -8,15 +8,15 @@ export type InputProps = React.InputHTMLAttributes<HTMLInputElement> & {
8
8
  *
9
9
  * Renders a plain `<input>` unless `iconLeft` or `iconRight` is supplied, in
10
10
  * which case it wraps the input in a relatively positioned container so an
11
- * icon — or an icon-styled button, as `SearchInput` uses for its clear
12
- * button — can sit inside the field's padding without affecting layout.
11
+ * icon — or an icon-styled button — can sit inside the field's padding
12
+ * without affecting layout.
13
13
  *
14
14
  * Controlled or uncontrolled exactly like a native input (`value`/`onChange`
15
15
  * or `defaultValue`), and `type` is forwarded as-is, so `type="password"`,
16
16
  * `type="number"`, etc. all work.
17
17
  *
18
18
  * Meant to be wrapped by `FormField` for label, description and validation
19
- * wiring, or by `SearchInput` for a search affordance.
19
+ * wiring. For search, use `SearchInput`, which draws its own field.
20
20
  */
21
21
  declare const Input: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & {
22
22
  iconLeft?: React.ReactNode;
@@ -10,15 +10,15 @@ const iconSlotStyles = `absolute top-1/2 -translate-y-1/2 text-(--input-icon-fg)
10
10
  *
11
11
  * Renders a plain `<input>` unless `iconLeft` or `iconRight` is supplied, in
12
12
  * which case it wraps the input in a relatively positioned container so an
13
- * icon — or an icon-styled button, as `SearchInput` uses for its clear
14
- * button — can sit inside the field's padding without affecting layout.
13
+ * icon — or an icon-styled button — can sit inside the field's padding
14
+ * without affecting layout.
15
15
  *
16
16
  * Controlled or uncontrolled exactly like a native input (`value`/`onChange`
17
17
  * or `defaultValue`), and `type` is forwarded as-is, so `type="password"`,
18
18
  * `type="number"`, etc. all work.
19
19
  *
20
20
  * Meant to be wrapped by `FormField` for label, description and validation
21
- * wiring, or by `SearchInput` for a search affordance.
21
+ * wiring. For search, use `SearchInput`, which draws its own field.
22
22
  */
23
23
  const Input = React.forwardRef(({ className, type, iconLeft, iconRight, ...props }, ref) => {
24
24
  if (iconLeft || iconRight) {
@@ -31,7 +31,7 @@ export const Markdown = React.forwardRef(({ children, className }, ref) => (_jsx
31
31
  ul: ({ children }) => _jsx("ul", { className: "mt-2 flex list-disc flex-col gap-1 pl-5", children: children }),
32
32
  ol: ({ children }) => _jsx("ol", { className: "mt-2 flex list-decimal flex-col gap-1 pl-5", children: children }),
33
33
  li: ({ children }) => _jsx("li", { className: "text-fg-default text-sm", children: children }),
34
- code: ({ children }) => _jsx("code", { className: "rounded bg-bg-subtle px-1.5 py-0.5 font-mono text-fg-emphasis text-xs", children: children }),
34
+ code: ({ children }) => _jsx("code", { className: "rounded-sm bg-bg-subtle px-1.5 py-0.5 font-mono text-fg-emphasis text-xs", children: children }),
35
35
  pre: ({ children }) => _jsx("pre", { className: "mt-2 overflow-x-auto rounded-md bg-bg-subtle p-3 font-mono text-xs", children: children }),
36
36
  }, children: children }) })));
37
37
  Markdown.displayName = "Markdown";
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.js","sourceRoot":"","sources":["../../../src/components/Markdown/Markdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,iCAAiC,CAAC;AACrD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAO3C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAgC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CACxG,cAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,YACtD,KAAC,aAAa,IACZ,UAAU,EAAE;YACV,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,KAAC,OAAO,IAAC,EAAE,EAAC,IAAI,YAAE,QAAQ,GAAW;YAC3D,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,KAAC,OAAO,IAAC,EAAE,EAAC,IAAI,YAAE,QAAQ,GAAW;YAC3D,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,KAAC,QAAQ,IAAC,SAAS,EAAC,OAAO,YAAE,QAAQ,GAAY;YACvE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACnB,KAAC,IAAI,IAAC,EAAE,EAAC,GAAG,EAAC,SAAS,EAAC,MAAM,YAC1B,QAAQ,GACJ,CACR;YACD,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACzB,YAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,SAAS,EAAC,yBAAyB,YACzF,QAAQ,GACP,CACL;YACD,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,aAAI,SAAS,EAAC,yCAAyC,YAAE,QAAQ,GAAM;YAC7F,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,aAAI,SAAS,EAAC,4CAA4C,YAAE,QAAQ,GAAM;YAChG,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,aAAI,SAAS,EAAC,yBAAyB,YAAE,QAAQ,GAAM;YAC7E,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,eAAM,SAAS,EAAC,uEAAuE,YAAE,QAAQ,GAAQ;YACjI,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,cAAK,SAAS,EAAC,oEAAoE,YAAE,QAAQ,GAAO;SAC5H,YAEA,QAAQ,GACK,GACZ,CACP,CAAC,CAAC;AACH,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC"}
1
+ {"version":3,"file":"Markdown.js","sourceRoot":"","sources":["../../../src/components/Markdown/Markdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,iCAAiC,CAAC;AACrD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAO3C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAgC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CACxG,cAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,YACtD,KAAC,aAAa,IACZ,UAAU,EAAE;YACV,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,KAAC,OAAO,IAAC,EAAE,EAAC,IAAI,YAAE,QAAQ,GAAW;YAC3D,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,KAAC,OAAO,IAAC,EAAE,EAAC,IAAI,YAAE,QAAQ,GAAW;YAC3D,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,KAAC,QAAQ,IAAC,SAAS,EAAC,OAAO,YAAE,QAAQ,GAAY;YACvE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACnB,KAAC,IAAI,IAAC,EAAE,EAAC,GAAG,EAAC,SAAS,EAAC,MAAM,YAC1B,QAAQ,GACJ,CACR;YACD,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACzB,YAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,SAAS,EAAC,yBAAyB,YACzF,QAAQ,GACP,CACL;YACD,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,aAAI,SAAS,EAAC,yCAAyC,YAAE,QAAQ,GAAM;YAC7F,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,aAAI,SAAS,EAAC,4CAA4C,YAAE,QAAQ,GAAM;YAChG,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,aAAI,SAAS,EAAC,yBAAyB,YAAE,QAAQ,GAAM;YAC7E,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,eAAM,SAAS,EAAC,0EAA0E,YAAE,QAAQ,GAAQ;YACpI,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,cAAK,SAAS,EAAC,oEAAoE,YAAE,QAAQ,GAAO;SAC5H,YAEA,QAAQ,GACK,GACZ,CACP,CAAC,CAAC;AACH,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { type VariantProps } from "class-variance-authority";
2
+ import * as React from "react";
3
+ /**
4
+ * Geometry only. Every colour reads a `--number-stepper-*` component token
5
+ * whose value is decided by src/components/NumberStepper/number-stepper.recipe.css.
6
+ *
7
+ * `size` tracks Input's and Button's heights (`sm` 32px, `md` 36px, `lg`
8
+ * 40px) so a stepper sits on the same baseline as the fields beside it.
9
+ */
10
+ declare const numberStepperVariants: (props?: ({
11
+ size?: "sm" | "md" | "lg" | null | undefined;
12
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
13
+ export type NumberStepperSize = NonNullable<VariantProps<typeof numberStepperVariants>["size"]>;
14
+ export type NumberStepperProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, "value" | "defaultValue" | "onChange" | "size" | "min" | "max" | "step" | "type"> & VariantProps<typeof numberStepperVariants> & {
15
+ /** Controlled value. */
16
+ value?: number;
17
+ /** Initial value in uncontrolled mode. Defaults to `min`, or `0` without one. */
18
+ defaultValue?: number;
19
+ /** Called with the new, already-clamped value. */
20
+ onValueChange?: (value: number) => void;
21
+ /** Lowest reachable value. Defaults to `0` — quantities are the common case. */
22
+ min?: number;
23
+ /** Highest reachable value. Unbounded when omitted. */
24
+ max?: number;
25
+ /** Increment for the buttons and arrow keys. `PageUp`/`PageDown` move ten of them. */
26
+ step?: number;
27
+ /** Accessible name for the decrement button. */
28
+ decrementLabel?: string;
29
+ /** Accessible name for the increment button. */
30
+ incrementLabel?: string;
31
+ /** Extra classes for the inner `<input>`; `className` styles the surrounding group. */
32
+ inputClassName?: string;
33
+ };
34
+ /**
35
+ * A whole-number field with decrement and increment buttons — a cart
36
+ * quantity, a guest count, a per-day capacity.
37
+ *
38
+ * Implements the WAI-ARIA spinbutton pattern on the `<input>` itself:
39
+ * `role="spinbutton"` with `aria-valuenow`/`min`/`max`, `ArrowUp`/`ArrowDown`
40
+ * step, `PageUp`/`PageDown` step by ten, and `Home`/`End` jump to the bounds
41
+ * that exist. The two buttons are pointer affordances and stay out of the tab
42
+ * order, so the field is one tab stop — the same reason RadioButtonGroup is.
43
+ *
44
+ * Typing is free-form while focused and committed on blur or `Enter`: the
45
+ * draft is parsed, rounded to the nearest `step` from `min`, and clamped.
46
+ * Anything unparseable reverts to the last committed value rather than
47
+ * reporting `NaN`. Every value `onValueChange` receives is in range.
48
+ *
49
+ * Controlled or uncontrolled through the `value`/`defaultValue`/
50
+ * `onValueChange` triad. `name` submits the committed value with a form, since
51
+ * the input is a real `<input>`. The ref and every unlisted prop land on that
52
+ * input — so `FormField`'s `id`/`aria-describedby` wiring reaches the control
53
+ * — while `className` styles the surrounding group.
54
+ */
55
+ export declare const NumberStepper: React.ForwardRefExoticComponent<Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "defaultValue" | "onChange" | "step" | "type" | "value" | "max" | "min"> & VariantProps<(props?: ({
56
+ size?: "sm" | "md" | "lg" | null | undefined;
57
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
58
+ /** Controlled value. */
59
+ value?: number;
60
+ /** Initial value in uncontrolled mode. Defaults to `min`, or `0` without one. */
61
+ defaultValue?: number;
62
+ /** Called with the new, already-clamped value. */
63
+ onValueChange?: (value: number) => void;
64
+ /** Lowest reachable value. Defaults to `0` — quantities are the common case. */
65
+ min?: number;
66
+ /** Highest reachable value. Unbounded when omitted. */
67
+ max?: number;
68
+ /** Increment for the buttons and arrow keys. `PageUp`/`PageDown` move ten of them. */
69
+ step?: number;
70
+ /** Accessible name for the decrement button. */
71
+ decrementLabel?: string;
72
+ /** Accessible name for the increment button. */
73
+ incrementLabel?: string;
74
+ /** Extra classes for the inner `<input>`; `className` styles the surrounding group. */
75
+ inputClassName?: string;
76
+ } & React.RefAttributes<HTMLInputElement>>;
77
+ export { numberStepperVariants };
78
+ //# sourceMappingURL=NumberStepper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberStepper.d.ts","sourceRoot":"","sources":["../../../src/components/NumberStepper/NumberStepper.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;GAMG;AACH,QAAA,MAAM,qBAAqB;;8EAe1B,CAAC;AAgBF,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,YAAY,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAEhG,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAC3C,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CACjF,GACC,YAAY,CAAC,OAAO,qBAAqB,CAAC,GAAG;IAC3C,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAOJ;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa;;;IA9CtB,wBAAwB;YAChB,MAAM;IACd,iFAAiF;mBAClE,MAAM;IACrB,kDAAkD;oBAClC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IACvC,gFAAgF;UAC1E,MAAM;IACZ,uDAAuD;UACjD,MAAM;IACZ,sFAAsF;WAC/E,MAAM;IACb,gDAAgD;qBAC/B,MAAM;IACvB,gDAAgD;qBAC/B,MAAM;IACvB,uFAAuF;qBACtE,MAAM;0CAyJ1B,CAAC;AAGF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}