@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.
Files changed (203) hide show
  1. package/README.md +229 -0
  2. package/bin/create-registry.js +1 -1
  3. package/bin/test-mcp.sh +1 -1
  4. package/bin/update-registry.js +2 -2
  5. package/dist/index.d.mts +16 -0
  6. package/dist/index.d.ts +16 -0
  7. package/dist/index.js +9458 -0
  8. package/dist/index.mjs +9449 -0
  9. package/dist/lib/utils.d.mts +2 -0
  10. package/dist/lib/utils.d.ts +2 -0
  11. package/dist/lib/utils.js +47 -0
  12. package/dist/lib/utils.mjs +28 -0
  13. package/dist/src/utils.d.mts +7 -0
  14. package/dist/src/utils.d.ts +7 -0
  15. package/dist/src/utils.js +47 -0
  16. package/dist/src/utils.mjs +28 -0
  17. package/dist/tailwind/index.d.mts +2 -0
  18. package/dist/tailwind/index.d.ts +2 -0
  19. package/dist/tailwind/index.js +2048 -0
  20. package/dist/tailwind/index.mjs +2017 -0
  21. package/dist/types/index.d.mts +12 -0
  22. package/dist/types/index.d.ts +12 -0
  23. package/dist/types/index.js +79 -0
  24. package/dist/types/index.mjs +56 -0
  25. package/package.json +170 -23
  26. package/style/theme-provider.tsx +1 -1
  27. package/MCP-INSTRUCTIONS.md +0 -73
  28. package/README-MCP.md +0 -175
  29. package/blocks/components/accordian-block.tsx +0 -48
  30. package/blocks/components/block-component-props.ts +0 -11
  31. package/blocks/components/bullet-cards-block.tsx +0 -46
  32. package/blocks/components/card-block/index.tsx +0 -171
  33. package/blocks/components/card-block/link-out-button.tsx +0 -20
  34. package/blocks/components/card-block/util.ts +0 -28
  35. package/blocks/components/carte-blanche-block/index.tsx +0 -127
  36. package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
  37. package/blocks/components/content.tsx +0 -70
  38. package/blocks/components/cta-block.tsx +0 -115
  39. package/blocks/components/enh-heading-block.tsx +0 -204
  40. package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
  41. package/blocks/components/grid-block/index.tsx +0 -83
  42. package/blocks/components/grid-block/mutator-registry.ts +0 -10
  43. package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
  44. package/blocks/components/group-block.tsx +0 -83
  45. package/blocks/components/heading-block.tsx +0 -88
  46. package/blocks/components/image-block.tsx +0 -111
  47. package/blocks/components/index.ts +0 -30
  48. package/blocks/components/screenful-block/content.tsx +0 -123
  49. package/blocks/components/screenful-block/index.tsx +0 -107
  50. package/blocks/components/screenful-block/poster-background.tsx +0 -34
  51. package/blocks/components/screenful-block/video-background.tsx +0 -45
  52. package/blocks/components/space-block.tsx +0 -66
  53. package/blocks/components/video-block.tsx +0 -138
  54. package/blocks/def/accordian-block.ts +0 -14
  55. package/blocks/def/block.ts +0 -7
  56. package/blocks/def/bullet-cards-block.ts +0 -22
  57. package/blocks/def/card-block.ts +0 -22
  58. package/blocks/def/carte-blanche-block.ts +0 -21
  59. package/blocks/def/cta-block.ts +0 -19
  60. package/blocks/def/element-block.ts +0 -11
  61. package/blocks/def/enh-heading-block.ts +0 -44
  62. package/blocks/def/grid-block.ts +0 -16
  63. package/blocks/def/group-block.ts +0 -11
  64. package/blocks/def/heading-block.ts +0 -15
  65. package/blocks/def/image-block.ts +0 -31
  66. package/blocks/def/index.ts +0 -35
  67. package/blocks/def/screenful-block.ts +0 -54
  68. package/blocks/def/space-block.ts +0 -64
  69. package/blocks/def/video-block.ts +0 -9
  70. package/blocks/index.ts +0 -2
  71. package/dist/mcp/enhanced-server.d.ts +0 -29
  72. package/dist/mcp/enhanced-server.js +0 -1128
  73. package/dist/mcp/index.d.ts +0 -28
  74. package/dist/mcp/index.js +0 -436
  75. package/dist/registry/api.d.ts +0 -37
  76. package/dist/registry/api.js +0 -129
  77. package/dist/registry/index.d.ts +0 -353
  78. package/dist/registry/index.js +0 -45
  79. package/environment.d.ts +0 -6
  80. package/primitives/accordion.tsx +0 -66
  81. package/primitives/action-button.tsx +0 -42
  82. package/primitives/apply-typography.tsx +0 -55
  83. package/primitives/aspect-ratio.tsx +0 -5
  84. package/primitives/avatar.tsx +0 -49
  85. package/primitives/badge.tsx +0 -36
  86. package/primitives/breadcrumb.tsx +0 -115
  87. package/primitives/breakpoint-indicator.tsx +0 -19
  88. package/primitives/button.tsx +0 -85
  89. package/primitives/calendar.tsx +0 -72
  90. package/primitives/card.tsx +0 -83
  91. package/primitives/carousel.tsx +0 -237
  92. package/primitives/checkbox.tsx +0 -32
  93. package/primitives/combobox.tsx +0 -239
  94. package/primitives/command.tsx +0 -157
  95. package/primitives/context-menu.tsx +0 -200
  96. package/primitives/dialog-video-controller.tsx +0 -38
  97. package/primitives/dialog.tsx +0 -157
  98. package/primitives/drawer.tsx +0 -138
  99. package/primitives/form.tsx +0 -178
  100. package/primitives/icons/github.tsx +0 -14
  101. package/primitives/icons/index.ts +0 -18
  102. package/primitives/icons/youtube-logo.tsx +0 -59
  103. package/primitives/index-common.ts +0 -224
  104. package/primitives/index-next.ts +0 -2
  105. package/primitives/input-otp.tsx +0 -65
  106. package/primitives/input.tsx +0 -30
  107. package/primitives/label.tsx +0 -28
  108. package/primitives/list-adaptor.ts +0 -12
  109. package/primitives/list-box.tsx +0 -74
  110. package/primitives/loading-spinner.tsx +0 -33
  111. package/primitives/navigation-menu.tsx +0 -147
  112. package/primitives/next/image.tsx +0 -90
  113. package/primitives/next/index.ts +0 -7
  114. package/primitives/next/inline-icon.tsx +0 -36
  115. package/primitives/next/link-element.tsx +0 -109
  116. package/primitives/next/mdx-link.tsx +0 -22
  117. package/primitives/next/media-stack.tsx +0 -69
  118. package/primitives/next/nav-items.tsx +0 -45
  119. package/primitives/next/youtube-embed.tsx +0 -83
  120. package/primitives/popover.tsx +0 -37
  121. package/primitives/progress.tsx +0 -27
  122. package/primitives/radio-group.tsx +0 -56
  123. package/primitives/scroll-area.tsx +0 -47
  124. package/primitives/select.tsx +0 -169
  125. package/primitives/separator.tsx +0 -29
  126. package/primitives/sheet.tsx +0 -178
  127. package/primitives/skeleton.tsx +0 -20
  128. package/primitives/slider.tsx +0 -72
  129. package/primitives/sonner.tsx +0 -35
  130. package/primitives/step-indicator.tsx +0 -69
  131. package/primitives/switch.tsx +0 -35
  132. package/primitives/table.tsx +0 -117
  133. package/primitives/tabs.tsx +0 -60
  134. package/primitives/text-area.tsx +0 -26
  135. package/primitives/toggle-group.tsx +0 -63
  136. package/primitives/toggle.tsx +0 -73
  137. package/primitives/tooltip.tsx +0 -48
  138. package/primitives/video-player.tsx +0 -23
  139. package/public/r/accordion.json +0 -11
  140. package/public/r/alert.json +0 -11
  141. package/public/r/avatar.json +0 -11
  142. package/public/r/badge.json +0 -11
  143. package/public/r/button.json +0 -11
  144. package/public/r/card.json +0 -11
  145. package/public/r/checkbox.json +0 -11
  146. package/public/r/default.json +0 -6
  147. package/public/r/dialog.json +0 -11
  148. package/public/r/input.json +0 -11
  149. package/public/r/label.json +0 -11
  150. package/public/r/new-york.json +0 -6
  151. package/public/r/popover.json +0 -11
  152. package/public/r/select.json +0 -11
  153. package/public/r/table.json +0 -11
  154. package/public/r/tabs.json +0 -11
  155. package/public/r/toast.json +0 -11
  156. package/registry.json +0 -184
  157. package/src/mcp/README.md +0 -141
  158. package/src/mcp/enhanced-server.ts +0 -1208
  159. package/src/mcp/index.ts +0 -518
  160. package/src/mcp/package.json +0 -10
  161. package/src/registry/api.ts +0 -164
  162. package/src/registry/index.ts +0 -60
  163. package/src/registry/package.json +0 -10
  164. package/tailwind/colors.tailwind.js +0 -53
  165. package/tailwind/fontFamily.tailwind.ts +0 -7
  166. package/tailwind/fontSize.tailwind.ts +0 -13
  167. package/tailwind/index.ts +0 -7
  168. package/tailwind/safelist.tailwind.js +0 -26
  169. package/tailwind/screens.tailwind.js +0 -8
  170. package/tailwind/spacing.tailwind.js +0 -65
  171. package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
  172. package/tailwind/tailwind.config.hanzo-preset.js +0 -915
  173. package/tailwind/tw-font-desc.ts +0 -15
  174. package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
  175. package/tailwind/typo-plugin/index.d.ts +0 -9
  176. package/tailwind/typo-plugin/index.js +0 -141
  177. package/tailwind/typo-plugin/utils.js +0 -60
  178. package/tailwind/typography-test.mdx +0 -35
  179. package/tailwind/z-index.tailwind.js +0 -71
  180. package/test/test-registry.js +0 -73
  181. package/tsconfig.json +0 -22
  182. package/types/animation-def.ts +0 -3
  183. package/types/breakpoints.ts +0 -11
  184. package/types/bullet-item.ts +0 -10
  185. package/types/button-def.ts +0 -39
  186. package/types/dimensions.ts +0 -8
  187. package/types/grid-def.ts +0 -56
  188. package/types/image-def.ts +0 -32
  189. package/types/index.ts +0 -29
  190. package/types/link-def.ts +0 -56
  191. package/types/media-stack-def.ts +0 -31
  192. package/types/t-shirt-size.ts +0 -5
  193. package/types/tshirt-dimensions.ts +0 -20
  194. package/types/video-def.ts +0 -25
  195. package/util/format-and-abbreviate-as-currency.ts +0 -125
  196. package/util/format-to-max-char.ts +0 -68
  197. package/util/index-client.ts +0 -3
  198. package/util/index.ts +0 -78
  199. package/util/number-abbreviate.ts +0 -49
  200. package/util/specifier.ts +0 -43
  201. package/util/spread-to-transform.ts +0 -24
  202. package/util/step-animation.ts +0 -90
  203. package/util/two-way-map.ts +0 -19
@@ -1,5 +0,0 @@
1
- type TShirtSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'
2
-
3
- export {
4
- type TShirtSize as default
5
- }
@@ -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
-
@@ -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
@@ -1,3 +0,0 @@
1
- export * from './index'
2
- // Must be imported from 'use client'
3
- export * from './step-animation'
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
- }
@@ -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
- }
@@ -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