@sc4rfurryx/proteusjs 1.0.0 → 1.1.1
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 +1 -1
- package/README.md +331 -77
- package/dist/.tsbuildinfo +1 -1
- package/dist/adapters/react.d.ts +140 -0
- package/dist/adapters/react.esm.js +849 -0
- package/dist/adapters/react.esm.js.map +1 -0
- package/dist/adapters/svelte.d.ts +181 -0
- package/dist/adapters/svelte.esm.js +909 -0
- package/dist/adapters/svelte.esm.js.map +1 -0
- package/dist/adapters/vue.d.ts +205 -0
- package/dist/adapters/vue.esm.js +873 -0
- package/dist/adapters/vue.esm.js.map +1 -0
- package/dist/modules/a11y-audit.d.ts +31 -0
- package/dist/modules/a11y-audit.esm.js +64 -0
- package/dist/modules/a11y-audit.esm.js.map +1 -0
- package/dist/modules/a11y-primitives.d.ts +36 -0
- package/dist/modules/a11y-primitives.esm.js +114 -0
- package/dist/modules/a11y-primitives.esm.js.map +1 -0
- package/dist/modules/anchor.d.ts +30 -0
- package/dist/modules/anchor.esm.js +219 -0
- package/dist/modules/anchor.esm.js.map +1 -0
- package/dist/modules/container.d.ts +60 -0
- package/dist/modules/container.esm.js +194 -0
- package/dist/modules/container.esm.js.map +1 -0
- package/dist/modules/perf.d.ts +82 -0
- package/dist/modules/perf.esm.js +257 -0
- package/dist/modules/perf.esm.js.map +1 -0
- package/dist/modules/popover.d.ts +33 -0
- package/dist/modules/popover.esm.js +191 -0
- package/dist/modules/popover.esm.js.map +1 -0
- package/dist/modules/scroll.d.ts +43 -0
- package/dist/modules/scroll.esm.js +195 -0
- package/dist/modules/scroll.esm.js.map +1 -0
- package/dist/modules/transitions.d.ts +35 -0
- package/dist/modules/transitions.esm.js +120 -0
- package/dist/modules/transitions.esm.js.map +1 -0
- package/dist/modules/typography.d.ts +72 -0
- package/dist/modules/typography.esm.js +168 -0
- package/dist/modules/typography.esm.js.map +1 -0
- package/dist/proteus.cjs.js +1554 -12
- package/dist/proteus.cjs.js.map +1 -1
- package/dist/proteus.d.ts +516 -12
- package/dist/proteus.esm.js +1545 -12
- package/dist/proteus.esm.js.map +1 -1
- package/dist/proteus.esm.min.js +3 -3
- package/dist/proteus.esm.min.js.map +1 -1
- package/dist/proteus.js +1554 -12
- package/dist/proteus.js.map +1 -1
- package/dist/proteus.min.js +3 -3
- package/dist/proteus.min.js.map +1 -1
- package/package.json +69 -7
- package/src/adapters/react.ts +264 -0
- package/src/adapters/svelte.ts +321 -0
- package/src/adapters/vue.ts +268 -0
- package/src/index.ts +33 -6
- package/src/modules/a11y-audit/index.ts +84 -0
- package/src/modules/a11y-primitives/index.ts +152 -0
- package/src/modules/anchor/index.ts +259 -0
- package/src/modules/container/index.ts +230 -0
- package/src/modules/perf/index.ts +291 -0
- package/src/modules/popover/index.ts +238 -0
- package/src/modules/scroll/index.ts +251 -0
- package/src/modules/transitions/index.ts +145 -0
- package/src/modules/typography/index.ts +239 -0
- package/src/utils/version.ts +1 -1
@@ -0,0 +1,168 @@
|
|
1
|
+
/*!
|
2
|
+
* ProteusJS v1.1.1
|
3
|
+
* Shape-shifting responsive design that adapts like the sea god himself
|
4
|
+
* (c) 2025 sc4rfurry
|
5
|
+
* Released under the MIT License
|
6
|
+
*/
|
7
|
+
/**
|
8
|
+
* @sc4rfurryx/proteusjs/typography
|
9
|
+
* Fluid typography with CSS-first approach
|
10
|
+
*
|
11
|
+
* @version 1.1.0
|
12
|
+
* @author sc4rfurry
|
13
|
+
* @license MIT
|
14
|
+
*/
|
15
|
+
/**
|
16
|
+
* Generate pure-CSS clamp() rules for fluid typography
|
17
|
+
*/
|
18
|
+
function fluidType(minRem, maxRem, options = {}) {
|
19
|
+
const { minViewportPx = 320, maxViewportPx = 1200, lineHeight, containerUnits = false } = options;
|
20
|
+
// Convert rem to px for calculations (assuming 16px base)
|
21
|
+
const minPx = minRem * 16;
|
22
|
+
const maxPx = maxRem * 16;
|
23
|
+
// Calculate slope and y-intercept for linear interpolation
|
24
|
+
const slope = (maxPx - minPx) / (maxViewportPx - minViewportPx);
|
25
|
+
const yIntercept = minPx - slope * minViewportPx;
|
26
|
+
// Generate clamp() function
|
27
|
+
const viewportUnit = containerUnits ? 'cqw' : 'vw';
|
28
|
+
const clampValue = `clamp(${minRem}rem, ${yIntercept / 16}rem + ${slope * 100}${viewportUnit}, ${maxRem}rem)`;
|
29
|
+
let css = `font-size: ${clampValue};`;
|
30
|
+
// Add line-height if specified
|
31
|
+
if (lineHeight) {
|
32
|
+
css += `\nline-height: ${lineHeight};`;
|
33
|
+
}
|
34
|
+
return { css };
|
35
|
+
}
|
36
|
+
/**
|
37
|
+
* Apply fluid typography to elements
|
38
|
+
*/
|
39
|
+
function applyFluidType(selector, minRem, maxRem, options = {}) {
|
40
|
+
const { css } = fluidType(minRem, maxRem, options);
|
41
|
+
const styleElement = document.createElement('style');
|
42
|
+
styleElement.textContent = `${selector} {\n ${css.replace(/\n/g, '\n ')}\n}`;
|
43
|
+
styleElement.setAttribute('data-proteus-typography', selector);
|
44
|
+
document.head.appendChild(styleElement);
|
45
|
+
}
|
46
|
+
/**
|
47
|
+
* Create a complete typographic scale
|
48
|
+
*/
|
49
|
+
function createTypographicScale(baseSize = 1, ratio = 1.25, steps = 6, options = {}) {
|
50
|
+
const scale = {};
|
51
|
+
for (let i = -2; i <= steps - 3; i++) {
|
52
|
+
const size = baseSize * Math.pow(ratio, i);
|
53
|
+
const minSize = size * 0.8; // 20% smaller at min viewport
|
54
|
+
const maxSize = size * 1.2; // 20% larger at max viewport
|
55
|
+
const stepName = i <= 0 ? `small${Math.abs(i)}` : `large${i}`;
|
56
|
+
scale[stepName] = fluidType(minSize, maxSize, options);
|
57
|
+
}
|
58
|
+
return scale;
|
59
|
+
}
|
60
|
+
/**
|
61
|
+
* Generate CSS custom properties for a typographic scale
|
62
|
+
*/
|
63
|
+
function generateScaleCSS(scale, prefix = '--font-size') {
|
64
|
+
const cssVars = Object.entries(scale)
|
65
|
+
.map(([name, result]) => ` ${prefix}-${name}: ${result.css.replace('font-size: ', '').replace(';', '')};`)
|
66
|
+
.join('\n');
|
67
|
+
return `:root {\n${cssVars}\n}`;
|
68
|
+
}
|
69
|
+
/**
|
70
|
+
* Optimize line height for readability
|
71
|
+
*/
|
72
|
+
function optimizeLineHeight(fontSize, measure = 65) {
|
73
|
+
// Optimal line height based on font size and measure (characters per line)
|
74
|
+
// Smaller fonts need more line height, larger fonts need less
|
75
|
+
const baseLineHeight = 1.4;
|
76
|
+
const sizeAdjustment = Math.max(0.1, Math.min(0.3, (1 - fontSize) * 0.5));
|
77
|
+
const measureAdjustment = Math.max(-0.1, Math.min(0.1, (65 - measure) * 0.002));
|
78
|
+
return baseLineHeight + sizeAdjustment + measureAdjustment;
|
79
|
+
}
|
80
|
+
/**
|
81
|
+
* Calculate optimal font size for container width
|
82
|
+
*/
|
83
|
+
function calculateOptimalSize(containerWidth, targetCharacters = 65, baseCharWidth = 0.5) {
|
84
|
+
// Calculate font size to achieve target characters per line
|
85
|
+
const optimalFontSize = containerWidth / (targetCharacters * baseCharWidth);
|
86
|
+
// Clamp to reasonable bounds (12px to 24px)
|
87
|
+
return Math.max(0.75, Math.min(1.5, optimalFontSize));
|
88
|
+
}
|
89
|
+
/**
|
90
|
+
* Apply responsive typography to an element
|
91
|
+
*/
|
92
|
+
function makeResponsive(target, options = {}) {
|
93
|
+
const targetEl = typeof target === 'string' ? document.querySelector(target) : target;
|
94
|
+
if (!targetEl) {
|
95
|
+
throw new Error('Target element not found');
|
96
|
+
}
|
97
|
+
const { minSize = 0.875, maxSize = 1.25, targetCharacters = 65, autoLineHeight = true } = options;
|
98
|
+
// Apply fluid typography
|
99
|
+
const { css } = fluidType(minSize, maxSize);
|
100
|
+
const element = targetEl;
|
101
|
+
// Parse and apply CSS
|
102
|
+
const styles = css.split(';').filter(Boolean);
|
103
|
+
styles.forEach(style => {
|
104
|
+
const [property, value] = style.split(':').map(s => s.trim());
|
105
|
+
if (property && value) {
|
106
|
+
element.style.setProperty(property, value);
|
107
|
+
}
|
108
|
+
});
|
109
|
+
// Auto line height if enabled
|
110
|
+
if (autoLineHeight) {
|
111
|
+
const updateLineHeight = () => {
|
112
|
+
const computedStyle = getComputedStyle(element);
|
113
|
+
const fontSize = parseFloat(computedStyle.fontSize);
|
114
|
+
const containerWidth = element.getBoundingClientRect().width;
|
115
|
+
const charactersPerLine = containerWidth / (fontSize * 0.5);
|
116
|
+
const optimalLineHeight = optimizeLineHeight(fontSize / 16, charactersPerLine);
|
117
|
+
element.style.lineHeight = optimalLineHeight.toString();
|
118
|
+
};
|
119
|
+
updateLineHeight();
|
120
|
+
// Update on resize
|
121
|
+
if ('ResizeObserver' in window) {
|
122
|
+
const resizeObserver = new ResizeObserver(updateLineHeight);
|
123
|
+
resizeObserver.observe(element);
|
124
|
+
// Store cleanup function
|
125
|
+
element._proteusTypographyCleanup = () => {
|
126
|
+
resizeObserver.disconnect();
|
127
|
+
};
|
128
|
+
}
|
129
|
+
}
|
130
|
+
}
|
131
|
+
/**
|
132
|
+
* Remove applied typography styles
|
133
|
+
*/
|
134
|
+
function cleanup(target) {
|
135
|
+
if (target) {
|
136
|
+
const targetEl = typeof target === 'string' ? document.querySelector(target) : target;
|
137
|
+
if (targetEl && targetEl._proteusTypographyCleanup) {
|
138
|
+
targetEl._proteusTypographyCleanup();
|
139
|
+
delete targetEl._proteusTypographyCleanup;
|
140
|
+
}
|
141
|
+
}
|
142
|
+
else {
|
143
|
+
// Remove all typography style elements
|
144
|
+
const styleElements = document.querySelectorAll('style[data-proteus-typography]');
|
145
|
+
styleElements.forEach(element => element.remove());
|
146
|
+
}
|
147
|
+
}
|
148
|
+
/**
|
149
|
+
* Check if container query units are supported
|
150
|
+
*/
|
151
|
+
function supportsContainerUnits() {
|
152
|
+
return CSS.supports('width', '1cqw');
|
153
|
+
}
|
154
|
+
// Export default object for convenience
|
155
|
+
var index = {
|
156
|
+
fluidType,
|
157
|
+
applyFluidType,
|
158
|
+
createTypographicScale,
|
159
|
+
generateScaleCSS,
|
160
|
+
optimizeLineHeight,
|
161
|
+
calculateOptimalSize,
|
162
|
+
makeResponsive,
|
163
|
+
cleanup,
|
164
|
+
supportsContainerUnits
|
165
|
+
};
|
166
|
+
|
167
|
+
export { applyFluidType, calculateOptimalSize, cleanup, createTypographicScale, index as default, fluidType, generateScaleCSS, makeResponsive, optimizeLineHeight, supportsContainerUnits };
|
168
|
+
//# sourceMappingURL=typography.esm.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"typography.esm.js","sources":["../../src/modules/typography/index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|