@stamcat/craftsman 0.0.27-alpha.9 → 0.0.28

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 (180) hide show
  1. package/AGENTS.md +21 -403
  2. package/Components.esm.js +62 -11
  3. package/README.md +63 -12
  4. package/Styles.esm.js +7 -7
  5. package/Utilities.esm.js +2 -2
  6. package/_virtual/_rolldown/runtime.esm.js +18 -6
  7. package/package.json +51 -3
  8. package/src/components/Button/AGENTS.md +65 -0
  9. package/src/components/Button/Button.d.ts +1 -1
  10. package/src/components/Button/Button.esm.js +11 -17
  11. package/src/components/Carousel/AGENTS.md +41 -0
  12. package/src/components/Carousel/Carousel.css +1 -0
  13. package/src/components/Carousel/Carousel.d.ts +11 -0
  14. package/src/components/Carousel/Carousel.scss +34 -0
  15. package/src/components/Carousel/Carousel2.esm.js +75 -0
  16. package/src/components/Checkbox/AGENTS.md +34 -0
  17. package/src/components/Checkbox/Checkbox.d.ts +8 -0
  18. package/src/components/Checkbox/Checkbox.esm.js +18 -0
  19. package/src/components/DatePicker/AGENTS.md +36 -0
  20. package/src/components/DatePicker/DatePicker.css +1 -0
  21. package/src/components/DatePicker/DatePicker.d.ts +8 -0
  22. package/src/components/DatePicker/DatePicker.scss +61 -0
  23. package/src/components/DatePicker/DatePicker2.esm.js +29 -0
  24. package/src/components/DatePicker/ReactCalendar.css +1 -0
  25. package/src/components/DatePicker/ReactCalendar.scss +158 -0
  26. package/src/components/DatePicker/_DatePicker.scss +73 -0
  27. package/src/components/DateRangePicker/AGENTS.md +38 -0
  28. package/src/components/DateRangePicker/DateRangePicker.css +1 -0
  29. package/src/components/DateRangePicker/DateRangePicker.d.ts +8 -0
  30. package/src/components/DateRangePicker/DateRangePicker.scss +62 -0
  31. package/src/components/DateRangePicker/DateRangePicker2.esm.js +29 -0
  32. package/src/components/DateTimePicker/AGENTS.md +41 -0
  33. package/src/components/DateTimePicker/DateTimePicker.css +1 -0
  34. package/src/components/DateTimePicker/DateTimePicker.d.ts +13 -0
  35. package/src/components/DateTimePicker/DateTimePicker.scss +86 -0
  36. package/src/components/DateTimePicker/DateTimePicker2.esm.js +82 -0
  37. package/src/components/Icons/IconAmazonPay.d.ts +2 -0
  38. package/src/components/Icons/IconAmazonPay.esm.js +76 -0
  39. package/src/components/Icons/IconAmex.d.ts +2 -0
  40. package/src/components/Icons/IconAmex.esm.js +87 -0
  41. package/src/components/Icons/IconApplePay.d.ts +2 -0
  42. package/src/components/Icons/IconApplePay.esm.js +26 -0
  43. package/src/components/Icons/IconDiscover.d.ts +2 -0
  44. package/src/components/Icons/IconDiscover.esm.js +129 -0
  45. package/src/components/Icons/IconGooglePay.d.ts +2 -0
  46. package/src/components/Icons/IconGooglePay.esm.js +64 -0
  47. package/src/components/Icons/IconMaestro.d.ts +2 -0
  48. package/src/components/Icons/IconMaestro.esm.js +38 -0
  49. package/src/components/Icons/IconMastercard.d.ts +2 -0
  50. package/src/components/Icons/IconMastercard.esm.js +27 -0
  51. package/src/components/Icons/IconPayPal.d.ts +2 -0
  52. package/src/components/Icons/IconPayPal.esm.js +52 -0
  53. package/src/components/Icons/IconSepa.d.ts +2 -0
  54. package/src/components/Icons/IconSepa.esm.js +272 -0
  55. package/src/components/Icons/IconShopPay.d.ts +2 -0
  56. package/src/components/Icons/IconShopPay.esm.js +35 -0
  57. package/src/components/Icons/IconSquare.d.ts +2 -0
  58. package/src/components/Icons/IconSquare.esm.js +11 -0
  59. package/src/components/Icons/IconStripe.d.ts +2 -0
  60. package/src/components/Icons/IconStripe.esm.js +57 -0
  61. package/src/components/Icons/IconUnionPay.d.ts +2 -0
  62. package/src/components/Icons/IconUnionPay.esm.js +28 -0
  63. package/src/components/Icons/IconVenmo.d.ts +2 -0
  64. package/src/components/Icons/IconVenmo.esm.js +21 -0
  65. package/src/components/Icons/IconVisa.d.ts +2 -0
  66. package/src/components/Icons/IconVisa.esm.js +14 -0
  67. package/src/components/Icons/index.d.ts +15 -0
  68. package/src/components/Icons/index.esm.js +16 -0
  69. package/src/components/Icons/types.d.ts +4 -0
  70. package/src/components/Input/AGENTS.md +30 -0
  71. package/src/components/Input/Input.css +1 -1
  72. package/src/components/Input/Input.scss +108 -95
  73. package/src/components/Input/Input2.esm.js +27 -18
  74. package/src/components/Input/InputWrapper.d.ts +1 -0
  75. package/src/components/InputNumber/AGENTS.md +37 -0
  76. package/src/components/InputNumber/InputNumber.css +1 -0
  77. package/src/components/InputNumber/InputNumber.d.ts +10 -0
  78. package/src/components/InputNumber/InputNumber.scss +29 -0
  79. package/src/components/InputNumber/InputNumber2.esm.js +36 -0
  80. package/src/components/InputPassword/AGENTS.md +29 -0
  81. package/src/components/{Input → InputPassword}/InputPassword.d.ts +1 -1
  82. package/src/components/InputPassword/InputPassword.esm.js +30 -0
  83. package/src/components/InputPhone/AGENTS.md +35 -0
  84. package/src/components/InputPhone/InputPhone.css +1 -0
  85. package/src/components/{Input → InputPhone}/InputPhone.d.ts +1 -1
  86. package/src/components/InputPhone/InputPhone.scss +266 -0
  87. package/src/components/{Input/InputPhone.esm.js → InputPhone/InputPhone2.esm.js} +4 -4
  88. package/src/components/Loader/AGENTS.md +31 -0
  89. package/src/components/Loader/Loader.esm.js +1 -1
  90. package/src/components/Loader/types.d.ts +1 -1
  91. package/src/components/Modal/AGENTS.md +47 -0
  92. package/src/components/Modal/Modal.css +1 -0
  93. package/src/components/Modal/Modal.scss +150 -0
  94. package/src/components/Modal/Modal2.esm.js +53 -0
  95. package/src/components/Notice/AGENTS.md +42 -0
  96. package/src/components/Notice/Notice.css +1 -0
  97. package/src/components/Notice/Notice.d.ts +13 -0
  98. package/src/components/Notice/Notice.scss +76 -0
  99. package/src/components/Notice/Notice2.esm.js +56 -0
  100. package/src/components/Pagination/AGENTS.md +38 -0
  101. package/src/components/Pagination/Pagination.css +1 -0
  102. package/src/components/Pagination/Pagination.d.ts +10 -0
  103. package/src/components/Pagination/Pagination.scss +22 -0
  104. package/src/components/Pagination/Pagination2.esm.js +64 -0
  105. package/src/components/RadioButton/AGENTS.md +44 -0
  106. package/src/components/RadioButton/RadioButton.d.ts +9 -0
  107. package/src/components/RadioButton/RadioButton.esm.js +18 -0
  108. package/src/components/Select/AGENTS.md +36 -0
  109. package/src/components/SortableList/AGENTS.md +45 -0
  110. package/src/components/SortableList/ListItem.d.ts +10 -0
  111. package/src/components/SortableList/ListItem.esm.js +67 -0
  112. package/src/components/SortableList/SortableList.css +1 -0
  113. package/src/components/SortableList/SortableList.d.ts +23 -0
  114. package/src/components/SortableList/SortableList.scss +41 -0
  115. package/src/components/SortableList/SortableList2.esm.js +54 -0
  116. package/src/components/SortableList/utilities.d.ts +7 -0
  117. package/src/components/SortableList/utilities.esm.js +4 -0
  118. package/src/components/Text/AGENTS.md +32 -0
  119. package/src/components/Text/Text.css +1 -1
  120. package/src/components/Text/Text.scss +2 -2
  121. package/src/components/Textarea/AGENTS.md +32 -0
  122. package/src/components/{Input → Textarea}/Textarea.d.ts +1 -1
  123. package/src/components/Textarea/Textarea.esm.js +23 -0
  124. package/src/components/TimePicker/AGENTS.md +42 -0
  125. package/src/components/TimePicker/TimePicker.css +1 -0
  126. package/src/components/TimePicker/TimePicker.d.ts +13 -0
  127. package/src/components/TimePicker/TimePicker.scss +226 -0
  128. package/src/components/TimePicker/TimePicker2.esm.js +98 -0
  129. package/src/components/TimePicker/TimePickerDisplay.d.ts +16 -0
  130. package/src/components/TimePicker/TimePickerDisplay.esm.js +54 -0
  131. package/src/components/TimePicker/TimePickerWheel.d.ts +13 -0
  132. package/src/components/TimePicker/TimePickerWheel.esm.js +61 -0
  133. package/src/components/TimePicker/constants.d.ts +7 -0
  134. package/src/components/TimePicker/constants.esm.js +3 -0
  135. package/src/components/TimePicker/utilities.d.ts +15 -0
  136. package/src/components/TimePicker/utilities.esm.js +20 -0
  137. package/src/components/Toggle/AGENTS.md +33 -0
  138. package/src/components/Toggle/Toggle.css +1 -0
  139. package/src/components/Toggle/Toggle.d.ts +5 -0
  140. package/src/components/Toggle/Toggle.scss +64 -0
  141. package/src/components/Toggle/Toggle2.esm.js +19 -0
  142. package/src/components/Tooltip/AGENTS.md +41 -0
  143. package/src/components/Tooltip/Tooltip.css +1 -0
  144. package/src/components/Tooltip/Tooltip.d.ts +12 -0
  145. package/src/components/Tooltip/Tooltip.scss +29 -0
  146. package/src/components/Tooltip/Tooltip2.esm.js +65 -0
  147. package/src/components/index.d.ts +17 -6
  148. package/src/styles/global/components/_button.scss +24 -21
  149. package/src/styles/global/components/_checkbox.scss +5 -4
  150. package/src/styles/global/components/_input.scss +1 -1
  151. package/src/styles/global/components/_radioButton.scss +5 -4
  152. package/src/styles/global/components/_typography.scss +6 -1
  153. package/src/styles/global/globalStyles.scss +9 -5
  154. package/src/styles/theme/components.esm.js +5 -6
  155. package/src/styles/utilities/_functions.scss +2 -2
  156. package/src/styles/utilities/_placeholders.scss +6 -0
  157. package/src/styles/utilities/layout.esm.js +3 -3
  158. package/src/utilities/types.d.ts +28 -3
  159. package/src/utilities/types.esm.js +11 -5
  160. package/src/utilities/validations.d.ts +5 -0
  161. package/src/utilities/validations.esm.js +19 -1
  162. package/src/components/Input/Checkbox.d.ts +0 -7
  163. package/src/components/Input/Checkbox.esm.js +0 -11
  164. package/src/components/Input/DatePicker.d.ts +0 -8
  165. package/src/components/Input/DatePicker.esm.js +0 -24
  166. package/src/components/Input/InputPassword.esm.js +0 -28
  167. package/src/components/Input/RadioButton.d.ts +0 -7
  168. package/src/components/Input/RadioButton.esm.js +0 -11
  169. package/src/components/Input/Textarea.esm.js +0 -24
  170. package/src/components/Modal/Modal.esm.js +0 -53
  171. package/src/components/Modal/Modal.module.css +0 -1
  172. package/src/components/Modal/Modal.module.esm.js +0 -16
  173. package/src/components/Modal/Modal.module.scss +0 -147
  174. package/src/styles/global/components/_reactCalendar.css +0 -1
  175. package/src/styles/global/components/_reactCalendar.scss +0 -237
  176. package/src/styles/global/components/_reactDatePicker.css +0 -1
  177. package/src/styles/global/components/_reactDatePicker.scss +0 -152
  178. package/src/styles/global/components/_reactPhone.css +0 -1
  179. package/src/styles/global/components/_reactPhone.scss +0 -265
  180. /package/src/components/{Progress.d.ts → Progress/Progress.d.ts} +0 -0
