@hanzo/ui 4.5.4 → 4.7.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/README.md +229 -0
- package/bin/create-registry.js +1 -1
- package/bin/test-mcp.sh +1 -1
- package/bin/update-registry.js +2 -2
- package/dist/index.d.mts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +9458 -0
- package/dist/index.mjs +9449 -0
- package/dist/lib/utils.d.mts +2 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.js +47 -0
- package/dist/lib/utils.mjs +28 -0
- package/dist/src/utils.d.mts +7 -0
- package/dist/src/utils.d.ts +7 -0
- package/dist/src/utils.js +47 -0
- package/dist/src/utils.mjs +28 -0
- package/dist/tailwind/index.d.mts +2 -0
- package/dist/tailwind/index.d.ts +2 -0
- package/dist/tailwind/index.js +2048 -0
- package/dist/tailwind/index.mjs +2017 -0
- package/dist/types/index.d.mts +12 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.js +79 -0
- package/dist/types/index.mjs +56 -0
- package/package.json +170 -23
- package/style/theme-provider.tsx +1 -1
- package/MCP-INSTRUCTIONS.md +0 -73
- package/README-MCP.md +0 -175
- package/blocks/components/accordian-block.tsx +0 -48
- package/blocks/components/block-component-props.ts +0 -11
- package/blocks/components/bullet-cards-block.tsx +0 -46
- package/blocks/components/card-block/index.tsx +0 -171
- package/blocks/components/card-block/link-out-button.tsx +0 -20
- package/blocks/components/card-block/util.ts +0 -28
- package/blocks/components/carte-blanche-block/index.tsx +0 -127
- package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
- package/blocks/components/content.tsx +0 -70
- package/blocks/components/cta-block.tsx +0 -115
- package/blocks/components/enh-heading-block.tsx +0 -204
- package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
- package/blocks/components/grid-block/index.tsx +0 -83
- package/blocks/components/grid-block/mutator-registry.ts +0 -10
- package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
- package/blocks/components/group-block.tsx +0 -83
- package/blocks/components/heading-block.tsx +0 -88
- package/blocks/components/image-block.tsx +0 -111
- package/blocks/components/index.ts +0 -30
- package/blocks/components/screenful-block/content.tsx +0 -123
- package/blocks/components/screenful-block/index.tsx +0 -107
- package/blocks/components/screenful-block/poster-background.tsx +0 -34
- package/blocks/components/screenful-block/video-background.tsx +0 -45
- package/blocks/components/space-block.tsx +0 -66
- package/blocks/components/video-block.tsx +0 -138
- package/blocks/def/accordian-block.ts +0 -14
- package/blocks/def/block.ts +0 -7
- package/blocks/def/bullet-cards-block.ts +0 -22
- package/blocks/def/card-block.ts +0 -22
- package/blocks/def/carte-blanche-block.ts +0 -21
- package/blocks/def/cta-block.ts +0 -19
- package/blocks/def/element-block.ts +0 -11
- package/blocks/def/enh-heading-block.ts +0 -44
- package/blocks/def/grid-block.ts +0 -16
- package/blocks/def/group-block.ts +0 -11
- package/blocks/def/heading-block.ts +0 -15
- package/blocks/def/image-block.ts +0 -31
- package/blocks/def/index.ts +0 -35
- package/blocks/def/screenful-block.ts +0 -54
- package/blocks/def/space-block.ts +0 -64
- package/blocks/def/video-block.ts +0 -9
- package/blocks/index.ts +0 -2
- package/dist/mcp/enhanced-server.d.ts +0 -29
- package/dist/mcp/enhanced-server.js +0 -1128
- package/dist/mcp/index.d.ts +0 -28
- package/dist/mcp/index.js +0 -436
- package/dist/registry/api.d.ts +0 -37
- package/dist/registry/api.js +0 -129
- package/dist/registry/index.d.ts +0 -353
- package/dist/registry/index.js +0 -45
- package/environment.d.ts +0 -6
- package/primitives/accordion.tsx +0 -66
- package/primitives/action-button.tsx +0 -42
- package/primitives/apply-typography.tsx +0 -55
- package/primitives/aspect-ratio.tsx +0 -5
- package/primitives/avatar.tsx +0 -49
- package/primitives/badge.tsx +0 -36
- package/primitives/breadcrumb.tsx +0 -115
- package/primitives/breakpoint-indicator.tsx +0 -19
- package/primitives/button.tsx +0 -85
- package/primitives/calendar.tsx +0 -72
- package/primitives/card.tsx +0 -83
- package/primitives/carousel.tsx +0 -237
- package/primitives/checkbox.tsx +0 -32
- package/primitives/combobox.tsx +0 -239
- package/primitives/command.tsx +0 -157
- package/primitives/context-menu.tsx +0 -200
- package/primitives/dialog-video-controller.tsx +0 -38
- package/primitives/dialog.tsx +0 -157
- package/primitives/drawer.tsx +0 -138
- package/primitives/form.tsx +0 -178
- package/primitives/icons/github.tsx +0 -14
- package/primitives/icons/index.ts +0 -18
- package/primitives/icons/youtube-logo.tsx +0 -59
- package/primitives/index-common.ts +0 -224
- package/primitives/index-next.ts +0 -2
- package/primitives/input-otp.tsx +0 -65
- package/primitives/input.tsx +0 -30
- package/primitives/label.tsx +0 -28
- package/primitives/list-adaptor.ts +0 -12
- package/primitives/list-box.tsx +0 -74
- package/primitives/loading-spinner.tsx +0 -33
- package/primitives/navigation-menu.tsx +0 -147
- package/primitives/next/image.tsx +0 -90
- package/primitives/next/index.ts +0 -7
- package/primitives/next/inline-icon.tsx +0 -36
- package/primitives/next/link-element.tsx +0 -109
- package/primitives/next/mdx-link.tsx +0 -22
- package/primitives/next/media-stack.tsx +0 -69
- package/primitives/next/nav-items.tsx +0 -45
- package/primitives/next/youtube-embed.tsx +0 -83
- package/primitives/popover.tsx +0 -37
- package/primitives/progress.tsx +0 -27
- package/primitives/radio-group.tsx +0 -56
- package/primitives/scroll-area.tsx +0 -47
- package/primitives/select.tsx +0 -169
- package/primitives/separator.tsx +0 -29
- package/primitives/sheet.tsx +0 -178
- package/primitives/skeleton.tsx +0 -20
- package/primitives/slider.tsx +0 -72
- package/primitives/sonner.tsx +0 -35
- package/primitives/step-indicator.tsx +0 -69
- package/primitives/switch.tsx +0 -35
- package/primitives/table.tsx +0 -117
- package/primitives/tabs.tsx +0 -60
- package/primitives/text-area.tsx +0 -26
- package/primitives/toggle-group.tsx +0 -63
- package/primitives/toggle.tsx +0 -73
- package/primitives/tooltip.tsx +0 -48
- package/primitives/video-player.tsx +0 -23
- package/public/r/accordion.json +0 -11
- package/public/r/alert.json +0 -11
- package/public/r/avatar.json +0 -11
- package/public/r/badge.json +0 -11
- package/public/r/button.json +0 -11
- package/public/r/card.json +0 -11
- package/public/r/checkbox.json +0 -11
- package/public/r/default.json +0 -6
- package/public/r/dialog.json +0 -11
- package/public/r/input.json +0 -11
- package/public/r/label.json +0 -11
- package/public/r/new-york.json +0 -6
- package/public/r/popover.json +0 -11
- package/public/r/select.json +0 -11
- package/public/r/table.json +0 -11
- package/public/r/tabs.json +0 -11
- package/public/r/toast.json +0 -11
- package/registry.json +0 -184
- package/src/mcp/README.md +0 -141
- package/src/mcp/enhanced-server.ts +0 -1208
- package/src/mcp/index.ts +0 -518
- package/src/mcp/package.json +0 -10
- package/src/registry/api.ts +0 -164
- package/src/registry/index.ts +0 -60
- package/src/registry/package.json +0 -10
- package/tailwind/colors.tailwind.js +0 -53
- package/tailwind/fontFamily.tailwind.ts +0 -7
- package/tailwind/fontSize.tailwind.ts +0 -13
- package/tailwind/index.ts +0 -7
- package/tailwind/safelist.tailwind.js +0 -26
- package/tailwind/screens.tailwind.js +0 -8
- package/tailwind/spacing.tailwind.js +0 -65
- package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
- package/tailwind/tailwind.config.hanzo-preset.js +0 -915
- package/tailwind/tw-font-desc.ts +0 -15
- package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
- package/tailwind/typo-plugin/index.d.ts +0 -9
- package/tailwind/typo-plugin/index.js +0 -141
- package/tailwind/typo-plugin/utils.js +0 -60
- package/tailwind/typography-test.mdx +0 -35
- package/tailwind/z-index.tailwind.js +0 -71
- package/test/test-registry.js +0 -73
- package/tsconfig.json +0 -22
- package/types/animation-def.ts +0 -3
- package/types/breakpoints.ts +0 -11
- package/types/bullet-item.ts +0 -10
- package/types/button-def.ts +0 -39
- package/types/dimensions.ts +0 -8
- package/types/grid-def.ts +0 -56
- package/types/image-def.ts +0 -32
- package/types/index.ts +0 -29
- package/types/link-def.ts +0 -56
- package/types/media-stack-def.ts +0 -31
- package/types/t-shirt-size.ts +0 -5
- package/types/tshirt-dimensions.ts +0 -20
- package/types/video-def.ts +0 -25
- package/util/format-and-abbreviate-as-currency.ts +0 -125
- package/util/format-to-max-char.ts +0 -68
- package/util/index-client.ts +0 -3
- package/util/index.ts +0 -78
- package/util/number-abbreviate.ts +0 -49
- package/util/specifier.ts +0 -43
- package/util/spread-to-transform.ts +0 -24
- package/util/step-animation.ts +0 -90
- package/util/two-way-map.ts +0 -19
package/types/t-shirt-size.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
type ConcreteDimensions = {
|
|
2
|
-
w: number
|
|
3
|
-
h: number
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
// TODO: This is only used by VideoDef.
|
|
7
|
-
// Is there a better way w @next/video?
|
|
8
|
-
type TShirtDimensions = {
|
|
9
|
-
xs?: ConcreteDimensions
|
|
10
|
-
sm?: ConcreteDimensions
|
|
11
|
-
md: ConcreteDimensions
|
|
12
|
-
lg?: ConcreteDimensions
|
|
13
|
-
xl?: ConcreteDimensions
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export {
|
|
17
|
-
type TShirtDimensions as default
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
package/types/video-def.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type TShirtDimensions from './tshirt-dimensions'
|
|
2
|
-
|
|
3
|
-
interface VideoDef {
|
|
4
|
-
videoProps?: any // For example,
|
|
5
|
-
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
6
|
-
videoProps: {
|
|
7
|
-
autoPlay: true,
|
|
8
|
-
loop: true,
|
|
9
|
-
muted: true,
|
|
10
|
-
playsInline: true
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
Valueless props are boolean.
|
|
14
|
-
NOTE: Must be camalCase as per React conventions! (playsinline => playsInline)
|
|
15
|
-
~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
16
|
-
poster?: string
|
|
17
|
-
sources?: string[]
|
|
18
|
-
dim: TShirtDimensions
|
|
19
|
-
// These are suppored so far: { vh: 60, mobile: {vw: 70} }
|
|
20
|
-
sizing?: any
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export {
|
|
24
|
-
type VideoDef as default
|
|
25
|
-
}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import Abbr, { type QuantityAbbrSymbol, ABBR_SYMBOLS_ARRAY } from './number-abbreviate'
|
|
2
|
-
|
|
3
|
-
interface FormatThreshold {
|
|
4
|
-
from: number
|
|
5
|
-
use: QuantityAbbrSymbol
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const usdFormatter = Intl.NumberFormat('en-US', {
|
|
9
|
-
style: 'currency',
|
|
10
|
-
currency: 'USD',
|
|
11
|
-
minimumFractionDigits: 2,
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
const formatAsUSCurrency = (n: number) => {
|
|
15
|
-
let result = usdFormatter.format(n)
|
|
16
|
-
return result.endsWith('.00') ? result.slice(0, -3) : result
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const formatAndAbbreviateAsCurrency = (
|
|
20
|
-
n: number | null,
|
|
21
|
-
thresholds: FormatThreshold[] = [{
|
|
22
|
-
from: 1000000000,
|
|
23
|
-
use: 'M'
|
|
24
|
-
}],
|
|
25
|
-
/**
|
|
26
|
-
* Chars that will be added by ui if the number is rounded.
|
|
27
|
-
* For example, if the desired output for 10.15 is "~10.1",
|
|
28
|
-
* the tilda counts as 1 char.
|
|
29
|
-
*/
|
|
30
|
-
roundingAdds: number = 1,
|
|
31
|
-
maxDecimal: number = 2
|
|
32
|
-
): {
|
|
33
|
-
full: string
|
|
34
|
-
result: string
|
|
35
|
-
change: 'rounded' | 'none' | 'abbr' | 'empty'
|
|
36
|
-
} => {
|
|
37
|
-
if (n === null) {
|
|
38
|
-
return {
|
|
39
|
-
full: '',
|
|
40
|
-
result: '',
|
|
41
|
-
change: 'empty'
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const formatted = formatAsUSCurrency(n)
|
|
46
|
-
|
|
47
|
-
if (n < thresholds[0].from) {
|
|
48
|
-
return {
|
|
49
|
-
full: formatted,
|
|
50
|
-
result: formatted,
|
|
51
|
-
change: 'none'
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Get operative FormatThreshold pair...
|
|
56
|
-
let threshold: FormatThreshold
|
|
57
|
-
for (
|
|
58
|
-
let i = 0;
|
|
59
|
-
i < thresholds.length && n >= thresholds[i].from;
|
|
60
|
-
threshold = thresholds[i], i++
|
|
61
|
-
) {}
|
|
62
|
-
|
|
63
|
-
// Build up units array to all units
|
|
64
|
-
// up to threshold.use
|
|
65
|
-
const units: QuantityAbbrSymbol[] = []
|
|
66
|
-
for (let i = 0; i < ABBR_SYMBOLS_ARRAY.length; i++) {
|
|
67
|
-
const current = ABBR_SYMBOLS_ARRAY[i]
|
|
68
|
-
units.push(current)
|
|
69
|
-
if (current === threshold!.use) {
|
|
70
|
-
break
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const abbreviator = new Abbr(units)
|
|
75
|
-
|
|
76
|
-
// Use threshold.from as a guide to how many chars are available:
|
|
77
|
-
// first digit + comma = 2
|
|
78
|
-
// Possible trailing cents: '.xx'.length = 3
|
|
79
|
-
// 3 - 2 = 1
|
|
80
|
-
const charsAvail = formatAsUSCurrency(threshold!.from).length + 1
|
|
81
|
-
const abbr = abbreviator.abbreviate(n, charsAvail) // arbitrary, but good approx
|
|
82
|
-
const numStr = abbr.slice(0, -1)
|
|
83
|
-
const abbreviation = abbr.slice(-1)
|
|
84
|
-
const numerical = parseFloat(numStr)
|
|
85
|
-
|
|
86
|
-
const integral = Math.floor(numerical)
|
|
87
|
-
const integralString = formatAsUSCurrency(integral)
|
|
88
|
-
const commas = integralString.split(',').length - 1
|
|
89
|
-
|
|
90
|
-
// minus abbr, dec point, dollar sign, and roundingAdds / tilda,
|
|
91
|
-
// (1 + 1 + 1 + roundingAdds)
|
|
92
|
-
// ("precision" does NOT include the decimal point itself,
|
|
93
|
-
// so we have to explicitly factor it in.)
|
|
94
|
-
const roundedString = numerical.toPrecision(charsAvail - commas - (3 + roundingAdds))
|
|
95
|
-
// remove trailing zeros, if any
|
|
96
|
-
const roundedNumerical = parseFloat(roundedString)
|
|
97
|
-
const roundedIntegral = Math.trunc(roundedNumerical)
|
|
98
|
-
const roundedIntegralString = formatAsUSCurrency(roundedIntegral)
|
|
99
|
-
|
|
100
|
-
let decimalPortion = roundedNumerical - roundedIntegral
|
|
101
|
-
let result
|
|
102
|
-
if (decimalPortion !== 0) {
|
|
103
|
-
// remove trailing zeros if any
|
|
104
|
-
decimalPortion = parseFloat(decimalPortion.toFixed(maxDecimal))
|
|
105
|
-
const decimalPortionString = decimalPortion.toString()
|
|
106
|
-
const afterDecimalString = decimalPortionString.slice(decimalPortionString.indexOf('.') + 1)
|
|
107
|
-
result = roundedIntegralString + '.' + afterDecimalString + abbreviation
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
result = roundedIntegralString + abbreviation
|
|
111
|
-
}
|
|
112
|
-
// Did we lose any precision?
|
|
113
|
-
const rounded = (roundedIntegral + decimalPortion !== n)
|
|
114
|
-
return {
|
|
115
|
-
full: formatted,
|
|
116
|
-
result,
|
|
117
|
-
change: rounded ? 'rounded' : 'abbr'
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export {
|
|
122
|
-
formatAndAbbreviateAsCurrency as default,
|
|
123
|
-
type FormatThreshold,
|
|
124
|
-
type QuantityAbbrSymbol
|
|
125
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import Abbr from './number-abbreviate'
|
|
2
|
-
|
|
3
|
-
const abbr = new Abbr(['K', 'M', 'B', 'T'])
|
|
4
|
-
|
|
5
|
-
const formatToMaxChar = (
|
|
6
|
-
n: number | null,
|
|
7
|
-
maxChars: number,
|
|
8
|
-
/**
|
|
9
|
-
* Chars that will be added by ui if the number is rounded.
|
|
10
|
-
* For example, if the desired output for 10.15 is "~10.1",
|
|
11
|
-
* the tilda counts as 1 char.
|
|
12
|
-
*/
|
|
13
|
-
roundingAdds: number = 1
|
|
14
|
-
): {
|
|
15
|
-
result: string
|
|
16
|
-
change: 'rounded' | 'none' | 'abbr' | 'empty'
|
|
17
|
-
} => {
|
|
18
|
-
if (n === null) {
|
|
19
|
-
return {
|
|
20
|
-
result: '',
|
|
21
|
-
change: 'empty'
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
const s = n.toString()
|
|
25
|
-
if (s.length > maxChars) {
|
|
26
|
-
// Highest number that can be rounded down to an
|
|
27
|
-
// acceptable string.
|
|
28
|
-
// Decimal point, plus one decimal place = 2 chars
|
|
29
|
-
const cuttoff = Math.pow(10, maxChars - 2 - roundingAdds) - 0.05
|
|
30
|
-
if (n < cuttoff) {
|
|
31
|
-
const intPortion = Math.floor(n)
|
|
32
|
-
const len = intPortion.toString().length
|
|
33
|
-
// 1 is for dec point itself
|
|
34
|
-
const availDecimals = maxChars - len - 1 - roundingAdds
|
|
35
|
-
// removes trailing zeros, if any
|
|
36
|
-
const roundedNumerical = parseFloat(n.toFixed(availDecimals))
|
|
37
|
-
return {
|
|
38
|
-
result: roundedNumerical.toString(),
|
|
39
|
-
change: 'rounded'
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
|
|
44
|
-
const str = abbr.abbreviate(n, maxChars)
|
|
45
|
-
const numStr = str.slice(0, -1)
|
|
46
|
-
const abbreviation = str.slice(-1)
|
|
47
|
-
const numerical = parseFloat(numStr)
|
|
48
|
-
|
|
49
|
-
// minus abbr, dec point, and roundingAdds / tilda,
|
|
50
|
-
// (1 + 1 + roundingAdds)
|
|
51
|
-
// ("precision" does NOT include the decimal point itself,
|
|
52
|
-
// so we have to explicitly factor it in.)
|
|
53
|
-
const roundedString = numerical.toPrecision(maxChars - (2 + roundingAdds))
|
|
54
|
-
// remove trailing zeros, if any
|
|
55
|
-
const roundedNumerical = parseFloat(roundedString)
|
|
56
|
-
return {
|
|
57
|
-
result: roundedNumerical.toString() + abbreviation,
|
|
58
|
-
change: roundedNumerical === numerical ? 'abbr' : 'rounded'
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return {
|
|
63
|
-
result: s,
|
|
64
|
-
change: 'none'
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export default formatToMaxChar
|
package/util/index-client.ts
DELETED
package/util/index.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { compiler as mdCompiler } from 'markdown-to-jsx'
|
|
2
|
-
|
|
3
|
-
import { clsx, type ClassValue } from 'clsx'
|
|
4
|
-
import { twMerge } from 'tailwind-merge'
|
|
5
|
-
export { cva, type VariantProps } from 'class-variance-authority'
|
|
6
|
-
|
|
7
|
-
import type { Dimensions } from '../types'
|
|
8
|
-
|
|
9
|
-
import { default as _merge } from 'lodash.merge'
|
|
10
|
-
|
|
11
|
-
export const cn = (...inputs: ClassValue[]) => (
|
|
12
|
-
twMerge(clsx(inputs))
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
export const markdown = (s: string, options?: any): JSX.Element => (
|
|
16
|
-
mdCompiler(s, {
|
|
17
|
-
wrapper: null,
|
|
18
|
-
...options
|
|
19
|
-
})
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
export const round = (num: number): string => (
|
|
23
|
-
num
|
|
24
|
-
.toFixed(7)
|
|
25
|
-
.replace(/(\.[0-9]+?)0+$/, '$1')
|
|
26
|
-
.replace(/\.0$/, '')
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
export const pxToRem = (px: number, base: number): string => (`${round(px / base)}rem`)
|
|
30
|
-
|
|
31
|
-
export const pxToEm = (px: number, base: number): string => (`${round(px / base)}em`)
|
|
32
|
-
|
|
33
|
-
export const hexToRgb = (hex: string): string => {
|
|
34
|
-
hex = hex.replace('#', '')
|
|
35
|
-
hex = hex.length === 3 ? hex.replace(/./g, '$&$&') : hex
|
|
36
|
-
const r = parseInt(hex.substring(0, 2), 16)
|
|
37
|
-
const g = parseInt(hex.substring(2, 4), 16)
|
|
38
|
-
const b = parseInt(hex.substring(4, 6), 16)
|
|
39
|
-
return `${r} ${g} ${b}`
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
export const asNum = (n: number | `${number}`): number => (
|
|
44
|
-
(typeof n === 'number') ? n : parseInt(n, 10)
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
// https://stackoverflow.com/questions/3971841/how-to-resize-images-proportionally-keeping-the-aspect-ratio
|
|
48
|
-
export const constrain = (d: Dimensions, c: Dimensions): Dimensions => {
|
|
49
|
-
|
|
50
|
-
const ratio = Math.min(c.w / d.w, c.h / d.h)
|
|
51
|
-
return {
|
|
52
|
-
w: Math.round(d.w * ratio),
|
|
53
|
-
h: Math.round(d.h * ratio)
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export const containsToken = (s: string | undefined, toFind: string): boolean => (s ? s.split(' ').includes(toFind) : false)
|
|
58
|
-
|
|
59
|
-
export const ldMerge = (
|
|
60
|
-
result: any,
|
|
61
|
-
...sources: any[]
|
|
62
|
-
): any => (_merge(result, ...sources))
|
|
63
|
-
|
|
64
|
-
export const capitalize = (str: string): string => (
|
|
65
|
-
str.charAt(0).toUpperCase() + str.slice(1)
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
export { default as spreadToTransform } from './spread-to-transform'
|
|
69
|
-
export { default as formatToMaxChar } from './format-to-max-char'
|
|
70
|
-
export {
|
|
71
|
-
default as formatAndAbbreviateAsCurrency,
|
|
72
|
-
type FormatThreshold,
|
|
73
|
-
type QuantityAbbrSymbol
|
|
74
|
-
} from './format-and-abbreviate-as-currency'
|
|
75
|
-
|
|
76
|
-
// Must be imported from 'use client', so can't include this...
|
|
77
|
-
// export * from './step-animation'
|
|
78
|
-
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
// cf: https://github.com/domharrington/js-number-abbreviate/blob/master/index.js
|
|
2
|
-
|
|
3
|
-
type QuantityAbbrSymbol = 'K' | 'M' | 'B' | 'T'
|
|
4
|
-
const ABBR_SYMBOLS_ARRAY = ['K', 'M', 'B', 'T'] satisfies QuantityAbbrSymbol[]
|
|
5
|
-
|
|
6
|
-
class NumberAbbreviator {
|
|
7
|
-
|
|
8
|
-
private _units: QuantityAbbrSymbol[]
|
|
9
|
-
|
|
10
|
-
constructor(units?: QuantityAbbrSymbol[]) {
|
|
11
|
-
this._units = units ?? ABBR_SYMBOLS_ARRAY
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
private _abbreviate = (
|
|
15
|
-
n: number,
|
|
16
|
-
decPlaces: number,
|
|
17
|
-
log: boolean = false
|
|
18
|
-
): string => {
|
|
19
|
-
|
|
20
|
-
const _decPlaces = Math.pow(10, decPlaces)
|
|
21
|
-
let _n = n
|
|
22
|
-
|
|
23
|
-
let _unit
|
|
24
|
-
for (let i = this._units.length - 1; i >= 0; i--) {
|
|
25
|
-
const size = Math.pow(10, (i + 1) * 3)
|
|
26
|
-
if (size <= _n) {
|
|
27
|
-
_n = Math.round(_n * _decPlaces / size) / _decPlaces
|
|
28
|
-
if ((_n === 1000) && (i < this._units.length - 1)) {
|
|
29
|
-
_n = 1
|
|
30
|
-
i++
|
|
31
|
-
}
|
|
32
|
-
_unit = this._units[i]
|
|
33
|
-
break
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return _n.toString() + (_unit ?? '')
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
abbreviate = (n: number, decPlaces: number, log: boolean = false) => {
|
|
40
|
-
const abbreviatedNumber = this._abbreviate(Math.abs(n), decPlaces, log)
|
|
41
|
-
return n < 0 ? '-' + abbreviatedNumber : abbreviatedNumber
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export {
|
|
46
|
-
type QuantityAbbrSymbol,
|
|
47
|
-
ABBR_SYMBOLS_ARRAY,
|
|
48
|
-
NumberAbbreviator as default
|
|
49
|
-
}
|
package/util/specifier.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { Dimensions, TShirtSize } from '../types'
|
|
2
|
-
import type { TypographySize } from '../primitives/apply-typography'
|
|
3
|
-
|
|
4
|
-
export const getPrimaryStartingWith = (s: string, toFind: string) => {
|
|
5
|
-
const tokenArray = s.split(' ')
|
|
6
|
-
return tokenArray.find((tok) => (tok.startsWith(`${toFind}-`)))
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export const getTShirtSize = (s: string): TShirtSize | undefined => {
|
|
10
|
-
const subTokenArray = s.split('-')
|
|
11
|
-
return subTokenArray[subTokenArray.length - 1] as TShirtSize
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const getTypographySize = (s: string): TypographySize | undefined => {
|
|
15
|
-
const subTokenArray = s.split('-')
|
|
16
|
-
return subTokenArray[subTokenArray.length - 1] as TypographySize
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const getDim = (s: string): Dimensions | undefined => {
|
|
20
|
-
const subTokenArray = s.split('-')
|
|
21
|
-
const dimStr = subTokenArray[subTokenArray.length - 1]
|
|
22
|
-
if (dimStr) {
|
|
23
|
-
const dimTokenArray = s.split('x')
|
|
24
|
-
return dimTokenArray ? {
|
|
25
|
-
w: Number(dimTokenArray[0]),
|
|
26
|
-
h: Number(dimTokenArray[1])
|
|
27
|
-
} : undefined
|
|
28
|
-
}
|
|
29
|
-
return undefined
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function getSpecifierData<T>(
|
|
33
|
-
main: string,
|
|
34
|
-
getPrimary: (s: string) => string | undefined,
|
|
35
|
-
getData: (s: string) => T | undefined,
|
|
36
|
-
def?: T
|
|
37
|
-
): T | undefined {
|
|
38
|
-
const primary = getPrimary(main)
|
|
39
|
-
if (primary) {
|
|
40
|
-
return getData(primary) ?? def
|
|
41
|
-
}
|
|
42
|
-
return def ?? undefined
|
|
43
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { MediaTransform } from '../types'
|
|
2
|
-
|
|
3
|
-
export default (t: MediaTransform) => {
|
|
4
|
-
|
|
5
|
-
let transformStrings: string[] = []
|
|
6
|
-
const scaleVal = 'scale' in t ? t.scale : undefined
|
|
7
|
-
if (scaleVal) {
|
|
8
|
-
if (typeof scaleVal === 'number') {
|
|
9
|
-
transformStrings.push(`scale(${scaleVal})`)
|
|
10
|
-
}
|
|
11
|
-
else if (
|
|
12
|
-
Array.isArray(scaleVal) &&
|
|
13
|
-
scaleVal.length == 2 &&
|
|
14
|
-
typeof scaleVal[0] === 'number'
|
|
15
|
-
) {
|
|
16
|
-
transformStrings.push(`scale(${scaleVal[0]}, ${scaleVal[1]})`)
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
throw new Error("parsing MediaTransform: Unrecognized value for 'scale'!")
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return transformStrings.length > 0 ? { transform: transformStrings.join(' ') } : {}
|
|
24
|
-
}
|
package/util/step-animation.ts
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { useEffect, useRef } from 'react'
|
|
2
|
-
import { makeObservable, reaction, computed, type IReactionDisposer, observable, action } from 'mobx'
|
|
3
|
-
|
|
4
|
-
interface StepAnimation {
|
|
5
|
-
notPast(step: number): boolean
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
class MyStepAnimation implements StepAnimation {
|
|
9
|
-
|
|
10
|
-
_step: number = -1
|
|
11
|
-
_reactionDisposer: IReactionDisposer | undefined = undefined
|
|
12
|
-
|
|
13
|
-
_initialStep: () => boolean
|
|
14
|
-
_intervals: number[]
|
|
15
|
-
|
|
16
|
-
/** initialStep: false -> true: step 0
|
|
17
|
-
true -> false: step 1
|
|
18
|
-
after intervals[0] : step 2
|
|
19
|
-
after intervals[1] : step 3
|
|
20
|
-
|
|
21
|
-
initialStep must contain at least one mobx observable and return boolean
|
|
22
|
-
see: https://mobx.js.org/reactions.html#reaction
|
|
23
|
-
*/
|
|
24
|
-
constructor(initialStep: () => boolean, intervals: number[]) {
|
|
25
|
-
|
|
26
|
-
this._initialStep = initialStep
|
|
27
|
-
this._intervals = intervals
|
|
28
|
-
|
|
29
|
-
makeObservable(this, {
|
|
30
|
-
_step: observable,
|
|
31
|
-
_setStep: action
|
|
32
|
-
})
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// This is separated out because reactions have to be created
|
|
36
|
-
// once we have a valid doc / window etc. (mobx internals)
|
|
37
|
-
// Can't just do it in constructor and assign to ref
|
|
38
|
-
initialize = () => {
|
|
39
|
-
|
|
40
|
-
const fireNext = () => {
|
|
41
|
-
this._setStep(this._step + 1)
|
|
42
|
-
if (this._step <= this._intervals.length) {
|
|
43
|
-
// No need to call clearTimeout(): https://stackoverflow.com/a/7391588/11645689
|
|
44
|
-
setTimeout(() => { fireNext() }, this._intervals[this._step - 1])
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
this._reactionDisposer = reaction(
|
|
49
|
-
this._initialStep,
|
|
50
|
-
(triggered: boolean) => {
|
|
51
|
-
if (triggered && this._step === -1) {
|
|
52
|
-
this._setStep(0)
|
|
53
|
-
}
|
|
54
|
-
// extra safe
|
|
55
|
-
else if (this._step === 0) {
|
|
56
|
-
fireNext()
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
_setStep = (v: number): void => {this._step = v}
|
|
63
|
-
|
|
64
|
-
dispose = () => {
|
|
65
|
-
if (this._reactionDisposer) {
|
|
66
|
-
this._reactionDisposer()
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// https://mobx.js.org/computeds-with-args.html#2-close-over-the-arguments
|
|
71
|
-
notPast = (step: number): boolean => (
|
|
72
|
-
computed(() => (this._step > -1 && this._step <= step)).get()
|
|
73
|
-
)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const useStepAnimation = (initialStep: () => boolean, intervals: number[]): StepAnimation => {
|
|
77
|
-
|
|
78
|
-
const animRef = useRef<MyStepAnimation>(new MyStepAnimation(initialStep, intervals))
|
|
79
|
-
useEffect(() => {
|
|
80
|
-
animRef.current.initialize()
|
|
81
|
-
return animRef.current.dispose
|
|
82
|
-
}, [])
|
|
83
|
-
|
|
84
|
-
return animRef.current
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export {
|
|
88
|
-
type StepAnimation,
|
|
89
|
-
useStepAnimation
|
|
90
|
-
}
|
package/util/two-way-map.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
class TwoWayReadonlyMap<T, K> {
|
|
2
|
-
map: Map<T, K>;
|
|
3
|
-
reverseMap: Map<K, T>;
|
|
4
|
-
constructor(map: Map<T, K>) {
|
|
5
|
-
this.map = map;
|
|
6
|
-
this.reverseMap = new Map<K, T>();
|
|
7
|
-
map.forEach((value, key) => {
|
|
8
|
-
this.reverseMap.set(value, key);
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
get(key: T) {
|
|
12
|
-
return this.map.get(key);
|
|
13
|
-
}
|
|
14
|
-
revGet(key: K) {
|
|
15
|
-
return this.reverseMap.get(key);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export default TwoWayReadonlyMap
|