react-skeletonify 1.1.1 → 1.2.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/LICENSE +21 -21
- package/README.md +171 -171
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +78 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +74 -23
- package/dist/index.mjs.map +1 -1
- package/package.json +51 -50
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Mohammed Sinan Mp
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Mohammed Sinan Mp
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,171 +1,171 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/Sinan0333/react-smart-skeleton/main/assets/logo.png" alt="React Skeletonify Logo" width="120" height="110" />
|
|
3
|
-
</p>
|
|
4
|
-
|
|
5
|
-
<p align="center">
|
|
6
|
-
<a href="https://www.npmjs.com/package/react-skeletonify">
|
|
7
|
-
<img src="https://img.shields.io/npm/v/react-skeletonify.svg" alt="npm version" />
|
|
8
|
-
</a>
|
|
9
|
-
<a href="https://www.npmjs.com/package/react-skeletonify">
|
|
10
|
-
<img src="https://img.shields.io/npm/dm/react-skeletonify.svg" alt="npm downloads" />
|
|
11
|
-
</a>
|
|
12
|
-
<a href="https://github.com/prettier/prettier">
|
|
13
|
-
<img src="https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square" alt="code style: prettier" />
|
|
14
|
-
</a>
|
|
15
|
-
</p>
|
|
16
|
-
|
|
17
|
-
<h1 align="center">⚡ React Skeletonify</h1>
|
|
18
|
-
|
|
19
|
-
A **lightweight and flexible skeleton loader** for React, built to make loading states feel smooth and natural.
|
|
20
|
-
Unlike traditional static skeletons, **React Skeletonify** adapts to your components dynamically — letting you configure animations, styles, and exclusions globally or per-component.
|
|
21
|
-
|
|
22
|
-
## 🎮 Live Demo
|
|
23
|
-
|
|
24
|
-
👉 [Try it here](https://playcode.io/2556254)
|
|
25
|
-
|
|
26
|
-
## 📚 Documentation
|
|
27
|
-
|
|
28
|
-
For complete guides and examples check out the full documentation site:
|
|
29
|
-
👉 [React Skeletonify Documentation](https://react-skeletonify.sinan-dev.in)
|
|
30
|
-
|
|
31
|
-
## ✨ Features
|
|
32
|
-
|
|
33
|
-
- 🎨 **Global & local configuration** with `SkeletonProvider` and `SkeletonWrapper`
|
|
34
|
-
- ⚡ **Smooth animations** with multiple presets
|
|
35
|
-
- 🛠️ **Highly customizable** styles, backgrounds, borders, and speed
|
|
36
|
-
- 🧩 Works with **any React component**
|
|
37
|
-
- 🧃 Exclude tags or groups (text, form, media, etc.) from skeleton rendering
|
|
38
|
-
- 🪶 Lightweight, no external dependencies
|
|
39
|
-
|
|
40
|
-
## 🚀 Installation
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
npm install react-skeletonify
|
|
44
|
-
# or
|
|
45
|
-
yarn add react-skeletonify
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Import styles once:
|
|
49
|
-
|
|
50
|
-
```tsx
|
|
51
|
-
import "react-skeletonify/dist/index.css";
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## 🔥 Quick Example
|
|
55
|
-
|
|
56
|
-
```tsx
|
|
57
|
-
import React from "react";
|
|
58
|
-
import { SkeletonProvider, SkeletonWrapper } from "react-skeletonify";
|
|
59
|
-
import "react-skeletonify/dist/index.css";
|
|
60
|
-
|
|
61
|
-
function App() {
|
|
62
|
-
return (
|
|
63
|
-
<SkeletonProvider
|
|
64
|
-
config={{
|
|
65
|
-
animation: "animation-1",
|
|
66
|
-
borderRadius: "8px",
|
|
67
|
-
animationSpeed: 3,
|
|
68
|
-
}}>
|
|
69
|
-
<SkeletonWrapper loading={true}>
|
|
70
|
-
<div style={{ height: "120px", width: "400px", padding: "10px" }}>
|
|
71
|
-
<div
|
|
72
|
-
style={{
|
|
73
|
-
height: "50px",
|
|
74
|
-
width: "50px",
|
|
75
|
-
borderRadius: "100%",
|
|
76
|
-
marginBottom: "10px",
|
|
77
|
-
}}></div>
|
|
78
|
-
<h6>React Skeletonify</h6>
|
|
79
|
-
<p>This is an example with global provider config 🚀</p>
|
|
80
|
-
</div>
|
|
81
|
-
</SkeletonWrapper>
|
|
82
|
-
</SkeletonProvider>
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export default App;
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## ⚙️ API
|
|
90
|
-
|
|
91
|
-
### 🔹 `SkeletonProvider`
|
|
92
|
-
|
|
93
|
-
Provides **global configuration** for skeletons. Wrap your app (or part of it) in this provider.
|
|
94
|
-
|
|
95
|
-
| Prop | Type | Default | Description |
|
|
96
|
-
| -------- | ------------------------- | ------- | ---------------------- |
|
|
97
|
-
| children | `ReactNode` | `null` | Child components |
|
|
98
|
-
| config | `Partial<SkeletonConfig>` | `{}` | Global skeleton config |
|
|
99
|
-
| style | `CSSProperties` | `{}` | Inline style overrides |
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
### 🔹 `SkeletonWrapper`
|
|
104
|
-
|
|
105
|
-
Wraps **specific content** and applies skeletons when `loading` is true.
|
|
106
|
-
It can **inherit** from `SkeletonProvider` or override per instance.
|
|
107
|
-
|
|
108
|
-
| Prop | Type | Default | Description |
|
|
109
|
-
| -------------- | ------------------------- | ------- | ---------------------- |
|
|
110
|
-
| loading | `boolean` | `false` | Show skeleton if true |
|
|
111
|
-
| children | `ReactNode` | `null` | Content to render |
|
|
112
|
-
| overrideConfig | `Partial<SkeletonConfig>` | `{}` | Override global config |
|
|
113
|
-
| style | `CSSProperties` | `{}` | Inline style overrides |
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## 🎨 Configuration Options (`SkeletonConfig`)
|
|
118
|
-
|
|
119
|
-
| Key | Type | Default | Description |
|
|
120
|
-
| --------------- | -------------------------------- | --------------- | -------------------- |
|
|
121
|
-
| animationSpeed | `number` | `3` | Speed of animation |
|
|
122
|
-
| background | `string` | `#aeaeae` | Background color |
|
|
123
|
-
| border | `string` | `"none"` | Border style |
|
|
124
|
-
| borderRadius | `string \| number` | `"0"` | Border radius |
|
|
125
|
-
| textTagsMargin | `string` | `"0"` | Margin for text tags |
|
|
126
|
-
| className | `string` | `""` | Custom class |
|
|
127
|
-
| style | `CSSProperties` | `{}` | Inline styles |
|
|
128
|
-
| animation | `"animation-1" \| "animation-2"` | `"animation-1"` | Animation type |
|
|
129
|
-
| exceptTags | `string[]` | `[]` | Excluded HTML tags |
|
|
130
|
-
| exceptTagGroups | `HtmlTagGroup[]` | `[]` | Excluded tag groups |
|
|
131
|
-
|
|
132
|
-
**Available Tag Groups:**
|
|
133
|
-
`TEXT_TAGS`, `STRUCTURE_TAGS`, `METADATA_TAGS`, `LIST_TAGS`, `TABLE_TAGS`, `FORM_TAGS`, `MEDIA_TAGS`, `INTERACTIVE_TAGS`, `MISC_TAGS`
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## 📦 Example with `exceptTags`
|
|
138
|
-
|
|
139
|
-
```tsx
|
|
140
|
-
<SkeletonWrapper
|
|
141
|
-
loading={true}
|
|
142
|
-
overrideConfig={{
|
|
143
|
-
exceptTags: ["img", "button"],
|
|
144
|
-
borderRadius: "6px",
|
|
145
|
-
}}>
|
|
146
|
-
<div>
|
|
147
|
-
<img src="/profile.jpg" alt="Profile" />
|
|
148
|
-
<h2>Hello World</h2>
|
|
149
|
-
<button>Click me</button>
|
|
150
|
-
</div>
|
|
151
|
-
</SkeletonWrapper>
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
👉 In this case, the `img` and `button` will not be skeletonized.
|
|
155
|
-
|
|
156
|
-
## 📌 Versioning
|
|
157
|
-
|
|
158
|
-
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [versions](https://www.npmjs.com/package/react-skeletonify?activeTab=versions).
|
|
159
|
-
|
|
160
|
-
## 🤝 Contributing
|
|
161
|
-
|
|
162
|
-
Contributions, issues, and feature requests are welcome! 🎉
|
|
163
|
-
Feel free to open a PR or an issue.
|
|
164
|
-
|
|
165
|
-
## 👨💻 Author
|
|
166
|
-
|
|
167
|
-
- **Sinan** - [GitHub](https://github.com/Sinan0333) · [Portfolio](http://sinan-dev.in)
|
|
168
|
-
|
|
169
|
-
## License
|
|
170
|
-
|
|
171
|
-
[](https://opensource.org/licenses/MIT)
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/Sinan0333/react-smart-skeleton/main/assets/logo.png" alt="React Skeletonify Logo" width="120" height="110" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<a href="https://www.npmjs.com/package/react-skeletonify">
|
|
7
|
+
<img src="https://img.shields.io/npm/v/react-skeletonify.svg" alt="npm version" />
|
|
8
|
+
</a>
|
|
9
|
+
<a href="https://www.npmjs.com/package/react-skeletonify">
|
|
10
|
+
<img src="https://img.shields.io/npm/dm/react-skeletonify.svg" alt="npm downloads" />
|
|
11
|
+
</a>
|
|
12
|
+
<a href="https://github.com/prettier/prettier">
|
|
13
|
+
<img src="https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square" alt="code style: prettier" />
|
|
14
|
+
</a>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<h1 align="center">⚡ React Skeletonify</h1>
|
|
18
|
+
|
|
19
|
+
A **lightweight and flexible skeleton loader** for React, built to make loading states feel smooth and natural.
|
|
20
|
+
Unlike traditional static skeletons, **React Skeletonify** adapts to your components dynamically — letting you configure animations, styles, and exclusions globally or per-component.
|
|
21
|
+
|
|
22
|
+
## 🎮 Live Demo
|
|
23
|
+
|
|
24
|
+
👉 [Try it here](https://playcode.io/2556254)
|
|
25
|
+
|
|
26
|
+
## 📚 Documentation
|
|
27
|
+
|
|
28
|
+
For complete guides and examples check out the full documentation site:
|
|
29
|
+
👉 [React Skeletonify Documentation](https://react-skeletonify.sinan-dev.in)
|
|
30
|
+
|
|
31
|
+
## ✨ Features
|
|
32
|
+
|
|
33
|
+
- 🎨 **Global & local configuration** with `SkeletonProvider` and `SkeletonWrapper`
|
|
34
|
+
- ⚡ **Smooth animations** with multiple presets
|
|
35
|
+
- 🛠️ **Highly customizable** styles, backgrounds, borders, and speed
|
|
36
|
+
- 🧩 Works with **any React component**
|
|
37
|
+
- 🧃 Exclude tags or groups (text, form, media, etc.) from skeleton rendering
|
|
38
|
+
- 🪶 Lightweight, no external dependencies
|
|
39
|
+
|
|
40
|
+
## 🚀 Installation
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm install react-skeletonify
|
|
44
|
+
# or
|
|
45
|
+
yarn add react-skeletonify
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Import styles once:
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
import "react-skeletonify/dist/index.css";
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 🔥 Quick Example
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
import React from "react";
|
|
58
|
+
import { SkeletonProvider, SkeletonWrapper } from "react-skeletonify";
|
|
59
|
+
import "react-skeletonify/dist/index.css";
|
|
60
|
+
|
|
61
|
+
function App() {
|
|
62
|
+
return (
|
|
63
|
+
<SkeletonProvider
|
|
64
|
+
config={{
|
|
65
|
+
animation: "animation-1",
|
|
66
|
+
borderRadius: "8px",
|
|
67
|
+
animationSpeed: 3,
|
|
68
|
+
}}>
|
|
69
|
+
<SkeletonWrapper loading={true}>
|
|
70
|
+
<div style={{ height: "120px", width: "400px", padding: "10px" }}>
|
|
71
|
+
<div
|
|
72
|
+
style={{
|
|
73
|
+
height: "50px",
|
|
74
|
+
width: "50px",
|
|
75
|
+
borderRadius: "100%",
|
|
76
|
+
marginBottom: "10px",
|
|
77
|
+
}}></div>
|
|
78
|
+
<h6>React Skeletonify</h6>
|
|
79
|
+
<p>This is an example with global provider config 🚀</p>
|
|
80
|
+
</div>
|
|
81
|
+
</SkeletonWrapper>
|
|
82
|
+
</SkeletonProvider>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export default App;
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## ⚙️ API
|
|
90
|
+
|
|
91
|
+
### 🔹 `SkeletonProvider`
|
|
92
|
+
|
|
93
|
+
Provides **global configuration** for skeletons. Wrap your app (or part of it) in this provider.
|
|
94
|
+
|
|
95
|
+
| Prop | Type | Default | Description |
|
|
96
|
+
| -------- | ------------------------- | ------- | ---------------------- |
|
|
97
|
+
| children | `ReactNode` | `null` | Child components |
|
|
98
|
+
| config | `Partial<SkeletonConfig>` | `{}` | Global skeleton config |
|
|
99
|
+
| style | `CSSProperties` | `{}` | Inline style overrides |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### 🔹 `SkeletonWrapper`
|
|
104
|
+
|
|
105
|
+
Wraps **specific content** and applies skeletons when `loading` is true.
|
|
106
|
+
It can **inherit** from `SkeletonProvider` or override per instance.
|
|
107
|
+
|
|
108
|
+
| Prop | Type | Default | Description |
|
|
109
|
+
| -------------- | ------------------------- | ------- | ---------------------- |
|
|
110
|
+
| loading | `boolean` | `false` | Show skeleton if true |
|
|
111
|
+
| children | `ReactNode` | `null` | Content to render |
|
|
112
|
+
| overrideConfig | `Partial<SkeletonConfig>` | `{}` | Override global config |
|
|
113
|
+
| style | `CSSProperties` | `{}` | Inline style overrides |
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 🎨 Configuration Options (`SkeletonConfig`)
|
|
118
|
+
|
|
119
|
+
| Key | Type | Default | Description |
|
|
120
|
+
| --------------- | -------------------------------- | --------------- | -------------------- |
|
|
121
|
+
| animationSpeed | `number` | `3` | Speed of animation |
|
|
122
|
+
| background | `string` | `#aeaeae` | Background color |
|
|
123
|
+
| border | `string` | `"none"` | Border style |
|
|
124
|
+
| borderRadius | `string \| number` | `"0"` | Border radius |
|
|
125
|
+
| textTagsMargin | `string` | `"0"` | Margin for text tags |
|
|
126
|
+
| className | `string` | `""` | Custom class |
|
|
127
|
+
| style | `CSSProperties` | `{}` | Inline styles |
|
|
128
|
+
| animation | `"animation-1" \| "animation-2"` | `"animation-1"` | Animation type |
|
|
129
|
+
| exceptTags | `string[]` | `[]` | Excluded HTML tags |
|
|
130
|
+
| exceptTagGroups | `HtmlTagGroup[]` | `[]` | Excluded tag groups |
|
|
131
|
+
|
|
132
|
+
**Available Tag Groups:**
|
|
133
|
+
`TEXT_TAGS`, `STRUCTURE_TAGS`, `METADATA_TAGS`, `LIST_TAGS`, `TABLE_TAGS`, `FORM_TAGS`, `MEDIA_TAGS`, `INTERACTIVE_TAGS`, `MISC_TAGS`
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 📦 Example with `exceptTags`
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
<SkeletonWrapper
|
|
141
|
+
loading={true}
|
|
142
|
+
overrideConfig={{
|
|
143
|
+
exceptTags: ["img", "button"],
|
|
144
|
+
borderRadius: "6px",
|
|
145
|
+
}}>
|
|
146
|
+
<div>
|
|
147
|
+
<img src="/profile.jpg" alt="Profile" />
|
|
148
|
+
<h2>Hello World</h2>
|
|
149
|
+
<button>Click me</button>
|
|
150
|
+
</div>
|
|
151
|
+
</SkeletonWrapper>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
👉 In this case, the `img` and `button` will not be skeletonized.
|
|
155
|
+
|
|
156
|
+
## 📌 Versioning
|
|
157
|
+
|
|
158
|
+
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [versions](https://www.npmjs.com/package/react-skeletonify?activeTab=versions).
|
|
159
|
+
|
|
160
|
+
## 🤝 Contributing
|
|
161
|
+
|
|
162
|
+
Contributions, issues, and feature requests are welcome! 🎉
|
|
163
|
+
Feel free to open a PR or an issue.
|
|
164
|
+
|
|
165
|
+
## 👨💻 Author
|
|
166
|
+
|
|
167
|
+
- **Sinan** - [GitHub](https://github.com/Sinan0333) · [Portfolio](http://sinan-dev.in)
|
|
168
|
+
|
|
169
|
+
## License
|
|
170
|
+
|
|
171
|
+
[](https://opensource.org/licenses/MIT)
|
package/dist/index.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/styles/skeleton.css"],"sourcesContent":[".react-skeletonify {\n color: transparent !important;\n outline: none !important;\n pointer-events: none !important;\n}\n.react-skeletonify img {\n opacity: 0;\n}\n.react-skeletonify a {\n text-decoration: none !important;\n color: transparent !important;\n}\n.react-skeletonify-text {\n margin-top: 5px !important;\n}\n.react-skeletonify::placeholder {\n color: transparent !important;\n}\n\n/* Animation 1 */\n/* animation: react-skeletonify-animation-1 3s ease-in-out infinite;\nanimation-delay: 0.5s; */\n@keyframes react-skeletonify-animation-1 {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.4;\n }\n 100% {\n opacity: 1;\n }\n}\n\n/* Animation 2 */\n/* animation: react-skeletonify-animation-2 2s infinite;*/\n@keyframes react-skeletonify-animation-2 {\n 100% {\n background-position: -100% 0;\n }\n}\n\n/* Animation 3 */\n/* animation: react-skeletonify-animation-3 1s linear infinite alternate; */\n@keyframes react-skeletonify-animation-3 {\n 0% {\n background-color: hsl(200, 20%, 80%);\n }\n 100% {\n background-color: hsl(200, 20%, 95%);\n }\n}\n"],"mappings":";AAAA,CAAC;AACC,SAAO;AACP,WAAS;AACT,kBAAgB;AAClB;AACA,CALC,kBAKkB;AACjB,WAAS;AACX;AACA,CARC,kBAQkB;AACjB,mBAAiB;AACjB,SAAO;AACT;AACA,CAAC;AACC,cAAY;AACd;AACA,CAfC,iBAeiB;AAChB,SAAO;AACT;AAKA,WAAW;AACT;AACE,aAAS;AACX;AACA;AACE,aAAS;AACX;AACA;AACE,aAAS;AACX;AACF;AAIA,WAAW;AACT;AACE,yBAAqB,MAAM;AAC7B;AACF;AAIA,WAAW;AACT;AACE,sBAAkB,IAAI,GAAG,EAAE,GAAG,EAAE;AAClC;AACA;AACE,sBAAkB,IAAI,GAAG,EAAE,GAAG,EAAE;AAClC;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/styles/skeleton.css"],"sourcesContent":[".react-skeletonify {\r\n color: transparent !important;\r\n outline: none !important;\r\n pointer-events: none !important;\r\n}\r\n.react-skeletonify img {\r\n opacity: 0;\r\n}\r\n.react-skeletonify a {\r\n text-decoration: none !important;\r\n color: transparent !important;\r\n}\r\n.react-skeletonify-text {\r\n margin-top: 5px !important;\r\n}\r\n.react-skeletonify::placeholder {\r\n color: transparent !important;\r\n}\r\n\r\n/* Animation 1 */\r\n/* animation: react-skeletonify-animation-1 3s ease-in-out infinite;\r\nanimation-delay: 0.5s; */\r\n@keyframes react-skeletonify-animation-1 {\r\n 0% {\r\n opacity: 1;\r\n }\r\n 50% {\r\n opacity: 0.4;\r\n }\r\n 100% {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n/* Animation 2 */\r\n/* animation: react-skeletonify-animation-2 2s infinite;*/\r\n@keyframes react-skeletonify-animation-2 {\r\n 100% {\r\n background-position: -100% 0;\r\n }\r\n}\r\n\r\n/* Animation 3 */\r\n/* animation: react-skeletonify-animation-3 1s linear infinite alternate; */\r\n@keyframes react-skeletonify-animation-3 {\r\n 0% {\r\n background-color: hsl(200, 20%, 80%);\r\n }\r\n 100% {\r\n background-color: hsl(200, 20%, 95%);\r\n }\r\n}\r\n"],"mappings":";AAAA,CAAC;AACC,SAAO;AACP,WAAS;AACT,kBAAgB;AAClB;AACA,CALC,kBAKkB;AACjB,WAAS;AACX;AACA,CARC,kBAQkB;AACjB,mBAAiB;AACjB,SAAO;AACT;AACA,CAAC;AACC,cAAY;AACd;AACA,CAfC,iBAeiB;AAChB,SAAO;AACT;AAKA,WAAW;AACT;AACE,aAAS;AACX;AACA;AACE,aAAS;AACX;AACA;AACE,aAAS;AACX;AACF;AAIA,WAAW;AACT;AACE,yBAAqB,MAAM;AAC7B;AACF;AAIA,WAAW;AACT;AACE,sBAAkB,IAAI,GAAG,EAAE,GAAG,EAAE;AAClC;AACA;AACE,sBAAkB,IAAI,GAAG,EAAE,GAAG,EAAE;AAClC;AACF;","names":[]}
|
package/dist/index.d.mts
CHANGED
|
@@ -23,6 +23,31 @@ interface SkeletonWrapperProps {
|
|
|
23
23
|
}
|
|
24
24
|
declare const SkeletonWrapper: React.FC<SkeletonWrapperProps>;
|
|
25
25
|
|
|
26
|
+
interface SkeletonLeafProps {
|
|
27
|
+
loading: boolean;
|
|
28
|
+
children: React.ReactNode;
|
|
29
|
+
overrideConfig?: Partial<SkeletonConfig>;
|
|
30
|
+
style?: CSSProperties;
|
|
31
|
+
}
|
|
32
|
+
declare const SkeletonLeaf: React.FC<SkeletonLeafProps>;
|
|
33
|
+
|
|
34
|
+
interface SkeletonKeepProps {
|
|
35
|
+
children: React.ReactNode;
|
|
36
|
+
}
|
|
37
|
+
declare const SkeletonKeep: React.FC<SkeletonKeepProps>;
|
|
38
|
+
|
|
39
|
+
interface SkeletonIgnoreProps {
|
|
40
|
+
children: React.ReactNode;
|
|
41
|
+
}
|
|
42
|
+
declare const SkeletonIgnore: React.FC<SkeletonIgnoreProps>;
|
|
43
|
+
|
|
44
|
+
interface SkeletonUniteProps {
|
|
45
|
+
children: React.ReactNode;
|
|
46
|
+
className?: string;
|
|
47
|
+
style?: React.CSSProperties;
|
|
48
|
+
}
|
|
49
|
+
declare const SkeletonUnite: React.FC<SkeletonUniteProps>;
|
|
50
|
+
|
|
26
51
|
interface SkeletonProviderProps {
|
|
27
52
|
children: React.ReactNode;
|
|
28
53
|
config?: Partial<SkeletonConfig>;
|
|
@@ -31,4 +56,4 @@ interface SkeletonProviderProps {
|
|
|
31
56
|
declare const SkeletonProvider: React.FC<SkeletonProviderProps>;
|
|
32
57
|
declare const useSkeleton: () => SkeletonConfig;
|
|
33
58
|
|
|
34
|
-
export { type SkeletonConfig, SkeletonProvider, SkeletonWrapper, useSkeleton };
|
|
59
|
+
export { type SkeletonConfig, SkeletonIgnore, SkeletonKeep, SkeletonLeaf, SkeletonProvider, SkeletonUnite, SkeletonWrapper, useSkeleton };
|
package/dist/index.d.ts
CHANGED
|
@@ -23,6 +23,31 @@ interface SkeletonWrapperProps {
|
|
|
23
23
|
}
|
|
24
24
|
declare const SkeletonWrapper: React.FC<SkeletonWrapperProps>;
|
|
25
25
|
|
|
26
|
+
interface SkeletonLeafProps {
|
|
27
|
+
loading: boolean;
|
|
28
|
+
children: React.ReactNode;
|
|
29
|
+
overrideConfig?: Partial<SkeletonConfig>;
|
|
30
|
+
style?: CSSProperties;
|
|
31
|
+
}
|
|
32
|
+
declare const SkeletonLeaf: React.FC<SkeletonLeafProps>;
|
|
33
|
+
|
|
34
|
+
interface SkeletonKeepProps {
|
|
35
|
+
children: React.ReactNode;
|
|
36
|
+
}
|
|
37
|
+
declare const SkeletonKeep: React.FC<SkeletonKeepProps>;
|
|
38
|
+
|
|
39
|
+
interface SkeletonIgnoreProps {
|
|
40
|
+
children: React.ReactNode;
|
|
41
|
+
}
|
|
42
|
+
declare const SkeletonIgnore: React.FC<SkeletonIgnoreProps>;
|
|
43
|
+
|
|
44
|
+
interface SkeletonUniteProps {
|
|
45
|
+
children: React.ReactNode;
|
|
46
|
+
className?: string;
|
|
47
|
+
style?: React.CSSProperties;
|
|
48
|
+
}
|
|
49
|
+
declare const SkeletonUnite: React.FC<SkeletonUniteProps>;
|
|
50
|
+
|
|
26
51
|
interface SkeletonProviderProps {
|
|
27
52
|
children: React.ReactNode;
|
|
28
53
|
config?: Partial<SkeletonConfig>;
|
|
@@ -31,4 +56,4 @@ interface SkeletonProviderProps {
|
|
|
31
56
|
declare const SkeletonProvider: React.FC<SkeletonProviderProps>;
|
|
32
57
|
declare const useSkeleton: () => SkeletonConfig;
|
|
33
58
|
|
|
34
|
-
export { type SkeletonConfig, SkeletonProvider, SkeletonWrapper, useSkeleton };
|
|
59
|
+
export { type SkeletonConfig, SkeletonIgnore, SkeletonKeep, SkeletonLeaf, SkeletonProvider, SkeletonUnite, SkeletonWrapper, useSkeleton };
|
package/dist/index.js
CHANGED
|
@@ -30,15 +30,16 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.tsx
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
|
+
SkeletonIgnore: () => SkeletonIgnore_default,
|
|
34
|
+
SkeletonKeep: () => SkeletonKeep_default,
|
|
35
|
+
SkeletonLeaf: () => SkeletonLeaf_default,
|
|
33
36
|
SkeletonProvider: () => SkeletonProvider,
|
|
37
|
+
SkeletonUnite: () => SkeletonUnite_default,
|
|
34
38
|
SkeletonWrapper: () => SkeletonWrapper_default,
|
|
35
39
|
useSkeleton: () => useSkeleton
|
|
36
40
|
});
|
|
37
41
|
module.exports = __toCommonJS(index_exports);
|
|
38
42
|
|
|
39
|
-
// src/components/SkeletonWrapper.tsx
|
|
40
|
-
var import_react6 = require("react");
|
|
41
|
-
|
|
42
43
|
// src/components/SkeletonElement.tsx
|
|
43
44
|
var import_react4 = __toESM(require("react"));
|
|
44
45
|
|
|
@@ -234,10 +235,38 @@ function checkTagInGroup(tag, groups) {
|
|
|
234
235
|
});
|
|
235
236
|
}
|
|
236
237
|
|
|
237
|
-
// src/
|
|
238
|
-
var
|
|
238
|
+
// src/components/SkeletonIgnore.tsx
|
|
239
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
240
|
+
var SkeletonIgnore = ({ children }) => {
|
|
241
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
|
|
242
|
+
};
|
|
243
|
+
var SkeletonIgnore_default = SkeletonIgnore;
|
|
244
|
+
|
|
245
|
+
// src/components/SkeletonKeep.tsx
|
|
246
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
247
|
+
var SkeletonKeep = ({ children }) => {
|
|
248
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children });
|
|
249
|
+
};
|
|
250
|
+
var SkeletonKeep_default = SkeletonKeep;
|
|
251
|
+
|
|
252
|
+
// src/components/SkeletonUnite.tsx
|
|
253
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
254
|
+
var SkeletonUnite = (props) => {
|
|
255
|
+
const { children, className, style } = props;
|
|
256
|
+
if (className && className.includes("react-skeletonify")) {
|
|
257
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className, style, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { opacity: 0 }, children }) });
|
|
258
|
+
}
|
|
259
|
+
return children;
|
|
260
|
+
};
|
|
261
|
+
var SkeletonUnite_default = SkeletonUnite;
|
|
262
|
+
|
|
263
|
+
// src/utils/check-element.ts
|
|
264
|
+
var isTextElement = (elementType) => {
|
|
239
265
|
return TEXT_TAGS.includes(elementType) || LIST_TAGS.includes(elementType);
|
|
240
266
|
};
|
|
267
|
+
var isSkeletonIgnoreComponent = (element) => element === SkeletonIgnore_default;
|
|
268
|
+
var isSkeletonKeepComponent = (element) => element === SkeletonKeep_default;
|
|
269
|
+
var isSkeletonUniteComponent = (element) => element === SkeletonUnite_default;
|
|
241
270
|
|
|
242
271
|
// src/hooks/useAddSkelton.ts
|
|
243
272
|
function useAddSkelton(config) {
|
|
@@ -245,20 +274,20 @@ function useAddSkelton(config) {
|
|
|
245
274
|
const CLASS_NAME = `react-skeletonify ${className} `;
|
|
246
275
|
const style = create_style_default(config);
|
|
247
276
|
const addSkeleton = (node) => {
|
|
248
|
-
if (!import_react3.default.isValidElement(node))
|
|
277
|
+
if (!import_react3.default.isValidElement(node)) {
|
|
249
278
|
return createNodeWrapper(node, CLASS_NAME, style);
|
|
279
|
+
}
|
|
250
280
|
const element = node;
|
|
251
281
|
const { children } = element.props;
|
|
252
282
|
const elementType = element.type;
|
|
283
|
+
if (isSkeletonKeepComponent(elementType)) return element;
|
|
284
|
+
if (isSkeletonIgnoreComponent(elementType)) return null;
|
|
285
|
+
if (isSkeletonUniteComponent(elementType)) {
|
|
286
|
+
return createLeafNode(element, CLASS_NAME, style);
|
|
287
|
+
}
|
|
253
288
|
if (typeof elementType === "string") {
|
|
254
|
-
if (exceptTags.includes(elementType))
|
|
255
|
-
|
|
256
|
-
}
|
|
257
|
-
const isRestrictedGroupTag = checkTagInGroup(
|
|
258
|
-
elementType,
|
|
259
|
-
exceptTagGroups
|
|
260
|
-
);
|
|
261
|
-
if (isRestrictedGroupTag) return element;
|
|
289
|
+
if (exceptTags.includes(elementType)) return element;
|
|
290
|
+
if (checkTagInGroup(elementType, exceptTagGroups)) return element;
|
|
262
291
|
}
|
|
263
292
|
const hasChildren = import_react3.default.Children.count(children) > 0;
|
|
264
293
|
const isValidChildren = typeof children !== "string";
|
|
@@ -266,8 +295,7 @@ function useAddSkelton(config) {
|
|
|
266
295
|
const rendered = elementType(element.props);
|
|
267
296
|
return addSkeleton(rendered);
|
|
268
297
|
}
|
|
269
|
-
|
|
270
|
-
if (isTextTag) {
|
|
298
|
+
if (isTextElement(elementType)) {
|
|
271
299
|
return createLeafNode(element, CLASS_NAME, {
|
|
272
300
|
...style,
|
|
273
301
|
margin: textTagsMargin
|
|
@@ -297,6 +325,9 @@ var SkeletonElement = (props) => {
|
|
|
297
325
|
};
|
|
298
326
|
var SkeletonElement_default = SkeletonElement;
|
|
299
327
|
|
|
328
|
+
// src/utils/create-config.ts
|
|
329
|
+
var import_react6 = require("react");
|
|
330
|
+
|
|
300
331
|
// src/context/SkeletonContext.tsx
|
|
301
332
|
var import_react5 = require("react");
|
|
302
333
|
|
|
@@ -320,7 +351,7 @@ var defaultValues = {
|
|
|
320
351
|
};
|
|
321
352
|
|
|
322
353
|
// src/context/SkeletonContext.tsx
|
|
323
|
-
var
|
|
354
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
324
355
|
var SkeletonContext = (0, import_react5.createContext)(defaultValues);
|
|
325
356
|
var SkeletonProvider = (props) => {
|
|
326
357
|
const { children, config, style } = props;
|
|
@@ -334,14 +365,12 @@ var SkeletonProvider = (props) => {
|
|
|
334
365
|
}),
|
|
335
366
|
[animation, background, config, style]
|
|
336
367
|
);
|
|
337
|
-
return /* @__PURE__ */ (0,
|
|
368
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SkeletonContext.Provider, { value, children });
|
|
338
369
|
};
|
|
339
370
|
var useSkeleton = () => (0, import_react5.useContext)(SkeletonContext);
|
|
340
371
|
|
|
341
|
-
// src/
|
|
342
|
-
var
|
|
343
|
-
var SkeletonWrapper = (props) => {
|
|
344
|
-
const { loading, children, overrideConfig, style } = props;
|
|
372
|
+
// src/utils/create-config.ts
|
|
373
|
+
var create_config_default = (overrideConfig, style) => {
|
|
345
374
|
const mainConfig = useSkeleton();
|
|
346
375
|
const config = (0, import_react6.useMemo)(
|
|
347
376
|
() => ({
|
|
@@ -351,15 +380,41 @@ var SkeletonWrapper = (props) => {
|
|
|
351
380
|
}),
|
|
352
381
|
[overrideConfig, mainConfig]
|
|
353
382
|
);
|
|
383
|
+
return config;
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
// src/components/SkeletonWrapper.tsx
|
|
387
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
388
|
+
var SkeletonWrapper = (props) => {
|
|
389
|
+
const { loading, children, overrideConfig, style } = props;
|
|
390
|
+
const config = create_config_default(overrideConfig, style);
|
|
354
391
|
if (loading) {
|
|
355
|
-
return /* @__PURE__ */ (0,
|
|
392
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SkeletonElement_default, { config, children });
|
|
356
393
|
}
|
|
357
394
|
return children;
|
|
358
395
|
};
|
|
359
396
|
var SkeletonWrapper_default = SkeletonWrapper;
|
|
397
|
+
|
|
398
|
+
// src/components/SkeletonLeaf.tsx
|
|
399
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
400
|
+
var SkeletonLeaf = (props) => {
|
|
401
|
+
const { loading, children, overrideConfig, style } = props;
|
|
402
|
+
const config = create_config_default(overrideConfig, style);
|
|
403
|
+
const skeletonStyle = create_style_default(config);
|
|
404
|
+
const className = `react-skeletonify ${config.className || ""}`;
|
|
405
|
+
if (loading) {
|
|
406
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className, style: skeletonStyle, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: { opacity: 0 }, children }) });
|
|
407
|
+
}
|
|
408
|
+
return children;
|
|
409
|
+
};
|
|
410
|
+
var SkeletonLeaf_default = SkeletonLeaf;
|
|
360
411
|
// Annotate the CommonJS export names for ESM import in node:
|
|
361
412
|
0 && (module.exports = {
|
|
413
|
+
SkeletonIgnore,
|
|
414
|
+
SkeletonKeep,
|
|
415
|
+
SkeletonLeaf,
|
|
362
416
|
SkeletonProvider,
|
|
417
|
+
SkeletonUnite,
|
|
363
418
|
SkeletonWrapper,
|
|
364
419
|
useSkeleton
|
|
365
420
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/components/SkeletonWrapper.tsx","../src/components/SkeletonElement.tsx","../src/hooks/useAddSkelton.ts","../src/utils/create-node-wrapper.ts","../src/utils/create-leaf-node.ts","../src/utils/create-style.ts","../src/constants/tags.ts","../src/utils/check-tag-in-group.ts","../src/utils/is-text-element.ts","../src/context/SkeletonContext.tsx","../src/context/skeleton-config.ts"],"sourcesContent":["import \"./styles/skeleton.css\";\n\nexport { default as SkeletonWrapper } from \"./components/SkeletonWrapper\";\nexport { SkeletonProvider, useSkeleton } from \"./context/SkeletonContext\";\nexport type { SkeletonConfig } from \"./context/skeleton-config\";\n","import React, { CSSProperties, useMemo } from \"react\";\nimport SkeletonElement from \"./SkeletonElement\";\nimport { SkeletonConfig } from \"../context/skeleton-config\";\nimport { useSkeleton } from \"../context/SkeletonContext\";\n\ninterface SkeletonWrapperProps {\n loading: boolean;\n children: React.ReactNode;\n overrideConfig?: Partial<SkeletonConfig>;\n style?: CSSProperties;\n}\n\nconst SkeletonWrapper: React.FC<SkeletonWrapperProps> = (props) => {\n const { loading, children, overrideConfig, style } = props;\n const mainConfig = useSkeleton();\n\n const config: SkeletonConfig = useMemo(\n () => ({\n ...mainConfig,\n ...overrideConfig,\n style: { ...mainConfig.style, ...overrideConfig?.style, ...style },\n }),\n [overrideConfig, mainConfig]\n );\n\n if (loading) {\n return <SkeletonElement config={config}>{children}</SkeletonElement>;\n }\n return children;\n};\n\nexport default SkeletonWrapper;\n","import React from \"react\";\nimport useAddSkelton from \"../hooks/useAddSkelton\";\nimport { SkeletonConfig } from \"../context/skeleton-config\";\n\ninterface SkeletonElementProps {\n children: React.ReactNode;\n config: SkeletonConfig;\n}\n\nconst SkeletonElement: React.FC<SkeletonElementProps> = (props) => {\n const { children, config } = props;\n const addSkeleton = useAddSkelton(config);\n\n return React.Children.map(children, (child) => addSkeleton(child));\n};\n\nexport default SkeletonElement;\n","import React from \"react\";\nimport createNodeWrapper from \"../utils/create-node-wrapper\";\nimport createLeafNode from \"../utils/create-leaf-node\";\nimport { SkeletonConfig } from \"../context/skeleton-config\";\nimport createStyle from \"../utils/create-style\";\nimport checkTagInGroup from \"../utils/check-tag-in-group\";\nimport isTextElement from \"../utils/is-text-element\";\n\nfunction useAddSkelton(config: SkeletonConfig) {\n const { className, exceptTags, exceptTagGroups, textTagsMargin } = config;\n const CLASS_NAME = `react-skeletonify ${className} `;\n const style = createStyle(config);\n\n const addSkeleton = (node: React.ReactNode): React.ReactNode => {\n if (!React.isValidElement(node))\n return createNodeWrapper(node as any, CLASS_NAME, style);\n\n const element = node as React.ReactElement<any>;\n const { children } = element.props;\n const elementType = element.type;\n\n if (typeof elementType === \"string\") {\n if (exceptTags.includes(elementType)) {\n return element;\n }\n const isRestrictedGroupTag = checkTagInGroup(\n elementType,\n exceptTagGroups\n );\n\n if (isRestrictedGroupTag) return element;\n }\n\n const hasChildren = React.Children.count(children) > 0;\n const isValidChildren = typeof children !== \"string\";\n\n if (typeof elementType === \"function\") {\n const rendered = (elementType as any)(element.props);\n return addSkeleton(rendered);\n }\n\n const isTextTag = isTextElement(elementType);\n\n if (isTextTag) {\n return createLeafNode(element, CLASS_NAME, {\n ...style,\n margin: textTagsMargin,\n });\n }\n\n if (elementType === \"img\") {\n return createNodeWrapper(element, CLASS_NAME, style);\n }\n\n if (hasChildren && isValidChildren) {\n const childWithSkeletons = React.Children.map(children, addSkeleton);\n\n return React.cloneElement(element, {\n ...element.props,\n children: childWithSkeletons,\n } as typeof element.props);\n }\n\n return createLeafNode(element, CLASS_NAME, style);\n };\n\n return addSkeleton;\n}\n\nexport default useAddSkelton;\n","import React, { createElement, CSSProperties } from \"react\";\n\nexport default function createNodeWrapper(\n node: React.ReactElement<any>,\n className: string,\n style: CSSProperties\n) {\n if (!node) return null;\n\n return createElement(\n \"div\",\n {\n className: className + (node?.props?.className || \"\"),\n style: {\n ...style,\n ...node?.props?.style,\n },\n },\n node\n );\n}\n","import React, { CSSProperties } from \"react\";\n\nexport default function createLeafNode(\n node: React.ReactElement<any>,\n className: string,\n style: CSSProperties\n): React.ReactElement {\n return React.cloneElement(node, {\n ...node.props,\n className: className + (node.props.className || \"\"),\n style: {\n ...style,\n ...node.props.style,\n },\n } as typeof node.props);\n}\n","import { CSSProperties } from \"react\";\nimport { SkeletonConfig } from \"../context/skeleton-config\";\n\nconst getAnimation = (\n animation: string,\n animationSpeed: number,\n background: string\n) => {\n switch (animation) {\n case \"animation-1\":\n return {\n animation: `react-skeletonify-animation-1 ${animationSpeed}s ease-in-out infinite `,\n background: background,\n animationDelay: \"0.5s\",\n };\n case \"animation-2\":\n return {\n animation: `react-skeletonify-animation-2 ${animationSpeed}s infinite`,\n background: `linear-gradient(120deg, ${background} 30%, #f0f0f0 38%, #f0f0f0 40%, ${background} 48%)`,\n backgroundSize: \"200% 100%\",\n backgroundPosition: \"100% 0\",\n };\n case \"animation-3\":\n return {\n animation: `react-skeletonify-animation-3 ${animationSpeed}s linear infinite alternate`,\n backgroundColor: background,\n };\n }\n};\n\nexport default (config: SkeletonConfig) => {\n const { animationSpeed, background, border, borderRadius, animation, style } =\n config;\n\n const skeletonAnimation: CSSProperties = {\n ...getAnimation(animation, animationSpeed, background),\n border,\n borderRadius,\n ...style,\n };\n\n return skeletonAnimation;\n};\n","// --- Text & Content ---\nexport const TEXT_TAGS = [\n \"p\",\n \"span\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"b\",\n \"strong\",\n \"i\",\n \"em\",\n \"u\",\n \"mark\",\n \"small\",\n \"sup\",\n \"sub\",\n \"abbr\",\n \"cite\",\n \"q\",\n \"blockquote\",\n \"code\",\n \"pre\",\n \"samp\",\n \"kbd\",\n \"var\",\n \"time\",\n \"br\",\n \"wbr\",\n];\n\n// --- Sectioning / Structure ---\nexport const STRUCTURE_TAGS = [\n \"html\",\n \"head\",\n \"body\",\n \"main\",\n \"header\",\n \"footer\",\n \"nav\",\n \"section\",\n \"article\",\n \"aside\",\n];\n\n// --- Metadata ---\nexport const METADATA_TAGS = [\"base\", \"link\", \"meta\", \"style\", \"title\"];\n\n// --- Lists ---\nexport const LIST_TAGS = [\"ul\", \"ol\", \"li\", \"dl\", \"dt\", \"dd\"];\n\n// --- Tables ---\nexport const TABLE_TAGS = [\n \"table\",\n \"caption\",\n \"thead\",\n \"tbody\",\n \"tfoot\",\n \"tr\",\n \"th\",\n \"td\",\n \"col\",\n \"colgroup\",\n];\n\n// --- Forms & Inputs ---\nexport const FORM_TAGS = [\n \"form\",\n \"input\",\n \"textarea\",\n \"button\",\n \"label\",\n \"select\",\n \"option\",\n \"optgroup\",\n \"fieldset\",\n \"legend\",\n \"datalist\",\n \"output\",\n \"meter\",\n \"progress\",\n];\n\n// --- Media ---\nexport const MEDIA_TAGS = [\n \"img\",\n \"audio\",\n \"video\",\n \"source\",\n \"track\",\n \"picture\",\n \"iframe\",\n \"embed\",\n \"object\",\n \"map\",\n \"area\",\n \"canvas\",\n];\n\n// --- Interactive ---\nexport const INTERACTIVE_TAGS = [\n \"details\",\n \"summary\",\n \"dialog\",\n \"script\",\n \"noscript\",\n \"template\",\n];\n\n// --- Other / Inline semantics ---\nexport const MISC_TAGS = [\"ins\", \"del\", \"s\", \"bdi\", \"bdo\", \"ruby\", \"rt\", \"rp\"];\n","import {\n FORM_TAGS,\n INTERACTIVE_TAGS,\n LIST_TAGS,\n MEDIA_TAGS,\n METADATA_TAGS,\n MISC_TAGS,\n STRUCTURE_TAGS,\n TABLE_TAGS,\n TEXT_TAGS,\n} from \"../constants/tags\";\nimport { HtmlTagGroup } from \"../context/skeleton-config\";\n\nexport default function checkTagInGroup(\n tag: string,\n groups: HtmlTagGroup[]\n): boolean {\n return groups.some((group) => {\n switch (group) {\n case \"TEXT_TAGS\":\n return TEXT_TAGS.includes(tag);\n case \"STRUCTURE_TAGS\":\n return STRUCTURE_TAGS.includes(tag);\n case \"METADATA_TAGS\":\n return METADATA_TAGS.includes(tag);\n case \"LIST_TAGS\":\n return LIST_TAGS.includes(tag);\n case \"TABLE_TAGS\":\n return TABLE_TAGS.includes(tag);\n case \"FORM_TAGS\":\n return FORM_TAGS.includes(tag);\n case \"MEDIA_TAGS\":\n return MEDIA_TAGS.includes(tag);\n case \"INTERACTIVE_TAGS\":\n return INTERACTIVE_TAGS.includes(tag);\n case \"MISC_TAGS\":\n return MISC_TAGS.includes(tag);\n }\n });\n}\n","import { LIST_TAGS, TEXT_TAGS } from \"../constants/tags\";\n\nexport default (elementType: string) => {\n return TEXT_TAGS.includes(elementType) || LIST_TAGS.includes(elementType);\n};\n","import React, {\n createContext,\n CSSProperties,\n useContext,\n useMemo,\n} from \"react\";\nimport {\n SkeletonConfig,\n defaultBackground,\n defaultValues,\n} from \"./skeleton-config\";\n\nconst SkeletonContext = createContext<SkeletonConfig>(defaultValues);\ninterface SkeletonProviderProps {\n children: React.ReactNode;\n config?: Partial<SkeletonConfig>;\n style?: CSSProperties;\n}\n\nexport const SkeletonProvider: React.FC<SkeletonProviderProps> = (props) => {\n const { children, config, style } = props;\n const { animation = defaultValues.animation, background } = config || {};\n\n const value: SkeletonConfig = useMemo(\n () => ({\n ...defaultValues,\n ...config,\n background: background ? background : defaultBackground[animation],\n style: { ...defaultValues.style, ...config?.style, ...style },\n }),\n [animation, background, config, style]\n );\n\n return (\n <SkeletonContext.Provider value={value}>\n {children}\n </SkeletonContext.Provider>\n );\n};\n\nexport const useSkeleton = () => useContext(SkeletonContext);\n","import { CSSProperties } from \"react\";\n\nexport const HTML_TAG_GROUPS = [\n \"TEXT_TAGS\",\n \"STRUCTURE_TAGS\",\n \"METADATA_TAGS\",\n \"LIST_TAGS\",\n \"TABLE_TAGS\",\n \"FORM_TAGS\",\n \"MEDIA_TAGS\",\n \"INTERACTIVE_TAGS\",\n \"MISC_TAGS\",\n] as const;\n\nexport type HtmlTagGroup = (typeof HTML_TAG_GROUPS)[number];\n\nexport const defaultBackground = {\n \"animation-1\": \"#aeaeae\",\n \"animation-2\": \"#e5e5e5\",\n \"animation-3\": \"hsl(210, 20%, 90%)\",\n};\n\nexport type SkeletonConfig = {\n animationSpeed: number;\n background: string;\n border: string;\n borderRadius: string;\n textTagsMargin: string;\n className?: string;\n style?: CSSProperties;\n animation: \"animation-1\" | \"animation-2\";\n exceptTags: string[];\n exceptTagGroups: HtmlTagGroup[];\n};\n\nexport const defaultValues: SkeletonConfig = {\n animationSpeed: 3,\n background: \"#aeaeae\",\n border: \"none\",\n borderRadius: \"0\",\n textTagsMargin: \"0\",\n className: \"\",\n style: {},\n animation: \"animation-1\",\n exceptTags: [],\n exceptTagGroups: [],\n};\n"],"mappings":"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","names":["import_react","import_react","import_react","import_react","React","React","React","import_react","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/components/SkeletonElement.tsx","../src/hooks/useAddSkelton.ts","../src/utils/create-node-wrapper.ts","../src/utils/create-leaf-node.ts","../src/utils/create-style.ts","../src/constants/tags.ts","../src/utils/check-tag-in-group.ts","../src/components/SkeletonIgnore.tsx","../src/components/SkeletonKeep.tsx","../src/components/SkeletonUnite.tsx","../src/utils/check-element.ts","../src/utils/create-config.ts","../src/context/SkeletonContext.tsx","../src/context/skeleton-config.ts","../src/components/SkeletonWrapper.tsx","../src/components/SkeletonLeaf.tsx"],"sourcesContent":["// Styles\r\nimport \"./styles/skeleton.css\";\r\n\r\n// All Components\r\nexport { default as SkeletonWrapper } from \"./components/SkeletonWrapper\";\r\nexport { default as SkeletonLeaf } from \"./components/SkeletonLeaf\";\r\nexport { default as SkeletonKeep } from \"./components/SkeletonKeep\";\r\nexport { default as SkeletonIgnore } from \"./components/SkeletonIgnore\";\r\nexport { default as SkeletonUnite } from \"./components/SkeletonUnite\";\r\n\r\n// Context\r\nexport { SkeletonProvider, useSkeleton } from \"./context/SkeletonContext\";\r\n\r\n// Types\r\nexport type { SkeletonConfig } from \"./context/skeleton-config\";\r\n","import React from \"react\";\r\nimport useAddSkelton from \"../hooks/useAddSkelton\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\n\r\ninterface SkeletonElementProps {\r\n children: React.ReactNode;\r\n config: SkeletonConfig;\r\n}\r\n\r\nconst SkeletonElement: React.FC<SkeletonElementProps> = (props) => {\r\n const { children, config } = props;\r\n const addSkeleton = useAddSkelton(config);\r\n\r\n return React.Children.map(children, (child) => addSkeleton(child));\r\n};\r\n\r\nexport default SkeletonElement;\r\n","import React from \"react\";\r\nimport createNodeWrapper from \"../utils/create-node-wrapper\";\r\nimport createLeafNode from \"../utils/create-leaf-node\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\nimport createStyle from \"../utils/create-style\";\r\nimport checkTagInGroup from \"../utils/check-tag-in-group\";\r\nimport {\r\n isSkeletonIgnoreComponent,\r\n isSkeletonKeepComponent,\r\n isSkeletonUniteComponent,\r\n isTextElement,\r\n} from \"../utils/check-element\";\r\n\r\nfunction useAddSkelton(config: SkeletonConfig) {\r\n const { className, exceptTags, exceptTagGroups, textTagsMargin } = config;\r\n const CLASS_NAME = `react-skeletonify ${className} `;\r\n const style = createStyle(config);\r\n\r\n const addSkeleton = (node: React.ReactNode): React.ReactNode => {\r\n if (!React.isValidElement(node)) {\r\n return createNodeWrapper(node as any, CLASS_NAME, style);\r\n }\r\n\r\n const element = node as React.ReactElement<any>;\r\n const { children } = element.props;\r\n const elementType = element.type;\r\n\r\n if (isSkeletonKeepComponent(elementType)) return element;\r\n if (isSkeletonIgnoreComponent(elementType)) return null;\r\n if (isSkeletonUniteComponent(elementType)) {\r\n return createLeafNode(element, CLASS_NAME, style);\r\n }\r\n\r\n if (typeof elementType === \"string\") {\r\n if (exceptTags.includes(elementType)) return element;\r\n if (checkTagInGroup(elementType, exceptTagGroups)) return element;\r\n }\r\n\r\n const hasChildren = React.Children.count(children) > 0;\r\n const isValidChildren = typeof children !== \"string\";\r\n\r\n if (typeof elementType === \"function\") {\r\n const rendered = (elementType as any)(element.props);\r\n return addSkeleton(rendered);\r\n }\r\n\r\n if (isTextElement(elementType)) {\r\n return createLeafNode(element, CLASS_NAME, {\r\n ...style,\r\n margin: textTagsMargin,\r\n });\r\n }\r\n\r\n if (elementType === \"img\") {\r\n return createNodeWrapper(element, CLASS_NAME, style);\r\n }\r\n\r\n if (hasChildren && isValidChildren) {\r\n const childWithSkeletons = React.Children.map(children, addSkeleton);\r\n\r\n return React.cloneElement(element, {\r\n ...element.props,\r\n children: childWithSkeletons,\r\n } as typeof element.props);\r\n }\r\n\r\n return createLeafNode(element, CLASS_NAME, style);\r\n };\r\n\r\n return addSkeleton;\r\n}\r\n\r\nexport default useAddSkelton;\r\n","import React, { createElement, CSSProperties } from \"react\";\r\n\r\nexport default function createNodeWrapper(\r\n node: React.ReactElement<any>,\r\n className: string,\r\n style: CSSProperties\r\n) {\r\n if (!node) return null;\r\n\r\n return createElement(\r\n \"div\",\r\n {\r\n className: className + (node?.props?.className || \"\"),\r\n style: {\r\n ...style,\r\n ...node?.props?.style,\r\n },\r\n },\r\n node\r\n );\r\n}\r\n","import React, { CSSProperties } from \"react\";\r\n\r\nexport default function createLeafNode(\r\n node: React.ReactElement<any>,\r\n className: string,\r\n style: CSSProperties\r\n): React.ReactElement {\r\n return React.cloneElement(node, {\r\n ...node.props,\r\n className: className + (node.props.className || \"\"),\r\n style: {\r\n ...style,\r\n ...node.props.style,\r\n },\r\n } as typeof node.props);\r\n}\r\n","import { CSSProperties } from \"react\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\n\r\nconst getAnimation = (\r\n animation: string,\r\n animationSpeed: number,\r\n background: string\r\n) => {\r\n switch (animation) {\r\n case \"animation-1\":\r\n return {\r\n animation: `react-skeletonify-animation-1 ${animationSpeed}s ease-in-out infinite `,\r\n background: background,\r\n animationDelay: \"0.5s\",\r\n };\r\n case \"animation-2\":\r\n return {\r\n animation: `react-skeletonify-animation-2 ${animationSpeed}s infinite`,\r\n background: `linear-gradient(120deg, ${background} 30%, #f0f0f0 38%, #f0f0f0 40%, ${background} 48%)`,\r\n backgroundSize: \"200% 100%\",\r\n backgroundPosition: \"100% 0\",\r\n };\r\n case \"animation-3\":\r\n return {\r\n animation: `react-skeletonify-animation-3 ${animationSpeed}s linear infinite alternate`,\r\n backgroundColor: background,\r\n };\r\n }\r\n};\r\n\r\nexport default (config: SkeletonConfig) => {\r\n const { animationSpeed, background, border, borderRadius, animation, style } =\r\n config;\r\n\r\n const skeletonAnimation: CSSProperties = {\r\n ...getAnimation(animation, animationSpeed, background),\r\n border,\r\n borderRadius,\r\n ...style,\r\n };\r\n\r\n return skeletonAnimation;\r\n};\r\n","// --- Text & Content ---\r\nexport const TEXT_TAGS = [\r\n \"p\",\r\n \"span\",\r\n \"h1\",\r\n \"h2\",\r\n \"h3\",\r\n \"h4\",\r\n \"h5\",\r\n \"h6\",\r\n \"b\",\r\n \"strong\",\r\n \"i\",\r\n \"em\",\r\n \"u\",\r\n \"mark\",\r\n \"small\",\r\n \"sup\",\r\n \"sub\",\r\n \"abbr\",\r\n \"cite\",\r\n \"q\",\r\n \"blockquote\",\r\n \"code\",\r\n \"pre\",\r\n \"samp\",\r\n \"kbd\",\r\n \"var\",\r\n \"time\",\r\n \"br\",\r\n \"wbr\",\r\n];\r\n\r\n// --- Sectioning / Structure ---\r\nexport const STRUCTURE_TAGS = [\r\n \"html\",\r\n \"head\",\r\n \"body\",\r\n \"main\",\r\n \"header\",\r\n \"footer\",\r\n \"nav\",\r\n \"section\",\r\n \"article\",\r\n \"aside\",\r\n];\r\n\r\n// --- Metadata ---\r\nexport const METADATA_TAGS = [\"base\", \"link\", \"meta\", \"style\", \"title\"];\r\n\r\n// --- Lists ---\r\nexport const LIST_TAGS = [\"ul\", \"ol\", \"li\", \"dl\", \"dt\", \"dd\"];\r\n\r\n// --- Tables ---\r\nexport const TABLE_TAGS = [\r\n \"table\",\r\n \"caption\",\r\n \"thead\",\r\n \"tbody\",\r\n \"tfoot\",\r\n \"tr\",\r\n \"th\",\r\n \"td\",\r\n \"col\",\r\n \"colgroup\",\r\n];\r\n\r\n// --- Forms & Inputs ---\r\nexport const FORM_TAGS = [\r\n \"form\",\r\n \"input\",\r\n \"textarea\",\r\n \"button\",\r\n \"label\",\r\n \"select\",\r\n \"option\",\r\n \"optgroup\",\r\n \"fieldset\",\r\n \"legend\",\r\n \"datalist\",\r\n \"output\",\r\n \"meter\",\r\n \"progress\",\r\n];\r\n\r\n// --- Media ---\r\nexport const MEDIA_TAGS = [\r\n \"img\",\r\n \"audio\",\r\n \"video\",\r\n \"source\",\r\n \"track\",\r\n \"picture\",\r\n \"iframe\",\r\n \"embed\",\r\n \"object\",\r\n \"map\",\r\n \"area\",\r\n \"canvas\",\r\n];\r\n\r\n// --- Interactive ---\r\nexport const INTERACTIVE_TAGS = [\r\n \"details\",\r\n \"summary\",\r\n \"dialog\",\r\n \"script\",\r\n \"noscript\",\r\n \"template\",\r\n];\r\n\r\n// --- Other / Inline semantics ---\r\nexport const MISC_TAGS = [\"ins\", \"del\", \"s\", \"bdi\", \"bdo\", \"ruby\", \"rt\", \"rp\"];\r\n","import {\r\n FORM_TAGS,\r\n INTERACTIVE_TAGS,\r\n LIST_TAGS,\r\n MEDIA_TAGS,\r\n METADATA_TAGS,\r\n MISC_TAGS,\r\n STRUCTURE_TAGS,\r\n TABLE_TAGS,\r\n TEXT_TAGS,\r\n} from \"../constants/tags\";\r\nimport { HtmlTagGroup } from \"../context/skeleton-config\";\r\n\r\nexport default function checkTagInGroup(\r\n tag: string,\r\n groups: HtmlTagGroup[]\r\n): boolean {\r\n return groups.some((group) => {\r\n switch (group) {\r\n case \"TEXT_TAGS\":\r\n return TEXT_TAGS.includes(tag);\r\n case \"STRUCTURE_TAGS\":\r\n return STRUCTURE_TAGS.includes(tag);\r\n case \"METADATA_TAGS\":\r\n return METADATA_TAGS.includes(tag);\r\n case \"LIST_TAGS\":\r\n return LIST_TAGS.includes(tag);\r\n case \"TABLE_TAGS\":\r\n return TABLE_TAGS.includes(tag);\r\n case \"FORM_TAGS\":\r\n return FORM_TAGS.includes(tag);\r\n case \"MEDIA_TAGS\":\r\n return MEDIA_TAGS.includes(tag);\r\n case \"INTERACTIVE_TAGS\":\r\n return INTERACTIVE_TAGS.includes(tag);\r\n case \"MISC_TAGS\":\r\n return MISC_TAGS.includes(tag);\r\n }\r\n });\r\n}\r\n","import React from \"react\";\r\n\r\ninterface SkeletonIgnoreProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nconst SkeletonIgnore: React.FC<SkeletonIgnoreProps> = ({ children }) => {\r\n return <>{children}</>;\r\n};\r\n\r\nexport default SkeletonIgnore;\r\n","import React from \"react\";\r\n\r\ninterface SkeletonKeepProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nconst SkeletonKeep: React.FC<SkeletonKeepProps> = ({ children }) => {\r\n return <>{children}</>;\r\n};\r\n\r\nexport default SkeletonKeep;\r\n","import React from \"react\";\r\n\r\ninterface SkeletonUniteProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst SkeletonUnite: React.FC<SkeletonUniteProps> = (props) => {\r\n const { children, className, style } = props;\r\n\r\n if (className && className.includes(\"react-skeletonify\")) {\r\n return (\r\n <div className={className} style={style}>\r\n <div style={{ opacity: 0 }}>{children}</div>\r\n </div>\r\n );\r\n }\r\n\r\n return children;\r\n};\r\n\r\nexport default SkeletonUnite;\r\n","import React from \"react\";\r\nimport { LIST_TAGS, TEXT_TAGS } from \"../constants/tags\";\r\n\r\nimport SkeletonIgnore from \"../components/SkeletonIgnore\";\r\nimport SkeletonKeep from \"../components/SkeletonKeep\";\r\nimport SkeletonUnite from \"../components/SkeletonUnite\";\r\n\r\nexport const isTextElement = (elementType: string): boolean => {\r\n return TEXT_TAGS.includes(elementType) || LIST_TAGS.includes(elementType);\r\n};\r\n\r\nexport const isSkeletonIgnoreComponent = (\r\n element: React.ComponentType<any> | string\r\n): boolean => element === SkeletonIgnore;\r\n\r\nexport const isSkeletonKeepComponent = (\r\n element: React.ComponentType<any> | string\r\n): boolean => element === SkeletonKeep;\r\n\r\nexport const isSkeletonUniteComponent = (\r\n element: React.ComponentType<any> | string\r\n): boolean => element === SkeletonUnite;\r\n","import { CSSProperties, useMemo } from \"react\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\nimport { useSkeleton } from \"../context/SkeletonContext\";\r\n\r\nexport default (\r\n overrideConfig?: Partial<SkeletonConfig>,\r\n style?: CSSProperties\r\n) => {\r\n const mainConfig = useSkeleton();\r\n\r\n const config: SkeletonConfig = useMemo(\r\n () => ({\r\n ...mainConfig,\r\n ...overrideConfig,\r\n style: { ...mainConfig.style, ...overrideConfig?.style, ...style },\r\n }),\r\n [overrideConfig, mainConfig]\r\n );\r\n\r\n return config;\r\n};\r\n","import React, {\r\n createContext,\r\n CSSProperties,\r\n useContext,\r\n useMemo,\r\n} from \"react\";\r\nimport {\r\n SkeletonConfig,\r\n defaultBackground,\r\n defaultValues,\r\n} from \"./skeleton-config\";\r\n\r\nconst SkeletonContext = createContext<SkeletonConfig>(defaultValues);\r\ninterface SkeletonProviderProps {\r\n children: React.ReactNode;\r\n config?: Partial<SkeletonConfig>;\r\n style?: CSSProperties;\r\n}\r\n\r\nexport const SkeletonProvider: React.FC<SkeletonProviderProps> = (props) => {\r\n const { children, config, style } = props;\r\n const { animation = defaultValues.animation, background } = config || {};\r\n\r\n const value: SkeletonConfig = useMemo(\r\n () => ({\r\n ...defaultValues,\r\n ...config,\r\n background: background ? background : defaultBackground[animation],\r\n style: { ...defaultValues.style, ...config?.style, ...style },\r\n }),\r\n [animation, background, config, style]\r\n );\r\n\r\n return (\r\n <SkeletonContext.Provider value={value}>\r\n {children}\r\n </SkeletonContext.Provider>\r\n );\r\n};\r\n\r\nexport const useSkeleton = () => useContext(SkeletonContext);\r\n","import { CSSProperties } from \"react\";\r\n\r\nexport const HTML_TAG_GROUPS = [\r\n \"TEXT_TAGS\",\r\n \"STRUCTURE_TAGS\",\r\n \"METADATA_TAGS\",\r\n \"LIST_TAGS\",\r\n \"TABLE_TAGS\",\r\n \"FORM_TAGS\",\r\n \"MEDIA_TAGS\",\r\n \"INTERACTIVE_TAGS\",\r\n \"MISC_TAGS\",\r\n] as const;\r\n\r\nexport type HtmlTagGroup = (typeof HTML_TAG_GROUPS)[number];\r\n\r\nexport const defaultBackground = {\r\n \"animation-1\": \"#aeaeae\",\r\n \"animation-2\": \"#e5e5e5\",\r\n \"animation-3\": \"hsl(210, 20%, 90%)\",\r\n};\r\n\r\nexport type SkeletonConfig = {\r\n animationSpeed: number;\r\n background: string;\r\n border: string;\r\n borderRadius: string;\r\n textTagsMargin: string;\r\n className?: string;\r\n style?: CSSProperties;\r\n animation: \"animation-1\" | \"animation-2\";\r\n exceptTags: string[];\r\n exceptTagGroups: HtmlTagGroup[];\r\n};\r\n\r\nexport const defaultValues: SkeletonConfig = {\r\n animationSpeed: 3,\r\n background: \"#aeaeae\",\r\n border: \"none\",\r\n borderRadius: \"0\",\r\n textTagsMargin: \"0\",\r\n className: \"\",\r\n style: {},\r\n animation: \"animation-1\",\r\n exceptTags: [],\r\n exceptTagGroups: [],\r\n};\r\n","import React, { CSSProperties } from \"react\";\r\nimport SkeletonElement from \"./SkeletonElement\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\nimport createConfig from \"../utils/create-config\";\r\n\r\ninterface SkeletonWrapperProps {\r\n loading: boolean;\r\n children: React.ReactNode;\r\n overrideConfig?: Partial<SkeletonConfig>;\r\n style?: CSSProperties;\r\n}\r\n\r\nconst SkeletonWrapper: React.FC<SkeletonWrapperProps> = (props) => {\r\n const { loading, children, overrideConfig, style } = props;\r\n const config = createConfig(overrideConfig, style);\r\n\r\n if (loading) {\r\n return <SkeletonElement config={config}>{children}</SkeletonElement>;\r\n }\r\n return children;\r\n};\r\n\r\nexport default SkeletonWrapper;\r\n","import React, { CSSProperties } from \"react\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\nimport createStyle from \"../utils/create-style\";\r\nimport createConfig from \"../utils/create-config\";\r\n\r\nexport interface SkeletonLeafProps {\r\n loading: boolean;\r\n children: React.ReactNode;\r\n overrideConfig?: Partial<SkeletonConfig>;\r\n style?: CSSProperties;\r\n}\r\n\r\nconst SkeletonLeaf: React.FC<SkeletonLeafProps> = (props) => {\r\n const { loading, children, overrideConfig, style } = props;\r\n const config = createConfig(overrideConfig, style);\r\n\r\n const skeletonStyle = createStyle(config);\r\n const className = `react-skeletonify ${config.className || \"\"}`;\r\n\r\n if (loading) {\r\n return (\r\n <div className={className} style={skeletonStyle}>\r\n <div style={{ opacity: 0 }}>{children}</div>\r\n </div>\r\n );\r\n }\r\n\r\n return children;\r\n};\r\n\r\nexport default SkeletonLeaf;\r\n"],"mappings":"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","names":["import_react","import_react","import_react","React","import_jsx_runtime","import_jsx_runtime","React","React","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
// src/components/SkeletonWrapper.tsx
|
|
2
|
-
import { useMemo as useMemo2 } from "react";
|
|
3
|
-
|
|
4
1
|
// src/components/SkeletonElement.tsx
|
|
5
2
|
import React4 from "react";
|
|
6
3
|
|
|
@@ -196,10 +193,38 @@ function checkTagInGroup(tag, groups) {
|
|
|
196
193
|
});
|
|
197
194
|
}
|
|
198
195
|
|
|
199
|
-
// src/
|
|
200
|
-
|
|
196
|
+
// src/components/SkeletonIgnore.tsx
|
|
197
|
+
import { Fragment, jsx } from "react/jsx-runtime";
|
|
198
|
+
var SkeletonIgnore = ({ children }) => {
|
|
199
|
+
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
200
|
+
};
|
|
201
|
+
var SkeletonIgnore_default = SkeletonIgnore;
|
|
202
|
+
|
|
203
|
+
// src/components/SkeletonKeep.tsx
|
|
204
|
+
import { Fragment as Fragment2, jsx as jsx2 } from "react/jsx-runtime";
|
|
205
|
+
var SkeletonKeep = ({ children }) => {
|
|
206
|
+
return /* @__PURE__ */ jsx2(Fragment2, { children });
|
|
207
|
+
};
|
|
208
|
+
var SkeletonKeep_default = SkeletonKeep;
|
|
209
|
+
|
|
210
|
+
// src/components/SkeletonUnite.tsx
|
|
211
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
212
|
+
var SkeletonUnite = (props) => {
|
|
213
|
+
const { children, className, style } = props;
|
|
214
|
+
if (className && className.includes("react-skeletonify")) {
|
|
215
|
+
return /* @__PURE__ */ jsx3("div", { className, style, children: /* @__PURE__ */ jsx3("div", { style: { opacity: 0 }, children }) });
|
|
216
|
+
}
|
|
217
|
+
return children;
|
|
218
|
+
};
|
|
219
|
+
var SkeletonUnite_default = SkeletonUnite;
|
|
220
|
+
|
|
221
|
+
// src/utils/check-element.ts
|
|
222
|
+
var isTextElement = (elementType) => {
|
|
201
223
|
return TEXT_TAGS.includes(elementType) || LIST_TAGS.includes(elementType);
|
|
202
224
|
};
|
|
225
|
+
var isSkeletonIgnoreComponent = (element) => element === SkeletonIgnore_default;
|
|
226
|
+
var isSkeletonKeepComponent = (element) => element === SkeletonKeep_default;
|
|
227
|
+
var isSkeletonUniteComponent = (element) => element === SkeletonUnite_default;
|
|
203
228
|
|
|
204
229
|
// src/hooks/useAddSkelton.ts
|
|
205
230
|
function useAddSkelton(config) {
|
|
@@ -207,20 +232,20 @@ function useAddSkelton(config) {
|
|
|
207
232
|
const CLASS_NAME = `react-skeletonify ${className} `;
|
|
208
233
|
const style = create_style_default(config);
|
|
209
234
|
const addSkeleton = (node) => {
|
|
210
|
-
if (!React3.isValidElement(node))
|
|
235
|
+
if (!React3.isValidElement(node)) {
|
|
211
236
|
return createNodeWrapper(node, CLASS_NAME, style);
|
|
237
|
+
}
|
|
212
238
|
const element = node;
|
|
213
239
|
const { children } = element.props;
|
|
214
240
|
const elementType = element.type;
|
|
241
|
+
if (isSkeletonKeepComponent(elementType)) return element;
|
|
242
|
+
if (isSkeletonIgnoreComponent(elementType)) return null;
|
|
243
|
+
if (isSkeletonUniteComponent(elementType)) {
|
|
244
|
+
return createLeafNode(element, CLASS_NAME, style);
|
|
245
|
+
}
|
|
215
246
|
if (typeof elementType === "string") {
|
|
216
|
-
if (exceptTags.includes(elementType))
|
|
217
|
-
|
|
218
|
-
}
|
|
219
|
-
const isRestrictedGroupTag = checkTagInGroup(
|
|
220
|
-
elementType,
|
|
221
|
-
exceptTagGroups
|
|
222
|
-
);
|
|
223
|
-
if (isRestrictedGroupTag) return element;
|
|
247
|
+
if (exceptTags.includes(elementType)) return element;
|
|
248
|
+
if (checkTagInGroup(elementType, exceptTagGroups)) return element;
|
|
224
249
|
}
|
|
225
250
|
const hasChildren = React3.Children.count(children) > 0;
|
|
226
251
|
const isValidChildren = typeof children !== "string";
|
|
@@ -228,8 +253,7 @@ function useAddSkelton(config) {
|
|
|
228
253
|
const rendered = elementType(element.props);
|
|
229
254
|
return addSkeleton(rendered);
|
|
230
255
|
}
|
|
231
|
-
|
|
232
|
-
if (isTextTag) {
|
|
256
|
+
if (isTextElement(elementType)) {
|
|
233
257
|
return createLeafNode(element, CLASS_NAME, {
|
|
234
258
|
...style,
|
|
235
259
|
margin: textTagsMargin
|
|
@@ -259,6 +283,9 @@ var SkeletonElement = (props) => {
|
|
|
259
283
|
};
|
|
260
284
|
var SkeletonElement_default = SkeletonElement;
|
|
261
285
|
|
|
286
|
+
// src/utils/create-config.ts
|
|
287
|
+
import { useMemo as useMemo2 } from "react";
|
|
288
|
+
|
|
262
289
|
// src/context/SkeletonContext.tsx
|
|
263
290
|
import {
|
|
264
291
|
createContext,
|
|
@@ -286,7 +313,7 @@ var defaultValues = {
|
|
|
286
313
|
};
|
|
287
314
|
|
|
288
315
|
// src/context/SkeletonContext.tsx
|
|
289
|
-
import { jsx } from "react/jsx-runtime";
|
|
316
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
290
317
|
var SkeletonContext = createContext(defaultValues);
|
|
291
318
|
var SkeletonProvider = (props) => {
|
|
292
319
|
const { children, config, style } = props;
|
|
@@ -300,14 +327,12 @@ var SkeletonProvider = (props) => {
|
|
|
300
327
|
}),
|
|
301
328
|
[animation, background, config, style]
|
|
302
329
|
);
|
|
303
|
-
return /* @__PURE__ */
|
|
330
|
+
return /* @__PURE__ */ jsx4(SkeletonContext.Provider, { value, children });
|
|
304
331
|
};
|
|
305
332
|
var useSkeleton = () => useContext(SkeletonContext);
|
|
306
333
|
|
|
307
|
-
// src/
|
|
308
|
-
|
|
309
|
-
var SkeletonWrapper = (props) => {
|
|
310
|
-
const { loading, children, overrideConfig, style } = props;
|
|
334
|
+
// src/utils/create-config.ts
|
|
335
|
+
var create_config_default = (overrideConfig, style) => {
|
|
311
336
|
const mainConfig = useSkeleton();
|
|
312
337
|
const config = useMemo2(
|
|
313
338
|
() => ({
|
|
@@ -317,14 +342,40 @@ var SkeletonWrapper = (props) => {
|
|
|
317
342
|
}),
|
|
318
343
|
[overrideConfig, mainConfig]
|
|
319
344
|
);
|
|
345
|
+
return config;
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
// src/components/SkeletonWrapper.tsx
|
|
349
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
350
|
+
var SkeletonWrapper = (props) => {
|
|
351
|
+
const { loading, children, overrideConfig, style } = props;
|
|
352
|
+
const config = create_config_default(overrideConfig, style);
|
|
320
353
|
if (loading) {
|
|
321
|
-
return /* @__PURE__ */
|
|
354
|
+
return /* @__PURE__ */ jsx5(SkeletonElement_default, { config, children });
|
|
322
355
|
}
|
|
323
356
|
return children;
|
|
324
357
|
};
|
|
325
358
|
var SkeletonWrapper_default = SkeletonWrapper;
|
|
359
|
+
|
|
360
|
+
// src/components/SkeletonLeaf.tsx
|
|
361
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
362
|
+
var SkeletonLeaf = (props) => {
|
|
363
|
+
const { loading, children, overrideConfig, style } = props;
|
|
364
|
+
const config = create_config_default(overrideConfig, style);
|
|
365
|
+
const skeletonStyle = create_style_default(config);
|
|
366
|
+
const className = `react-skeletonify ${config.className || ""}`;
|
|
367
|
+
if (loading) {
|
|
368
|
+
return /* @__PURE__ */ jsx6("div", { className, style: skeletonStyle, children: /* @__PURE__ */ jsx6("div", { style: { opacity: 0 }, children }) });
|
|
369
|
+
}
|
|
370
|
+
return children;
|
|
371
|
+
};
|
|
372
|
+
var SkeletonLeaf_default = SkeletonLeaf;
|
|
326
373
|
export {
|
|
374
|
+
SkeletonIgnore_default as SkeletonIgnore,
|
|
375
|
+
SkeletonKeep_default as SkeletonKeep,
|
|
376
|
+
SkeletonLeaf_default as SkeletonLeaf,
|
|
327
377
|
SkeletonProvider,
|
|
378
|
+
SkeletonUnite_default as SkeletonUnite,
|
|
328
379
|
SkeletonWrapper_default as SkeletonWrapper,
|
|
329
380
|
useSkeleton
|
|
330
381
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/SkeletonWrapper.tsx","../src/components/SkeletonElement.tsx","../src/hooks/useAddSkelton.ts","../src/utils/create-node-wrapper.ts","../src/utils/create-leaf-node.ts","../src/utils/create-style.ts","../src/constants/tags.ts","../src/utils/check-tag-in-group.ts","../src/utils/is-text-element.ts","../src/context/SkeletonContext.tsx","../src/context/skeleton-config.ts"],"sourcesContent":["import React, { CSSProperties, useMemo } from \"react\";\nimport SkeletonElement from \"./SkeletonElement\";\nimport { SkeletonConfig } from \"../context/skeleton-config\";\nimport { useSkeleton } from \"../context/SkeletonContext\";\n\ninterface SkeletonWrapperProps {\n loading: boolean;\n children: React.ReactNode;\n overrideConfig?: Partial<SkeletonConfig>;\n style?: CSSProperties;\n}\n\nconst SkeletonWrapper: React.FC<SkeletonWrapperProps> = (props) => {\n const { loading, children, overrideConfig, style } = props;\n const mainConfig = useSkeleton();\n\n const config: SkeletonConfig = useMemo(\n () => ({\n ...mainConfig,\n ...overrideConfig,\n style: { ...mainConfig.style, ...overrideConfig?.style, ...style },\n }),\n [overrideConfig, mainConfig]\n );\n\n if (loading) {\n return <SkeletonElement config={config}>{children}</SkeletonElement>;\n }\n return children;\n};\n\nexport default SkeletonWrapper;\n","import React from \"react\";\nimport useAddSkelton from \"../hooks/useAddSkelton\";\nimport { SkeletonConfig } from \"../context/skeleton-config\";\n\ninterface SkeletonElementProps {\n children: React.ReactNode;\n config: SkeletonConfig;\n}\n\nconst SkeletonElement: React.FC<SkeletonElementProps> = (props) => {\n const { children, config } = props;\n const addSkeleton = useAddSkelton(config);\n\n return React.Children.map(children, (child) => addSkeleton(child));\n};\n\nexport default SkeletonElement;\n","import React from \"react\";\nimport createNodeWrapper from \"../utils/create-node-wrapper\";\nimport createLeafNode from \"../utils/create-leaf-node\";\nimport { SkeletonConfig } from \"../context/skeleton-config\";\nimport createStyle from \"../utils/create-style\";\nimport checkTagInGroup from \"../utils/check-tag-in-group\";\nimport isTextElement from \"../utils/is-text-element\";\n\nfunction useAddSkelton(config: SkeletonConfig) {\n const { className, exceptTags, exceptTagGroups, textTagsMargin } = config;\n const CLASS_NAME = `react-skeletonify ${className} `;\n const style = createStyle(config);\n\n const addSkeleton = (node: React.ReactNode): React.ReactNode => {\n if (!React.isValidElement(node))\n return createNodeWrapper(node as any, CLASS_NAME, style);\n\n const element = node as React.ReactElement<any>;\n const { children } = element.props;\n const elementType = element.type;\n\n if (typeof elementType === \"string\") {\n if (exceptTags.includes(elementType)) {\n return element;\n }\n const isRestrictedGroupTag = checkTagInGroup(\n elementType,\n exceptTagGroups\n );\n\n if (isRestrictedGroupTag) return element;\n }\n\n const hasChildren = React.Children.count(children) > 0;\n const isValidChildren = typeof children !== \"string\";\n\n if (typeof elementType === \"function\") {\n const rendered = (elementType as any)(element.props);\n return addSkeleton(rendered);\n }\n\n const isTextTag = isTextElement(elementType);\n\n if (isTextTag) {\n return createLeafNode(element, CLASS_NAME, {\n ...style,\n margin: textTagsMargin,\n });\n }\n\n if (elementType === \"img\") {\n return createNodeWrapper(element, CLASS_NAME, style);\n }\n\n if (hasChildren && isValidChildren) {\n const childWithSkeletons = React.Children.map(children, addSkeleton);\n\n return React.cloneElement(element, {\n ...element.props,\n children: childWithSkeletons,\n } as typeof element.props);\n }\n\n return createLeafNode(element, CLASS_NAME, style);\n };\n\n return addSkeleton;\n}\n\nexport default useAddSkelton;\n","import React, { createElement, CSSProperties } from \"react\";\n\nexport default function createNodeWrapper(\n node: React.ReactElement<any>,\n className: string,\n style: CSSProperties\n) {\n if (!node) return null;\n\n return createElement(\n \"div\",\n {\n className: className + (node?.props?.className || \"\"),\n style: {\n ...style,\n ...node?.props?.style,\n },\n },\n node\n );\n}\n","import React, { CSSProperties } from \"react\";\n\nexport default function createLeafNode(\n node: React.ReactElement<any>,\n className: string,\n style: CSSProperties\n): React.ReactElement {\n return React.cloneElement(node, {\n ...node.props,\n className: className + (node.props.className || \"\"),\n style: {\n ...style,\n ...node.props.style,\n },\n } as typeof node.props);\n}\n","import { CSSProperties } from \"react\";\nimport { SkeletonConfig } from \"../context/skeleton-config\";\n\nconst getAnimation = (\n animation: string,\n animationSpeed: number,\n background: string\n) => {\n switch (animation) {\n case \"animation-1\":\n return {\n animation: `react-skeletonify-animation-1 ${animationSpeed}s ease-in-out infinite `,\n background: background,\n animationDelay: \"0.5s\",\n };\n case \"animation-2\":\n return {\n animation: `react-skeletonify-animation-2 ${animationSpeed}s infinite`,\n background: `linear-gradient(120deg, ${background} 30%, #f0f0f0 38%, #f0f0f0 40%, ${background} 48%)`,\n backgroundSize: \"200% 100%\",\n backgroundPosition: \"100% 0\",\n };\n case \"animation-3\":\n return {\n animation: `react-skeletonify-animation-3 ${animationSpeed}s linear infinite alternate`,\n backgroundColor: background,\n };\n }\n};\n\nexport default (config: SkeletonConfig) => {\n const { animationSpeed, background, border, borderRadius, animation, style } =\n config;\n\n const skeletonAnimation: CSSProperties = {\n ...getAnimation(animation, animationSpeed, background),\n border,\n borderRadius,\n ...style,\n };\n\n return skeletonAnimation;\n};\n","// --- Text & Content ---\nexport const TEXT_TAGS = [\n \"p\",\n \"span\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"b\",\n \"strong\",\n \"i\",\n \"em\",\n \"u\",\n \"mark\",\n \"small\",\n \"sup\",\n \"sub\",\n \"abbr\",\n \"cite\",\n \"q\",\n \"blockquote\",\n \"code\",\n \"pre\",\n \"samp\",\n \"kbd\",\n \"var\",\n \"time\",\n \"br\",\n \"wbr\",\n];\n\n// --- Sectioning / Structure ---\nexport const STRUCTURE_TAGS = [\n \"html\",\n \"head\",\n \"body\",\n \"main\",\n \"header\",\n \"footer\",\n \"nav\",\n \"section\",\n \"article\",\n \"aside\",\n];\n\n// --- Metadata ---\nexport const METADATA_TAGS = [\"base\", \"link\", \"meta\", \"style\", \"title\"];\n\n// --- Lists ---\nexport const LIST_TAGS = [\"ul\", \"ol\", \"li\", \"dl\", \"dt\", \"dd\"];\n\n// --- Tables ---\nexport const TABLE_TAGS = [\n \"table\",\n \"caption\",\n \"thead\",\n \"tbody\",\n \"tfoot\",\n \"tr\",\n \"th\",\n \"td\",\n \"col\",\n \"colgroup\",\n];\n\n// --- Forms & Inputs ---\nexport const FORM_TAGS = [\n \"form\",\n \"input\",\n \"textarea\",\n \"button\",\n \"label\",\n \"select\",\n \"option\",\n \"optgroup\",\n \"fieldset\",\n \"legend\",\n \"datalist\",\n \"output\",\n \"meter\",\n \"progress\",\n];\n\n// --- Media ---\nexport const MEDIA_TAGS = [\n \"img\",\n \"audio\",\n \"video\",\n \"source\",\n \"track\",\n \"picture\",\n \"iframe\",\n \"embed\",\n \"object\",\n \"map\",\n \"area\",\n \"canvas\",\n];\n\n// --- Interactive ---\nexport const INTERACTIVE_TAGS = [\n \"details\",\n \"summary\",\n \"dialog\",\n \"script\",\n \"noscript\",\n \"template\",\n];\n\n// --- Other / Inline semantics ---\nexport const MISC_TAGS = [\"ins\", \"del\", \"s\", \"bdi\", \"bdo\", \"ruby\", \"rt\", \"rp\"];\n","import {\n FORM_TAGS,\n INTERACTIVE_TAGS,\n LIST_TAGS,\n MEDIA_TAGS,\n METADATA_TAGS,\n MISC_TAGS,\n STRUCTURE_TAGS,\n TABLE_TAGS,\n TEXT_TAGS,\n} from \"../constants/tags\";\nimport { HtmlTagGroup } from \"../context/skeleton-config\";\n\nexport default function checkTagInGroup(\n tag: string,\n groups: HtmlTagGroup[]\n): boolean {\n return groups.some((group) => {\n switch (group) {\n case \"TEXT_TAGS\":\n return TEXT_TAGS.includes(tag);\n case \"STRUCTURE_TAGS\":\n return STRUCTURE_TAGS.includes(tag);\n case \"METADATA_TAGS\":\n return METADATA_TAGS.includes(tag);\n case \"LIST_TAGS\":\n return LIST_TAGS.includes(tag);\n case \"TABLE_TAGS\":\n return TABLE_TAGS.includes(tag);\n case \"FORM_TAGS\":\n return FORM_TAGS.includes(tag);\n case \"MEDIA_TAGS\":\n return MEDIA_TAGS.includes(tag);\n case \"INTERACTIVE_TAGS\":\n return INTERACTIVE_TAGS.includes(tag);\n case \"MISC_TAGS\":\n return MISC_TAGS.includes(tag);\n }\n });\n}\n","import { LIST_TAGS, TEXT_TAGS } from \"../constants/tags\";\n\nexport default (elementType: string) => {\n return TEXT_TAGS.includes(elementType) || LIST_TAGS.includes(elementType);\n};\n","import React, {\n createContext,\n CSSProperties,\n useContext,\n useMemo,\n} from \"react\";\nimport {\n SkeletonConfig,\n defaultBackground,\n defaultValues,\n} from \"./skeleton-config\";\n\nconst SkeletonContext = createContext<SkeletonConfig>(defaultValues);\ninterface SkeletonProviderProps {\n children: React.ReactNode;\n config?: Partial<SkeletonConfig>;\n style?: CSSProperties;\n}\n\nexport const SkeletonProvider: React.FC<SkeletonProviderProps> = (props) => {\n const { children, config, style } = props;\n const { animation = defaultValues.animation, background } = config || {};\n\n const value: SkeletonConfig = useMemo(\n () => ({\n ...defaultValues,\n ...config,\n background: background ? background : defaultBackground[animation],\n style: { ...defaultValues.style, ...config?.style, ...style },\n }),\n [animation, background, config, style]\n );\n\n return (\n <SkeletonContext.Provider value={value}>\n {children}\n </SkeletonContext.Provider>\n );\n};\n\nexport const useSkeleton = () => useContext(SkeletonContext);\n","import { CSSProperties } from \"react\";\n\nexport const HTML_TAG_GROUPS = [\n \"TEXT_TAGS\",\n \"STRUCTURE_TAGS\",\n \"METADATA_TAGS\",\n \"LIST_TAGS\",\n \"TABLE_TAGS\",\n \"FORM_TAGS\",\n \"MEDIA_TAGS\",\n \"INTERACTIVE_TAGS\",\n \"MISC_TAGS\",\n] as const;\n\nexport type HtmlTagGroup = (typeof HTML_TAG_GROUPS)[number];\n\nexport const defaultBackground = {\n \"animation-1\": \"#aeaeae\",\n \"animation-2\": \"#e5e5e5\",\n \"animation-3\": \"hsl(210, 20%, 90%)\",\n};\n\nexport type SkeletonConfig = {\n animationSpeed: number;\n background: string;\n border: string;\n borderRadius: string;\n textTagsMargin: string;\n className?: string;\n style?: CSSProperties;\n animation: \"animation-1\" | \"animation-2\";\n exceptTags: string[];\n exceptTagGroups: HtmlTagGroup[];\n};\n\nexport const defaultValues: SkeletonConfig = {\n animationSpeed: 3,\n background: \"#aeaeae\",\n border: \"none\",\n borderRadius: \"0\",\n textTagsMargin: \"0\",\n className: \"\",\n style: {},\n animation: \"animation-1\",\n exceptTags: [],\n exceptTagGroups: [],\n};\n"],"mappings":"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","names":["useMemo","React","React","React","React","React","jsx","useMemo"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/SkeletonElement.tsx","../src/hooks/useAddSkelton.ts","../src/utils/create-node-wrapper.ts","../src/utils/create-leaf-node.ts","../src/utils/create-style.ts","../src/constants/tags.ts","../src/utils/check-tag-in-group.ts","../src/components/SkeletonIgnore.tsx","../src/components/SkeletonKeep.tsx","../src/components/SkeletonUnite.tsx","../src/utils/check-element.ts","../src/utils/create-config.ts","../src/context/SkeletonContext.tsx","../src/context/skeleton-config.ts","../src/components/SkeletonWrapper.tsx","../src/components/SkeletonLeaf.tsx"],"sourcesContent":["import React from \"react\";\r\nimport useAddSkelton from \"../hooks/useAddSkelton\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\n\r\ninterface SkeletonElementProps {\r\n children: React.ReactNode;\r\n config: SkeletonConfig;\r\n}\r\n\r\nconst SkeletonElement: React.FC<SkeletonElementProps> = (props) => {\r\n const { children, config } = props;\r\n const addSkeleton = useAddSkelton(config);\r\n\r\n return React.Children.map(children, (child) => addSkeleton(child));\r\n};\r\n\r\nexport default SkeletonElement;\r\n","import React from \"react\";\r\nimport createNodeWrapper from \"../utils/create-node-wrapper\";\r\nimport createLeafNode from \"../utils/create-leaf-node\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\nimport createStyle from \"../utils/create-style\";\r\nimport checkTagInGroup from \"../utils/check-tag-in-group\";\r\nimport {\r\n isSkeletonIgnoreComponent,\r\n isSkeletonKeepComponent,\r\n isSkeletonUniteComponent,\r\n isTextElement,\r\n} from \"../utils/check-element\";\r\n\r\nfunction useAddSkelton(config: SkeletonConfig) {\r\n const { className, exceptTags, exceptTagGroups, textTagsMargin } = config;\r\n const CLASS_NAME = `react-skeletonify ${className} `;\r\n const style = createStyle(config);\r\n\r\n const addSkeleton = (node: React.ReactNode): React.ReactNode => {\r\n if (!React.isValidElement(node)) {\r\n return createNodeWrapper(node as any, CLASS_NAME, style);\r\n }\r\n\r\n const element = node as React.ReactElement<any>;\r\n const { children } = element.props;\r\n const elementType = element.type;\r\n\r\n if (isSkeletonKeepComponent(elementType)) return element;\r\n if (isSkeletonIgnoreComponent(elementType)) return null;\r\n if (isSkeletonUniteComponent(elementType)) {\r\n return createLeafNode(element, CLASS_NAME, style);\r\n }\r\n\r\n if (typeof elementType === \"string\") {\r\n if (exceptTags.includes(elementType)) return element;\r\n if (checkTagInGroup(elementType, exceptTagGroups)) return element;\r\n }\r\n\r\n const hasChildren = React.Children.count(children) > 0;\r\n const isValidChildren = typeof children !== \"string\";\r\n\r\n if (typeof elementType === \"function\") {\r\n const rendered = (elementType as any)(element.props);\r\n return addSkeleton(rendered);\r\n }\r\n\r\n if (isTextElement(elementType)) {\r\n return createLeafNode(element, CLASS_NAME, {\r\n ...style,\r\n margin: textTagsMargin,\r\n });\r\n }\r\n\r\n if (elementType === \"img\") {\r\n return createNodeWrapper(element, CLASS_NAME, style);\r\n }\r\n\r\n if (hasChildren && isValidChildren) {\r\n const childWithSkeletons = React.Children.map(children, addSkeleton);\r\n\r\n return React.cloneElement(element, {\r\n ...element.props,\r\n children: childWithSkeletons,\r\n } as typeof element.props);\r\n }\r\n\r\n return createLeafNode(element, CLASS_NAME, style);\r\n };\r\n\r\n return addSkeleton;\r\n}\r\n\r\nexport default useAddSkelton;\r\n","import React, { createElement, CSSProperties } from \"react\";\r\n\r\nexport default function createNodeWrapper(\r\n node: React.ReactElement<any>,\r\n className: string,\r\n style: CSSProperties\r\n) {\r\n if (!node) return null;\r\n\r\n return createElement(\r\n \"div\",\r\n {\r\n className: className + (node?.props?.className || \"\"),\r\n style: {\r\n ...style,\r\n ...node?.props?.style,\r\n },\r\n },\r\n node\r\n );\r\n}\r\n","import React, { CSSProperties } from \"react\";\r\n\r\nexport default function createLeafNode(\r\n node: React.ReactElement<any>,\r\n className: string,\r\n style: CSSProperties\r\n): React.ReactElement {\r\n return React.cloneElement(node, {\r\n ...node.props,\r\n className: className + (node.props.className || \"\"),\r\n style: {\r\n ...style,\r\n ...node.props.style,\r\n },\r\n } as typeof node.props);\r\n}\r\n","import { CSSProperties } from \"react\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\n\r\nconst getAnimation = (\r\n animation: string,\r\n animationSpeed: number,\r\n background: string\r\n) => {\r\n switch (animation) {\r\n case \"animation-1\":\r\n return {\r\n animation: `react-skeletonify-animation-1 ${animationSpeed}s ease-in-out infinite `,\r\n background: background,\r\n animationDelay: \"0.5s\",\r\n };\r\n case \"animation-2\":\r\n return {\r\n animation: `react-skeletonify-animation-2 ${animationSpeed}s infinite`,\r\n background: `linear-gradient(120deg, ${background} 30%, #f0f0f0 38%, #f0f0f0 40%, ${background} 48%)`,\r\n backgroundSize: \"200% 100%\",\r\n backgroundPosition: \"100% 0\",\r\n };\r\n case \"animation-3\":\r\n return {\r\n animation: `react-skeletonify-animation-3 ${animationSpeed}s linear infinite alternate`,\r\n backgroundColor: background,\r\n };\r\n }\r\n};\r\n\r\nexport default (config: SkeletonConfig) => {\r\n const { animationSpeed, background, border, borderRadius, animation, style } =\r\n config;\r\n\r\n const skeletonAnimation: CSSProperties = {\r\n ...getAnimation(animation, animationSpeed, background),\r\n border,\r\n borderRadius,\r\n ...style,\r\n };\r\n\r\n return skeletonAnimation;\r\n};\r\n","// --- Text & Content ---\r\nexport const TEXT_TAGS = [\r\n \"p\",\r\n \"span\",\r\n \"h1\",\r\n \"h2\",\r\n \"h3\",\r\n \"h4\",\r\n \"h5\",\r\n \"h6\",\r\n \"b\",\r\n \"strong\",\r\n \"i\",\r\n \"em\",\r\n \"u\",\r\n \"mark\",\r\n \"small\",\r\n \"sup\",\r\n \"sub\",\r\n \"abbr\",\r\n \"cite\",\r\n \"q\",\r\n \"blockquote\",\r\n \"code\",\r\n \"pre\",\r\n \"samp\",\r\n \"kbd\",\r\n \"var\",\r\n \"time\",\r\n \"br\",\r\n \"wbr\",\r\n];\r\n\r\n// --- Sectioning / Structure ---\r\nexport const STRUCTURE_TAGS = [\r\n \"html\",\r\n \"head\",\r\n \"body\",\r\n \"main\",\r\n \"header\",\r\n \"footer\",\r\n \"nav\",\r\n \"section\",\r\n \"article\",\r\n \"aside\",\r\n];\r\n\r\n// --- Metadata ---\r\nexport const METADATA_TAGS = [\"base\", \"link\", \"meta\", \"style\", \"title\"];\r\n\r\n// --- Lists ---\r\nexport const LIST_TAGS = [\"ul\", \"ol\", \"li\", \"dl\", \"dt\", \"dd\"];\r\n\r\n// --- Tables ---\r\nexport const TABLE_TAGS = [\r\n \"table\",\r\n \"caption\",\r\n \"thead\",\r\n \"tbody\",\r\n \"tfoot\",\r\n \"tr\",\r\n \"th\",\r\n \"td\",\r\n \"col\",\r\n \"colgroup\",\r\n];\r\n\r\n// --- Forms & Inputs ---\r\nexport const FORM_TAGS = [\r\n \"form\",\r\n \"input\",\r\n \"textarea\",\r\n \"button\",\r\n \"label\",\r\n \"select\",\r\n \"option\",\r\n \"optgroup\",\r\n \"fieldset\",\r\n \"legend\",\r\n \"datalist\",\r\n \"output\",\r\n \"meter\",\r\n \"progress\",\r\n];\r\n\r\n// --- Media ---\r\nexport const MEDIA_TAGS = [\r\n \"img\",\r\n \"audio\",\r\n \"video\",\r\n \"source\",\r\n \"track\",\r\n \"picture\",\r\n \"iframe\",\r\n \"embed\",\r\n \"object\",\r\n \"map\",\r\n \"area\",\r\n \"canvas\",\r\n];\r\n\r\n// --- Interactive ---\r\nexport const INTERACTIVE_TAGS = [\r\n \"details\",\r\n \"summary\",\r\n \"dialog\",\r\n \"script\",\r\n \"noscript\",\r\n \"template\",\r\n];\r\n\r\n// --- Other / Inline semantics ---\r\nexport const MISC_TAGS = [\"ins\", \"del\", \"s\", \"bdi\", \"bdo\", \"ruby\", \"rt\", \"rp\"];\r\n","import {\r\n FORM_TAGS,\r\n INTERACTIVE_TAGS,\r\n LIST_TAGS,\r\n MEDIA_TAGS,\r\n METADATA_TAGS,\r\n MISC_TAGS,\r\n STRUCTURE_TAGS,\r\n TABLE_TAGS,\r\n TEXT_TAGS,\r\n} from \"../constants/tags\";\r\nimport { HtmlTagGroup } from \"../context/skeleton-config\";\r\n\r\nexport default function checkTagInGroup(\r\n tag: string,\r\n groups: HtmlTagGroup[]\r\n): boolean {\r\n return groups.some((group) => {\r\n switch (group) {\r\n case \"TEXT_TAGS\":\r\n return TEXT_TAGS.includes(tag);\r\n case \"STRUCTURE_TAGS\":\r\n return STRUCTURE_TAGS.includes(tag);\r\n case \"METADATA_TAGS\":\r\n return METADATA_TAGS.includes(tag);\r\n case \"LIST_TAGS\":\r\n return LIST_TAGS.includes(tag);\r\n case \"TABLE_TAGS\":\r\n return TABLE_TAGS.includes(tag);\r\n case \"FORM_TAGS\":\r\n return FORM_TAGS.includes(tag);\r\n case \"MEDIA_TAGS\":\r\n return MEDIA_TAGS.includes(tag);\r\n case \"INTERACTIVE_TAGS\":\r\n return INTERACTIVE_TAGS.includes(tag);\r\n case \"MISC_TAGS\":\r\n return MISC_TAGS.includes(tag);\r\n }\r\n });\r\n}\r\n","import React from \"react\";\r\n\r\ninterface SkeletonIgnoreProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nconst SkeletonIgnore: React.FC<SkeletonIgnoreProps> = ({ children }) => {\r\n return <>{children}</>;\r\n};\r\n\r\nexport default SkeletonIgnore;\r\n","import React from \"react\";\r\n\r\ninterface SkeletonKeepProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nconst SkeletonKeep: React.FC<SkeletonKeepProps> = ({ children }) => {\r\n return <>{children}</>;\r\n};\r\n\r\nexport default SkeletonKeep;\r\n","import React from \"react\";\r\n\r\ninterface SkeletonUniteProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst SkeletonUnite: React.FC<SkeletonUniteProps> = (props) => {\r\n const { children, className, style } = props;\r\n\r\n if (className && className.includes(\"react-skeletonify\")) {\r\n return (\r\n <div className={className} style={style}>\r\n <div style={{ opacity: 0 }}>{children}</div>\r\n </div>\r\n );\r\n }\r\n\r\n return children;\r\n};\r\n\r\nexport default SkeletonUnite;\r\n","import React from \"react\";\r\nimport { LIST_TAGS, TEXT_TAGS } from \"../constants/tags\";\r\n\r\nimport SkeletonIgnore from \"../components/SkeletonIgnore\";\r\nimport SkeletonKeep from \"../components/SkeletonKeep\";\r\nimport SkeletonUnite from \"../components/SkeletonUnite\";\r\n\r\nexport const isTextElement = (elementType: string): boolean => {\r\n return TEXT_TAGS.includes(elementType) || LIST_TAGS.includes(elementType);\r\n};\r\n\r\nexport const isSkeletonIgnoreComponent = (\r\n element: React.ComponentType<any> | string\r\n): boolean => element === SkeletonIgnore;\r\n\r\nexport const isSkeletonKeepComponent = (\r\n element: React.ComponentType<any> | string\r\n): boolean => element === SkeletonKeep;\r\n\r\nexport const isSkeletonUniteComponent = (\r\n element: React.ComponentType<any> | string\r\n): boolean => element === SkeletonUnite;\r\n","import { CSSProperties, useMemo } from \"react\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\nimport { useSkeleton } from \"../context/SkeletonContext\";\r\n\r\nexport default (\r\n overrideConfig?: Partial<SkeletonConfig>,\r\n style?: CSSProperties\r\n) => {\r\n const mainConfig = useSkeleton();\r\n\r\n const config: SkeletonConfig = useMemo(\r\n () => ({\r\n ...mainConfig,\r\n ...overrideConfig,\r\n style: { ...mainConfig.style, ...overrideConfig?.style, ...style },\r\n }),\r\n [overrideConfig, mainConfig]\r\n );\r\n\r\n return config;\r\n};\r\n","import React, {\r\n createContext,\r\n CSSProperties,\r\n useContext,\r\n useMemo,\r\n} from \"react\";\r\nimport {\r\n SkeletonConfig,\r\n defaultBackground,\r\n defaultValues,\r\n} from \"./skeleton-config\";\r\n\r\nconst SkeletonContext = createContext<SkeletonConfig>(defaultValues);\r\ninterface SkeletonProviderProps {\r\n children: React.ReactNode;\r\n config?: Partial<SkeletonConfig>;\r\n style?: CSSProperties;\r\n}\r\n\r\nexport const SkeletonProvider: React.FC<SkeletonProviderProps> = (props) => {\r\n const { children, config, style } = props;\r\n const { animation = defaultValues.animation, background } = config || {};\r\n\r\n const value: SkeletonConfig = useMemo(\r\n () => ({\r\n ...defaultValues,\r\n ...config,\r\n background: background ? background : defaultBackground[animation],\r\n style: { ...defaultValues.style, ...config?.style, ...style },\r\n }),\r\n [animation, background, config, style]\r\n );\r\n\r\n return (\r\n <SkeletonContext.Provider value={value}>\r\n {children}\r\n </SkeletonContext.Provider>\r\n );\r\n};\r\n\r\nexport const useSkeleton = () => useContext(SkeletonContext);\r\n","import { CSSProperties } from \"react\";\r\n\r\nexport const HTML_TAG_GROUPS = [\r\n \"TEXT_TAGS\",\r\n \"STRUCTURE_TAGS\",\r\n \"METADATA_TAGS\",\r\n \"LIST_TAGS\",\r\n \"TABLE_TAGS\",\r\n \"FORM_TAGS\",\r\n \"MEDIA_TAGS\",\r\n \"INTERACTIVE_TAGS\",\r\n \"MISC_TAGS\",\r\n] as const;\r\n\r\nexport type HtmlTagGroup = (typeof HTML_TAG_GROUPS)[number];\r\n\r\nexport const defaultBackground = {\r\n \"animation-1\": \"#aeaeae\",\r\n \"animation-2\": \"#e5e5e5\",\r\n \"animation-3\": \"hsl(210, 20%, 90%)\",\r\n};\r\n\r\nexport type SkeletonConfig = {\r\n animationSpeed: number;\r\n background: string;\r\n border: string;\r\n borderRadius: string;\r\n textTagsMargin: string;\r\n className?: string;\r\n style?: CSSProperties;\r\n animation: \"animation-1\" | \"animation-2\";\r\n exceptTags: string[];\r\n exceptTagGroups: HtmlTagGroup[];\r\n};\r\n\r\nexport const defaultValues: SkeletonConfig = {\r\n animationSpeed: 3,\r\n background: \"#aeaeae\",\r\n border: \"none\",\r\n borderRadius: \"0\",\r\n textTagsMargin: \"0\",\r\n className: \"\",\r\n style: {},\r\n animation: \"animation-1\",\r\n exceptTags: [],\r\n exceptTagGroups: [],\r\n};\r\n","import React, { CSSProperties } from \"react\";\r\nimport SkeletonElement from \"./SkeletonElement\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\nimport createConfig from \"../utils/create-config\";\r\n\r\ninterface SkeletonWrapperProps {\r\n loading: boolean;\r\n children: React.ReactNode;\r\n overrideConfig?: Partial<SkeletonConfig>;\r\n style?: CSSProperties;\r\n}\r\n\r\nconst SkeletonWrapper: React.FC<SkeletonWrapperProps> = (props) => {\r\n const { loading, children, overrideConfig, style } = props;\r\n const config = createConfig(overrideConfig, style);\r\n\r\n if (loading) {\r\n return <SkeletonElement config={config}>{children}</SkeletonElement>;\r\n }\r\n return children;\r\n};\r\n\r\nexport default SkeletonWrapper;\r\n","import React, { CSSProperties } from \"react\";\r\nimport { SkeletonConfig } from \"../context/skeleton-config\";\r\nimport createStyle from \"../utils/create-style\";\r\nimport createConfig from \"../utils/create-config\";\r\n\r\nexport interface SkeletonLeafProps {\r\n loading: boolean;\r\n children: React.ReactNode;\r\n overrideConfig?: Partial<SkeletonConfig>;\r\n style?: CSSProperties;\r\n}\r\n\r\nconst SkeletonLeaf: React.FC<SkeletonLeafProps> = (props) => {\r\n const { loading, children, overrideConfig, style } = props;\r\n const config = createConfig(overrideConfig, style);\r\n\r\n const skeletonStyle = createStyle(config);\r\n const className = `react-skeletonify ${config.className || \"\"}`;\r\n\r\n if (loading) {\r\n return (\r\n <div className={className} style={skeletonStyle}>\r\n <div style={{ opacity: 0 }}>{children}</div>\r\n </div>\r\n );\r\n }\r\n\r\n return children;\r\n};\r\n\r\nexport default SkeletonLeaf;\r\n"],"mappings":"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","names":["React","React","React","Fragment","jsx","jsx","React","React","useMemo","jsx","useMemo","jsx","jsx"]}
|
package/package.json
CHANGED
|
@@ -1,50 +1,51 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "react-skeletonify",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"main": "dist/index.js",
|
|
5
|
-
"module": "dist/index.mjs",
|
|
6
|
-
"types": "dist/index.d.ts",
|
|
7
|
-
"files": [
|
|
8
|
-
"dist"
|
|
9
|
-
],
|
|
10
|
-
"scripts": {
|
|
11
|
-
"clean": "
|
|
12
|
-
"build": "tsup",
|
|
13
|
-
"prepublishOnly": "npm run clean && npm run build"
|
|
14
|
-
},
|
|
15
|
-
"keywords": [
|
|
16
|
-
"react",
|
|
17
|
-
"skeleton",
|
|
18
|
-
"skeleton loader",
|
|
19
|
-
"loading state",
|
|
20
|
-
"placeholder",
|
|
21
|
-
"react component",
|
|
22
|
-
"react ui",
|
|
23
|
-
"react skeleton loader",
|
|
24
|
-
"react shimmer"
|
|
25
|
-
],
|
|
26
|
-
"author": "Sinan sinan.m.p333@gmail.com",
|
|
27
|
-
"license": "MIT",
|
|
28
|
-
"description": "A lightweight React package to add smart skeleton loaders to any component",
|
|
29
|
-
"repository": {
|
|
30
|
-
"type": "git",
|
|
31
|
-
"url": "https://github.com/Sinan0333/react-skeletonify"
|
|
32
|
-
},
|
|
33
|
-
"homepage": "https://react-skeletonify.sinan-dev.in",
|
|
34
|
-
"bugs": {
|
|
35
|
-
"url": "https://github.com/Sinan0333/react-skeletonify/issues"
|
|
36
|
-
},
|
|
37
|
-
"peerDependencies": {
|
|
38
|
-
"react": ">=18.0.0",
|
|
39
|
-
"react-dom": ">=18.0.0"
|
|
40
|
-
},
|
|
41
|
-
"devDependencies": {
|
|
42
|
-
"@types/react": "^19.1.12",
|
|
43
|
-
"@types/react-dom": "^19.1.8",
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "react-skeletonify",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"module": "dist/index.mjs",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"clean": "rimraf dist",
|
|
12
|
+
"build": "tsup",
|
|
13
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"react",
|
|
17
|
+
"skeleton",
|
|
18
|
+
"skeleton loader",
|
|
19
|
+
"loading state",
|
|
20
|
+
"placeholder",
|
|
21
|
+
"react component",
|
|
22
|
+
"react ui",
|
|
23
|
+
"react skeleton loader",
|
|
24
|
+
"react shimmer"
|
|
25
|
+
],
|
|
26
|
+
"author": "Sinan sinan.m.p333@gmail.com",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"description": "A lightweight React package to add smart skeleton loaders to any component",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/Sinan0333/react-skeletonify"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://react-skeletonify.sinan-dev.in",
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/Sinan0333/react-skeletonify/issues"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"react": ">=18.0.0",
|
|
39
|
+
"react-dom": ">=18.0.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/react": "^19.1.12",
|
|
43
|
+
"@types/react-dom": "^19.1.8",
|
|
44
|
+
"react": "^19.1.1",
|
|
45
|
+
"react-dom": "^19.1.1",
|
|
46
|
+
"rimraf": "^6.1.2",
|
|
47
|
+
"tsup": "^8.5.0",
|
|
48
|
+
"typescript": "^5.9.2",
|
|
49
|
+
"vite": "^7.1.3"
|
|
50
|
+
}
|
|
51
|
+
}
|