banhaten 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +361 -0
  3. package/banhaten.config.example.json +13 -0
  4. package/package.json +59 -0
  5. package/registry/assets/activity-feed-avatar.png +0 -0
  6. package/registry/assets/avatars/avatar-01.jpg +0 -0
  7. package/registry/assets/avatars/avatar-02.jpg +0 -0
  8. package/registry/assets/avatars/avatar-03.jpg +0 -0
  9. package/registry/assets/avatars/avatar-04.jpg +0 -0
  10. package/registry/assets/avatars/avatar-05.jpg +0 -0
  11. package/registry/assets/avatars/avatar-06.jpg +0 -0
  12. package/registry/assets/avatars/avatar-07.jpg +0 -0
  13. package/registry/assets/avatars/avatar-08.jpg +0 -0
  14. package/registry/assets/avatars/avatar-09.jpg +0 -0
  15. package/registry/assets/avatars/avatar-10.jpg +0 -0
  16. package/registry/assets/avatars/avatar-11.jpg +0 -0
  17. package/registry/assets/avatars/avatar-12.jpg +0 -0
  18. package/registry/assets/avatars/avatar-13.jpg +0 -0
  19. package/registry/assets/avatars/avatar-14.jpg +0 -0
  20. package/registry/assets/avatars/avatar-15.jpg +0 -0
  21. package/registry/assets/avatars/avatar-16.jpg +0 -0
  22. package/registry/assets/avatars/avatar-17.jpg +0 -0
  23. package/registry/assets/avatars/avatar-18.jpg +0 -0
  24. package/registry/assets/avatars/avatar-19.jpg +0 -0
  25. package/registry/assets/avatars/avatar-20.jpg +0 -0
  26. package/registry/assets/avatars/avatar-21.jpg +0 -0
  27. package/registry/assets/avatars/avatar-22.jpg +0 -0
  28. package/registry/assets/avatars/avatar-23.jpg +0 -0
  29. package/registry/assets/avatars/avatar-24.jpg +0 -0
  30. package/registry/assets/avatars/avatar-25.jpg +0 -0
  31. package/registry/assets/avatars/avatar-26.jpg +0 -0
  32. package/registry/assets/avatars/avatar-27.jpg +0 -0
  33. package/registry/assets/avatars/avatar-28.jpg +0 -0
  34. package/registry/assets/avatars/avatar-29.jpg +0 -0
  35. package/registry/assets/avatars/avatar-30.jpg +0 -0
  36. package/registry/assets/avatars/avatar-31.jpg +0 -0
  37. package/registry/assets/avatars/avatar-32.jpg +0 -0
  38. package/registry/assets/avatars/avatar-33.jpg +0 -0
  39. package/registry/assets/avatars/avatar-34.jpg +0 -0
  40. package/registry/assets/avatars/avatar-35.jpg +0 -0
  41. package/registry/assets/image-assets.json +744 -0
  42. package/registry/assets/images/art-01.jpg +0 -0
  43. package/registry/assets/images/art-02.jpg +0 -0
  44. package/registry/assets/images/art-03.jpg +0 -0
  45. package/registry/assets/images/art-04.jpg +0 -0
  46. package/registry/assets/images/art-05.jpg +0 -0
  47. package/registry/assets/images/art-06.jpg +0 -0
  48. package/registry/assets/images/art-07.jpg +0 -0
  49. package/registry/assets/images/art-08.jpg +0 -0
  50. package/registry/assets/images/art-09.jpg +0 -0
  51. package/registry/assets/images/art-10.jpg +0 -0
  52. package/registry/assets/images/art-11.jpg +0 -0
  53. package/registry/assets/images/art-12.jpg +0 -0
  54. package/registry/assets/images/art-13.jpg +0 -0
  55. package/registry/assets/images/art-14.jpg +0 -0
  56. package/registry/assets/images/art-15.jpg +0 -0
  57. package/registry/assets/images/art-16.jpg +0 -0
  58. package/registry/assets/images/art-17.jpg +0 -0
  59. package/registry/assets/images/art-18.jpg +0 -0
  60. package/registry/assets/images/art-19.jpg +0 -0
  61. package/registry/assets/images/art-20.jpg +0 -0
  62. package/registry/assets/images/art-21.jpg +0 -0
  63. package/registry/assets/images/art-22.jpg +0 -0
  64. package/registry/assets/images/art-23.jpg +0 -0
  65. package/registry/assets/images/art-24.jpg +0 -0
  66. package/registry/assets/images/art-25.jpg +0 -0
  67. package/registry/assets/images/art-26.jpg +0 -0
  68. package/registry/assets/images/art-27.jpg +0 -0
  69. package/registry/assets/images/nature-01.jpg +0 -0
  70. package/registry/assets/images/nature-02.jpg +0 -0
  71. package/registry/assets/images/nature-03.jpg +0 -0
  72. package/registry/assets/images/nature-04.jpg +0 -0
  73. package/registry/assets/images/nature-05.jpg +0 -0
  74. package/registry/assets/images/nature-06.jpg +0 -0
  75. package/registry/assets/images/nature-07.jpg +0 -0
  76. package/registry/assets/images/nature-08.jpg +0 -0
  77. package/registry/assets/images/nature-09.jpg +0 -0
  78. package/registry/assets/images/nature-10.jpg +0 -0
  79. package/registry/assets/images/nature-11.jpg +0 -0
  80. package/registry/assets/images/nature-12.jpg +0 -0
  81. package/registry/assets/images/nature-13.jpg +0 -0
  82. package/registry/assets/images/nature-14.jpg +0 -0
  83. package/registry/assets/images/nature-15.jpg +0 -0
  84. package/registry/assets/images/nature-16.jpg +0 -0
  85. package/registry/assets/images/nature-17.jpg +0 -0
  86. package/registry/assets/images/nature-18.jpg +0 -0
  87. package/registry/assets/images/nature-19.jpg +0 -0
  88. package/registry/assets/images/nature-20.jpg +0 -0
  89. package/registry/components/accordion.tsx +119 -0
  90. package/registry/components/alert.tsx +282 -0
  91. package/registry/components/attribute.tsx +452 -0
  92. package/registry/components/avatar.tsx +142 -0
  93. package/registry/components/badge.tsx +567 -0
  94. package/registry/components/button-group.tsx +246 -0
  95. package/registry/components/button.tsx +102 -0
  96. package/registry/components/card.tsx +613 -0
  97. package/registry/components/checkbox.tsx +244 -0
  98. package/registry/components/date-picker.tsx +1143 -0
  99. package/registry/components/divider.tsx +82 -0
  100. package/registry/components/expanded/ActivityFeed.tsx +226 -0
  101. package/registry/components/expanded/Banner.tsx +145 -0
  102. package/registry/components/expanded/BannerBoard.tsx +225 -0
  103. package/registry/components/expanded/Breadcrumbs.tsx +156 -0
  104. package/registry/components/expanded/CatalogComponentsShowcase.tsx +211 -0
  105. package/registry/components/expanded/CatalogDivider.tsx +48 -0
  106. package/registry/components/expanded/CatalogTag.tsx +92 -0
  107. package/registry/components/expanded/CommandBar.tsx +406 -0
  108. package/registry/components/expanded/FileUpload.tsx +231 -0
  109. package/registry/components/expanded/IconExplorer.tsx +612 -0
  110. package/registry/components/expanded/OnboardingStepListItem.tsx +67 -0
  111. package/registry/components/expanded/PageHeader.tsx +184 -0
  112. package/registry/components/expanded/Slideout.tsx +514 -0
  113. package/registry/components/expanded/Steps.tsx +266 -0
  114. package/registry/components/expanded/Table.tsx +1014 -0
  115. package/registry/components/expanded/Tabs.tsx +86 -0
  116. package/registry/components/expanded/Timeline.tsx +235 -0
  117. package/registry/components/expanded/TimelineShowcase.tsx +158 -0
  118. package/registry/components/expanded/activityFeed.css +292 -0
  119. package/registry/components/expanded/banner.css +312 -0
  120. package/registry/components/expanded/breadcrumbs.css +140 -0
  121. package/registry/components/expanded/catalogComponentsShowcase.css +87 -0
  122. package/registry/components/expanded/commandBar.css +473 -0
  123. package/registry/components/expanded/divider.css +75 -0
  124. package/registry/components/expanded/fileUpload.css +228 -0
  125. package/registry/components/expanded/iconExplorer.css +764 -0
  126. package/registry/components/expanded/iconPacks.ts +866 -0
  127. package/registry/components/expanded/onboardingStepListItem.css +126 -0
  128. package/registry/components/expanded/pageHeader.css +287 -0
  129. package/registry/components/expanded/slideout.css +955 -0
  130. package/registry/components/expanded/steps.css +329 -0
  131. package/registry/components/expanded/table.css +607 -0
  132. package/registry/components/expanded/tabs.css +197 -0
  133. package/registry/components/expanded/tag.css +148 -0
  134. package/registry/components/expanded/timeline.css +282 -0
  135. package/registry/components/input-content.ts +106 -0
  136. package/registry/components/input.tsx +866 -0
  137. package/registry/components/menu.tsx +758 -0
  138. package/registry/components/modal.tsx +799 -0
  139. package/registry/components/pagination.tsx +543 -0
  140. package/registry/components/progress-slider.tsx +216 -0
  141. package/registry/components/progress.tsx +367 -0
  142. package/registry/components/radio-card.tsx +654 -0
  143. package/registry/components/radio-group.tsx +570 -0
  144. package/registry/components/select-content.tsx +313 -0
  145. package/registry/components/select.tsx +871 -0
  146. package/registry/components/slider.tsx +380 -0
  147. package/registry/components/social-button.tsx +360 -0
  148. package/registry/components/spinner.tsx +31 -0
  149. package/registry/components/tag.tsx +423 -0
  150. package/registry/components/textarea.tsx +625 -0
  151. package/registry/components/toggle.tsx +272 -0
  152. package/registry/components/toolbar.tsx +467 -0
  153. package/registry/components/tooltip.tsx +427 -0
  154. package/registry/examples/accordion-demo.tsx +34 -0
  155. package/registry/examples/alert-demo.tsx +14 -0
  156. package/registry/examples/attribute-demo.tsx +65 -0
  157. package/registry/examples/avatar-demo.tsx +74 -0
  158. package/registry/examples/badge-demo.tsx +53 -0
  159. package/registry/examples/button-demo.tsx +83 -0
  160. package/registry/examples/button-group-demo.tsx +42 -0
  161. package/registry/examples/card-demo.tsx +48 -0
  162. package/registry/examples/checkbox-demo.tsx +67 -0
  163. package/registry/examples/date-picker-demo.tsx +74 -0
  164. package/registry/examples/divider-demo.tsx +17 -0
  165. package/registry/examples/expanded/activity-feed-demo.tsx +22 -0
  166. package/registry/examples/expanded/banner-demo.tsx +23 -0
  167. package/registry/examples/expanded/catalog-components-demo.tsx +5 -0
  168. package/registry/examples/expanded/command-bar-demo.tsx +10 -0
  169. package/registry/examples/expanded/icons-demo.tsx +5 -0
  170. package/registry/examples/expanded/onboarding-step-demo.tsx +11 -0
  171. package/registry/examples/expanded/page-header-demo.tsx +19 -0
  172. package/registry/examples/expanded/slideout-demo.tsx +15 -0
  173. package/registry/examples/expanded/steps-demo.tsx +18 -0
  174. package/registry/examples/expanded/tabs-demo.tsx +13 -0
  175. package/registry/examples/expanded/timeline-demo.tsx +18 -0
  176. package/registry/examples/input-demo.tsx +87 -0
  177. package/registry/examples/menu-demo.tsx +109 -0
  178. package/registry/examples/modal-demo.tsx +16 -0
  179. package/registry/examples/pagination-demo.tsx +17 -0
  180. package/registry/examples/progress-demo.tsx +37 -0
  181. package/registry/examples/progress-slider-demo.tsx +29 -0
  182. package/registry/examples/radio-card-demo.tsx +51 -0
  183. package/registry/examples/radio-group-demo.tsx +62 -0
  184. package/registry/examples/select-demo.tsx +73 -0
  185. package/registry/examples/slider-demo.tsx +31 -0
  186. package/registry/examples/social-button-demo.tsx +51 -0
  187. package/registry/examples/tag-demo.tsx +29 -0
  188. package/registry/examples/textarea-demo.tsx +79 -0
  189. package/registry/examples/toggle-demo.tsx +59 -0
  190. package/registry/examples/toolbar-demo.tsx +80 -0
  191. package/registry/examples/tooltip-demo.tsx +115 -0
  192. package/registry/hooks/use-direction.ts +27 -0
  193. package/registry/index.json +1213 -0
  194. package/registry/styles/globals.css +4600 -0
  195. package/registry/utils/cn.ts +6 -0
  196. package/src/cli/index.js +826 -0
  197. package/tokens/Color mode.zip +0 -0
  198. package/tokens/Numbers.zip +0 -0
  199. package/tokens/Radius.zip +0 -0
  200. package/tokens/Theme.zip +0 -0
  201. package/tokens/banhaten.tokens.json +5525 -0
