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 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
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
@@ -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/utils/is-text-element.ts
238
- var is_text_element_default = (elementType) => {
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
- return element;
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
- const isTextTag = is_text_element_default(elementType);
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 import_jsx_runtime = require("react/jsx-runtime");
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, import_jsx_runtime.jsx)(SkeletonContext.Provider, { value, children });
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/components/SkeletonWrapper.tsx
342
- var import_jsx_runtime2 = require("react/jsx-runtime");
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, import_jsx_runtime2.jsx)(SkeletonElement_default, { config, children });
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/utils/is-text-element.ts
200
- var is_text_element_default = (elementType) => {
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
- return element;
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
- const isTextTag = is_text_element_default(elementType);
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__ */ jsx(SkeletonContext.Provider, { value, children });
330
+ return /* @__PURE__ */ jsx4(SkeletonContext.Provider, { value, children });
304
331
  };
305
332
  var useSkeleton = () => useContext(SkeletonContext);
306
333
 
307
- // src/components/SkeletonWrapper.tsx
308
- import { jsx as jsx2 } from "react/jsx-runtime";
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__ */ jsx2(SkeletonElement_default, { config, children });
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
  };
@@ -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.1.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": "rm -rf 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
- "tsup": "^8.5.0",
45
- "typescript": "^5.9.2",
46
- "vite": "^7.1.3",
47
- "react": "^19.1.1",
48
- "react-dom": "^19.1.1"
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
+ }