@@ -1,11 +1,23 @@
1
1
  //#region \0rolldown/runtime.js
2
- var e = Object.defineProperty, t = (t, n) => {
2
+ var e = Object.create, t = Object.defineProperty, n = Object.getOwnPropertyDescriptor, r = Object.getOwnPropertyNames, i = Object.getPrototypeOf, a = Object.prototype.hasOwnProperty, o = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), s = (e, n) => {
3
3
  let r = {};
4
- for (var i in t) e(r, i, {
5
- get: t[i],
4
+ for (var i in e) t(r, i, {
5
+ get: e[i],
6
6
  enumerable: !0
7
7
  });
8
- return n || e(r, Symbol.toStringTag, { value: "Module" }), r;
9
- };
8
+ return n || t(r, Symbol.toStringTag, { value: "Module" }), r;
9
+ }, c = (e, i, o, s) => {
10
+ if (i && typeof i == "object" || typeof i == "function") for (var c = r(i), l = 0, u = c.length, d; l < u; l++) d = c[l], !a.call(e, d) && d !== o && t(e, d, {
11
+ get: ((e) => i[e]).bind(null, d),
12
+ enumerable: !(s = n(i, d)) || s.enumerable
13
+ });
14
+ return e;
15
+ }, l = (n, r, a) => (a = n == null ? {} : e(i(n)), c(r || !n || !n.__esModule ? t(a, "default", {
16
+ value: n,
17
+ enumerable: !0
18
+ }) : a, n)), u = /* @__PURE__ */ ((e) => typeof require < "u" ? require : typeof Proxy < "u" ? new Proxy(e, { get: (e, t) => (typeof require < "u" ? require : e)[t] }) : e)(function(e) {
19
+ if (typeof require < "u") return require.apply(this, arguments);
20
+ throw Error("Calling `require` for \"" + e + "\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.");
21
+ });
10
22
  //#endregion
11
- export { t as __exportAll };
23
+ export { o as __commonJSMin, s as __exportAll, u as __require, l as __toESM };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stamcat/craftsman",
3
- "version": "0.0.27-alpha.9",
3
+ "version": "0.0.28",
4
4
  "type": "module",
5
5
  "description": "A powerful, lightweight framework for design systems",
6
6
  "repository": {
@@ -23,14 +23,22 @@
23
23
  "prepublishOnly": "node ./scripts/prepublishCheck.js"
24
24
  },
25
25
  "dependencies": {
26
+ "@atlaskit/pragmatic-drag-and-drop": "3.0.0",
27
+ "@floating-ui/react-dom": "2.1.9",
28
+ "@wojtekmaj/react-daterange-picker": "7.1.0",
26
29
  "clsx": "2.1.1",
27
- "dompurify": "3.4.12",
30
+ "country-flag-icons": "1.6.20",
31
+ "dompurify": "3.4.13",
32
+ "embla-carousel-react": "8.6.0",
28
33
  "react": "19.2.7",
29
34
  "react-date-picker": "12.0.2",
30
35
  "react-datetime-picker": "7.0.2",
36
+ "react-device-detect": "2.2.3",
31
37
  "react-dom": "19.2.7",
32
38
  "react-icons": "5.7.0",
33
39
  "react-international-phone": "4.8.0",
40
+ "react-intl": "10.1.20",
41
+ "react-time-picker": "8.1.0",
34
42
  "react-toastify": "11.1.0",
35
43
  "sass-embedded": "1.100.0",
36
44
  "typescript-plugin-css-modules": "5.2.0",
@@ -38,7 +46,7 @@
38
46
  },
39
47
  "devDependencies": {},
40
48
  "overrides": {
41
- "postcss": "8.5.20",
49
+ "postcss": "8.5.23",
42
50
  "sharp": "0.35.3"
43
51
  },
44
52
  "exports": {
@@ -104,9 +112,49 @@
104
112
  "types": "./src/components/DatePicker.d.ts",
105
113
  "default": "./src/components/DatePicker.esm.js"
106
114
  },
115
+ "./DateRangePicker": {
116
+ "types": "./src/components/DateRangePicker.d.ts",
117
+ "default": "./src/components/DateRangePicker.esm.js"
118
+ },
107
119
  "./InputPhone": {
108
120
  "types": "./src/components/InputPhone.d.ts",
109
121
  "default": "./src/components/InputPhone.esm.js"
122
+ },
123
+ "./InputNumber": {
124
+ "types": "./src/components/InputNumber.d.ts",
125
+ "default": "./src/components/InputNumber.esm.js"
126
+ },
127
+ "./Toggle": {
128
+ "types": "./src/components/Toggle.d.ts",
129
+ "default": "./src/components/Toggle.esm.js"
130
+ },
131
+ "./Pagination": {
132
+ "types": "./src/components/Pagination.d.ts",
133
+ "default": "./src/components/Pagination.esm.js"
134
+ },
135
+ "./Carousel": {
136
+ "types": "./src/components/Carousel.d.ts",
137
+ "default": "./src/components/Carousel.esm.js"
138
+ },
139
+ "./TimePicker": {
140
+ "types": "./src/components/TimePicker.d.ts",
141
+ "default": "./src/components/TimePicker.esm.js"
142
+ },
143
+ "./DateTimePicker": {
144
+ "types": "./src/components/DateTimePicker.d.ts",
145
+ "default": "./src/components/DateTimePicker.esm.js"
146
+ },
147
+ "./Tooltip": {
148
+ "types": "./src/components/Tooltip.d.ts",
149
+ "default": "./src/components/Tooltip.esm.js"
150
+ },
151
+ "./Notice": {
152
+ "types": "./src/components/Notice.d.ts",
153
+ "default": "./src/components/Notice.esm.js"
154
+ },
155
+ "./SortableList": {
156
+ "types": "./src/components/SortableList.d.ts",
157
+ "default": "./src/components/SortableList.esm.js"
110
158
  }
111
159
  }