@@ -0,0 +1,266 @@
1
+ import type { ReactNode } from "react";
2
+ import "./steps.css";
3
+
4
+ export type StepIndicator = "icon" | "number";
5
+ export type StepDirection = "horizontal" | "vertical";
6
+ export type StepAlignment = "leading" | "middle" | "trailing";
7
+ export type StepPosition = "top" | "bottom";
8
+
9
+ export type StepItem = {
10
+ actions?: ReactNode;
11
+ caption?: ReactNode;
12
+ label?: ReactNode;
13
+ number?: ReactNode;
14
+ slotContent?: ReactNode;
15
+ supportText?: ReactNode;
16
+ };
17
+
18
+ export type StepsProps = {
19
+ alignment?: Exclude<StepAlignment, "middle">;
20
+ className?: string;
21
+ dir?: "ltr" | "rtl";
22
+ direction?: StepDirection;
23
+ indicator?: StepIndicator;
24
+ items?: StepItem[];
25
+ };
26
+
27
+ export type HorizontalStepItemProps = {
28
+ alignment?: StepAlignment;
29
+ caption?: ReactNode;
30
+ className?: string;
31
+ hasCaption?: boolean;
32
+ indicator?: StepIndicator;
33
+ label?: ReactNode;
34
+ number?: ReactNode;
35
+ position?: StepPosition;
36
+ dir?: "ltr" | "rtl";
37
+ showLeadingLine?: boolean;
38
+ showTrailingLine?: boolean;
39
+ };
40
+
41
+ export type VerticalStepItemProps = {
42
+ actions?: ReactNode;
43
+ alignment?: Exclude<StepAlignment, "middle">;
44
+ caption?: ReactNode;
45
+ className?: string;
46
+ hasActionButtons?: boolean;
47
+ hasCaption?: boolean;
48
+ hasSlotContent?: boolean;
49
+ hasSupportText?: boolean;
50
+ indicator?: StepIndicator;
51
+ label?: ReactNode;
52
+ number?: ReactNode;
53
+ dir?: "ltr" | "rtl";
54
+ showBottomPadding?: boolean;
55
+ showLine?: boolean;
56
+ slotContent?: ReactNode;
57
+ supportText?: ReactNode;
58
+ };
59
+
60
+ export function Steps({
61
+ alignment = "leading",
62
+ className = "",
63
+ dir = "ltr",
64
+ direction = "horizontal",
65
+ indicator = "icon",
66
+ items,
67
+ }: StepsProps) {
68
+ const rtl = dir === "rtl";
69
+ const stepItems = items ?? [];
70
+
71
+ if (direction === "vertical") {
72
+ return (
73
+ <div
74
+ className={["ds-steps", "ds-steps--vertical", rtl ? "ds-steps--rtl" : "ds-steps--ltr", className]
75
+ .filter(Boolean)
76
+ .join(" ")}
77
+ dir={dir}
78
+ >
79
+ {stepItems.map((item, index) => (
80
+ <VerticalStepItem
81
+ alignment={alignment}
82
+ caption={item.caption}
83
+ hasActionButtons={Boolean(item.actions)}
84
+ hasSlotContent={Boolean(item.slotContent)}
85
+ indicator={indicator}
86
+ key={index}
87
+ label={item.label}
88
+ number={item.number ?? index + 1}
89
+ dir={dir}
90
+ showBottomPadding={index < stepItems.length - 1}
91
+ showLine={index < stepItems.length - 1}
92
+ slotContent={item.slotContent}
93
+ supportText={item.supportText}
94
+ >
95
+ {item.actions}
96
+ </VerticalStepItem>
97
+ ))}
98
+ </div>
99
+ );
100
+ }
101
+
102
+ return (
103
+ <div
104
+ className={["ds-steps", "ds-steps--horizontal", rtl ? "ds-steps--rtl" : "ds-steps--ltr", className]
105
+ .filter(Boolean)
106
+ .join(" ")}
107
+ dir={dir}
108
+ >
109
+ {stepItems.map((item, index) => (
110
+ <HorizontalStepItem
111
+ caption={item.caption}
112
+ hasCaption={item.caption !== null && item.caption !== undefined}
113
+ indicator={indicator}
114
+ key={index}
115
+ label={item.label}
116
+ number={item.number ?? index + 1}
117
+ dir={dir}
118
+ />
119
+ ))}
120
+ </div>
121
+ );
122
+ }
123
+
124
+ export function HorizontalStepItem({
125
+ alignment = "leading",
126
+ caption,
127
+ className = "",
128
+ hasCaption = true,
129
+ indicator = "icon",
130
+ label,
131
+ number = 1,
132
+ position = "top",
133
+ dir = "ltr",
134
+ showLeadingLine = true,
135
+ showTrailingLine = true,
136
+ }: HorizontalStepItemProps) {
137
+ const rtl = dir === "rtl";
138
+ const linePlacement = getHorizontalLinePlacement(alignment, rtl, showLeadingLine, showTrailingLine);
139
+ const text = (
140
+ <div className="ds-horizontal-step-item__text">
141
+ {label && <div className="ds-horizontal-step-item__label">{label}</div>}
142
+ {hasCaption && caption && <div className="ds-horizontal-step-item__caption">{caption}</div>}
143
+ </div>
144
+ );
145
+ const track = (
146
+ <div className="ds-horizontal-step-item__track" aria-hidden="true">
147
+ {linePlacement.before && <span className="ds-step-line ds-step-line--horizontal" />}
148
+ <StepMarker indicator={indicator} number={number} />
149
+ {linePlacement.after && <span className="ds-step-line ds-step-line--horizontal" />}
150
+ </div>
151
+ );
152
+
153
+ return (
154
+ <div
155
+ className={[
156
+ "ds-horizontal-step-item",
157
+ `ds-horizontal-step-item--${alignment}`,
158
+ `ds-horizontal-step-item--${position}`,
159
+ rtl ? "ds-horizontal-step-item--rtl" : "ds-horizontal-step-item--ltr",
160
+ className,
161
+ ]
162
+ .filter(Boolean)
163
+ .join(" ")}
164
+ dir={dir}
165
+ >
166
+ {position === "bottom" ? text : track}
167
+ {position === "bottom" ? track : text}
168
+ </div>
169
+ );
170
+ }
171
+
172
+ export function VerticalStepItem({
173
+ actions,
174
+ alignment = "leading",
175
+ caption,
176
+ children,
177
+ className = "",
178
+ hasActionButtons = true,
179
+ hasCaption = true,
180
+ hasSlotContent = true,
181
+ hasSupportText = true,
182
+ indicator = "icon",
183
+ label,
184
+ number = 1,
185
+ dir = "ltr",
186
+ showBottomPadding = true,
187
+ showLine = true,
188
+ slotContent,
189
+ supportText,
190
+ }: VerticalStepItemProps & { children?: ReactNode }) {
191
+ const rtl = dir === "rtl";
192
+ const marker = (
193
+ <div className="ds-vertical-step-item__rail" aria-hidden="true">
194
+ <StepMarker indicator={indicator} number={number} />
195
+ {showLine && <span className="ds-step-line ds-step-line--vertical" />}
196
+ </div>
197
+ );
198
+ const markerFirst = (alignment === "leading" && !rtl) || (alignment === "trailing" && rtl);
199
+ const renderedActions = actions ?? children;
200
+ const renderedSlot = slotContent;
201
+
202
+ return (
203
+ <div
204
+ className={[
205
+ "ds-vertical-step-item",
206
+ `ds-vertical-step-item--${alignment}`,
207
+ rtl ? "ds-vertical-step-item--rtl" : "ds-vertical-step-item--ltr",
208
+ className,
209
+ ]
210
+ .filter(Boolean)
211
+ .join(" ")}
212
+ dir={dir}
213
+ >
214
+ {markerFirst && marker}
215
+ <div className="ds-vertical-step-item__content">
216
+ <div className="ds-vertical-step-item__copy">
217
+ <div className="ds-vertical-step-item__header">
218
+ {rtl && hasSupportText && supportText && <div className="ds-vertical-step-item__support">{supportText}</div>}
219
+ {label && <div className="ds-vertical-step-item__label">{label}</div>}
220
+ {!rtl && hasSupportText && supportText && <div className="ds-vertical-step-item__support">{supportText}</div>}
221
+ </div>
222
+ {hasCaption && caption && <div className="ds-vertical-step-item__caption">{caption}</div>}
223
+ </div>
224
+ {hasSlotContent && renderedSlot}
225
+ {hasActionButtons && renderedActions && <div className="ds-vertical-step-item__actions">{renderedActions}</div>}
226
+ {showBottomPadding && <div className="ds-vertical-step-item__bottom-padding" />}
227
+ </div>
228
+ {!markerFirst && marker}
229
+ </div>
230
+ );
231
+ }
232
+
233
+ function StepMarker({ indicator, number }: { indicator: StepIndicator; number: ReactNode }) {
234
+ if (indicator === "number") {
235
+ return (
236
+ <span className="ds-step-marker ds-step-marker--number">
237
+ <span>{number}</span>
238
+ </span>
239
+ );
240
+ }
241
+
242
+ return (
243
+ <span className="ds-step-marker ds-step-marker--icon">
244
+ <svg aria-hidden="true" focusable="false" viewBox="0 0 24 24">
245
+ <path d="m10.6 15.3-3.3-3.3 1.4-1.4 1.9 1.9 4.7-4.7 1.4 1.4-6.1 6.1Z" />
246
+ </svg>
247
+ </span>
248
+ );
249
+ }
250
+
251
+ function getHorizontalLinePlacement(
252
+ alignment: StepAlignment,
253
+ rtl: boolean,
254
+ showLeadingLine: boolean,
255
+ showTrailingLine: boolean,
256
+ ) {
257
+ if (alignment === "middle") {
258
+ return { before: showLeadingLine, after: showTrailingLine };
259
+ }
260
+
261
+ if (alignment === "leading") {
262
+ return rtl ? { before: showTrailingLine, after: false } : { before: false, after: showTrailingLine };
263
+ }
264
+
265
+ return rtl ? { before: false, after: showLeadingLine } : { before: showLeadingLine, after: false };
266
+ }