@duskmoon-dev/art-components 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.
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # @duskmoon-dev/art-components
2
+
3
+ React wrappers for `@duskmoon-dev/css-art`.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ bun add @duskmoon-dev/art-components @duskmoon-dev/css-art
9
+ ```
10
+
11
+ Import the CSS once in your app:
12
+
13
+ ```css
14
+ @import "@duskmoon-dev/art-components/styles.css";
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```tsx
20
+ import { ArtMoon, ArtPlasmaBall } from "@duskmoon-dev/art-components";
21
+
22
+ export function Demo() {
23
+ return (
24
+ <>
25
+ <ArtMoon crescent glow size="lg" />
26
+ <ArtPlasmaBall defaultChecked />
27
+ </>
28
+ );
29
+ }
30
+ ```
31
+
32
+ ## Components
33
+
34
+ - `ArtMoon`
35
+ - `ArtSun`
36
+ - `ArtAtom`
37
+ - `ArtEclipse`
38
+ - `ArtMountain`
39
+ - `ArtSnowflake`
40
+ - `ArtPlasmaBall`
41
+ - `ArtCircularGallery`
42
+ - `ArtCatStargazer`
43
+ - `ArtFlowerAnimation`
44
+ - `ArtColorSpin`
45
+ - `ArtSynthwaveStarfield`
46
+ - `ArtCsswitch` / `ArtCSSwitch`
47
+ - `ArtSnowballPreloader`
48
+ - `ArtGeminiInput`
49
+
50
+ All decorative components forward refs to their root element, accept `className`,
51
+ `style`, and DuskMoon CSS custom properties through `style`.
@@ -0,0 +1,99 @@
1
+ import React from "react";
2
+ import type { ComponentProps, CSSProperties, ReactNode } from "react";
3
+ export type ArtSize = "sm" | "default" | "lg";
4
+ export type ArtExtendedSize = ArtSize | "xl";
5
+ export type ArtStyle = CSSProperties & {
6
+ [key: `--${string}`]: string | number | undefined;
7
+ };
8
+ interface BaseArtProps extends Omit<ComponentProps<"div">, "style"> {
9
+ decorative?: boolean;
10
+ style?: ArtStyle;
11
+ }
12
+ interface SizedArtProps extends BaseArtProps {
13
+ size?: ArtSize;
14
+ }
15
+ interface ExtendedSizedArtProps extends BaseArtProps {
16
+ size?: ArtExtendedSize;
17
+ }
18
+ export interface ArtMoonProps extends ExtendedSizedArtProps {
19
+ crescent?: boolean;
20
+ glow?: boolean;
21
+ }
22
+ export declare const ArtMoon: React.ForwardRefExoticComponent<Omit<ArtMoonProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
23
+ export interface ArtSunProps extends ExtendedSizedArtProps {
24
+ rays?: boolean;
25
+ sunset?: boolean;
26
+ pulse?: boolean;
27
+ }
28
+ export declare const ArtSun: React.ForwardRefExoticComponent<Omit<ArtSunProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
29
+ export type ArtAtomProps = SizedArtProps;
30
+ export declare const ArtAtom: React.ForwardRefExoticComponent<Omit<SizedArtProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
31
+ export type ArtEclipseProps = SizedArtProps;
32
+ export declare const ArtEclipse: React.ForwardRefExoticComponent<Omit<SizedArtProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
33
+ export type ArtMountainProps = SizedArtProps;
34
+ export declare const ArtMountain: React.ForwardRefExoticComponent<Omit<SizedArtProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
35
+ export interface ArtSnowflakeProps extends BaseArtProps {
36
+ unicode?: boolean;
37
+ fall?: boolean;
38
+ }
39
+ export declare const ArtSnowflake: React.ForwardRefExoticComponent<Omit<ArtSnowflakeProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
40
+ export interface ArtPlasmaBallProps extends SizedArtProps {
41
+ checked?: boolean;
42
+ defaultChecked?: boolean;
43
+ hideBase?: boolean;
44
+ hideElectrode?: boolean;
45
+ inputProps?: Omit<ComponentProps<"input">, "type" | "checked" | "defaultChecked">;
46
+ onCheckedChange?: (checked: boolean) => void;
47
+ }
48
+ export declare const ArtPlasmaBall: React.ForwardRefExoticComponent<Omit<ArtPlasmaBallProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
49
+ export interface ArtCircularGalleryItem {
50
+ id?: string;
51
+ title: string;
52
+ src: string;
53
+ href?: string;
54
+ alt?: string;
55
+ target?: ComponentProps<"a">["target"];
56
+ rel?: ComponentProps<"a">["rel"];
57
+ }
58
+ export interface ArtCircularGalleryProps extends Omit<SizedArtProps, "title"> {
59
+ title?: ReactNode;
60
+ items: ArtCircularGalleryItem[];
61
+ }
62
+ export declare const ArtCircularGallery: React.ForwardRefExoticComponent<Omit<ArtCircularGalleryProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
63
+ export type ArtCatStargazerProps = SizedArtProps;
64
+ export declare const ArtCatStargazer: React.ForwardRefExoticComponent<Omit<SizedArtProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
65
+ export type ArtFlowerAnimationProps = SizedArtProps;
66
+ export declare const ArtFlowerAnimation: React.ForwardRefExoticComponent<Omit<SizedArtProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
67
+ export type ArtColorSpinProps = SizedArtProps;
68
+ export declare const ArtColorSpin: React.ForwardRefExoticComponent<Omit<SizedArtProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
69
+ export interface ArtSynthwaveStarfieldProps extends SizedArtProps {
70
+ paused?: boolean;
71
+ }
72
+ export declare const ArtSynthwaveStarfield: React.ForwardRefExoticComponent<Omit<ArtSynthwaveStarfieldProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
73
+ export type ArtCsswitchProps = SizedArtProps;
74
+ export declare const ArtCsswitch: React.ForwardRefExoticComponent<Omit<SizedArtProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
75
+ export declare const ArtCSSwitch: React.ForwardRefExoticComponent<Omit<SizedArtProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
76
+ export type ArtSnowballPreloaderProps = SizedArtProps;
77
+ export declare const ArtSnowballPreloader: React.ForwardRefExoticComponent<Omit<SizedArtProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
78
+ type GeminiButtonProps = Omit<ComponentProps<"button">, "children">;
79
+ export interface ArtGeminiInputProps extends Omit<BaseArtProps, "children" | "onChange" | "defaultValue" | "style"> {
80
+ size?: ArtSize;
81
+ style?: ArtStyle;
82
+ value?: ComponentProps<"textarea">["value"];
83
+ defaultValue?: ComponentProps<"textarea">["defaultValue"];
84
+ onChange?: ComponentProps<"textarea">["onChange"];
85
+ placeholder?: string;
86
+ name?: string;
87
+ rows?: number;
88
+ disabled?: boolean;
89
+ readOnly?: boolean;
90
+ required?: boolean;
91
+ fieldClassName?: string;
92
+ textareaProps?: Omit<ComponentProps<"textarea">, "className" | "value" | "defaultValue" | "onChange" | "placeholder" | "name" | "rows" | "disabled" | "readOnly" | "required">;
93
+ before?: ReactNode;
94
+ after?: ReactNode;
95
+ beforeButtonProps?: GeminiButtonProps;
96
+ afterButtonProps?: GeminiButtonProps;
97
+ }
98
+ export declare const ArtGeminiInput: React.ForwardRefExoticComponent<Omit<ArtGeminiInputProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
99
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,801 @@
1
+ "use client";
2
+
3
+ // src/index.tsx
4
+ import { forwardRef, useId } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ function cn(...values) {
7
+ return values.filter(Boolean).join(" ");
8
+ }
9
+ function sizeClass(baseClass, size) {
10
+ return size && size !== "default" ? `${baseClass}-${size}` : undefined;
11
+ }
12
+ function getDecorativeProps(decorative, props) {
13
+ if (decorative === false || props["aria-hidden"] !== undefined || props["aria-label"] || props["aria-labelledby"] || props.role || props.title) {
14
+ return {};
15
+ }
16
+ return { "aria-hidden": true };
17
+ }
18
+ function cssUrl(value) {
19
+ return `url("${value.replaceAll('"', "\\\"")}")`;
20
+ }
21
+ var ArtMoon = forwardRef(({
22
+ size = "default",
23
+ crescent = false,
24
+ glow = false,
25
+ decorative,
26
+ className,
27
+ ...props
28
+ }, ref) => /* @__PURE__ */ jsx("div", {
29
+ ref,
30
+ className: cn("art-moon", sizeClass("art-moon", size), crescent && "art-moon-crescent", glow && "art-moon-glow", className),
31
+ ...getDecorativeProps(decorative, props),
32
+ ...props
33
+ }));
34
+ ArtMoon.displayName = "ArtMoon";
35
+ var ArtSun = forwardRef(({
36
+ size = "default",
37
+ rays = false,
38
+ sunset = false,
39
+ pulse = false,
40
+ decorative,
41
+ className,
42
+ ...props
43
+ }, ref) => /* @__PURE__ */ jsx("div", {
44
+ ref,
45
+ className: cn("art-sun", sizeClass("art-sun", size), rays && "art-sun-rays", sunset && "art-sun-sunset", pulse && "art-sun-pulse", className),
46
+ ...getDecorativeProps(decorative, props),
47
+ ...props
48
+ }));
49
+ ArtSun.displayName = "ArtSun";
50
+ var ArtAtom = forwardRef(({ size = "default", decorative, className, ...props }, ref) => /* @__PURE__ */ jsxs("div", {
51
+ ref,
52
+ className: cn("art-atom", sizeClass("art-atom", size), className),
53
+ ...getDecorativeProps(decorative, props),
54
+ ...props,
55
+ children: [
56
+ /* @__PURE__ */ jsx("div", {
57
+ className: "electron"
58
+ }),
59
+ /* @__PURE__ */ jsx("div", {
60
+ className: "electron-alpha"
61
+ }),
62
+ /* @__PURE__ */ jsx("div", {
63
+ className: "electron-omega"
64
+ })
65
+ ]
66
+ }));
67
+ ArtAtom.displayName = "ArtAtom";
68
+ var ArtEclipse = forwardRef(({ size = "default", decorative, className, ...props }, ref) => /* @__PURE__ */ jsx("div", {
69
+ ref,
70
+ className: cn("art-eclipse", sizeClass("art-eclipse", size), className),
71
+ ...getDecorativeProps(decorative, props),
72
+ ...props,
73
+ children: Array.from({ length: 6 }, (_, index) => /* @__PURE__ */ jsx("div", {
74
+ className: cn("layer", `layer-${index + 1}`)
75
+ }, index))
76
+ }));
77
+ ArtEclipse.displayName = "ArtEclipse";
78
+ var ArtMountain = forwardRef(({ size = "default", decorative, className, ...props }, ref) => /* @__PURE__ */ jsxs("div", {
79
+ ref,
80
+ className: cn("art-mountain", sizeClass("art-mountain", size), className),
81
+ ...getDecorativeProps(decorative, props),
82
+ ...props,
83
+ children: [
84
+ Array.from({ length: 4 }, (_, index) => /* @__PURE__ */ jsx("div", {
85
+ className: "mountain"
86
+ }, `mountain-${index}`)),
87
+ Array.from({ length: 3 }, (_, index) => /* @__PURE__ */ jsx("div", {
88
+ className: "tree"
89
+ }, `tree-${index}`)),
90
+ /* @__PURE__ */ jsx("div", {
91
+ className: "lights",
92
+ children: Array.from({ length: 9 }, (_, index) => /* @__PURE__ */ jsx("div", {
93
+ className: "borealis"
94
+ }, index))
95
+ })
96
+ ]
97
+ }));
98
+ ArtMountain.displayName = "ArtMountain";
99
+ var ArtSnowflake = forwardRef(({ unicode = false, fall = false, decorative, className, ...props }, ref) => /* @__PURE__ */ jsx("div", {
100
+ ref,
101
+ className: cn("art-snowflake", unicode && "art-snowflake-unicode", fall && "art-snowflake-fall", className),
102
+ ...getDecorativeProps(decorative, props),
103
+ ...props
104
+ }));
105
+ ArtSnowflake.displayName = "ArtSnowflake";
106
+ function PlasmaRay({ bigwave = false }) {
107
+ return /* @__PURE__ */ jsxs("div", {
108
+ className: cn("ray", bigwave && "bigwave"),
109
+ children: [
110
+ /* @__PURE__ */ jsx("span", {}),
111
+ /* @__PURE__ */ jsx("span", {}),
112
+ /* @__PURE__ */ jsx("span", {})
113
+ ]
114
+ });
115
+ }
116
+ function PlasmaRays({ group }) {
117
+ const rayCount = group > 3 ? 3 : 5;
118
+ return /* @__PURE__ */ jsx("div", {
119
+ className: "rays",
120
+ children: Array.from({ length: rayCount }, (_, index) => /* @__PURE__ */ jsx(PlasmaRay, {
121
+ bigwave: group >= 4 || index % 2 === 1
122
+ }, index))
123
+ });
124
+ }
125
+ var ArtPlasmaBall = forwardRef(({
126
+ size = "default",
127
+ checked,
128
+ defaultChecked,
129
+ hideBase = false,
130
+ hideElectrode = false,
131
+ inputProps,
132
+ onCheckedChange,
133
+ className,
134
+ ...props
135
+ }, ref) => {
136
+ const {
137
+ className: inputClassName,
138
+ onChange: inputOnChange,
139
+ ...restInputProps
140
+ } = inputProps ?? {};
141
+ const inputLabelProps = restInputProps["aria-label"] || restInputProps["aria-labelledby"] ? {} : { "aria-label": "Toggle plasma ball" };
142
+ const handleChange = (event) => {
143
+ onCheckedChange?.(event.currentTarget.checked);
144
+ inputOnChange?.(event);
145
+ };
146
+ return /* @__PURE__ */ jsxs("div", {
147
+ ref,
148
+ className: cn("art-plasma-ball", sizeClass("art-plasma-ball", size), hideBase && "art-plasma-ball-no-base", className),
149
+ ...props,
150
+ children: [
151
+ /* @__PURE__ */ jsx("input", {
152
+ type: "checkbox",
153
+ className: cn("switcher", inputClassName),
154
+ checked,
155
+ defaultChecked,
156
+ onChange: handleChange,
157
+ ...inputLabelProps,
158
+ ...restInputProps
159
+ }),
160
+ /* @__PURE__ */ jsxs("div", {
161
+ className: "glassball",
162
+ children: [
163
+ /* @__PURE__ */ jsx("div", {
164
+ className: cn("electrode", hideElectrode && "hide-electrode")
165
+ }),
166
+ Array.from({ length: 6 }, (_, index) => /* @__PURE__ */ jsx(PlasmaRays, {
167
+ group: index
168
+ }, index))
169
+ ]
170
+ }),
171
+ /* @__PURE__ */ jsxs("div", {
172
+ className: "base",
173
+ children: [
174
+ /* @__PURE__ */ jsx("div", {}),
175
+ /* @__PURE__ */ jsx("div", {}),
176
+ /* @__PURE__ */ jsx("span", {})
177
+ ]
178
+ }),
179
+ /* @__PURE__ */ jsx("div", {
180
+ className: "switch"
181
+ })
182
+ ]
183
+ });
184
+ });
185
+ ArtPlasmaBall.displayName = "ArtPlasmaBall";
186
+ var ArtCircularGallery = forwardRef(({
187
+ title = "Gallery",
188
+ items,
189
+ size = "default",
190
+ decorative,
191
+ className,
192
+ ...props
193
+ }, ref) => {
194
+ const reactId = useId().replaceAll(":", "");
195
+ return /* @__PURE__ */ jsxs("div", {
196
+ ref,
197
+ className: cn("art-circular-gallery", sizeClass("art-circular-gallery", size), className),
198
+ ...getDecorativeProps(decorative, props),
199
+ ...props,
200
+ children: [
201
+ title ? /* @__PURE__ */ jsx("h1", {
202
+ children: title
203
+ }) : null,
204
+ items.map((item, index) => {
205
+ const id = item.id ?? `${reactId}-gallery-item-${index + 1}`;
206
+ const itemStyle = {
207
+ "--i": index + 1,
208
+ "--bg-img": cssUrl(item.src)
209
+ };
210
+ return /* @__PURE__ */ jsx("div", {
211
+ id,
212
+ "data-title": item.title,
213
+ style: itemStyle,
214
+ children: /* @__PURE__ */ jsx("a", {
215
+ href: item.href ?? `#${id}`,
216
+ target: item.target,
217
+ rel: item.rel,
218
+ children: /* @__PURE__ */ jsx("img", {
219
+ src: item.src,
220
+ alt: item.alt ?? item.title
221
+ })
222
+ })
223
+ }, id);
224
+ })
225
+ ]
226
+ });
227
+ });
228
+ ArtCircularGallery.displayName = "ArtCircularGallery";
229
+ var ArtCatStargazer = forwardRef(({ size = "default", decorative, className, ...props }, ref) => /* @__PURE__ */ jsxs("div", {
230
+ ref,
231
+ className: cn("art-cat-stargazer", sizeClass("art-cat-stargazer", size), className),
232
+ ...getDecorativeProps(decorative, props),
233
+ ...props,
234
+ children: [
235
+ /* @__PURE__ */ jsx("div", {
236
+ className: "moon"
237
+ }),
238
+ /* @__PURE__ */ jsxs("div", {
239
+ className: "cat",
240
+ children: [
241
+ /* @__PURE__ */ jsx("div", {
242
+ className: "bubble"
243
+ }),
244
+ /* @__PURE__ */ jsx("div", {
245
+ className: "backpack"
246
+ }),
247
+ /* @__PURE__ */ jsx("div", {
248
+ className: "tail"
249
+ }),
250
+ /* @__PURE__ */ jsxs("div", {
251
+ className: "body",
252
+ children: [
253
+ /* @__PURE__ */ jsx("div", {
254
+ className: "leg"
255
+ }),
256
+ /* @__PURE__ */ jsx("div", {
257
+ className: "paw"
258
+ }),
259
+ /* @__PURE__ */ jsx("div", {
260
+ className: "paw"
261
+ })
262
+ ]
263
+ }),
264
+ /* @__PURE__ */ jsx("div", {
265
+ className: "ear"
266
+ }),
267
+ /* @__PURE__ */ jsx("div", {
268
+ className: "ear"
269
+ }),
270
+ /* @__PURE__ */ jsxs("div", {
271
+ className: "head",
272
+ children: [
273
+ Array.from({ length: 4 }, (_, index) => /* @__PURE__ */ jsx("div", {
274
+ className: "whisker"
275
+ }, index)),
276
+ /* @__PURE__ */ jsx("div", {
277
+ className: "nose"
278
+ }),
279
+ /* @__PURE__ */ jsx("div", {
280
+ className: "eye"
281
+ }),
282
+ /* @__PURE__ */ jsx("div", {
283
+ className: "eye"
284
+ })
285
+ ]
286
+ })
287
+ ]
288
+ })
289
+ ]
290
+ }));
291
+ ArtCatStargazer.displayName = "ArtCatStargazer";
292
+ function Flower({ index }) {
293
+ const leafCount = index === 1 ? 6 : 4;
294
+ return /* @__PURE__ */ jsxs("div", {
295
+ className: cn("flower", `flower--${index}`),
296
+ children: [
297
+ /* @__PURE__ */ jsxs("div", {
298
+ className: cn("flower__leafs", `flower__leafs--${Math.min(index, 3)}`),
299
+ children: [
300
+ Array.from({ length: 4 }, (_, leafIndex) => /* @__PURE__ */ jsx("div", {
301
+ className: cn("flower__leaf", `flower__leaf--${leafIndex + 1}`)
302
+ }, leafIndex)),
303
+ /* @__PURE__ */ jsx("div", {
304
+ className: "flower__white-circle"
305
+ })
306
+ ]
307
+ }),
308
+ /* @__PURE__ */ jsx("div", {
309
+ className: "flower__line",
310
+ children: Array.from({ length: leafCount }, (_, leafIndex) => /* @__PURE__ */ jsx("div", {
311
+ className: cn("flower__line__leaf", `flower__line__leaf--${leafIndex + 1}`)
312
+ }, leafIndex))
313
+ }),
314
+ Array.from({ length: 8 }, (_, lightIndex) => /* @__PURE__ */ jsx("div", {
315
+ className: cn("flower__light", `flower__light--${lightIndex + 1}`)
316
+ }, lightIndex))
317
+ ]
318
+ });
319
+ }
320
+ function FlowerGrass({ index }) {
321
+ return /* @__PURE__ */ jsxs("div", {
322
+ className: cn("flower__grass", `flower__grass--${index}`),
323
+ children: [
324
+ /* @__PURE__ */ jsx("div", {
325
+ className: "flower__grass--top"
326
+ }),
327
+ /* @__PURE__ */ jsx("div", {
328
+ className: "flower__grass--bottom"
329
+ }),
330
+ Array.from({ length: 8 }, (_, leafIndex) => /* @__PURE__ */ jsx("div", {
331
+ className: cn("flower__grass__leaf", `flower__grass__leaf--${leafIndex + 1}`)
332
+ }, leafIndex)),
333
+ /* @__PURE__ */ jsx("div", {
334
+ className: "flower__grass__overlay"
335
+ })
336
+ ]
337
+ });
338
+ }
339
+ function LongGrass({ index }) {
340
+ return /* @__PURE__ */ jsx("div", {
341
+ className: cn("long-g", `long-g--${index}`),
342
+ children: Array.from({ length: 4 }, (_, leafIndex) => /* @__PURE__ */ jsx("div", {
343
+ className: cn("leaf", `leaf--${leafIndex}`)
344
+ }, leafIndex))
345
+ });
346
+ }
347
+ function FrontGrass() {
348
+ return /* @__PURE__ */ jsx("div", {
349
+ className: "flower__g-front",
350
+ children: /* @__PURE__ */ jsx("div", {
351
+ className: "flower__g-front__line",
352
+ children: Array.from({ length: 8 }, (_, index) => /* @__PURE__ */ jsx("div", {
353
+ className: cn("flower__g-front__leaf-wrapper", `flower__g-front__leaf-wrapper--${index + 1}`),
354
+ children: /* @__PURE__ */ jsx("div", {
355
+ className: "flower__g-front__leaf"
356
+ })
357
+ }, index))
358
+ })
359
+ });
360
+ }
361
+ function FrontRightGrass() {
362
+ return /* @__PURE__ */ jsxs("div", {
363
+ className: "flower__g-fr",
364
+ children: [
365
+ /* @__PURE__ */ jsx("div", {
366
+ className: "leaf"
367
+ }),
368
+ Array.from({ length: 8 }, (_, index) => /* @__PURE__ */ jsx("div", {
369
+ className: cn("flower__g-fr__leaf", `flower__g-fr__leaf--${index + 1}`)
370
+ }, index))
371
+ ]
372
+ });
373
+ }
374
+ function Bubble() {
375
+ return /* @__PURE__ */ jsx("div", {
376
+ className: "bubble",
377
+ children: /* @__PURE__ */ jsx("svg", {
378
+ className: "heart",
379
+ viewBox: "0 0 32 29.6",
380
+ "aria-hidden": "true",
381
+ children: /* @__PURE__ */ jsx("path", {
382
+ d: "M23.6 0c-2.9 0-5.6 1.6-7.6 4.1C14 1.6 11.3 0 8.4 0 3.8 0 0 3.8 0 8.4c0 9.3 16 21.2 16 21.2S32 17.7 32 8.4C32 3.8 28.2 0 23.6 0z"
383
+ })
384
+ })
385
+ });
386
+ }
387
+ var ArtFlowerAnimation = forwardRef(({ size = "default", decorative, className, ...props }, ref) => /* @__PURE__ */ jsxs("div", {
388
+ ref,
389
+ className: cn("art-flower-animation", sizeClass("art-flower-animation", size), className),
390
+ ...getDecorativeProps(decorative, props),
391
+ ...props,
392
+ children: [
393
+ /* @__PURE__ */ jsx("div", {
394
+ className: "night"
395
+ }),
396
+ /* @__PURE__ */ jsxs("div", {
397
+ className: "flowers",
398
+ children: [
399
+ /* @__PURE__ */ jsx(Flower, {
400
+ index: 1
401
+ }),
402
+ /* @__PURE__ */ jsx(Flower, {
403
+ index: 2
404
+ }),
405
+ /* @__PURE__ */ jsx(Flower, {
406
+ index: 3
407
+ }),
408
+ /* @__PURE__ */ jsx(Flower, {
409
+ index: 4
410
+ }),
411
+ /* @__PURE__ */ jsxs("div", {
412
+ className: "growing-grass",
413
+ children: [
414
+ /* @__PURE__ */ jsx(FlowerGrass, {
415
+ index: 1
416
+ }),
417
+ /* @__PURE__ */ jsx(FlowerGrass, {
418
+ index: 2
419
+ })
420
+ ]
421
+ }),
422
+ /* @__PURE__ */ jsxs("div", {
423
+ className: "flower__g-long",
424
+ children: [
425
+ /* @__PURE__ */ jsx("div", {
426
+ className: "flower__g-long__top"
427
+ }),
428
+ /* @__PURE__ */ jsx("div", {
429
+ className: "flower__g-long__bottom"
430
+ })
431
+ ]
432
+ }),
433
+ /* @__PURE__ */ jsx("div", {
434
+ className: "flower__g-right flower__g-right--1",
435
+ children: /* @__PURE__ */ jsx("div", {
436
+ className: "leaf"
437
+ })
438
+ }),
439
+ /* @__PURE__ */ jsx("div", {
440
+ className: "flower__g-right flower__g-right--2",
441
+ children: /* @__PURE__ */ jsx("div", {
442
+ className: "leaf"
443
+ })
444
+ }),
445
+ /* @__PURE__ */ jsx(FrontGrass, {}),
446
+ /* @__PURE__ */ jsx(FrontRightGrass, {}),
447
+ Array.from({ length: 7 }, (_, index) => /* @__PURE__ */ jsx(LongGrass, {
448
+ index: index + 1
449
+ }, index)),
450
+ /* @__PURE__ */ jsx("div", {
451
+ className: "bubbles",
452
+ children: Array.from({ length: 20 }, (_, index) => /* @__PURE__ */ jsx(Bubble, {}, index))
453
+ })
454
+ ]
455
+ })
456
+ ]
457
+ }));
458
+ ArtFlowerAnimation.displayName = "ArtFlowerAnimation";
459
+ var ArtColorSpin = forwardRef(({ size = "default", decorative, className, ...props }, ref) => /* @__PURE__ */ jsx("div", {
460
+ ref,
461
+ className: cn("art-color-spin", sizeClass("art-color-spin", size), className),
462
+ ...getDecorativeProps(decorative, props),
463
+ ...props,
464
+ children: /* @__PURE__ */ jsx("ul", {
465
+ children: Array.from({ length: 4 }, (_, index) => /* @__PURE__ */ jsx("li", {
466
+ style: { "--i": index }
467
+ }, index))
468
+ })
469
+ }));
470
+ ArtColorSpin.displayName = "ArtColorSpin";
471
+ var ArtSynthwaveStarfield = forwardRef(({ size = "default", paused = false, decorative, className, ...props }, ref) => /* @__PURE__ */ jsxs("div", {
472
+ ref,
473
+ className: cn("art-synthwave-starfield", sizeClass("art-synthwave-starfield", size), paused && "art-synthwave-starfield-paused", className),
474
+ ...getDecorativeProps(decorative, props),
475
+ ...props,
476
+ children: [
477
+ /* @__PURE__ */ jsx("div", {
478
+ className: "art-synthwave-starfield-sides art-synthwave-starfield-lefrig"
479
+ }),
480
+ /* @__PURE__ */ jsx("div", {
481
+ className: "art-synthwave-starfield-sides art-synthwave-starfield-topbot"
482
+ }),
483
+ /* @__PURE__ */ jsx("div", {
484
+ className: "art-synthwave-starfield-stars"
485
+ }),
486
+ /* @__PURE__ */ jsx("div", {
487
+ className: "art-synthwave-starfield-stars"
488
+ })
489
+ ]
490
+ }));
491
+ ArtSynthwaveStarfield.displayName = "ArtSynthwaveStarfield";
492
+ function SwitchButton({ className }) {
493
+ return /* @__PURE__ */ jsx("button", {
494
+ type: "button",
495
+ className,
496
+ tabIndex: -1,
497
+ "aria-hidden": "true"
498
+ });
499
+ }
500
+ function SwitchBar() {
501
+ return /* @__PURE__ */ jsxs("div", {
502
+ className: "bar",
503
+ children: [
504
+ /* @__PURE__ */ jsx(SwitchButton, {
505
+ className: "sub-lr"
506
+ }),
507
+ /* @__PURE__ */ jsx(SwitchButton, {
508
+ className: "sub-rr"
509
+ }),
510
+ /* @__PURE__ */ jsx("span", {
511
+ className: "minus-sign"
512
+ }),
513
+ /* @__PURE__ */ jsx("span", {
514
+ className: "peripheral"
515
+ }),
516
+ /* @__PURE__ */ jsx("span", {
517
+ className: "cord"
518
+ })
519
+ ]
520
+ });
521
+ }
522
+ function SwitchConnector() {
523
+ return /* @__PURE__ */ jsxs("div", {
524
+ className: "connector",
525
+ children: [
526
+ /* @__PURE__ */ jsx("div", {
527
+ className: "con-lr",
528
+ children: /* @__PURE__ */ jsx("div", {
529
+ className: "con-part"
530
+ })
531
+ }),
532
+ /* @__PURE__ */ jsx("div", {
533
+ className: "con-rr",
534
+ children: /* @__PURE__ */ jsx("div", {
535
+ className: "con-part"
536
+ })
537
+ })
538
+ ]
539
+ });
540
+ }
541
+ function LeftJoycon() {
542
+ return /* @__PURE__ */ jsxs("div", {
543
+ className: "controller",
544
+ children: [
545
+ /* @__PURE__ */ jsx(SwitchBar, {}),
546
+ /* @__PURE__ */ jsx(SwitchConnector, {}),
547
+ /* @__PURE__ */ jsx(SwitchButton, {
548
+ className: "minus"
549
+ }),
550
+ /* @__PURE__ */ jsx(SwitchButton, {
551
+ className: "mushroom round"
552
+ }),
553
+ /* @__PURE__ */ jsx(SwitchButton, {
554
+ className: "direction arrow up round"
555
+ }),
556
+ /* @__PURE__ */ jsx(SwitchButton, {
557
+ className: "direction arrow down round"
558
+ }),
559
+ /* @__PURE__ */ jsx(SwitchButton, {
560
+ className: "direction arrow left round"
561
+ }),
562
+ /* @__PURE__ */ jsx(SwitchButton, {
563
+ className: "direction arrow right round"
564
+ }),
565
+ /* @__PURE__ */ jsx(SwitchButton, {
566
+ className: "menu"
567
+ })
568
+ ]
569
+ });
570
+ }
571
+ function RightJoycon() {
572
+ return /* @__PURE__ */ jsxs("div", {
573
+ className: "controller right",
574
+ children: [
575
+ /* @__PURE__ */ jsx(SwitchBar, {}),
576
+ /* @__PURE__ */ jsx(SwitchConnector, {}),
577
+ /* @__PURE__ */ jsx(SwitchButton, {
578
+ className: "minus plus"
579
+ }),
580
+ /* @__PURE__ */ jsx(SwitchButton, {
581
+ className: "mushroom round"
582
+ }),
583
+ /* @__PURE__ */ jsx(SwitchButton, {
584
+ className: "direction x round"
585
+ }),
586
+ /* @__PURE__ */ jsx(SwitchButton, {
587
+ className: "direction y round"
588
+ }),
589
+ /* @__PURE__ */ jsx(SwitchButton, {
590
+ className: "direction a round"
591
+ }),
592
+ /* @__PURE__ */ jsx(SwitchButton, {
593
+ className: "direction b round"
594
+ }),
595
+ /* @__PURE__ */ jsx(SwitchButton, {
596
+ className: "home round"
597
+ })
598
+ ]
599
+ });
600
+ }
601
+ function SwitchBody() {
602
+ return /* @__PURE__ */ jsxs("div", {
603
+ className: "body",
604
+ children: [
605
+ /* @__PURE__ */ jsx("div", {
606
+ className: "frame",
607
+ children: /* @__PURE__ */ jsx("div", {
608
+ className: "screen"
609
+ })
610
+ }),
611
+ /* @__PURE__ */ jsx("div", {
612
+ className: "lr"
613
+ }),
614
+ /* @__PURE__ */ jsx("div", {
615
+ className: "lr rr"
616
+ }),
617
+ /* @__PURE__ */ jsx("div", {
618
+ className: "volume"
619
+ })
620
+ ]
621
+ });
622
+ }
623
+ function ComfortGrip() {
624
+ return /* @__PURE__ */ jsxs("div", {
625
+ className: "comfort-grip",
626
+ children: [
627
+ /* @__PURE__ */ jsx("div", {
628
+ className: "grip"
629
+ }),
630
+ /* @__PURE__ */ jsx("div", {
631
+ className: "grip right"
632
+ }),
633
+ /* @__PURE__ */ jsx("div", {
634
+ className: "holder",
635
+ children: /* @__PURE__ */ jsxs("div", {
636
+ className: "main-frame",
637
+ children: [
638
+ /* @__PURE__ */ jsx("div", {
639
+ className: "logo"
640
+ }),
641
+ /* @__PURE__ */ jsx("div", {
642
+ className: "logo right"
643
+ }),
644
+ /* @__PURE__ */ jsx("div", {
645
+ className: "nintendo",
646
+ children: "NINTENDO"
647
+ }),
648
+ /* @__PURE__ */ jsx("div", {
649
+ className: "switch",
650
+ children: "SWITCH"
651
+ }),
652
+ Array.from({ length: 8 }, (_, index) => /* @__PURE__ */ jsx("div", {
653
+ className: "light"
654
+ }, index))
655
+ ]
656
+ })
657
+ })
658
+ ]
659
+ });
660
+ }
661
+ var ArtCsswitch = forwardRef(({ size = "default", decorative, className, ...props }, ref) => /* @__PURE__ */ jsxs("div", {
662
+ ref,
663
+ className: cn("art-csswitch", sizeClass("art-csswitch", size), className),
664
+ ...getDecorativeProps(decorative, props),
665
+ ...props,
666
+ children: [
667
+ /* @__PURE__ */ jsx(SwitchBody, {}),
668
+ /* @__PURE__ */ jsx(ComfortGrip, {}),
669
+ /* @__PURE__ */ jsx(LeftJoycon, {}),
670
+ /* @__PURE__ */ jsx(RightJoycon, {})
671
+ ]
672
+ }));
673
+ ArtCsswitch.displayName = "ArtCsswitch";
674
+ var ArtCSSwitch = ArtCsswitch;
675
+ var ArtSnowballPreloader = forwardRef(({ size = "default", decorative, className, ...props }, ref) => /* @__PURE__ */ jsxs("div", {
676
+ ref,
677
+ className: cn("art-snowball-preloader", sizeClass("art-snowball-preloader", size), className),
678
+ ...getDecorativeProps(decorative, props),
679
+ ...props,
680
+ children: [
681
+ /* @__PURE__ */ jsx("div", {
682
+ className: "art-snowball-preloader-outer-ring"
683
+ }),
684
+ /* @__PURE__ */ jsx("div", {
685
+ className: "art-snowball-preloader-inner-ring"
686
+ }),
687
+ /* @__PURE__ */ jsx("div", {
688
+ className: "art-snowball-preloader-track-cover"
689
+ }),
690
+ /* @__PURE__ */ jsxs("div", {
691
+ className: "art-snowball-preloader-ball",
692
+ children: [
693
+ /* @__PURE__ */ jsx("div", {
694
+ className: "art-snowball-preloader-ball-texture"
695
+ }),
696
+ /* @__PURE__ */ jsx("div", {
697
+ className: "art-snowball-preloader-ball-inner-shadow"
698
+ }),
699
+ /* @__PURE__ */ jsx("div", {
700
+ className: "art-snowball-preloader-ball-outer-shadow"
701
+ }),
702
+ /* @__PURE__ */ jsx("div", {
703
+ className: "art-snowball-preloader-ball-side-shadows"
704
+ })
705
+ ]
706
+ })
707
+ ]
708
+ }));
709
+ ArtSnowballPreloader.displayName = "ArtSnowballPreloader";
710
+ var ArtGeminiInput = forwardRef(({
711
+ size = "default",
712
+ className,
713
+ value,
714
+ defaultValue,
715
+ onChange,
716
+ placeholder,
717
+ name,
718
+ rows,
719
+ disabled,
720
+ readOnly,
721
+ required,
722
+ fieldClassName,
723
+ textareaProps,
724
+ before = "+",
725
+ after = ">",
726
+ beforeButtonProps,
727
+ afterButtonProps,
728
+ ...props
729
+ }, ref) => {
730
+ const {
731
+ className: beforeButtonClassName,
732
+ type: beforeButtonType = "button",
733
+ ...restBeforeButtonProps
734
+ } = beforeButtonProps ?? {};
735
+ const {
736
+ className: afterButtonClassName,
737
+ type: afterButtonType = "button",
738
+ ...restAfterButtonProps
739
+ } = afterButtonProps ?? {};
740
+ return /* @__PURE__ */ jsxs("div", {
741
+ ref,
742
+ className: cn("art-gemini-input", sizeClass("art-gemini-input", size), className),
743
+ ...props,
744
+ children: [
745
+ /* @__PURE__ */ jsx("div", {
746
+ className: "art-gemini-input-border"
747
+ }),
748
+ /* @__PURE__ */ jsxs("div", {
749
+ className: "art-gemini-input-inner",
750
+ children: [
751
+ before !== null ? /* @__PURE__ */ jsx("button", {
752
+ type: beforeButtonType,
753
+ className: cn("art-gemini-input-btn", beforeButtonClassName),
754
+ disabled: disabled || beforeButtonProps?.disabled,
755
+ ...restBeforeButtonProps,
756
+ children: before
757
+ }) : null,
758
+ /* @__PURE__ */ jsx("textarea", {
759
+ className: cn("art-gemini-input-field", fieldClassName),
760
+ value,
761
+ defaultValue,
762
+ onChange,
763
+ placeholder,
764
+ name,
765
+ rows,
766
+ disabled,
767
+ readOnly,
768
+ required,
769
+ ...textareaProps
770
+ }),
771
+ after !== null ? /* @__PURE__ */ jsx("button", {
772
+ type: afterButtonType,
773
+ className: cn("art-gemini-input-btn", afterButtonClassName),
774
+ disabled: disabled || afterButtonProps?.disabled,
775
+ ...restAfterButtonProps,
776
+ children: after
777
+ }) : null
778
+ ]
779
+ })
780
+ ]
781
+ });
782
+ });
783
+ ArtGeminiInput.displayName = "ArtGeminiInput";
784
+ export {
785
+ ArtSynthwaveStarfield,
786
+ ArtSun,
787
+ ArtSnowflake,
788
+ ArtSnowballPreloader,
789
+ ArtPlasmaBall,
790
+ ArtMountain,
791
+ ArtMoon,
792
+ ArtGeminiInput,
793
+ ArtFlowerAnimation,
794
+ ArtEclipse,
795
+ ArtCsswitch,
796
+ ArtColorSpin,
797
+ ArtCircularGallery,
798
+ ArtCatStargazer,
799
+ ArtCSSwitch,
800
+ ArtAtom
801
+ };
@@ -0,0 +1 @@
1
+ @import "@duskmoon-dev/css-art";
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@duskmoon-dev/art-components",
3
+ "version": "0.1.0",
4
+ "description": "React components for @duskmoon-dev/css-art pure CSS illustrations",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "style": "./dist/styles.css",
10
+ "sideEffects": [
11
+ "./dist/styles.css"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/index.js",
16
+ "types": "./dist/index.d.ts"
17
+ },
18
+ "./styles.css": "./dist/styles.css"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "scripts": {
25
+ "build": "rm -rf dist && bun run build:js && bun run build:types && bun run build:css",
26
+ "build:js": "bun run build.ts",
27
+ "build:types": "tsc -p tsconfig.build.json --emitDeclarationOnly",
28
+ "build:css": "mkdir -p dist && cp src/styles.css dist/styles.css",
29
+ "test": "bun test --preload ../../test/setup.ts tests",
30
+ "typecheck": "tsc --noEmit"
31
+ },
32
+ "keywords": [
33
+ "duskmoon",
34
+ "react",
35
+ "css-art",
36
+ "pure-css",
37
+ "components"
38
+ ],
39
+ "author": "DuskMoon Development",
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/duskmoon-dev/duskmoon-react.git",
44
+ "directory": "packages/art-components"
45
+ },
46
+ "peerDependencies": {
47
+ "@duskmoon-dev/css-art": ">=1.17.0",
48
+ "react": ">=19.0.0",
49
+ "react-dom": ">=19.0.0"
50
+ },
51
+ "devDependencies": {
52
+ "@duskmoon-dev/css-art": "^1.17.0",
53
+ "@testing-library/react": "16.3.2",
54
+ "@types/react": "19.2.17",
55
+ "@types/react-dom": "19.2.3",
56
+ "happy-dom": "20.10.2"
57
+ },
58
+ "publishConfig": {
59
+ "access": "public"
60
+ }
61
+ }