112
160
  }
@@ -0,0 +1,65 @@
1
+ # Button — Agent Usage Notes
2
+
3
+ Import:
4
+
5
+ ```tsx
6
+ import { Button } from "@stamcat/craftsman/Button";
7
+ ```
8
+
9
+ Props:
10
+
11
+ - Inherits all native `<button>` props.
12
+ - `variant?: "primary" | "default" | "text"` (default: `"default"`)
13
+ - `size?: number` (default visual scale is `1`)
14
+ - `styles?: React.CSSProperties` (inline style override)
15
+
16
+ Behavior notes:
17
+
18
+ - `type` defaults to `"button"`.
19
+ - For `variant !== "default"`, variant is appended to `className` (for example `"primary"`).
20
+ - `className` is preserved and merged after component classes.
21
+ - Theme component overrides are selector-based CSS emitted by `ThemeProvider`; `theme.components.*` accepts JS style objects or raw CSS/Sass strings for the target selector.
22
+ - If `children` is empty (per `isEmpty`), the component renders nothing.
23
+ - `size` is clamped to `[0.1, 10]` before styling is applied.
24
+ - When `size` is provided, Button sets a single `--btn-size` CSS variable inline; all scaling math lives in SCSS:
25
+ - `border-radius: calc(var(--w-gutter) * 0.75 * var(--btn-size))`
26
+ - `padding: calc(var(--w-gutter) * 0.5 * var(--btn-size)) calc(var(--w-gutter) * 0.75 * var(--btn-size))`
27
+ - `font-size: max(10px, calc(var(--w-text) * var(--btn-size)))`
28
+ - This is the standard sizing pattern used across the library (see `Toggle`'s `--toggle-width`): components expose one scale/size CSS variable, and SCSS does all the `calc()` work.
29
+ - There is no dedicated icon/loading prop. Icons, loaders, and mixed content are passed as `children`.
30
+ - Supports both real disable (`disabled={true}`) and style-only disable (`className="disabled"`).
31
+ - Native button modes are supported (`type="button" | "submit" | "reset"`).
32
+ - Accessibility props such as `aria-label` pass through unchanged.
33
+
34
+ Example:
35
+
36
+ ```tsx
37
+ <Button variant="primary" onClick={onSave}>Save</Button>
38
+ ```
39
+
40
+ Story-aligned usage examples:
41
+
42
+ ```tsx
43
+ // Scaled compact button (size is clamped to [0.1, 10])
44
+ <Button variant="primary" size={0.5}>Mini Action</Button>
45
+
46
+ // Icon content
47
+ <Button variant="primary">
48
+ <TruckIcon size={20} /> <span>Ship</span>
49
+ </Button>
50
+
51
+ // Loading content
52
+ <Button aria-label="Saving">
53
+ <Loader type="boxy" width={32} color="#de13ca" />
54
+ </Button>
55
+
56
+ // Style-only disabled appearance while still allowing click handlers
57
+ <Button className="disabled" onClick={onClick}>Disabled Look</Button>
58
+
59
+ // Native submit behavior
60
+ <Button type="submit" aria-label="Save form">Save</Button>
61
+ ```
62
+
63
+ Implementation caution:
64
+
65
+ - Size scaling depends on CSS variables provided by the package global styles (`--btn-border-radius`, `--btn-pad-y`, `--btn-pad-x`, `--w-text`).
@@ -1,4 +1,4 @@
1
- import { ButtonType } from '../../styles';
1
+ import { ButtonType } from '../../utilities/types';
2
2
  export type ButtonProps = React.ComponentProps<"button"> & {
3
3
  variant?: ButtonType;
4
4
  size?: number;
@@ -1,26 +1,20 @@
1
1
  "use client";
2
2
  import { isEmpty as e } from "../../utilities/validations.esm.js";
3
- import { width as t } from "../../styles/utilities/layout.esm.js";
4
- import "../../../Styles.esm.js";
5
- import n from "clsx";
6
- import { Fragment as r, jsx as i } from "react/jsx-runtime";
3
+ import t from "clsx";
4
+ import { Fragment as n, jsx as r } from "react/jsx-runtime";
7
5
  //#region src/components/Button/Button.tsx
8
- var a = (a) => {
9
- let { type: o = "button", variant: s = "default", size: c, styles: l, className: u, style: d, ...f } = a, p = typeof c == "number" ? Math.min(10, Math.max(.1, c)) : void 0, m = e(l) ? void 0 : l, h = p ? {
10
- borderRadius: `calc(var(--btn-border-radius) * ${p})`,
11
- padding: `calc(var(--btn-pad-y) * ${p}) calc(var(--btn-pad-x) * ${p})`,
12
- fontSize: `max(10px, calc(${t("text")} * ${p}))`
13
- } : {};
14
- return e(a.children) ? /* @__PURE__ */ i(r, {}) : /* @__PURE__ */ i("button", {
15
- type: o,
16
- className: n(s, u),
6
+ var i = (i) => {
7
+ let { type: a = "button", variant: o = "default", size: s, styles: c, className: l, style: u, ...d } = i, f = typeof s == "number" ? Math.min(10, Math.max(.1, s)) : void 0, p = e(c) ? void 0 : c, m = f ? { "--btn-size": f } : void 0;
8
+ return e(i.children) ? /* @__PURE__ */ r(n, {}) : /* @__PURE__ */ r("button", {
9
+ type: a,
10
+ className: t("button", o, l),
17
11
  style: {
18
- ...h,
19
12
  ...m,
20
- ...d
13
+ ...p,
14
+ ...u
21
15
  },
22
- ...f
16
+ ...d
23
17
  });
24
18
  };
25
19
  //#endregion
26
- export { a as Button };
20
+ export { i as Button };
@@ -0,0 +1,41 @@
1
+ # Carousel — Agent Usage Notes
2
+
3
+ Import:
4
+
5
+ ```tsx
6
+ import { Carousel } from "@stamcat/craftsman/Carousel";
7
+ ```
8
+
9
+ Props:
10
+
11
+ - Extends `EmblaOptionsType` from `embla-carousel`, except `slides`.
12
+ - `slides?: React.ReactNode[]`
13
+ - `className?: string`
14
+ - `style?: React.CSSProperties`
15
+ - `buttons?: boolean` (default: `true`)
16
+ - `pagination?: "dots" | "numbers"` (default: `"dots"`)
17
+
18
+ Behavior notes:
19
+
20
+ - `slides` is an array prop; do not pass slide content as `children`.
21
+ - Built on `embla-carousel-react`, so standard Embla options such as `loop`, `align`, `dragFree`, and `slidesToScroll` pass through.
22
+ - Previous/next controls are built in and can be hidden with `buttons={false}`.
23
+ - Pagination can render dots or the shared `Pagination` component in number mode.
24
+ - Number pagination uses zero-based indexes internally, consistent with `Pagination`.
25
+ - The component manages its own selected index from the Embla instance; there is no separate controlled index prop.
26
+
27
+ Example:
28
+
29
+ ```tsx
30
+ const slides = [
31
+ <figure key="one"><img src="/slide-1.jpg" alt="First slide" /></figure>,
32
+ <figure key="two"><img src="/slide-2.jpg" alt="Second slide" /></figure>,
33
+ ];
34
+
35
+ <Carousel
36
+ slides={slides}
37
+ loop={false}
38
+ pagination="dots"
39
+ align="center"
40
+ />
41
+ ```
@@ -0,0 +1 @@
1
+ @layer craftsman-component{.carousel{position:relative}.carousel__viewport{overflow:hidden}.carousel__container{touch-action:pan-y pinch-zoom;display:flex}.carousel__slide{flex:0 0 100%;min-width:0}.carousel__controls{justify-content:space-between;gap:calc(var(--w-gutter) * .5);margin-top:calc(var(--w-gutter) * .75);flex-flow:row;width:100%;display:inline-flex}.carousel__dots button{margin:0 calc(var(--w-gutter) * .125)}}
@@ -0,0 +1,11 @@
1
+ import { default as React } from 'react';
2
+ import { EmblaOptionsType } from 'embla-carousel';
3
+ import { CarouselPageType } from '../../utilities/types';
4
+ export type CarouselProps = Omit<EmblaOptionsType, "slides"> & {
5
+ slides?: React.ReactNode[];
6
+ className?: string;
7
+ style?: React.CSSProperties;
8
+ buttons?: boolean;
9
+ pagination?: CarouselPageType;
10
+ };
11
+ export declare const Carousel: React.FC<CarouselProps>;
@@ -0,0 +1,34 @@
1
+ @use "../../styles/utilities/_functions" as u;
2
+
3
+ @layer craftsman-component {
4
+ .carousel {
5
+ position: relative;
6
+
7
+ &__viewport {
8
+ overflow: hidden;
9
+ }
10
+
11
+ &__container {
12
+ display: flex;
13
+ touch-action: pan-y pinch-zoom;
14
+ }
15
+
16
+ &__slide {
17
+ flex: 0 0 100%;
18
+ min-width: 0;
19
+ }
20
+
21
+ &__controls {
22
+ display: inline-flex;
23
+ justify-content: space-between;
24
+ flex-flow: row nowrap;
25
+ gap: #{u.width("gutter", 0.5)};
26
+ margin-top: #{u.width("gutter", 0.75)};
27
+ width: 100%;
28
+ }
29
+ &__dots button {
30
+ margin: 0 #{u.width("gutter", 0.125)};
31
+ }
32
+
33
+ }
34
+ }
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ import { Button as e } from "../Button/Button.esm.js";
3
+ import { Pagination as t } from "../Pagination/Pagination2.esm.js";
4
+ import './Carousel.css';/* empty css */
5
+ import n from "clsx";
6
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
7
+ import { useCallback as a, useSyncExternalStore as o } from "react";
8
+ import { FaAngleLeft as s, FaAngleRight as c, FaCircle as l, FaRegCircle as u } from "react-icons/fa6";
9
+ import d from "embla-carousel-react";
10
+ //#region src/components/Carousel/Carousel.tsx
11
+ var f = (f) => {
12
+ let { slides: p = [], className: m, style: h, buttons: g = !0, pagination: _ = "dots", ...v } = f, [y, b] = d(v), x = a((e) => b ? (b.on("select", e).on("reInit", e), () => {
13
+ b.off("select", e), b.off("reInit", e);
14
+ }) : () => {}, [b]), S = o(x, () => !!b?.canScrollPrev(), () => !1), C = o(x, () => !!b?.canScrollNext(), () => !1), w = o(x, () => b?.selectedScrollSnap() ?? 0, () => 0), T = () => b?.scrollPrev(), E = () => b?.scrollNext(), D = (e) => {
15
+ let t = parseInt(e.currentTarget.value, 10) || 0;
16
+ b?.scrollTo(t);
17
+ };
18
+ return /* @__PURE__ */ i("div", {
19
+ className: n("carousel", m),
20
+ style: h,
21
+ children: [/* @__PURE__ */ r("div", {
22
+ className: "carousel__viewport",
23
+ ref: y,
24
+ children: /* @__PURE__ */ r("div", {
25
+ className: "carousel__container",
26
+ children: p.map((e, t) => /* @__PURE__ */ r("div", {
27
+ className: "carousel__slide",
28
+ children: e
29
+ }, `slide-${t}`))
30
+ })
31
+ }), /* @__PURE__ */ i("div", {
32
+ className: "carousel__controls",
33
+ children: [
34
+ g && /* @__PURE__ */ i("div", {
35
+ className: "carousel__buttons",
36
+ children: [/* @__PURE__ */ r(e, {
37
+ variant: "text",
38
+ onClick: T,
39
+ disabled: !S,
40
+ name: "prev",
41
+ children: /* @__PURE__ */ r(s, {
42
+ size: 24,
43
+ "aria-label": "prev"
44
+ })
45
+ }), /* @__PURE__ */ r(e, {
46
+ variant: "text",
47
+ onClick: E,
48
+ disabled: !C,
49
+ name: "next",
50
+ children: /* @__PURE__ */ r(c, {
51
+ size: 24,
52
+ "aria-label": "next"
53
+ })
54
+ })]
55
+ }),
56
+ _ === "dots" && /* @__PURE__ */ r("div", {
57
+ className: "carousel__dots",
58
+ children: p.map((t, n) => /* @__PURE__ */ r(e, {
59
+ variant: "text",
60
+ value: n,
61
+ onClick: D,
62
+ children: r(w === n ? l : u, { size: 16 })
63
+ }, `dot-${n}`))
64
+ }),
65
+ _ === "numbers" && /* @__PURE__ */ r(t, {
66
+ total: p.length,
67
+ current: w,
68
+ onChange: D
69
+ })
70
+ ]
71
+ })]
72
+ });
73
+ };
74
+ //#endregion
75
+ export { f as Carousel };
@@ -0,0 +1,34 @@
1
+ # Checkbox — Agent Usage Notes
2
+
3
+ Import:
4
+
5
+ ```tsx
6
+ import { Checkbox } from "@stamcat/craftsman/Checkbox";
7
+ ```
8
+
9
+ Props:
10
+
11
+ - Extends `Input` props.
12
+ - `type?: "checkbox"` (default: `"checkbox"`)
13
+ - `labelPosition?: "left" | "right" | "top" | "bottom"` (default: `"right"`)
14
+ - `size?: number` (default visual scale is `1`, clamped to `[0.1, 10]`)
15
+
16
+ Behavior notes:
17
+
18
+ - `Checkbox` is a thin wrapper around `Input` with checkbox-specific guardrails.
19
+ - The wrapper enforces checkbox type by default and narrows label position options to common checkbox layouts.
20
+ - Controlled and uncontrolled patterns are both supported (`checked` + `onChange`, or `defaultChecked`).
21
+ - When `size` is provided, Checkbox sets a single `--checkbox-size` CSS variable inline; the checkbox box and checkmark scale via SCSS `calc()` from that variable (same pattern as `Button`'s `--btn-size` and `Toggle`'s `--toggle-width`).
22
+
23
+ Example:
24
+
25
+ ```tsx
26
+ <Checkbox
27
+ id="accept-terms"
28
+ name="terms"
29
+ value="accepted"
30
+ label="Accept terms"
31
+ checked={accepted}
32
+ onChange={(event) => setAccepted(event.currentTarget.checked)}
33
+ />
34
+ ```
@@ -0,0 +1,8 @@
1
+ import { InputProps } from '../Input/Input';
2
+ import { CheckboxLabelPosition } from '../../utilities/types';
3
+ export type CheckboxProps = InputProps & {
4
+ type?: "checkbox";
5
+ labelPosition?: CheckboxLabelPosition;
6
+ size?: number;
7
+ };
8
+ export declare const Checkbox: React.FC<CheckboxProps>;
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { Input as e } from "../Input/Input2.esm.js";
3
+ import { jsx as t } from "react/jsx-runtime";
4
+ //#region src/components/Checkbox/Checkbox.tsx
5
+ var n = ({ type: n = "checkbox", labelPosition: r = "right", size: i, style: a, ...o }) => {
6
+ let s = typeof i == "number" ? Math.min(10, Math.max(.1, i)) : void 0;
7
+ return /* @__PURE__ */ t(e, {
8
+ type: n,
9
+ labelPosition: r,
10
+ style: {
11
+ ...s ? { "--checkbox-size": s } : void 0,
12
+ ...a
13
+ },
14
+ ...o
15
+ });
16
+ };
17
+ //#endregion
18
+ export { n as Checkbox };
@@ -0,0 +1,36 @@
1
+ # DatePicker — Agent Usage Notes
2
+
3
+ Import:
4
+
5
+ ```tsx
6
+ import { DatePicker } from "@stamcat/craftsman/DatePicker";
7
+ ```
8
+
9
+ Props:
10
+
11
+ - Extends `DatePickerProps` from `react-date-picker`.
12
+ - `label?: string | ReactNode`
13
+ - `labelPosition?: "top" | "left" | "bottom" | "right" | "inside" | "hidden"` (default: `"top"`)
14
+ - `error?: string | boolean | ReactNode`
15
+ - `required?: boolean`
16
+ - `value?: Date | null`
17
+ - `onChange?: (value: DatePickerProps["value"]) => void`
18
+
19
+ Behavior notes:
20
+
21
+ - Controlled component — parent owns `value` and `onChange`.
22
+ - Calendar flyout renders below the input; ensure the container has at least 400px of vertical space.
23
+ - Use `useState` to manage the selected date value.
24
+
25
+ Example:
26
+
27
+ ```tsx
28
+ const [date, setDate] = useState<Date | null>(null);
29
+
30
+ <DatePicker
31
+ label="Appointment Date"
32
+ value={date}
33
+ onChange={setDate}
34
+ required
35
+ />
36
+ ```
@@ -0,0 +1 @@
1
+ @layer craftsman-base{.react-date-picker__wrapper:focus{box-shadow:none;outline:0}.react-date-picker__wrapper{color:var(--text);border:1px solid var(--gray400);padding:calc(var(--w-gutter) * .5);background-color:var(--white);border-radius:6px}[type=number].react-date-picker__wrapper::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}[type=number].react-date-picker__wrapper::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}[type=number].react-date-picker__wrapper{appearance:textfield}.react-date-picker__wrapper:disabled,.disabled.react-date-picker__wrapper{border-color:var(--gray200);background-color:var(--gray100)}.react-date-picker__calendar{z-index:1;width:350px;max-width:100vw}.react-date-picker__calendar .react-calendar{border-width:thin}.react-date-picker__calendar--closed,.react-date-picker__clock--closed{display:none}.react-date-picker__calendar .react-date-picker__inputGroup__input:invalid{background:unset}}.react-date-picker,.react-date-picker *,.react-date-picker :before,.react-date-picker :after{box-sizing:border-box}@layer craftsman-component{.react-date-picker{display:inline-flex;position:relative}.react-date-picker--disabled{color:#6d6d6d;background-color:#f0f0f0}.react-date-picker__wrapper{flex-grow:1;flex-shrink:0;padding:6px 8px;display:flex}.react-date-picker__inputGroup{box-sizing:content-box;flex-grow:1;padding:0 2px}.react-date-picker__inputGroup__divider{white-space:pre;padding:1px 0}.react-date-picker__inputGroup__divider,.react-date-picker__inputGroup__leadingZero{font:inherit;display:inline-block}.react-date-picker__inputGroup__input{text-align:center;color:currentColor;min-width:calc(2ch + 1px);height:calc(100% - 2px);font:inherit;box-sizing:content-box;appearance:textfield;background:0 0;border:0;padding:1px;position:relative}[name=year].react-date-picker__inputGroup__input{min-width:calc(4ch + 2px)}.react-date-picker__inputGroup__input:disabled{background-color:unset}.react-date-picker__inputGroup__input::-webkit-outer-spin-button{appearance:none;margin:0}.react-date-picker__inputGroup__input::-webkit-inner-spin-button{appearance:none;margin:0}.react-date-picker__inputGroup__input--hasLeadingZero{margin-left:-.54em;padding-left:calc(1px + .54em)}.react-date-picker__button{border:0;padding:4px 4px 4px 7px}.react-date-picker__button:hover{background:0 0}}
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+ import { LabeledInput } from '../Input/InputWrapper';
3
+ import { DatePickerProps as ReactDatePickerProps } from 'react-date-picker';
4
+ export type DatePickerProps = ReactDatePickerProps & LabeledInput & {
5
+ id?: string;
6
+ style?: React.CSSProperties;
7
+ };
8
+ export declare const DatePicker: React.FC<DatePickerProps>;
@@ -0,0 +1,61 @@
1
+ @use "../../styles/global/components/input";
2
+ @use "../../styles/utilities/_functions" as u;
3
+ @use "../../styles/utilities/_placeholders";
4
+ @use "./_DatePicker";
5
+ @layer craftsman-base {
6
+ .react-date-picker,
7
+ .react-date-picker *,
8
+ .react-date-picker *:before,
9
+ .react-date-picker *:after {
10
+ @extend %border-box;
11
+ }
12
+
13
+ .react-date-picker {
14
+ @extend %date-picker-styles;
15
+ &--disabled {
16
+ @extend %date-picker-disabled;
17
+ }
18
+ &__wrapper {
19
+ @extend %date-picker-wrapper;
20
+ }
21
+ &__inputGroup {
22
+ @extend %date-picker-input-group;
23
+ }
24
+ &__inputGroup__divider {
25
+ @extend %date-picker-divider;
26
+ }
27
+ &__inputGroup__divider,
28
+ &__inputGroup__leadingZero {
29
+ @extend %date-picker-leading-zero-divider;
30
+ }
31
+ &__inputGroup__input {
32
+ @extend %date-picker-group-input;
33
+ }
34
+ &__inputGroup__input::-webkit-outer-spin-button,
35
+ &__inputGroup__input::-webkit-inner-spin-button {
36
+ @extend %date-picker-input-spinner;
37
+ }
38
+ &__inputGroup__input--hasLeadingZero {
39
+ @extend %date-picker-input-leading-zero;
40
+ }
41
+ &__button {
42
+ @extend %date-picker-button;
43
+ }
44
+ &__calendar {
45
+ width: 350px;
46
+ max-width: 100vw;
47
+ z-index: 1;
48
+ .react-calendar {
49
+ border-width: thin;
50
+ }
51
+ }
52
+ &__calendar--closed, &__clock--closed {
53
+ display: none;
54
+ }
55
+
56
+ }
57
+ .react-date-picker__calendar
58
+ .react-date-picker__inputGroup__input:invalid {
59
+ background: unset;
60
+ }
61
+ }
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { InputWrapper as e } from "../Input/InputWrapper.esm.js";
3
+ import './ReactCalendar.css';import './DatePicker.css';/* empty css */
4
+ /* empty css */
5
+ import t from "clsx";
6
+ import { jsx as n } from "react/jsx-runtime";
7
+ import { useId as r } from "react";
8
+ import { DatePicker as i } from "react-date-picker";
9
+ import { FaRegCalendar as a, FaX as o } from "react-icons/fa6";
10
+ //#region src/components/DatePicker/DatePicker.tsx
11
+ var s = ({ label: s, id: c, labelPosition: l = "top", required: u = !1, error: d, style: f, className: p, ...m }) => {
12
+ let h = r();
13
+ return /* @__PURE__ */ n(e, {
14
+ id: c || h,
15
+ className: t("datePicker", p),
16
+ label: s,
17
+ labelPosition: l,
18
+ error: d,
19
+ required: u,
20
+ style: f,
21
+ children: /* @__PURE__ */ n(i, {
22
+ calendarIcon: /* @__PURE__ */ n(a, { size: 16 }),
23
+ clearIcon: /* @__PURE__ */ n(o, { size: 14 }),
24
+ ...m
25
+ })
26
+ });
27
+ };
28
+ //#endregion
29
+ export { s as DatePicker };
@@ -0,0 +1 @@
1
+ .react-calendar,.react-calendar *,.react-calendar :before,.react-calendar :after{box-sizing:border-box}@layer craftsman-base{.react-calendar{background:#fff;border:1px solid #a0a096;width:350px;max-width:100%;line-height:1.125em}.react-calendar--doubleView{width:700px}.react-calendar--doubleView .react-calendar__viewContainer{margin:-.5em;display:flex}.react-calendar--doubleView .react-calendar__viewContainer>*{width:50%;margin:.5em}.react-calendar button{border:0;outline:none;margin:0}.react-calendar button:enabled:hover{cursor:pointer}.react-calendar__navigation{height:44px;margin-bottom:1em;display:flex}.react-calendar__navigation button{background:0 0;min-width:44px}.react-calendar__navigation button:disabled{background-color:#f0f0f0}.react-calendar__navigation button:enabled:hover,.react-calendar__navigation button:enabled:focus{background-color:#e6e6e6}.react-calendar__month-view__weekdays{text-align:center;text-transform:uppercase;font:inherit;font-size:.75em;font-weight:700}.react-calendar__month-view__weekdays__weekday{padding:.5em}.react-calendar__month-view__weekNumbers .react-calendar__tile{font:inherit;justify-content:center;align-items:center;font-size:.75em;font-weight:700;display:flex}.react-calendar__month-view__days__day--weekend{color:#d10000}.react-calendar__month-view__days__day--neighboringMonth,.react-calendar__decade-view__years__year--neighboringDecade,.react-calendar__century-view__decades__decade--neighboringCentury{color:#757575}.react-calendar__tile:disabled{color:#ababab;background-color:#f0f0f0}.react-calendar__month-view__days__day--neighboringMonth:disabled,.react-calendar__decade-view__years__year--neighboringDecade:disabled,.react-calendar__century-view__decades__decade--neighboringCentury:disabled{color:#cdcdcd}.react-calendar__tile:enabled:hover,.react-calendar__tile:enabled:focus{background-color:#e6e6e6}.react-calendar__tile--now{background:#ffff76}.react-calendar__tile--now:enabled:hover,.react-calendar__tile--now:enabled:focus{background:#ffffa9}.react-calendar__tile--hasActive{background:#76baff}.react-calendar__tile--hasActive:enabled:hover,.react-calendar__tile--hasActive:enabled:focus{background:#a9d4ff}.react-calendar__tile--active{color:#fff;background:#006edc}.react-calendar__tile--active:enabled:hover,.react-calendar__tile--active:enabled:focus{background:#1087ff}.react-calendar--selectRange .react-calendar__tile--hover{background-color:#e6e6e6}.react-calendar{border-color:var(--gray400)}.react-calendar button{border-radius:unset;justify-content:center;padding:12px 0}.react-calendar__year-view button,.react-calendar__decade-view button,.react-calendar__century-view button{padding:18px 0}}