@johnfmorton/some-shade 0.1.0-beta.1 → 0.1.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +234 -0
- package/package.json +3 -2
package/README.md
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Some Shade
|
|
2
|
+
|
|
3
|
+
WebGL image effects as a web component. Drop `<some-shade-image>` into any page to apply shader-based visual effects to images.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @johnfmorton/some-shade
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`lit` is a dependency and will be installed automatically.
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<script type="module">
|
|
17
|
+
import '@johnfmorton/some-shade';
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<some-shade-image
|
|
21
|
+
src="photo.jpg"
|
|
22
|
+
effect="halftone-cmyk"
|
|
23
|
+
dot-radius="4"
|
|
24
|
+
grid-size="8"
|
|
25
|
+
></some-shade-image>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Effects
|
|
29
|
+
|
|
30
|
+
### CMYK Halftone
|
|
31
|
+
|
|
32
|
+
Simulates a CMYK halftone print screen with per-channel angle control.
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<some-shade-image
|
|
36
|
+
src="photo.jpg"
|
|
37
|
+
effect="halftone-cmyk"
|
|
38
|
+
dot-radius="4"
|
|
39
|
+
grid-size="8"
|
|
40
|
+
angle-c="15"
|
|
41
|
+
angle-m="75"
|
|
42
|
+
angle-y="0"
|
|
43
|
+
angle-k="45"
|
|
44
|
+
></some-shade-image>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Duotone Halftone
|
|
48
|
+
|
|
49
|
+
Halftone effect using a single custom color.
|
|
50
|
+
|
|
51
|
+
```html
|
|
52
|
+
<some-shade-image
|
|
53
|
+
src="photo.jpg"
|
|
54
|
+
effect="halftone-duotone"
|
|
55
|
+
dot-radius="4"
|
|
56
|
+
grid-size="8"
|
|
57
|
+
duotone-color="#0099cc"
|
|
58
|
+
angle="0"
|
|
59
|
+
></some-shade-image>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Pixel Sort
|
|
63
|
+
|
|
64
|
+
Sorts pixels by luminance along a configurable direction.
|
|
65
|
+
|
|
66
|
+
```html
|
|
67
|
+
<some-shade-image
|
|
68
|
+
src="photo.jpg"
|
|
69
|
+
effect="pixel-sort"
|
|
70
|
+
threshold="0.5"
|
|
71
|
+
sort-direction="0"
|
|
72
|
+
sort-span="64"
|
|
73
|
+
></some-shade-image>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Dot Grid
|
|
77
|
+
|
|
78
|
+
Renders the image as a grid of dots with a customizable background.
|
|
79
|
+
|
|
80
|
+
```html
|
|
81
|
+
<some-shade-image
|
|
82
|
+
src="photo.jpg"
|
|
83
|
+
effect="dot-grid"
|
|
84
|
+
dot-radius="4"
|
|
85
|
+
grid-size="8"
|
|
86
|
+
dot-offset-x="0.5"
|
|
87
|
+
dot-offset-y="0.5"
|
|
88
|
+
bg-color="#ffffff"
|
|
89
|
+
></some-shade-image>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Attributes Reference
|
|
93
|
+
|
|
94
|
+
| Attribute | Type | Default | Effects |
|
|
95
|
+
|-----------|------|---------|---------|
|
|
96
|
+
| `src` | string | `""` | all |
|
|
97
|
+
| `effect` | string | `"halftone-cmyk"` | all |
|
|
98
|
+
| `dot-radius` | number | `4` | halftone-cmyk, halftone-duotone, dot-grid |
|
|
99
|
+
| `grid-size` | number | `8` | halftone-cmyk, halftone-duotone, dot-grid |
|
|
100
|
+
| `angle-c` | number | `15` | halftone-cmyk |
|
|
101
|
+
| `angle-m` | number | `75` | halftone-cmyk |
|
|
102
|
+
| `angle-y` | number | `0` | halftone-cmyk |
|
|
103
|
+
| `angle-k` | number | `45` | halftone-cmyk |
|
|
104
|
+
| `duotone-color` | string (hex) | `"#0099cc"` | halftone-duotone |
|
|
105
|
+
| `angle` | number | `0` | halftone-duotone |
|
|
106
|
+
| `threshold` | number | `0.5` | pixel-sort |
|
|
107
|
+
| `sort-direction` | number | `0` | pixel-sort |
|
|
108
|
+
| `sort-span` | number | `64` | pixel-sort |
|
|
109
|
+
| `dot-offset-x` | number | `0.5` | dot-grid |
|
|
110
|
+
| `dot-offset-y` | number | `0.5` | dot-grid |
|
|
111
|
+
| `bg-color` | string (hex) | `"#ffffff"` | dot-grid |
|
|
112
|
+
|
|
113
|
+
## Framework Usage
|
|
114
|
+
|
|
115
|
+
The component works in any framework. Import `@johnfmorton/some-shade` once to register the custom element, then use `<some-shade-image>` in your templates.
|
|
116
|
+
|
|
117
|
+
### React
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
import '@johnfmorton/some-shade';
|
|
121
|
+
|
|
122
|
+
declare global {
|
|
123
|
+
namespace JSX {
|
|
124
|
+
interface IntrinsicElements {
|
|
125
|
+
'some-shade-image': React.DetailedHTMLProps<
|
|
126
|
+
React.HTMLAttributes<HTMLElement> & {
|
|
127
|
+
src?: string;
|
|
128
|
+
effect?: string;
|
|
129
|
+
'dot-radius'?: number;
|
|
130
|
+
'grid-size'?: number;
|
|
131
|
+
},
|
|
132
|
+
HTMLElement
|
|
133
|
+
>;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function App() {
|
|
139
|
+
return (
|
|
140
|
+
<some-shade-image
|
|
141
|
+
src="photo.jpg"
|
|
142
|
+
effect="halftone-cmyk"
|
|
143
|
+
dot-radius={4}
|
|
144
|
+
grid-size={8}
|
|
145
|
+
/>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Custom Effects
|
|
151
|
+
|
|
152
|
+
Register your own shader effects using the `register()` API:
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
import { register } from '@johnfmorton/some-shade';
|
|
156
|
+
|
|
157
|
+
register({
|
|
158
|
+
name: 'my-effect',
|
|
159
|
+
vertexShader: `
|
|
160
|
+
attribute vec2 a_position;
|
|
161
|
+
attribute vec2 a_texCoord;
|
|
162
|
+
varying vec2 v_texCoord;
|
|
163
|
+
void main() {
|
|
164
|
+
gl_Position = vec4(a_position, 0.0, 1.0);
|
|
165
|
+
v_texCoord = a_texCoord;
|
|
166
|
+
}
|
|
167
|
+
`,
|
|
168
|
+
fragmentShader: `
|
|
169
|
+
precision mediump float;
|
|
170
|
+
uniform sampler2D u_image;
|
|
171
|
+
varying vec2 v_texCoord;
|
|
172
|
+
uniform float u_intensity;
|
|
173
|
+
void main() {
|
|
174
|
+
gl_FragColor = texture2D(u_image, v_texCoord) * u_intensity;
|
|
175
|
+
}
|
|
176
|
+
`,
|
|
177
|
+
uniforms: [
|
|
178
|
+
{ name: 'u_intensity', type: 'float', default: 1.0, attribute: 'intensity' },
|
|
179
|
+
],
|
|
180
|
+
});
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Then use it:
|
|
184
|
+
|
|
185
|
+
```html
|
|
186
|
+
<some-shade-image src="photo.jpg" effect="my-effect" intensity="0.8"></some-shade-image>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### `EffectDefinition`
|
|
190
|
+
|
|
191
|
+
```ts
|
|
192
|
+
interface EffectDefinition {
|
|
193
|
+
name: string;
|
|
194
|
+
fragmentShader: string;
|
|
195
|
+
vertexShader: string;
|
|
196
|
+
uniforms: UniformDefinition[];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
interface UniformDefinition {
|
|
200
|
+
name: string;
|
|
201
|
+
type: 'float' | 'vec2' | 'vec3' | 'vec4';
|
|
202
|
+
default: number | number[];
|
|
203
|
+
attribute?: string;
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Programmatic API
|
|
208
|
+
|
|
209
|
+
```ts
|
|
210
|
+
import { register, get, list, SomeShadeImage } from '@johnfmorton/some-shade';
|
|
211
|
+
|
|
212
|
+
register(effectDef); // Register a custom effect
|
|
213
|
+
get('halftone-cmyk'); // Get an effect definition by name
|
|
214
|
+
list(); // List all registered effect names
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
`SomeShadeImage` is the Lit component class, exported for subclassing or direct use.
|
|
218
|
+
|
|
219
|
+
## Browser Support
|
|
220
|
+
|
|
221
|
+
Requires WebGL. If WebGL is unavailable, the component falls back to a plain `<img>` element.
|
|
222
|
+
|
|
223
|
+
## Development
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
pnpm install
|
|
227
|
+
pnpm dev # Watch mode (component + playground)
|
|
228
|
+
pnpm build # Build everything
|
|
229
|
+
pnpm build:component # Build web component only
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## License
|
|
233
|
+
|
|
234
|
+
ISC
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@johnfmorton/some-shade",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/some-shade.cjs.js",
|
|
6
6
|
"module": "./dist/some-shade.es.js",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"files": [
|
|
16
|
-
"dist"
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
17
18
|
],
|
|
18
19
|
"dependencies": {
|
|
19
20
|
"lit": "^3.2.0"
|