@idlapps/t 0.1.1 → 0.1.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 +247 -23
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -41
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -41
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @idlapps/t
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Parse HTML strings into DOM elements with shorthand CSS utilities.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -8,48 +8,272 @@ Lightweight, tree-shakable string utility functions.
|
|
|
8
8
|
npm install @idlapps/t
|
|
9
9
|
# or
|
|
10
10
|
pnpm add @idlapps/t
|
|
11
|
-
# or
|
|
12
|
-
yarn add @idlapps/t
|
|
13
11
|
```
|
|
14
12
|
|
|
15
13
|
## Usage
|
|
16
14
|
|
|
17
15
|
```ts
|
|
18
|
-
import {
|
|
16
|
+
import { t } from "@idlapps/t";
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
const { el, refs } = t("<div p10 bgred ref=box>Hello</div>");
|
|
19
|
+
document.body.appendChild(el);
|
|
20
|
+
refs.box.style.color; // apply additional JS to refs
|
|
22
21
|
```
|
|
23
22
|
|
|
24
|
-
##
|
|
23
|
+
## How it works
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
`t()` parses an HTML string, extracts `ref` attributes as refs, converts shorthand CSS attribute names into inline styles, and returns the DOM fragment.
|
|
27
26
|
|
|
28
|
-
|
|
27
|
+
## Shorthand CSS
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
### Margin
|
|
30
|
+
|
|
31
|
+
| Shorthand | CSS |
|
|
32
|
+
| --------- | ------------------------------------ |
|
|
33
|
+
| `m10` | `margin:10px` |
|
|
34
|
+
| `m-15` | `margin:-15px` |
|
|
35
|
+
| `ml10` | `margin-left:10px` |
|
|
36
|
+
| `mr10` | `margin-right:10px` |
|
|
37
|
+
| `mt10` | `margin-top:10px` |
|
|
38
|
+
| `mb10` | `margin-bottom:10px` |
|
|
39
|
+
| `mx10` | `margin-left:10px;margin-right:10px` |
|
|
40
|
+
| `my10` | `margin-top:10px;margin-bottom:10px` |
|
|
41
|
+
| `mx20p` | `margin-left:20%;margin-right:20%` |
|
|
42
|
+
|
|
43
|
+
### Padding
|
|
44
|
+
|
|
45
|
+
| Shorthand | CSS |
|
|
46
|
+
| --------- | -------------------------------------- |
|
|
47
|
+
| `p10` | `padding:10px` |
|
|
48
|
+
| `pl10` | `padding-left:10px` |
|
|
49
|
+
| `pr10` | `padding-right:10px` |
|
|
50
|
+
| `pt10` | `padding-top:10px` |
|
|
51
|
+
| `pb10` | `padding-bottom:10px` |
|
|
52
|
+
| `px10` | `padding-left:10px;padding-right:10px` |
|
|
53
|
+
| `py10` | `padding-top:10px;padding-bottom:10px` |
|
|
54
|
+
|
|
55
|
+
### Width / Height
|
|
56
|
+
|
|
57
|
+
| Shorthand | CSS |
|
|
58
|
+
| --------- | ------------------ |
|
|
59
|
+
| `w100` | `width:100px` |
|
|
60
|
+
| `h100` | `height:100px` |
|
|
61
|
+
| `w50p` | `width:50%` |
|
|
62
|
+
| `w-50p` | `width:-50%` |
|
|
63
|
+
| `minw100` | `min-width:100px` |
|
|
64
|
+
| `maxw200` | `max-width:200px` |
|
|
65
|
+
| `minh100` | `min-height:100px` |
|
|
66
|
+
| `maxh200` | `max-height:200px` |
|
|
67
|
+
|
|
68
|
+
### Colors
|
|
69
|
+
|
|
70
|
+
| Shorthand | CSS |
|
|
71
|
+
| --------- | ----------------------- |
|
|
72
|
+
| `bgred` | `background:red` |
|
|
73
|
+
| `bgteal` | `background:teal` |
|
|
74
|
+
| `clwhite` | `color:white` |
|
|
75
|
+
| `clblack` | `color:black` |
|
|
76
|
+
| `bgtransparent` | `background:transparent` |
|
|
77
|
+
| `cltransparent` | `color:transparent` |
|
|
78
|
+
| `bctransparent` | `border-color:transparent` |
|
|
79
|
+
| `bg#ff0000` | `background:#ff0000` |
|
|
80
|
+
| `cl#ffffff` | `color:#ffffff` |
|
|
81
|
+
| `bgrgba(255,0,0,0.5)` | `background:rgba(255,0,0,0.5)` |
|
|
82
|
+
| `clhsl(120,100%,50%)` | `color:hsl(120,100%,50%)` |
|
|
83
|
+
| `bglinear-gradient(red,blue)` | `background:linear-gradient(red,blue)` |
|
|
84
|
+
| `bgradial-gradient(red,blue)` | `background:radial-gradient(red,blue)` |
|
|
85
|
+
| `bgconic-gradient(red,blue)` | `background:conic-gradient(red,blue)` |
|
|
86
|
+
|
|
87
|
+
> Use `135deg` instead of `to right` in gradients — HTML splits on spaces.
|
|
88
|
+
|
|
89
|
+
### Typography
|
|
90
|
+
|
|
91
|
+
| Shorthand | CSS |
|
|
92
|
+
| ---------- | -------------------- |
|
|
93
|
+
| `fs14` | `font-size:14px` |
|
|
94
|
+
| `fwbold` | `font-weight:bold` |
|
|
95
|
+
| `lh15` | `line-height:15px` |
|
|
96
|
+
| `ls1` | `letter-spacing:1px` |
|
|
97
|
+
| `tacenter` | `text-align:center` |
|
|
98
|
+
|
|
99
|
+
### Position
|
|
100
|
+
|
|
101
|
+
| Shorthand | CSS |
|
|
102
|
+
| ---------------- | ------------------- |
|
|
103
|
+
| `a` / `absolute` | `position:absolute` |
|
|
104
|
+
| `r` / `relative` | `position:relative` |
|
|
105
|
+
| `f` / `fixed` | `position:fixed` |
|
|
106
|
+
| `sticky` | `position:sticky` |
|
|
107
|
+
| `l20` | `left:20px` |
|
|
108
|
+
| `l-20` | `left:-20px` |
|
|
109
|
+
| `r20` | `right:20px` |
|
|
110
|
+
| `t20` | `top:20px` |
|
|
111
|
+
| `b20` | `bottom:20px` |
|
|
112
|
+
| `b-10` | `bottom:-10px` |
|
|
113
|
+
| `l5p` | `left:5%` |
|
|
114
|
+
|
|
115
|
+
### Flex
|
|
116
|
+
|
|
117
|
+
| Shorthand | CSS |
|
|
118
|
+
| --------------- | -------------------------------------------------------- |
|
|
119
|
+
| `flex` | `display:flex` |
|
|
120
|
+
| `c` | `display:flex;justify-content:center;align-items:center` |
|
|
121
|
+
| `h` | `display:flex;flex-direction:row` |
|
|
122
|
+
| `v` | `display:flex;flex-direction:column` |
|
|
123
|
+
| `gap10` | `gap:10px` |
|
|
124
|
+
| `justifycenter` | `justify-content:center` |
|
|
125
|
+
| `itemscenter` | `align-items:center` |
|
|
126
|
+
|
|
127
|
+
### Text Align
|
|
128
|
+
|
|
129
|
+
| Shorthand | CSS |
|
|
130
|
+
| --------- | ------------------- |
|
|
131
|
+
| `tac` | `text-align:center` |
|
|
132
|
+
| `tar` | `text-align:right` |
|
|
133
|
+
| `tal` | `text-align:left` |
|
|
134
|
+
|
|
135
|
+
### Border
|
|
136
|
+
|
|
137
|
+
| Shorthand | CSS |
|
|
138
|
+
| ---------- | ------------------------ |
|
|
139
|
+
| `ba` | `border` |
|
|
140
|
+
| `ba2` | `border:2px solid` |
|
|
141
|
+
| `bt1` | `border-top:1px solid` |
|
|
142
|
+
| `br1` | `border-right:1px solid` |
|
|
143
|
+
| `bb1` | `border-bottom:1px solid`|
|
|
144
|
+
| `bl1` | `border-left:1px solid` |
|
|
145
|
+
| `bcred` | `border-color:red` |
|
|
146
|
+
| `bctred` | `border-top-color:red` |
|
|
147
|
+
| `bcrblue` | `border-right-color:blue`|
|
|
148
|
+
| `bcbgreen` | `border-bottom-color:green`|
|
|
149
|
+
| `bclwhite` | `border-left-color:white`|
|
|
150
|
+
| `rounded8` | `border-radius:8px` |
|
|
151
|
+
| `shadowsm` | `box-shadow:sm` |
|
|
152
|
+
|
|
153
|
+
### Other
|
|
154
|
+
|
|
155
|
+
| Shorthand | CSS |
|
|
156
|
+
| ---------------- | ------------------ |
|
|
157
|
+
| `z10` | `z-index:10` |
|
|
158
|
+
| `overflowhidden` | `overflow:hidden` |
|
|
159
|
+
| `tn500` | `transition:500ms` |
|
|
160
|
+
|
|
161
|
+
### Transform
|
|
162
|
+
|
|
163
|
+
| Shorthand | CSS |
|
|
164
|
+
| --------- | ----------------------------- |
|
|
165
|
+
| `tx10` | `transform:translateX(10px)` |
|
|
166
|
+
| `ty20` | `transform:translateY(20px)` |
|
|
167
|
+
| `tr45` | `transform:rotate(45deg)` |
|
|
168
|
+
| `tr-90` | `transform:rotate(-90deg)` |
|
|
169
|
+
| `ts2` | `transform:scale(2)` |
|
|
170
|
+
| `ts05` | `transform:scale(05)` |
|
|
171
|
+
| `tx50p` | `transform:translateX(50%)` |
|
|
172
|
+
| `tx-50p` | `transform:translateX(-50%)` |
|
|
173
|
+
| `ty-20` | `transform:translateY(-20px)` |
|
|
174
|
+
|
|
175
|
+
### Negative values
|
|
176
|
+
|
|
177
|
+
Prefix any numeric value with `-`:
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
m-15 → margin:-15px
|
|
181
|
+
ml-10 → margin-left:-10px
|
|
182
|
+
tx-50p → transform:translateX(-50%)
|
|
34
183
|
```
|
|
35
184
|
|
|
36
|
-
###
|
|
185
|
+
### Percent values
|
|
37
186
|
|
|
38
|
-
|
|
187
|
+
Suffix with `p`:
|
|
39
188
|
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
189
|
+
```
|
|
190
|
+
mx20p → margin-left:20%;margin-right:20%
|
|
191
|
+
w50p → width:50%
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Hover (`h:`)
|
|
195
|
+
|
|
196
|
+
Apply styles on hover:
|
|
197
|
+
|
|
198
|
+
```html
|
|
199
|
+
<div h:bgred h:p15>Hover me</div>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
```css
|
|
203
|
+
._t0:hover {
|
|
204
|
+
background-color: red !important;
|
|
205
|
+
padding: 15px !important;
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Ancestor Hover (`h1:`, `h2:`, ...)
|
|
210
|
+
|
|
211
|
+
Hover a parent to style a child. The number indicates how many levels up:
|
|
212
|
+
|
|
213
|
+
```html
|
|
214
|
+
<div>
|
|
215
|
+
<span h1:p30>Hover parent to pad me</span>
|
|
216
|
+
</div>
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
```css
|
|
220
|
+
._t0:hover ._t1 {
|
|
221
|
+
padding: 30px !important;
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
- `h1:` — hover immediate parent
|
|
226
|
+
- `h2:` — hover grandparent
|
|
227
|
+
- `h3:` — hover great-grandparent
|
|
228
|
+
- `hN:` — hover Nth ancestor
|
|
229
|
+
|
|
230
|
+
## Responsive (`sm:`, `md:`, `lg:`, `xl:`, `2xl:`)
|
|
231
|
+
|
|
232
|
+
Media query breakpoints wrapped in `@media(min-width:...)`:
|
|
233
|
+
|
|
234
|
+
| Prefix | Breakpoint |
|
|
235
|
+
| ------ | ---------- |
|
|
236
|
+
| `sm:` | 640px |
|
|
237
|
+
| `md:` | 768px |
|
|
238
|
+
| `lg:` | 1024px |
|
|
239
|
+
| `xl:` | 1280px |
|
|
240
|
+
| `2xl:` | 1536px |
|
|
241
|
+
|
|
242
|
+
```html
|
|
243
|
+
<div md:p20 lg:bgred>Responsive</div>
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
```css
|
|
247
|
+
@media (min-width: 768px) {
|
|
248
|
+
._t0 {
|
|
249
|
+
padding: 20px !important;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
@media (min-width: 1024px) {
|
|
253
|
+
._t1 {
|
|
254
|
+
background-color: red !important;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Combining hover + responsive + ancestor
|
|
260
|
+
|
|
261
|
+
All prefixes stack:
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
md:h:bgred → @media(≥768px) hover → background-color:red
|
|
265
|
+
md:h1:p30 → @media(≥768px) parent hover → padding:30px
|
|
266
|
+
lg:h2:clwhite → @media(≥1024px) grandparent hover → color:white
|
|
44
267
|
```
|
|
45
268
|
|
|
46
|
-
##
|
|
269
|
+
## Refs
|
|
47
270
|
|
|
48
|
-
|
|
271
|
+
Extract elements by `ref` attribute:
|
|
49
272
|
|
|
50
273
|
```ts
|
|
51
|
-
|
|
52
|
-
|
|
274
|
+
const { input, btn } = t("<input ref=input><button ref=btn>OK</button>");
|
|
275
|
+
input.placeholder = "Type...";
|
|
276
|
+
btn.onclick = () => alert(input.value);
|
|
53
277
|
```
|
|
54
278
|
|
|
55
279
|
## License
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=document.createElement(`template`),t={m:`margin`,p:`padding`,t:`top`,r:`right`,l:`left`,b:`bottom`,x:`$l:$r`,y:`$t:$b`,w:`width`,h:`height`,min:`min`,max:`max`,P:`position`,D:`display`,fd:`flexDirection`,C:`center`,bg:`background`,cl:`color`,tn:`transition`,tx:`translateX`,ty:`translateY`,tr:`rotate`,ts:`scale`,fs:`fontSize`,fw:`fontWeight`,lh:`lineHeight`,ls:`letterSpacing`,ta:`textAlign`,bd:`border`,rounded:`borderRadius`,shadow:`boxShadow`,opacity:`opacity`,z:`zIndex`,overflow:`overflow`,gap:`gap`,justify:`justifyContent`,items:`alignItems`,ml:`$m$l`,mr:`$m$r`,mt:`$m$t`,mb:`$m$b`,mx:`$m$l:$m$r`,my:`$m$t:$m$b`,pl:`$p$l`,pr:`$p$r`,pt:`$p$t`,pb:`$p$b`,px:`$p$l:$p$r`,py:`$p$t:$p$b`,minw:`$min$w`,minh:`$min$h`,maxw:`$max$w`,maxh:`$max$h`,ba:`$bd`,bt:`$bd$t`,br:`$bd$r`,bb:`$bd$b`,bl:`$bd$l`,bc:`borderColor`,bct:`borderTopColor`,bcr:`borderRightColor`,bcb:`borderBottomColor`,bcl:`borderLeftColor`},n={absolute:`$P:absolute`,a:`$P:absolute`,relative:`$P:relative`,r:`$P:relative`,fixed:`$P:fixed`,f:`$P:fixed`,sticky:`$P:sticky`,flex:`$D:flex`,c:`$D:flex;$justify:$C;$items:$C`,h:`$D:flex;$fd:row`,v:`$D:flex;$fd:column`,tac:`$ta:center`,tar:`$ta:right`,tal:`$ta:left`,ba:`$bd`},r=new Set(`transparent.currentcolor.inherit.initial.unset.red.blue.green.white.black.yellow.orange.purple.pink.teal.cyan.magenta.lime.maroon.navy.olive.gray.grey.silver.gold.coral.salmon.tomato.crimson.indigo.violet.turquoise.plum.orchid.khaki.lavender.ivory.beige.tan.wheat.peru.sienna.chocolate.firebrick.darkred.lightgreen.darkgreen.lightblue.darkblue.darkcyan.darkmagenta.darkviolet.darkorange.darkgoldenrod.darkslategray.darkolivegreen.mediumseagreen.mediumturquoise.mediumslateblue.mediumorchid.mediumpurple.hotpink.deeppink.palevioletred.lightsalmon.lightcoral.skyblue.lightskyblue.steelblue.dodgerblue.cornflowerblue.royalblue.slateblue.mediumblue.midnightblue.aquamarine.chartreuse.springgreen.forestgreen.limegreen.lawngreen.darkseagreen.palegreen.lightyellow.lemonchiffon.paleturquoise.powderblue.lightsteelblue.aliceblue.ghostwhite.snow.floralwhite.oldlace.linen.antiquewhite.mintcream.mistyrose.peachpuff.navajowhite.burlywood.sandybrown.darksalmon.rosybrown.darkkhaki.palegoldenrod.cadetblue.lightcyan.azure.honeydew.thistle.gainsboro.whitesmoke.darkgray.dimgray.lightslategray.slategray`.split(`.`)),i=new Set(`bold.bolder.lighter.normal.italic.oblique.thin.hairline.semibold.extrabold.ultrabold.medium.regular.small.xxsmall.xsmall.large.xlarge.xxlarge.smaller.larger.normal.collapse.hidden.visible.scroll.auto.block.inline.inlineblock.inlineflex.grid.inlinegrid.none.contents.unset.inherit.initial.solid.dashed.dotted.double.groove.ridge.inset.outset.cover.contain.fill.stroke.running.paused.forwards.backwards.both.ease.linear.easein.easeout.easeinout.stepstart.stepend.nowrap.pre.prewrap.preline.breakspace.uppercase.lowercase.capitalize.center.justify.start.end.stretch.baseline.sub.super.overline.through.pointer.default.notallowed.text.wait.help.progress.snapstart.snapend.snapcenter.snearest.mandatory.smooth.noerase.erase.vertical.horizontal.row.column.rowreverse.columnreverse.wrap.wrapreverse`.split(`.`)),a=new Set([`z`,`opacity`,`zIndex`]),o=new Set([`tn`,`transition`]),s=new Set([`tx`,`ty`,`translateX`,`translateY`,`tr`,`ts`,`rotate`,`scale`]),c=new Set([`ba`,`bt`,`br`,`bb`,`bl`,`border`,`borderTop`,`borderRight`,`borderBottom`,`borderLeft`]),l=new Set([`tr`,`rotate`]),u=new Set([`ts`,`scale`]),d={sm:640,md:768,lg:1024,xl:1280,"2xl":1536},f=Object.keys(d).sort((e,t)=>t.length-e.length),p=Object.keys(t).sort((e,t)=>t.length-e.length);function m(e){for(;e.includes(`$`);){let n=``,r=0;for(;r<e.length;){if(e[r]===`$`){let i=e.slice(r+1).match(/^[a-zA-Z]+/);if(i){let e=t[i[0]]??i[0];n+=n&&/[a-zA-Z]$/.test(n)?e[0].toUpperCase()+e.slice(1):e,r+=1+i[0].length;continue}}n+=e[r++]}e=n}return e}const h=e=>e.replace(/([A-Z])/g,`-$1`).toLowerCase(),g=e=>e.split(`;`).map(e=>{let t=e.indexOf(`:`);return t>-1?`${h(e.slice(0,t))}:${e.slice(t+1)}`:h(e)}).join(`;`);function _(e,t){return/^-?\d+$/.test(e)?a.has(t)||u.has(t)?e:o.has(t)?`${e}ms`:l.has(t)?`${e}deg`:`${e}px`:/^-?\d+p$/.test(e)?`${e.slice(0,-1)}%`:e}const v=/^#([0-9a-f]{3,8})$/i,y=/^(rgba?|hsla?|oklch|color|linear-gradient|radial-gradient|conic-gradient|repeating-linear-gradient|repeating-radial-gradient)\(.+\)$/i;function b(e){if(n[e])return g(m(n[e]));for(let n of p){if(!e.startsWith(n)||n.length>=e.length)continue;let a=e.slice(n.length),o=_(a,n);if(/^\d/.test(a)||r.has(a.toLowerCase())||i.has(a.toLowerCase())||v.test(a)||y.test(a)||a[0]===`-`&&/^\d/.test(a.slice(1))){let e=m(t[n]);return(e.includes(`:`)?e.split(`:`):[e]).map(e=>s.has(e)?`transform:${e}(${o})`:c.has(n)&&/^\d/.test(a)?`${h(e)}:${o} solid`:`${h(e)}:${o}`).join(`;`)}}return``}let x=0;const S=[],C=[];function w(e,t){return e?`@media(min-width:${e}px){${t}}`:t}function T(e){let t=[];for(let n of Array.from(e.attributes)){if(n.name===`ref`)continue;let r=n.name,i;for(let e of f)if(r.startsWith(e+`:`)){i=d[e],r=r.slice(e.length+1);break}if(r.startsWith(`h:`)){let t=b(r.slice(2));if(t){let n=`_t${x++}`;e.classList.add(n),S.push(w(i,`.${n}:hover{${t.split(`;`).map(e=>e+`!important`).join(`;`)}}`))}e.removeAttribute(n.name);continue}let a=r.match(/^h(\d+):(.+)$/);if(a){let t=b(a[2]);t&&C.push({el:e,level:+a[1],css:t,media:i}),e.removeAttribute(n.name);continue}let o=b(r);if(o){if(i){let t=`_t${x++}`;e.classList.add(t),S.push(w(i,`.${t}{${o.split(`;`).map(e=>e+`!important`).join(`;`)}}`))}else t.push(o);e.removeAttribute(n.name)}}t.length&&e.setAttribute(`style`,(e.getAttribute(`style`)||``)+t.join(`;`))}function E(t){e.innerHTML=String(t);let n={},r=document.createTreeWalker(e.content,NodeFilter.SHOW_ELEMENT),i;for(;i=r.nextNode();)T(i),i.hasAttribute(`ref`)&&(n[i.getAttribute(`ref`)]=i,i.removeAttribute(`ref`));for(let{el:e,level:t,css:n,media:r}of C){let i=e;for(let e=0;e<t;e++)i=i?.parentElement??null;if(i&&i!==e){let t=`_t${x++}`,a=`_t${x++}`;i.classList.add(t),e.classList.add(a),S.push(w(r,`.${t}:hover .${a}{${n.split(`;`).map(e=>e+`!important`).join(`;`)}}`))}}if(C.length=0,document.body.appendChild(e.content),S.length){let e=document.querySelector(`style[data-t]`)||(()=>{let e=document.createElement(`style`);return e.setAttribute(`data-t`,``),document.head.appendChild(e)})();e.textContent+=S.join(``),S.length=0}return n}exports.t=E;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Converts a string to camelCase.\n *\n * @example\n * ```ts\n * import { camelCase } from \"@idlapps/t\";\n *\n * camelCase(\"hello-world\"); // \"helloWorld\"\n * camelCase(\"foo_bar_baz\"); // \"fooBarBaz\"\n * camelCase(\"Hello World\"); // \"helloWorld\"\n * camelCase(\"alreadyCamel\"); // \"alreadyCamel\"\n * ```\n */\nexport function camelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, char: string | undefined) =>\n char ? char.toUpperCase() : \"\"\n )\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n}\n\n/**\n * Truncates a string to a maximum length, appending an ellipsis if truncated.\n *\n * @example\n * ```ts\n * import { truncate } from \"@idlapps/t\";\n *\n * truncate(\"Hello, World!\", 5); // \"Hello...\"\n * truncate(\"Hi\", 10); // \"Hi\"\n * truncate(\"abcdefghij\", 7); // \"abcd...\"\n * ```\n */\nexport function truncate(str: string, maxLength: number, suffix = \"...\"): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - suffix.length) + suffix;\n}\n\n/**\n * Converts a string to kebab-case.\n *\n * @example\n * ```ts\n * import { kebabCase } from \"@idlapps/t\";\n *\n * kebabCase(\"helloWorld\"); // \"hello-world\"\n * kebabCase(\"foo_bar_baz\"); // \"foo-bar-baz\"\n * kebabCase(\"Hello World\"); // \"hello-world\"\n * ```\n */\nexport function kebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[_\\s]+/g, \"-\")\n .toLowerCase();\n}\n"],"mappings":"mEAaA,SAAgB,EAAU,EAAqB,CAC7C,OAAO,EACJ,QAAQ,gBAAiB,EAAG,IAC3B,EAAO,EAAK,YAAY,EAAI,EAC9B,CAAC,CACA,QAAQ,SAAW,GAAS,EAAK,YAAY,CAAC,CACnD,CAcA,SAAgB,EAAS,EAAa,EAAmB,EAAS,MAAe,CAE/E,OADI,EAAI,QAAU,EAAkB,EAC7B,EAAI,MAAM,EAAG,EAAY,EAAO,MAAM,EAAI,CACnD,CAcA,SAAgB,EAAU,EAAqB,CAC7C,OAAO,EACJ,QAAQ,kBAAmB,OAAO,CAAC,CACnC,QAAQ,UAAW,GAAG,CAAC,CACvB,YAAY,CACjB"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["const T = document.createElement('template');\n\nconst A: Record<string, string> = {\n m: 'margin', p: 'padding', t: 'top', r: 'right', l: 'left', b: 'bottom',\n x: '$l:$r', y: '$t:$b', w: 'width', h: 'height', min: 'min', max: 'max',\n P: 'position', D: 'display', fd: 'flexDirection', C: 'center',\n bg: 'background', cl: 'color', tn: 'transition',\n tx: 'translateX', ty: 'translateY', tr: 'rotate', ts: 'scale',\n fs: 'fontSize', fw: 'fontWeight', lh: 'lineHeight', ls: 'letterSpacing', ta: 'textAlign',\n bd: 'border', rounded: 'borderRadius', shadow: 'boxShadow',\n opacity: 'opacity', z: 'zIndex', overflow: 'overflow',\n gap: 'gap', justify: 'justifyContent', items: 'alignItems',\n ml: '$m$l', mr: '$m$r', mt: '$m$t', mb: '$m$b',\n mx: '$m$l:$m$r', my: '$m$t:$m$b',\n pl: '$p$l', pr: '$p$r', pt: '$p$t', pb: '$p$b',\n px: '$p$l:$p$r', py: '$p$t:$p$b',\n minw: '$min$w', minh: '$min$h', maxw: '$max$w', maxh: '$max$h',\n ba: '$bd', bt: '$bd$t', br: '$bd$r', bb: '$bd$b', bl: '$bd$l',\n bc: 'borderColor', bct: 'borderTopColor', bcr: 'borderRightColor', bcb: 'borderBottomColor', bcl: 'borderLeftColor',\n};\n\nconst exact: Record<string, string> = {\n absolute: '$P:absolute', a: '$P:absolute',\n relative: '$P:relative', r: '$P:relative',\n fixed: '$P:fixed', f: '$P:fixed', sticky: '$P:sticky',\n flex: '$D:flex', c: '$D:flex;$justify:$C;$items:$C',\n h: '$D:flex;$fd:row', v: '$D:flex;$fd:column',\n tac: '$ta:center', tar: '$ta:right', tal: '$ta:left',\n ba: '$bd',\n};\n\nconst colors = new Set(['transparent','currentcolor','inherit','initial','unset','red','blue','green','white','black','yellow','orange','purple','pink','teal','cyan','magenta','lime','maroon','navy','olive','gray','grey','silver','gold','coral','salmon','tomato','crimson','indigo','violet','turquoise','plum','orchid','khaki','lavender','ivory','beige','tan','wheat','peru','sienna','chocolate','firebrick','darkred','lightgreen','darkgreen','lightblue','darkblue','darkcyan','darkmagenta','darkviolet','darkorange','darkgoldenrod','darkslategray','darkolivegreen','mediumseagreen','mediumturquoise','mediumslateblue','mediumorchid','mediumpurple','hotpink','deeppink','palevioletred','lightsalmon','lightcoral','skyblue','lightskyblue','steelblue','dodgerblue','cornflowerblue','royalblue','slateblue','mediumblue','midnightblue','aquamarine','chartreuse','springgreen','forestgreen','limegreen','lawngreen','darkseagreen','palegreen','lightyellow','lemonchiffon','paleturquoise','powderblue','lightsteelblue','aliceblue','ghostwhite','snow','floralwhite','oldlace','linen','antiquewhite','mintcream','mistyrose','peachpuff','navajowhite','burlywood','sandybrown','darksalmon','rosybrown','darkkhaki','palegoldenrod','cadetblue','lightcyan','azure','honeydew','thistle','gainsboro','whitesmoke','darkgray','dimgray','lightslategray','slategray']);\nconst keywords = new Set(['bold','bolder','lighter','normal','italic','oblique','thin','hairline','semibold','extrabold','ultrabold','medium','regular','small','xxsmall','xsmall','large','xlarge','xxlarge','smaller','larger','normal','collapse','hidden','visible','scroll','auto','block','inline','inlineblock','inlineflex','grid','inlinegrid','none','contents','unset','inherit','initial','solid','dashed','dotted','double','groove','ridge','inset','outset','cover','contain','fill','stroke','running','paused','forwards','backwards','both','ease','linear','easein','easeout','easeinout','stepstart','stepend','nowrap','pre','prewrap','preline','breakspace','uppercase','lowercase','capitalize','center','justify','start','end','stretch','baseline','sub','super','overline','through','pointer','default','notallowed','text','wait','help','progress','snapstart','snapend','snapcenter','snearest','mandatory','smooth','noerase','erase','vertical','horizontal','row','column','rowreverse','columnreverse','wrap','wrapreverse']);\nconst unitless = new Set(['z', 'opacity', 'zIndex']);\nconst ms = new Set(['tn', 'transition']);\nconst transforms = new Set(['tx', 'ty', 'translateX', 'translateY', 'tr', 'ts', 'rotate', 'scale']);\nconst solidSuffix = new Set(['ba', 'bt', 'br', 'bb', 'bl', 'border', 'borderTop', 'borderRight', 'borderBottom', 'borderLeft']);\nconst deg = new Set(['tr', 'rotate']);\nconst unitlessVal = new Set(['ts', 'scale']);\nconst BP: Record<string, number> = { sm: 640, md: 768, lg: 1024, xl: 1280, '2xl': 1536 };\nconst BPS = Object.keys(BP).sort((a, b) => b.length - a.length);\nconst AP = Object.keys(A).sort((a, b) => b.length - a.length);\n\nfunction resolve(s: string): string {\n while (s.includes('$')) {\n let r = '', i = 0;\n while (i < s.length) {\n if (s[i] === '$') {\n const m = s.slice(i + 1).match(/^[a-zA-Z]+/);\n if (m) {\n const v = A[m[0]] ?? m[0];\n r += r && /[a-zA-Z]$/.test(r) ? v[0].toUpperCase() + v.slice(1) : v;\n i += 1 + m[0].length;\n continue;\n }\n }\n r += s[i++];\n }\n s = r;\n }\n return s;\n}\n\nconst kebab = (s: string) => s.replace(/([A-Z])/g, '-$1').toLowerCase();\n\nconst toCSS = (v: string) => v.split(';').map(p => { const i = p.indexOf(':'); return i > -1 ? `${kebab(p.slice(0, i))}:${p.slice(i + 1)}` : kebab(p); }).join(';');\n\nfunction parseVal(raw: string, prop: string): string {\n if (/^-?\\d+$/.test(raw)) return unitless.has(prop) || unitlessVal.has(prop) ? raw : ms.has(prop) ? `${raw}ms` : deg.has(prop) ? `${raw}deg` : `${raw}px`;\n if (/^-?\\d+p$/.test(raw)) return `${raw.slice(0, -1)}%`;\n return raw;\n}\n\nconst hex = /^#([0-9a-f]{3,8})$/i;\nconst fn = /^(rgba?|hsla?|oklch|color|linear-gradient|radial-gradient|conic-gradient|repeating-linear-gradient|repeating-radial-gradient)\\(.+\\)$/i;\n\nfunction parse(attr: string): string {\n if (exact[attr]) return toCSS(resolve(exact[attr]));\n\n for (const p of AP) {\n if (!attr.startsWith(p) || p.length >= attr.length) continue;\n const raw = attr.slice(p.length);\n const val = parseVal(raw, p);\n if (/^\\d/.test(raw) || colors.has(raw.toLowerCase()) || keywords.has(raw.toLowerCase()) || hex.test(raw) || fn.test(raw) || raw[0] === '-' && /^\\d/.test(raw.slice(1))) {\n const resolved = resolve(A[p]);\n const props = resolved.includes(':') ? resolved.split(':') : [resolved];\n return props.map(k => transforms.has(k) ? `transform:${k}(${val})` : solidSuffix.has(p) && /^\\d/.test(raw) ? `${kebab(k)}:${val} solid` : `${kebab(k)}:${val}`).join(';');\n }\n }\n return '';\n}\n\nlet C = 0;\nconst R: string[] = [];\nconst pendingHoverTarget: { el: Element; level: number; css: string; media?: number }[] = [];\n\nfunction mediaWrap(m: number | undefined, css: string): string {\n return m ? `@media(min-width:${m}px){${css}}` : css;\n}\n\nfunction apply(el: Element) {\n const s: string[] = [];\n for (const a of Array.from(el.attributes)) {\n if (a.name === 'ref') continue;\n let attr = a.name;\n let media: number | undefined;\n for (const bp of BPS) {\n if (attr.startsWith(bp + ':')) { media = BP[bp]; attr = attr.slice(bp.length + 1); break; }\n }\n if (attr.startsWith('h:')) {\n const css = parse(attr.slice(2));\n if (css) {\n const cls = `_t${C++}`;\n el.classList.add(cls);\n R.push(mediaWrap(media, `.${cls}:hover{${css.split(';').map(p => p + '!important').join(';')}}`));\n }\n el.removeAttribute(a.name);\n continue;\n }\n const hm = attr.match(/^h(\\d+):(.+)$/);\n if (hm) {\n const css = parse(hm[2]);\n if (css) pendingHoverTarget.push({ el, level: +hm[1], css, media });\n el.removeAttribute(a.name);\n continue;\n }\n const css = parse(attr);\n if (css) {\n if (media) {\n const cls = `_t${C++}`;\n el.classList.add(cls);\n R.push(mediaWrap(media, `.${cls}{${css.split(';').map(p => p + '!important').join(';')}}`));\n } else {\n s.push(css);\n }\n el.removeAttribute(a.name);\n }\n }\n if (s.length) el.setAttribute('style', (el.getAttribute('style') || '') + s.join(';'));\n}\n\nexport function t(value: unknown) {\n T.innerHTML = String(value);\n const refs: Record<string, HTMLElement> = {};\n const w = document.createTreeWalker(T.content, NodeFilter.SHOW_ELEMENT);\n let n: HTMLElement | null;\n while ((n = w.nextNode() as HTMLElement | null)) {\n apply(n);\n if (n.hasAttribute('ref')) { refs[n.getAttribute('ref')!] = n; n.removeAttribute('ref'); }\n }\n for (const { el, level, css, media } of pendingHoverTarget) {\n let ancestor: HTMLElement | null = el as HTMLElement;\n for (let i = 0; i < level; i++) ancestor = ancestor?.parentElement ?? null;\n if (ancestor && ancestor !== el) {\n const tCls = `_t${C++}`;\n const hCls = `_t${C++}`;\n ancestor.classList.add(tCls);\n el.classList.add(hCls);\n R.push(mediaWrap(media, `.${tCls}:hover .${hCls}{${css.split(';').map(p => p + '!important').join(';')}}`));\n }\n }\n pendingHoverTarget.length = 0;\n document.body.appendChild(T.content);\n if (R.length) {\n const el = document.querySelector('style[data-t]') as HTMLStyleElement || (() => { const s = document.createElement('style'); s.setAttribute('data-t', ''); return document.head.appendChild(s); })();\n el.textContent += R.join('');\n R.length = 0;\n }\n return refs;\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,44 +1,5 @@
|
|
|
1
1
|
//#region src/index.d.ts
|
|
2
|
-
|
|
3
|
-
* Converts a string to camelCase.
|
|
4
|
-
*
|
|
5
|
-
* @example
|
|
6
|
-
* ```ts
|
|
7
|
-
* import { camelCase } from "@idlapps/t";
|
|
8
|
-
*
|
|
9
|
-
* camelCase("hello-world"); // "helloWorld"
|
|
10
|
-
* camelCase("foo_bar_baz"); // "fooBarBaz"
|
|
11
|
-
* camelCase("Hello World"); // "helloWorld"
|
|
12
|
-
* camelCase("alreadyCamel"); // "alreadyCamel"
|
|
13
|
-
* ```
|
|
14
|
-
*/
|
|
15
|
-
declare function camelCase(str: string): string;
|
|
16
|
-
/**
|
|
17
|
-
* Truncates a string to a maximum length, appending an ellipsis if truncated.
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```ts
|
|
21
|
-
* import { truncate } from "@idlapps/t";
|
|
22
|
-
*
|
|
23
|
-
* truncate("Hello, World!", 5); // "Hello..."
|
|
24
|
-
* truncate("Hi", 10); // "Hi"
|
|
25
|
-
* truncate("abcdefghij", 7); // "abcd..."
|
|
26
|
-
* ```
|
|
27
|
-
*/
|
|
28
|
-
declare function truncate(str: string, maxLength: number, suffix?: string): string;
|
|
29
|
-
/**
|
|
30
|
-
* Converts a string to kebab-case.
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* ```ts
|
|
34
|
-
* import { kebabCase } from "@idlapps/t";
|
|
35
|
-
*
|
|
36
|
-
* kebabCase("helloWorld"); // "hello-world"
|
|
37
|
-
* kebabCase("foo_bar_baz"); // "foo-bar-baz"
|
|
38
|
-
* kebabCase("Hello World"); // "hello-world"
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
declare function kebabCase(str: string): string;
|
|
2
|
+
declare function t(value: unknown): Record<string, HTMLElement>;
|
|
42
3
|
//#endregion
|
|
43
|
-
export {
|
|
4
|
+
export { t };
|
|
44
5
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";iBA6IgB,EAAE,iBAAc,eAAA"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,44 +1,5 @@
|
|
|
1
1
|
//#region src/index.d.ts
|
|
2
|
-
|
|
3
|
-
* Converts a string to camelCase.
|
|
4
|
-
*
|
|
5
|
-
* @example
|
|
6
|
-
* ```ts
|
|
7
|
-
* import { camelCase } from "@idlapps/t";
|
|
8
|
-
*
|
|
9
|
-
* camelCase("hello-world"); // "helloWorld"
|
|
10
|
-
* camelCase("foo_bar_baz"); // "fooBarBaz"
|
|
11
|
-
* camelCase("Hello World"); // "helloWorld"
|
|
12
|
-
* camelCase("alreadyCamel"); // "alreadyCamel"
|
|
13
|
-
* ```
|
|
14
|
-
*/
|
|
15
|
-
declare function camelCase(str: string): string;
|
|
16
|
-
/**
|
|
17
|
-
* Truncates a string to a maximum length, appending an ellipsis if truncated.
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```ts
|
|
21
|
-
* import { truncate } from "@idlapps/t";
|
|
22
|
-
*
|
|
23
|
-
* truncate("Hello, World!", 5); // "Hello..."
|
|
24
|
-
* truncate("Hi", 10); // "Hi"
|
|
25
|
-
* truncate("abcdefghij", 7); // "abcd..."
|
|
26
|
-
* ```
|
|
27
|
-
*/
|
|
28
|
-
declare function truncate(str: string, maxLength: number, suffix?: string): string;
|
|
29
|
-
/**
|
|
30
|
-
* Converts a string to kebab-case.
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* ```ts
|
|
34
|
-
* import { kebabCase } from "@idlapps/t";
|
|
35
|
-
*
|
|
36
|
-
* kebabCase("helloWorld"); // "hello-world"
|
|
37
|
-
* kebabCase("foo_bar_baz"); // "foo-bar-baz"
|
|
38
|
-
* kebabCase("Hello World"); // "hello-world"
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
declare function kebabCase(str: string): string;
|
|
2
|
+
declare function t(value: unknown): Record<string, HTMLElement>;
|
|
42
3
|
//#endregion
|
|
43
|
-
export {
|
|
4
|
+
export { t };
|
|
44
5
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";iBA6IgB,EAAE,iBAAc,eAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
const e=document.createElement(`template`),t={m:`margin`,p:`padding`,t:`top`,r:`right`,l:`left`,b:`bottom`,x:`$l:$r`,y:`$t:$b`,w:`width`,h:`height`,min:`min`,max:`max`,P:`position`,D:`display`,fd:`flexDirection`,C:`center`,bg:`background`,cl:`color`,tn:`transition`,tx:`translateX`,ty:`translateY`,tr:`rotate`,ts:`scale`,fs:`fontSize`,fw:`fontWeight`,lh:`lineHeight`,ls:`letterSpacing`,ta:`textAlign`,bd:`border`,rounded:`borderRadius`,shadow:`boxShadow`,opacity:`opacity`,z:`zIndex`,overflow:`overflow`,gap:`gap`,justify:`justifyContent`,items:`alignItems`,ml:`$m$l`,mr:`$m$r`,mt:`$m$t`,mb:`$m$b`,mx:`$m$l:$m$r`,my:`$m$t:$m$b`,pl:`$p$l`,pr:`$p$r`,pt:`$p$t`,pb:`$p$b`,px:`$p$l:$p$r`,py:`$p$t:$p$b`,minw:`$min$w`,minh:`$min$h`,maxw:`$max$w`,maxh:`$max$h`,ba:`$bd`,bt:`$bd$t`,br:`$bd$r`,bb:`$bd$b`,bl:`$bd$l`,bc:`borderColor`,bct:`borderTopColor`,bcr:`borderRightColor`,bcb:`borderBottomColor`,bcl:`borderLeftColor`},n={absolute:`$P:absolute`,a:`$P:absolute`,relative:`$P:relative`,r:`$P:relative`,fixed:`$P:fixed`,f:`$P:fixed`,sticky:`$P:sticky`,flex:`$D:flex`,c:`$D:flex;$justify:$C;$items:$C`,h:`$D:flex;$fd:row`,v:`$D:flex;$fd:column`,tac:`$ta:center`,tar:`$ta:right`,tal:`$ta:left`,ba:`$bd`},r=new Set(`transparent.currentcolor.inherit.initial.unset.red.blue.green.white.black.yellow.orange.purple.pink.teal.cyan.magenta.lime.maroon.navy.olive.gray.grey.silver.gold.coral.salmon.tomato.crimson.indigo.violet.turquoise.plum.orchid.khaki.lavender.ivory.beige.tan.wheat.peru.sienna.chocolate.firebrick.darkred.lightgreen.darkgreen.lightblue.darkblue.darkcyan.darkmagenta.darkviolet.darkorange.darkgoldenrod.darkslategray.darkolivegreen.mediumseagreen.mediumturquoise.mediumslateblue.mediumorchid.mediumpurple.hotpink.deeppink.palevioletred.lightsalmon.lightcoral.skyblue.lightskyblue.steelblue.dodgerblue.cornflowerblue.royalblue.slateblue.mediumblue.midnightblue.aquamarine.chartreuse.springgreen.forestgreen.limegreen.lawngreen.darkseagreen.palegreen.lightyellow.lemonchiffon.paleturquoise.powderblue.lightsteelblue.aliceblue.ghostwhite.snow.floralwhite.oldlace.linen.antiquewhite.mintcream.mistyrose.peachpuff.navajowhite.burlywood.sandybrown.darksalmon.rosybrown.darkkhaki.palegoldenrod.cadetblue.lightcyan.azure.honeydew.thistle.gainsboro.whitesmoke.darkgray.dimgray.lightslategray.slategray`.split(`.`)),i=new Set(`bold.bolder.lighter.normal.italic.oblique.thin.hairline.semibold.extrabold.ultrabold.medium.regular.small.xxsmall.xsmall.large.xlarge.xxlarge.smaller.larger.normal.collapse.hidden.visible.scroll.auto.block.inline.inlineblock.inlineflex.grid.inlinegrid.none.contents.unset.inherit.initial.solid.dashed.dotted.double.groove.ridge.inset.outset.cover.contain.fill.stroke.running.paused.forwards.backwards.both.ease.linear.easein.easeout.easeinout.stepstart.stepend.nowrap.pre.prewrap.preline.breakspace.uppercase.lowercase.capitalize.center.justify.start.end.stretch.baseline.sub.super.overline.through.pointer.default.notallowed.text.wait.help.progress.snapstart.snapend.snapcenter.snearest.mandatory.smooth.noerase.erase.vertical.horizontal.row.column.rowreverse.columnreverse.wrap.wrapreverse`.split(`.`)),a=new Set([`z`,`opacity`,`zIndex`]),o=new Set([`tn`,`transition`]),s=new Set([`tx`,`ty`,`translateX`,`translateY`,`tr`,`ts`,`rotate`,`scale`]),c=new Set([`ba`,`bt`,`br`,`bb`,`bl`,`border`,`borderTop`,`borderRight`,`borderBottom`,`borderLeft`]),l=new Set([`tr`,`rotate`]),u=new Set([`ts`,`scale`]),d={sm:640,md:768,lg:1024,xl:1280,"2xl":1536},f=Object.keys(d).sort((e,t)=>t.length-e.length),p=Object.keys(t).sort((e,t)=>t.length-e.length);function m(e){for(;e.includes(`$`);){let n=``,r=0;for(;r<e.length;){if(e[r]===`$`){let i=e.slice(r+1).match(/^[a-zA-Z]+/);if(i){let e=t[i[0]]??i[0];n+=n&&/[a-zA-Z]$/.test(n)?e[0].toUpperCase()+e.slice(1):e,r+=1+i[0].length;continue}}n+=e[r++]}e=n}return e}const h=e=>e.replace(/([A-Z])/g,`-$1`).toLowerCase(),g=e=>e.split(`;`).map(e=>{let t=e.indexOf(`:`);return t>-1?`${h(e.slice(0,t))}:${e.slice(t+1)}`:h(e)}).join(`;`);function _(e,t){return/^-?\d+$/.test(e)?a.has(t)||u.has(t)?e:o.has(t)?`${e}ms`:l.has(t)?`${e}deg`:`${e}px`:/^-?\d+p$/.test(e)?`${e.slice(0,-1)}%`:e}const v=/^#([0-9a-f]{3,8})$/i,y=/^(rgba?|hsla?|oklch|color|linear-gradient|radial-gradient|conic-gradient|repeating-linear-gradient|repeating-radial-gradient)\(.+\)$/i;function b(e){if(n[e])return g(m(n[e]));for(let n of p){if(!e.startsWith(n)||n.length>=e.length)continue;let a=e.slice(n.length),o=_(a,n);if(/^\d/.test(a)||r.has(a.toLowerCase())||i.has(a.toLowerCase())||v.test(a)||y.test(a)||a[0]===`-`&&/^\d/.test(a.slice(1))){let e=m(t[n]);return(e.includes(`:`)?e.split(`:`):[e]).map(e=>s.has(e)?`transform:${e}(${o})`:c.has(n)&&/^\d/.test(a)?`${h(e)}:${o} solid`:`${h(e)}:${o}`).join(`;`)}}return``}let x=0;const S=[],C=[];function w(e,t){return e?`@media(min-width:${e}px){${t}}`:t}function T(e){let t=[];for(let n of Array.from(e.attributes)){if(n.name===`ref`)continue;let r=n.name,i;for(let e of f)if(r.startsWith(e+`:`)){i=d[e],r=r.slice(e.length+1);break}if(r.startsWith(`h:`)){let t=b(r.slice(2));if(t){let n=`_t${x++}`;e.classList.add(n),S.push(w(i,`.${n}:hover{${t.split(`;`).map(e=>e+`!important`).join(`;`)}}`))}e.removeAttribute(n.name);continue}let a=r.match(/^h(\d+):(.+)$/);if(a){let t=b(a[2]);t&&C.push({el:e,level:+a[1],css:t,media:i}),e.removeAttribute(n.name);continue}let o=b(r);if(o){if(i){let t=`_t${x++}`;e.classList.add(t),S.push(w(i,`.${t}{${o.split(`;`).map(e=>e+`!important`).join(`;`)}}`))}else t.push(o);e.removeAttribute(n.name)}}t.length&&e.setAttribute(`style`,(e.getAttribute(`style`)||``)+t.join(`;`))}function E(t){e.innerHTML=String(t);let n={},r=document.createTreeWalker(e.content,NodeFilter.SHOW_ELEMENT),i;for(;i=r.nextNode();)T(i),i.hasAttribute(`ref`)&&(n[i.getAttribute(`ref`)]=i,i.removeAttribute(`ref`));for(let{el:e,level:t,css:n,media:r}of C){let i=e;for(let e=0;e<t;e++)i=i?.parentElement??null;if(i&&i!==e){let t=`_t${x++}`,a=`_t${x++}`;i.classList.add(t),e.classList.add(a),S.push(w(r,`.${t}:hover .${a}{${n.split(`;`).map(e=>e+`!important`).join(`;`)}}`))}}if(C.length=0,document.body.appendChild(e.content),S.length){let e=document.querySelector(`style[data-t]`)||(()=>{let e=document.createElement(`style`);return e.setAttribute(`data-t`,``),document.head.appendChild(e)})();e.textContent+=S.join(``),S.length=0}return n}export{E as t};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Converts a string to camelCase.\n *\n * @example\n * ```ts\n * import { camelCase } from \"@idlapps/t\";\n *\n * camelCase(\"hello-world\"); // \"helloWorld\"\n * camelCase(\"foo_bar_baz\"); // \"fooBarBaz\"\n * camelCase(\"Hello World\"); // \"helloWorld\"\n * camelCase(\"alreadyCamel\"); // \"alreadyCamel\"\n * ```\n */\nexport function camelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, char: string | undefined) =>\n char ? char.toUpperCase() : \"\"\n )\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n}\n\n/**\n * Truncates a string to a maximum length, appending an ellipsis if truncated.\n *\n * @example\n * ```ts\n * import { truncate } from \"@idlapps/t\";\n *\n * truncate(\"Hello, World!\", 5); // \"Hello...\"\n * truncate(\"Hi\", 10); // \"Hi\"\n * truncate(\"abcdefghij\", 7); // \"abcd...\"\n * ```\n */\nexport function truncate(str: string, maxLength: number, suffix = \"...\"): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - suffix.length) + suffix;\n}\n\n/**\n * Converts a string to kebab-case.\n *\n * @example\n * ```ts\n * import { kebabCase } from \"@idlapps/t\";\n *\n * kebabCase(\"helloWorld\"); // \"hello-world\"\n * kebabCase(\"foo_bar_baz\"); // \"foo-bar-baz\"\n * kebabCase(\"Hello World\"); // \"hello-world\"\n * ```\n */\nexport function kebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[_\\s]+/g, \"-\")\n .toLowerCase();\n}\n"],"mappings":"AAaA,SAAgB,EAAU,EAAqB,CAC7C,OAAO,EACJ,QAAQ,gBAAiB,EAAG,IAC3B,EAAO,EAAK,YAAY,EAAI,EAC9B,CAAC,CACA,QAAQ,SAAW,GAAS,EAAK,YAAY,CAAC,CACnD,CAcA,SAAgB,EAAS,EAAa,EAAmB,EAAS,MAAe,CAE/E,OADI,EAAI,QAAU,EAAkB,EAC7B,EAAI,MAAM,EAAG,EAAY,EAAO,MAAM,EAAI,CACnD,CAcA,SAAgB,EAAU,EAAqB,CAC7C,OAAO,EACJ,QAAQ,kBAAmB,OAAO,CAAC,CACnC,QAAQ,UAAW,GAAG,CAAC,CACvB,YAAY,CACjB"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["const T = document.createElement('template');\n\nconst A: Record<string, string> = {\n m: 'margin', p: 'padding', t: 'top', r: 'right', l: 'left', b: 'bottom',\n x: '$l:$r', y: '$t:$b', w: 'width', h: 'height', min: 'min', max: 'max',\n P: 'position', D: 'display', fd: 'flexDirection', C: 'center',\n bg: 'background', cl: 'color', tn: 'transition',\n tx: 'translateX', ty: 'translateY', tr: 'rotate', ts: 'scale',\n fs: 'fontSize', fw: 'fontWeight', lh: 'lineHeight', ls: 'letterSpacing', ta: 'textAlign',\n bd: 'border', rounded: 'borderRadius', shadow: 'boxShadow',\n opacity: 'opacity', z: 'zIndex', overflow: 'overflow',\n gap: 'gap', justify: 'justifyContent', items: 'alignItems',\n ml: '$m$l', mr: '$m$r', mt: '$m$t', mb: '$m$b',\n mx: '$m$l:$m$r', my: '$m$t:$m$b',\n pl: '$p$l', pr: '$p$r', pt: '$p$t', pb: '$p$b',\n px: '$p$l:$p$r', py: '$p$t:$p$b',\n minw: '$min$w', minh: '$min$h', maxw: '$max$w', maxh: '$max$h',\n ba: '$bd', bt: '$bd$t', br: '$bd$r', bb: '$bd$b', bl: '$bd$l',\n bc: 'borderColor', bct: 'borderTopColor', bcr: 'borderRightColor', bcb: 'borderBottomColor', bcl: 'borderLeftColor',\n};\n\nconst exact: Record<string, string> = {\n absolute: '$P:absolute', a: '$P:absolute',\n relative: '$P:relative', r: '$P:relative',\n fixed: '$P:fixed', f: '$P:fixed', sticky: '$P:sticky',\n flex: '$D:flex', c: '$D:flex;$justify:$C;$items:$C',\n h: '$D:flex;$fd:row', v: '$D:flex;$fd:column',\n tac: '$ta:center', tar: '$ta:right', tal: '$ta:left',\n ba: '$bd',\n};\n\nconst colors = new Set(['transparent','currentcolor','inherit','initial','unset','red','blue','green','white','black','yellow','orange','purple','pink','teal','cyan','magenta','lime','maroon','navy','olive','gray','grey','silver','gold','coral','salmon','tomato','crimson','indigo','violet','turquoise','plum','orchid','khaki','lavender','ivory','beige','tan','wheat','peru','sienna','chocolate','firebrick','darkred','lightgreen','darkgreen','lightblue','darkblue','darkcyan','darkmagenta','darkviolet','darkorange','darkgoldenrod','darkslategray','darkolivegreen','mediumseagreen','mediumturquoise','mediumslateblue','mediumorchid','mediumpurple','hotpink','deeppink','palevioletred','lightsalmon','lightcoral','skyblue','lightskyblue','steelblue','dodgerblue','cornflowerblue','royalblue','slateblue','mediumblue','midnightblue','aquamarine','chartreuse','springgreen','forestgreen','limegreen','lawngreen','darkseagreen','palegreen','lightyellow','lemonchiffon','paleturquoise','powderblue','lightsteelblue','aliceblue','ghostwhite','snow','floralwhite','oldlace','linen','antiquewhite','mintcream','mistyrose','peachpuff','navajowhite','burlywood','sandybrown','darksalmon','rosybrown','darkkhaki','palegoldenrod','cadetblue','lightcyan','azure','honeydew','thistle','gainsboro','whitesmoke','darkgray','dimgray','lightslategray','slategray']);\nconst keywords = new Set(['bold','bolder','lighter','normal','italic','oblique','thin','hairline','semibold','extrabold','ultrabold','medium','regular','small','xxsmall','xsmall','large','xlarge','xxlarge','smaller','larger','normal','collapse','hidden','visible','scroll','auto','block','inline','inlineblock','inlineflex','grid','inlinegrid','none','contents','unset','inherit','initial','solid','dashed','dotted','double','groove','ridge','inset','outset','cover','contain','fill','stroke','running','paused','forwards','backwards','both','ease','linear','easein','easeout','easeinout','stepstart','stepend','nowrap','pre','prewrap','preline','breakspace','uppercase','lowercase','capitalize','center','justify','start','end','stretch','baseline','sub','super','overline','through','pointer','default','notallowed','text','wait','help','progress','snapstart','snapend','snapcenter','snearest','mandatory','smooth','noerase','erase','vertical','horizontal','row','column','rowreverse','columnreverse','wrap','wrapreverse']);\nconst unitless = new Set(['z', 'opacity', 'zIndex']);\nconst ms = new Set(['tn', 'transition']);\nconst transforms = new Set(['tx', 'ty', 'translateX', 'translateY', 'tr', 'ts', 'rotate', 'scale']);\nconst solidSuffix = new Set(['ba', 'bt', 'br', 'bb', 'bl', 'border', 'borderTop', 'borderRight', 'borderBottom', 'borderLeft']);\nconst deg = new Set(['tr', 'rotate']);\nconst unitlessVal = new Set(['ts', 'scale']);\nconst BP: Record<string, number> = { sm: 640, md: 768, lg: 1024, xl: 1280, '2xl': 1536 };\nconst BPS = Object.keys(BP).sort((a, b) => b.length - a.length);\nconst AP = Object.keys(A).sort((a, b) => b.length - a.length);\n\nfunction resolve(s: string): string {\n while (s.includes('$')) {\n let r = '', i = 0;\n while (i < s.length) {\n if (s[i] === '$') {\n const m = s.slice(i + 1).match(/^[a-zA-Z]+/);\n if (m) {\n const v = A[m[0]] ?? m[0];\n r += r && /[a-zA-Z]$/.test(r) ? v[0].toUpperCase() + v.slice(1) : v;\n i += 1 + m[0].length;\n continue;\n }\n }\n r += s[i++];\n }\n s = r;\n }\n return s;\n}\n\nconst kebab = (s: string) => s.replace(/([A-Z])/g, '-$1').toLowerCase();\n\nconst toCSS = (v: string) => v.split(';').map(p => { const i = p.indexOf(':'); return i > -1 ? `${kebab(p.slice(0, i))}:${p.slice(i + 1)}` : kebab(p); }).join(';');\n\nfunction parseVal(raw: string, prop: string): string {\n if (/^-?\\d+$/.test(raw)) return unitless.has(prop) || unitlessVal.has(prop) ? raw : ms.has(prop) ? `${raw}ms` : deg.has(prop) ? `${raw}deg` : `${raw}px`;\n if (/^-?\\d+p$/.test(raw)) return `${raw.slice(0, -1)}%`;\n return raw;\n}\n\nconst hex = /^#([0-9a-f]{3,8})$/i;\nconst fn = /^(rgba?|hsla?|oklch|color|linear-gradient|radial-gradient|conic-gradient|repeating-linear-gradient|repeating-radial-gradient)\\(.+\\)$/i;\n\nfunction parse(attr: string): string {\n if (exact[attr]) return toCSS(resolve(exact[attr]));\n\n for (const p of AP) {\n if (!attr.startsWith(p) || p.length >= attr.length) continue;\n const raw = attr.slice(p.length);\n const val = parseVal(raw, p);\n if (/^\\d/.test(raw) || colors.has(raw.toLowerCase()) || keywords.has(raw.toLowerCase()) || hex.test(raw) || fn.test(raw) || raw[0] === '-' && /^\\d/.test(raw.slice(1))) {\n const resolved = resolve(A[p]);\n const props = resolved.includes(':') ? resolved.split(':') : [resolved];\n return props.map(k => transforms.has(k) ? `transform:${k}(${val})` : solidSuffix.has(p) && /^\\d/.test(raw) ? `${kebab(k)}:${val} solid` : `${kebab(k)}:${val}`).join(';');\n }\n }\n return '';\n}\n\nlet C = 0;\nconst R: string[] = [];\nconst pendingHoverTarget: { el: Element; level: number; css: string; media?: number }[] = [];\n\nfunction mediaWrap(m: number | undefined, css: string): string {\n return m ? `@media(min-width:${m}px){${css}}` : css;\n}\n\nfunction apply(el: Element) {\n const s: string[] = [];\n for (const a of Array.from(el.attributes)) {\n if (a.name === 'ref') continue;\n let attr = a.name;\n let media: number | undefined;\n for (const bp of BPS) {\n if (attr.startsWith(bp + ':')) { media = BP[bp]; attr = attr.slice(bp.length + 1); break; }\n }\n if (attr.startsWith('h:')) {\n const css = parse(attr.slice(2));\n if (css) {\n const cls = `_t${C++}`;\n el.classList.add(cls);\n R.push(mediaWrap(media, `.${cls}:hover{${css.split(';').map(p => p + '!important').join(';')}}`));\n }\n el.removeAttribute(a.name);\n continue;\n }\n const hm = attr.match(/^h(\\d+):(.+)$/);\n if (hm) {\n const css = parse(hm[2]);\n if (css) pendingHoverTarget.push({ el, level: +hm[1], css, media });\n el.removeAttribute(a.name);\n continue;\n }\n const css = parse(attr);\n if (css) {\n if (media) {\n const cls = `_t${C++}`;\n el.classList.add(cls);\n R.push(mediaWrap(media, `.${cls}{${css.split(';').map(p => p + '!important').join(';')}}`));\n } else {\n s.push(css);\n }\n el.removeAttribute(a.name);\n }\n }\n if (s.length) el.setAttribute('style', (el.getAttribute('style') || '') + s.join(';'));\n}\n\nexport function t(value: unknown) {\n T.innerHTML = String(value);\n const refs: Record<string, HTMLElement> = {};\n const w = document.createTreeWalker(T.content, NodeFilter.SHOW_ELEMENT);\n let n: HTMLElement | null;\n while ((n = w.nextNode() as HTMLElement | null)) {\n apply(n);\n if (n.hasAttribute('ref')) { refs[n.getAttribute('ref')!] = n; n.removeAttribute('ref'); }\n }\n for (const { el, level, css, media } of pendingHoverTarget) {\n let ancestor: HTMLElement | null = el as HTMLElement;\n for (let i = 0; i < level; i++) ancestor = ancestor?.parentElement ?? null;\n if (ancestor && ancestor !== el) {\n const tCls = `_t${C++}`;\n const hCls = `_t${C++}`;\n ancestor.classList.add(tCls);\n el.classList.add(hCls);\n R.push(mediaWrap(media, `.${tCls}:hover .${hCls}{${css.split(';').map(p => p + '!important').join(';')}}`));\n }\n }\n pendingHoverTarget.length = 0;\n document.body.appendChild(T.content);\n if (R.length) {\n const el = document.querySelector('style[data-t]') as HTMLStyleElement || (() => { const s = document.createElement('style'); s.setAttribute('data-t', ''); return document.head.appendChild(s); })();\n el.textContent += R.join('');\n R.length = 0;\n }\n return refs;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@idlapps/t",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Lightweight, tree-shakable string utility functions",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
"dev": "tsdown --watch",
|
|
28
28
|
"lint": "eslint .",
|
|
29
29
|
"typecheck": "tsc --noEmit",
|
|
30
|
-
"prepublishOnly": "npm run build"
|
|
30
|
+
"prepublishOnly": "npm run build",
|
|
31
|
+
"test": "concurrently \"tsdown --watch\" \"browser-sync start --config bs-config.cjs\""
|
|
31
32
|
},
|
|
32
33
|
"keywords": [
|
|
33
34
|
"string",
|
|
@@ -39,6 +40,9 @@
|
|
|
39
40
|
],
|
|
40
41
|
"license": "MIT",
|
|
41
42
|
"devDependencies": {
|
|
43
|
+
"browser-sync": "^3.0.4",
|
|
44
|
+
"concurrently": "^10.0.5",
|
|
45
|
+
"jsdom": "^30.1.0",
|
|
42
46
|
"tsdown": "^0.22.14",
|
|
43
47
|
"typescript": "^5.8.0"
|
|
44
48
|
},
|