@seanyeh77/ui 0.0.0-stage → 0.3.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 (564) hide show
  1. package/dist/bundle.js +81 -0
  2. package/dist/bundle.js.map +1 -0
  3. package/dist/fonts/LICENSE-OFL.txt +93 -0
  4. package/dist/fonts/geist-mono-cyrillic-400-normal.woff2 +0 -0
  5. package/dist/fonts/geist-mono-cyrillic-500-normal.woff2 +0 -0
  6. package/dist/fonts/geist-mono-cyrillic-600-normal.woff2 +0 -0
  7. package/dist/fonts/geist-mono-cyrillic-700-normal.woff2 +0 -0
  8. package/dist/fonts/geist-mono-cyrillic-ext-400-normal.woff2 +0 -0
  9. package/dist/fonts/geist-mono-cyrillic-ext-500-normal.woff2 +0 -0
  10. package/dist/fonts/geist-mono-cyrillic-ext-600-normal.woff2 +0 -0
  11. package/dist/fonts/geist-mono-cyrillic-ext-700-normal.woff2 +0 -0
  12. package/dist/fonts/geist-mono-latin-400-normal.woff2 +0 -0
  13. package/dist/fonts/geist-mono-latin-500-normal.woff2 +0 -0
  14. package/dist/fonts/geist-mono-latin-600-normal.woff2 +0 -0
  15. package/dist/fonts/geist-mono-latin-700-normal.woff2 +0 -0
  16. package/dist/fonts/geist-mono-latin-ext-400-normal.woff2 +0 -0
  17. package/dist/fonts/geist-mono-latin-ext-500-normal.woff2 +0 -0
  18. package/dist/fonts/geist-mono-latin-ext-600-normal.woff2 +0 -0
  19. package/dist/fonts/geist-mono-latin-ext-700-normal.woff2 +0 -0
  20. package/dist/fonts/geist-mono-symbols2-400-normal.woff2 +0 -0
  21. package/dist/fonts/geist-mono-symbols2-500-normal.woff2 +0 -0
  22. package/dist/fonts/geist-mono-symbols2-600-normal.woff2 +0 -0
  23. package/dist/fonts/geist-mono-symbols2-700-normal.woff2 +0 -0
  24. package/dist/fonts/geist-mono-vietnamese-400-normal.woff2 +0 -0
  25. package/dist/fonts/geist-mono-vietnamese-500-normal.woff2 +0 -0
  26. package/dist/fonts/geist-mono-vietnamese-600-normal.woff2 +0 -0
  27. package/dist/fonts/geist-mono-vietnamese-700-normal.woff2 +0 -0
  28. package/dist/fonts/inter-cyrillic-400-normal.woff2 +0 -0
  29. package/dist/fonts/inter-cyrillic-500-normal.woff2 +0 -0
  30. package/dist/fonts/inter-cyrillic-600-normal.woff2 +0 -0
  31. package/dist/fonts/inter-cyrillic-700-normal.woff2 +0 -0
  32. package/dist/fonts/inter-cyrillic-ext-400-normal.woff2 +0 -0
  33. package/dist/fonts/inter-cyrillic-ext-500-normal.woff2 +0 -0
  34. package/dist/fonts/inter-cyrillic-ext-600-normal.woff2 +0 -0
  35. package/dist/fonts/inter-cyrillic-ext-700-normal.woff2 +0 -0
  36. package/dist/fonts/inter-greek-400-normal.woff2 +0 -0
  37. package/dist/fonts/inter-greek-500-normal.woff2 +0 -0
  38. package/dist/fonts/inter-greek-600-normal.woff2 +0 -0
  39. package/dist/fonts/inter-greek-700-normal.woff2 +0 -0
  40. package/dist/fonts/inter-greek-ext-400-normal.woff2 +0 -0
  41. package/dist/fonts/inter-greek-ext-500-normal.woff2 +0 -0
  42. package/dist/fonts/inter-greek-ext-600-normal.woff2 +0 -0
  43. package/dist/fonts/inter-greek-ext-700-normal.woff2 +0 -0
  44. package/dist/fonts/inter-latin-400-normal.woff2 +0 -0
  45. package/dist/fonts/inter-latin-500-normal.woff2 +0 -0
  46. package/dist/fonts/inter-latin-600-normal.woff2 +0 -0
  47. package/dist/fonts/inter-latin-700-normal.woff2 +0 -0
  48. package/dist/fonts/inter-latin-ext-400-normal.woff2 +0 -0
  49. package/dist/fonts/inter-latin-ext-500-normal.woff2 +0 -0
  50. package/dist/fonts/inter-latin-ext-600-normal.woff2 +0 -0
  51. package/dist/fonts/inter-latin-ext-700-normal.woff2 +0 -0
  52. package/dist/fonts/inter-vietnamese-400-normal.woff2 +0 -0
  53. package/dist/fonts/inter-vietnamese-500-normal.woff2 +0 -0
  54. package/dist/fonts/inter-vietnamese-600-normal.woff2 +0 -0
  55. package/dist/fonts/inter-vietnamese-700-normal.woff2 +0 -0
  56. package/dist/fonts/noto-sans-tc-0-400-normal.woff2 +0 -0
  57. package/dist/fonts/noto-sans-tc-0-500-normal.woff2 +0 -0
  58. package/dist/fonts/noto-sans-tc-0-600-normal.woff2 +0 -0
  59. package/dist/fonts/noto-sans-tc-0-700-normal.woff2 +0 -0
  60. package/dist/fonts/noto-sans-tc-1-400-normal.woff2 +0 -0
  61. package/dist/fonts/noto-sans-tc-1-500-normal.woff2 +0 -0
  62. package/dist/fonts/noto-sans-tc-1-600-normal.woff2 +0 -0
  63. package/dist/fonts/noto-sans-tc-1-700-normal.woff2 +0 -0
  64. package/dist/fonts/noto-sans-tc-10-400-normal.woff2 +0 -0
  65. package/dist/fonts/noto-sans-tc-10-500-normal.woff2 +0 -0
  66. package/dist/fonts/noto-sans-tc-10-600-normal.woff2 +0 -0
  67. package/dist/fonts/noto-sans-tc-10-700-normal.woff2 +0 -0
  68. package/dist/fonts/noto-sans-tc-101-400-normal.woff2 +0 -0
  69. package/dist/fonts/noto-sans-tc-101-500-normal.woff2 +0 -0
  70. package/dist/fonts/noto-sans-tc-101-600-normal.woff2 +0 -0
  71. package/dist/fonts/noto-sans-tc-101-700-normal.woff2 +0 -0
  72. package/dist/fonts/noto-sans-tc-102-400-normal.woff2 +0 -0
  73. package/dist/fonts/noto-sans-tc-102-500-normal.woff2 +0 -0
  74. package/dist/fonts/noto-sans-tc-102-600-normal.woff2 +0 -0
  75. package/dist/fonts/noto-sans-tc-102-700-normal.woff2 +0 -0
  76. package/dist/fonts/noto-sans-tc-103-400-normal.woff2 +0 -0
  77. package/dist/fonts/noto-sans-tc-103-500-normal.woff2 +0 -0
  78. package/dist/fonts/noto-sans-tc-103-600-normal.woff2 +0 -0
  79. package/dist/fonts/noto-sans-tc-103-700-normal.woff2 +0 -0
  80. package/dist/fonts/noto-sans-tc-104-400-normal.woff2 +0 -0
  81. package/dist/fonts/noto-sans-tc-104-500-normal.woff2 +0 -0
  82. package/dist/fonts/noto-sans-tc-104-600-normal.woff2 +0 -0
  83. package/dist/fonts/noto-sans-tc-104-700-normal.woff2 +0 -0
  84. package/dist/fonts/noto-sans-tc-105-400-normal.woff2 +0 -0
  85. package/dist/fonts/noto-sans-tc-105-500-normal.woff2 +0 -0
  86. package/dist/fonts/noto-sans-tc-105-600-normal.woff2 +0 -0
  87. package/dist/fonts/noto-sans-tc-105-700-normal.woff2 +0 -0
  88. package/dist/fonts/noto-sans-tc-106-400-normal.woff2 +0 -0
  89. package/dist/fonts/noto-sans-tc-106-500-normal.woff2 +0 -0
  90. package/dist/fonts/noto-sans-tc-106-600-normal.woff2 +0 -0
  91. package/dist/fonts/noto-sans-tc-106-700-normal.woff2 +0 -0
  92. package/dist/fonts/noto-sans-tc-107-400-normal.woff2 +0 -0
  93. package/dist/fonts/noto-sans-tc-107-500-normal.woff2 +0 -0
  94. package/dist/fonts/noto-sans-tc-107-600-normal.woff2 +0 -0
  95. package/dist/fonts/noto-sans-tc-107-700-normal.woff2 +0 -0
  96. package/dist/fonts/noto-sans-tc-108-400-normal.woff2 +0 -0
  97. package/dist/fonts/noto-sans-tc-108-500-normal.woff2 +0 -0
  98. package/dist/fonts/noto-sans-tc-108-600-normal.woff2 +0 -0
  99. package/dist/fonts/noto-sans-tc-108-700-normal.woff2 +0 -0
  100. package/dist/fonts/noto-sans-tc-109-400-normal.woff2 +0 -0
  101. package/dist/fonts/noto-sans-tc-109-500-normal.woff2 +0 -0
  102. package/dist/fonts/noto-sans-tc-109-600-normal.woff2 +0 -0
  103. package/dist/fonts/noto-sans-tc-109-700-normal.woff2 +0 -0
  104. package/dist/fonts/noto-sans-tc-11-400-normal.woff2 +0 -0
  105. package/dist/fonts/noto-sans-tc-11-500-normal.woff2 +0 -0
  106. package/dist/fonts/noto-sans-tc-11-600-normal.woff2 +0 -0
  107. package/dist/fonts/noto-sans-tc-11-700-normal.woff2 +0 -0
  108. package/dist/fonts/noto-sans-tc-110-400-normal.woff2 +0 -0
  109. package/dist/fonts/noto-sans-tc-110-500-normal.woff2 +0 -0
  110. package/dist/fonts/noto-sans-tc-110-600-normal.woff2 +0 -0
  111. package/dist/fonts/noto-sans-tc-110-700-normal.woff2 +0 -0
  112. package/dist/fonts/noto-sans-tc-111-400-normal.woff2 +0 -0
  113. package/dist/fonts/noto-sans-tc-111-500-normal.woff2 +0 -0
  114. package/dist/fonts/noto-sans-tc-111-600-normal.woff2 +0 -0
  115. package/dist/fonts/noto-sans-tc-111-700-normal.woff2 +0 -0
  116. package/dist/fonts/noto-sans-tc-112-400-normal.woff2 +0 -0
  117. package/dist/fonts/noto-sans-tc-112-500-normal.woff2 +0 -0
  118. package/dist/fonts/noto-sans-tc-112-600-normal.woff2 +0 -0
  119. package/dist/fonts/noto-sans-tc-112-700-normal.woff2 +0 -0
  120. package/dist/fonts/noto-sans-tc-113-400-normal.woff2 +0 -0
  121. package/dist/fonts/noto-sans-tc-113-500-normal.woff2 +0 -0
  122. package/dist/fonts/noto-sans-tc-113-600-normal.woff2 +0 -0
  123. package/dist/fonts/noto-sans-tc-113-700-normal.woff2 +0 -0
  124. package/dist/fonts/noto-sans-tc-114-400-normal.woff2 +0 -0
  125. package/dist/fonts/noto-sans-tc-114-500-normal.woff2 +0 -0
  126. package/dist/fonts/noto-sans-tc-114-600-normal.woff2 +0 -0
  127. package/dist/fonts/noto-sans-tc-114-700-normal.woff2 +0 -0
  128. package/dist/fonts/noto-sans-tc-115-400-normal.woff2 +0 -0
  129. package/dist/fonts/noto-sans-tc-115-500-normal.woff2 +0 -0
  130. package/dist/fonts/noto-sans-tc-115-600-normal.woff2 +0 -0
  131. package/dist/fonts/noto-sans-tc-115-700-normal.woff2 +0 -0
  132. package/dist/fonts/noto-sans-tc-116-400-normal.woff2 +0 -0
  133. package/dist/fonts/noto-sans-tc-116-500-normal.woff2 +0 -0
  134. package/dist/fonts/noto-sans-tc-116-600-normal.woff2 +0 -0
  135. package/dist/fonts/noto-sans-tc-116-700-normal.woff2 +0 -0
  136. package/dist/fonts/noto-sans-tc-117-400-normal.woff2 +0 -0
  137. package/dist/fonts/noto-sans-tc-117-500-normal.woff2 +0 -0
  138. package/dist/fonts/noto-sans-tc-117-600-normal.woff2 +0 -0
  139. package/dist/fonts/noto-sans-tc-117-700-normal.woff2 +0 -0
  140. package/dist/fonts/noto-sans-tc-118-400-normal.woff2 +0 -0
  141. package/dist/fonts/noto-sans-tc-118-500-normal.woff2 +0 -0
  142. package/dist/fonts/noto-sans-tc-118-600-normal.woff2 +0 -0
  143. package/dist/fonts/noto-sans-tc-118-700-normal.woff2 +0 -0
  144. package/dist/fonts/noto-sans-tc-119-400-normal.woff2 +0 -0
  145. package/dist/fonts/noto-sans-tc-119-500-normal.woff2 +0 -0
  146. package/dist/fonts/noto-sans-tc-119-600-normal.woff2 +0 -0
  147. package/dist/fonts/noto-sans-tc-119-700-normal.woff2 +0 -0
  148. package/dist/fonts/noto-sans-tc-12-400-normal.woff2 +0 -0
  149. package/dist/fonts/noto-sans-tc-12-500-normal.woff2 +0 -0
  150. package/dist/fonts/noto-sans-tc-12-600-normal.woff2 +0 -0
  151. package/dist/fonts/noto-sans-tc-12-700-normal.woff2 +0 -0
  152. package/dist/fonts/noto-sans-tc-120-400-normal.woff2 +0 -0
  153. package/dist/fonts/noto-sans-tc-120-500-normal.woff2 +0 -0
  154. package/dist/fonts/noto-sans-tc-120-600-normal.woff2 +0 -0
  155. package/dist/fonts/noto-sans-tc-120-700-normal.woff2 +0 -0
  156. package/dist/fonts/noto-sans-tc-121-400-normal.woff2 +0 -0
  157. package/dist/fonts/noto-sans-tc-121-500-normal.woff2 +0 -0
  158. package/dist/fonts/noto-sans-tc-121-600-normal.woff2 +0 -0
  159. package/dist/fonts/noto-sans-tc-121-700-normal.woff2 +0 -0
  160. package/dist/fonts/noto-sans-tc-122-400-normal.woff2 +0 -0
  161. package/dist/fonts/noto-sans-tc-122-500-normal.woff2 +0 -0
  162. package/dist/fonts/noto-sans-tc-122-600-normal.woff2 +0 -0
  163. package/dist/fonts/noto-sans-tc-122-700-normal.woff2 +0 -0
  164. package/dist/fonts/noto-sans-tc-123-400-normal.woff2 +0 -0
  165. package/dist/fonts/noto-sans-tc-123-500-normal.woff2 +0 -0
  166. package/dist/fonts/noto-sans-tc-123-600-normal.woff2 +0 -0
  167. package/dist/fonts/noto-sans-tc-123-700-normal.woff2 +0 -0
  168. package/dist/fonts/noto-sans-tc-2-400-normal.woff2 +0 -0
  169. package/dist/fonts/noto-sans-tc-2-500-normal.woff2 +0 -0
  170. package/dist/fonts/noto-sans-tc-2-600-normal.woff2 +0 -0
  171. package/dist/fonts/noto-sans-tc-2-700-normal.woff2 +0 -0
  172. package/dist/fonts/noto-sans-tc-23-400-normal.woff2 +0 -0
  173. package/dist/fonts/noto-sans-tc-23-500-normal.woff2 +0 -0
  174. package/dist/fonts/noto-sans-tc-23-600-normal.woff2 +0 -0
  175. package/dist/fonts/noto-sans-tc-23-700-normal.woff2 +0 -0
  176. package/dist/fonts/noto-sans-tc-24-400-normal.woff2 +0 -0
  177. package/dist/fonts/noto-sans-tc-24-500-normal.woff2 +0 -0
  178. package/dist/fonts/noto-sans-tc-24-600-normal.woff2 +0 -0
  179. package/dist/fonts/noto-sans-tc-24-700-normal.woff2 +0 -0
  180. package/dist/fonts/noto-sans-tc-25-400-normal.woff2 +0 -0
  181. package/dist/fonts/noto-sans-tc-25-500-normal.woff2 +0 -0
  182. package/dist/fonts/noto-sans-tc-25-600-normal.woff2 +0 -0
  183. package/dist/fonts/noto-sans-tc-25-700-normal.woff2 +0 -0
  184. package/dist/fonts/noto-sans-tc-26-400-normal.woff2 +0 -0
  185. package/dist/fonts/noto-sans-tc-26-500-normal.woff2 +0 -0
  186. package/dist/fonts/noto-sans-tc-26-600-normal.woff2 +0 -0
  187. package/dist/fonts/noto-sans-tc-26-700-normal.woff2 +0 -0
  188. package/dist/fonts/noto-sans-tc-27-400-normal.woff2 +0 -0
  189. package/dist/fonts/noto-sans-tc-27-500-normal.woff2 +0 -0
  190. package/dist/fonts/noto-sans-tc-27-600-normal.woff2 +0 -0
  191. package/dist/fonts/noto-sans-tc-27-700-normal.woff2 +0 -0
  192. package/dist/fonts/noto-sans-tc-28-400-normal.woff2 +0 -0
  193. package/dist/fonts/noto-sans-tc-28-500-normal.woff2 +0 -0
  194. package/dist/fonts/noto-sans-tc-28-600-normal.woff2 +0 -0
  195. package/dist/fonts/noto-sans-tc-28-700-normal.woff2 +0 -0
  196. package/dist/fonts/noto-sans-tc-29-400-normal.woff2 +0 -0
  197. package/dist/fonts/noto-sans-tc-29-500-normal.woff2 +0 -0
  198. package/dist/fonts/noto-sans-tc-29-600-normal.woff2 +0 -0
  199. package/dist/fonts/noto-sans-tc-29-700-normal.woff2 +0 -0
  200. package/dist/fonts/noto-sans-tc-30-400-normal.woff2 +0 -0
  201. package/dist/fonts/noto-sans-tc-30-500-normal.woff2 +0 -0
  202. package/dist/fonts/noto-sans-tc-30-600-normal.woff2 +0 -0
  203. package/dist/fonts/noto-sans-tc-30-700-normal.woff2 +0 -0
  204. package/dist/fonts/noto-sans-tc-31-400-normal.woff2 +0 -0
  205. package/dist/fonts/noto-sans-tc-31-500-normal.woff2 +0 -0
  206. package/dist/fonts/noto-sans-tc-31-600-normal.woff2 +0 -0
  207. package/dist/fonts/noto-sans-tc-31-700-normal.woff2 +0 -0
  208. package/dist/fonts/noto-sans-tc-32-400-normal.woff2 +0 -0
  209. package/dist/fonts/noto-sans-tc-32-500-normal.woff2 +0 -0
  210. package/dist/fonts/noto-sans-tc-32-600-normal.woff2 +0 -0
  211. package/dist/fonts/noto-sans-tc-32-700-normal.woff2 +0 -0
  212. package/dist/fonts/noto-sans-tc-33-400-normal.woff2 +0 -0
  213. package/dist/fonts/noto-sans-tc-33-500-normal.woff2 +0 -0
  214. package/dist/fonts/noto-sans-tc-33-600-normal.woff2 +0 -0
  215. package/dist/fonts/noto-sans-tc-33-700-normal.woff2 +0 -0
  216. package/dist/fonts/noto-sans-tc-34-400-normal.woff2 +0 -0
  217. package/dist/fonts/noto-sans-tc-34-500-normal.woff2 +0 -0
  218. package/dist/fonts/noto-sans-tc-34-600-normal.woff2 +0 -0
  219. package/dist/fonts/noto-sans-tc-34-700-normal.woff2 +0 -0
  220. package/dist/fonts/noto-sans-tc-35-400-normal.woff2 +0 -0
  221. package/dist/fonts/noto-sans-tc-35-500-normal.woff2 +0 -0
  222. package/dist/fonts/noto-sans-tc-35-600-normal.woff2 +0 -0
  223. package/dist/fonts/noto-sans-tc-35-700-normal.woff2 +0 -0
  224. package/dist/fonts/noto-sans-tc-36-400-normal.woff2 +0 -0
  225. package/dist/fonts/noto-sans-tc-36-500-normal.woff2 +0 -0
  226. package/dist/fonts/noto-sans-tc-36-600-normal.woff2 +0 -0
  227. package/dist/fonts/noto-sans-tc-36-700-normal.woff2 +0 -0
  228. package/dist/fonts/noto-sans-tc-37-400-normal.woff2 +0 -0
  229. package/dist/fonts/noto-sans-tc-37-500-normal.woff2 +0 -0
  230. package/dist/fonts/noto-sans-tc-37-600-normal.woff2 +0 -0
  231. package/dist/fonts/noto-sans-tc-37-700-normal.woff2 +0 -0
  232. package/dist/fonts/noto-sans-tc-38-400-normal.woff2 +0 -0
  233. package/dist/fonts/noto-sans-tc-38-500-normal.woff2 +0 -0
  234. package/dist/fonts/noto-sans-tc-38-600-normal.woff2 +0 -0
  235. package/dist/fonts/noto-sans-tc-38-700-normal.woff2 +0 -0
  236. package/dist/fonts/noto-sans-tc-39-400-normal.woff2 +0 -0
  237. package/dist/fonts/noto-sans-tc-39-500-normal.woff2 +0 -0
  238. package/dist/fonts/noto-sans-tc-39-600-normal.woff2 +0 -0
  239. package/dist/fonts/noto-sans-tc-39-700-normal.woff2 +0 -0
  240. package/dist/fonts/noto-sans-tc-4-400-normal.woff2 +0 -0
  241. package/dist/fonts/noto-sans-tc-4-500-normal.woff2 +0 -0
  242. package/dist/fonts/noto-sans-tc-4-600-normal.woff2 +0 -0
  243. package/dist/fonts/noto-sans-tc-4-700-normal.woff2 +0 -0
  244. package/dist/fonts/noto-sans-tc-40-400-normal.woff2 +0 -0
  245. package/dist/fonts/noto-sans-tc-40-500-normal.woff2 +0 -0
  246. package/dist/fonts/noto-sans-tc-40-600-normal.woff2 +0 -0
  247. package/dist/fonts/noto-sans-tc-40-700-normal.woff2 +0 -0
  248. package/dist/fonts/noto-sans-tc-41-400-normal.woff2 +0 -0
  249. package/dist/fonts/noto-sans-tc-41-500-normal.woff2 +0 -0
  250. package/dist/fonts/noto-sans-tc-41-600-normal.woff2 +0 -0
  251. package/dist/fonts/noto-sans-tc-41-700-normal.woff2 +0 -0
  252. package/dist/fonts/noto-sans-tc-42-400-normal.woff2 +0 -0
  253. package/dist/fonts/noto-sans-tc-42-500-normal.woff2 +0 -0
  254. package/dist/fonts/noto-sans-tc-42-600-normal.woff2 +0 -0
  255. package/dist/fonts/noto-sans-tc-42-700-normal.woff2 +0 -0
  256. package/dist/fonts/noto-sans-tc-43-400-normal.woff2 +0 -0
  257. package/dist/fonts/noto-sans-tc-43-500-normal.woff2 +0 -0
  258. package/dist/fonts/noto-sans-tc-43-600-normal.woff2 +0 -0
  259. package/dist/fonts/noto-sans-tc-43-700-normal.woff2 +0 -0
  260. package/dist/fonts/noto-sans-tc-44-400-normal.woff2 +0 -0
  261. package/dist/fonts/noto-sans-tc-44-500-normal.woff2 +0 -0
  262. package/dist/fonts/noto-sans-tc-44-600-normal.woff2 +0 -0
  263. package/dist/fonts/noto-sans-tc-44-700-normal.woff2 +0 -0
  264. package/dist/fonts/noto-sans-tc-45-400-normal.woff2 +0 -0
  265. package/dist/fonts/noto-sans-tc-45-500-normal.woff2 +0 -0
  266. package/dist/fonts/noto-sans-tc-45-600-normal.woff2 +0 -0
  267. package/dist/fonts/noto-sans-tc-45-700-normal.woff2 +0 -0
  268. package/dist/fonts/noto-sans-tc-46-400-normal.woff2 +0 -0
  269. package/dist/fonts/noto-sans-tc-46-500-normal.woff2 +0 -0
  270. package/dist/fonts/noto-sans-tc-46-600-normal.woff2 +0 -0
  271. package/dist/fonts/noto-sans-tc-46-700-normal.woff2 +0 -0
  272. package/dist/fonts/noto-sans-tc-47-400-normal.woff2 +0 -0
  273. package/dist/fonts/noto-sans-tc-47-500-normal.woff2 +0 -0
  274. package/dist/fonts/noto-sans-tc-47-600-normal.woff2 +0 -0
  275. package/dist/fonts/noto-sans-tc-47-700-normal.woff2 +0 -0
  276. package/dist/fonts/noto-sans-tc-48-400-normal.woff2 +0 -0
  277. package/dist/fonts/noto-sans-tc-48-500-normal.woff2 +0 -0
  278. package/dist/fonts/noto-sans-tc-48-600-normal.woff2 +0 -0
  279. package/dist/fonts/noto-sans-tc-48-700-normal.woff2 +0 -0
  280. package/dist/fonts/noto-sans-tc-49-400-normal.woff2 +0 -0
  281. package/dist/fonts/noto-sans-tc-49-500-normal.woff2 +0 -0
  282. package/dist/fonts/noto-sans-tc-49-600-normal.woff2 +0 -0
  283. package/dist/fonts/noto-sans-tc-49-700-normal.woff2 +0 -0
  284. package/dist/fonts/noto-sans-tc-50-400-normal.woff2 +0 -0
  285. package/dist/fonts/noto-sans-tc-50-500-normal.woff2 +0 -0
  286. package/dist/fonts/noto-sans-tc-50-600-normal.woff2 +0 -0
  287. package/dist/fonts/noto-sans-tc-50-700-normal.woff2 +0 -0
  288. package/dist/fonts/noto-sans-tc-51-400-normal.woff2 +0 -0
  289. package/dist/fonts/noto-sans-tc-51-500-normal.woff2 +0 -0
  290. package/dist/fonts/noto-sans-tc-51-600-normal.woff2 +0 -0
  291. package/dist/fonts/noto-sans-tc-51-700-normal.woff2 +0 -0
  292. package/dist/fonts/noto-sans-tc-52-400-normal.woff2 +0 -0
  293. package/dist/fonts/noto-sans-tc-52-500-normal.woff2 +0 -0
  294. package/dist/fonts/noto-sans-tc-52-600-normal.woff2 +0 -0
  295. package/dist/fonts/noto-sans-tc-52-700-normal.woff2 +0 -0
  296. package/dist/fonts/noto-sans-tc-53-400-normal.woff2 +0 -0
  297. package/dist/fonts/noto-sans-tc-53-500-normal.woff2 +0 -0
  298. package/dist/fonts/noto-sans-tc-53-600-normal.woff2 +0 -0
  299. package/dist/fonts/noto-sans-tc-53-700-normal.woff2 +0 -0
  300. package/dist/fonts/noto-sans-tc-54-400-normal.woff2 +0 -0
  301. package/dist/fonts/noto-sans-tc-54-500-normal.woff2 +0 -0
  302. package/dist/fonts/noto-sans-tc-54-600-normal.woff2 +0 -0
  303. package/dist/fonts/noto-sans-tc-54-700-normal.woff2 +0 -0
  304. package/dist/fonts/noto-sans-tc-55-400-normal.woff2 +0 -0
  305. package/dist/fonts/noto-sans-tc-55-500-normal.woff2 +0 -0
  306. package/dist/fonts/noto-sans-tc-55-600-normal.woff2 +0 -0
  307. package/dist/fonts/noto-sans-tc-55-700-normal.woff2 +0 -0
  308. package/dist/fonts/noto-sans-tc-56-400-normal.woff2 +0 -0
  309. package/dist/fonts/noto-sans-tc-56-500-normal.woff2 +0 -0
  310. package/dist/fonts/noto-sans-tc-56-600-normal.woff2 +0 -0
  311. package/dist/fonts/noto-sans-tc-56-700-normal.woff2 +0 -0
  312. package/dist/fonts/noto-sans-tc-57-400-normal.woff2 +0 -0
  313. package/dist/fonts/noto-sans-tc-57-500-normal.woff2 +0 -0
  314. package/dist/fonts/noto-sans-tc-57-600-normal.woff2 +0 -0
  315. package/dist/fonts/noto-sans-tc-57-700-normal.woff2 +0 -0
  316. package/dist/fonts/noto-sans-tc-58-400-normal.woff2 +0 -0
  317. package/dist/fonts/noto-sans-tc-58-500-normal.woff2 +0 -0
  318. package/dist/fonts/noto-sans-tc-58-600-normal.woff2 +0 -0
  319. package/dist/fonts/noto-sans-tc-58-700-normal.woff2 +0 -0
  320. package/dist/fonts/noto-sans-tc-59-400-normal.woff2 +0 -0
  321. package/dist/fonts/noto-sans-tc-59-500-normal.woff2 +0 -0
  322. package/dist/fonts/noto-sans-tc-59-600-normal.woff2 +0 -0
  323. package/dist/fonts/noto-sans-tc-59-700-normal.woff2 +0 -0
  324. package/dist/fonts/noto-sans-tc-60-400-normal.woff2 +0 -0
  325. package/dist/fonts/noto-sans-tc-60-500-normal.woff2 +0 -0
  326. package/dist/fonts/noto-sans-tc-60-600-normal.woff2 +0 -0
  327. package/dist/fonts/noto-sans-tc-60-700-normal.woff2 +0 -0
  328. package/dist/fonts/noto-sans-tc-61-400-normal.woff2 +0 -0
  329. package/dist/fonts/noto-sans-tc-61-500-normal.woff2 +0 -0
  330. package/dist/fonts/noto-sans-tc-61-600-normal.woff2 +0 -0
  331. package/dist/fonts/noto-sans-tc-61-700-normal.woff2 +0 -0
  332. package/dist/fonts/noto-sans-tc-62-400-normal.woff2 +0 -0
  333. package/dist/fonts/noto-sans-tc-62-500-normal.woff2 +0 -0
  334. package/dist/fonts/noto-sans-tc-62-600-normal.woff2 +0 -0
  335. package/dist/fonts/noto-sans-tc-62-700-normal.woff2 +0 -0
  336. package/dist/fonts/noto-sans-tc-63-400-normal.woff2 +0 -0
  337. package/dist/fonts/noto-sans-tc-63-500-normal.woff2 +0 -0
  338. package/dist/fonts/noto-sans-tc-63-600-normal.woff2 +0 -0
  339. package/dist/fonts/noto-sans-tc-63-700-normal.woff2 +0 -0
  340. package/dist/fonts/noto-sans-tc-64-400-normal.woff2 +0 -0
  341. package/dist/fonts/noto-sans-tc-64-500-normal.woff2 +0 -0
  342. package/dist/fonts/noto-sans-tc-64-600-normal.woff2 +0 -0
  343. package/dist/fonts/noto-sans-tc-64-700-normal.woff2 +0 -0
  344. package/dist/fonts/noto-sans-tc-65-400-normal.woff2 +0 -0
  345. package/dist/fonts/noto-sans-tc-65-500-normal.woff2 +0 -0
  346. package/dist/fonts/noto-sans-tc-65-600-normal.woff2 +0 -0
  347. package/dist/fonts/noto-sans-tc-65-700-normal.woff2 +0 -0
  348. package/dist/fonts/noto-sans-tc-66-400-normal.woff2 +0 -0
  349. package/dist/fonts/noto-sans-tc-66-500-normal.woff2 +0 -0
  350. package/dist/fonts/noto-sans-tc-66-600-normal.woff2 +0 -0
  351. package/dist/fonts/noto-sans-tc-66-700-normal.woff2 +0 -0
  352. package/dist/fonts/noto-sans-tc-67-400-normal.woff2 +0 -0
  353. package/dist/fonts/noto-sans-tc-67-500-normal.woff2 +0 -0
  354. package/dist/fonts/noto-sans-tc-67-600-normal.woff2 +0 -0
  355. package/dist/fonts/noto-sans-tc-67-700-normal.woff2 +0 -0
  356. package/dist/fonts/noto-sans-tc-68-400-normal.woff2 +0 -0
  357. package/dist/fonts/noto-sans-tc-68-500-normal.woff2 +0 -0
  358. package/dist/fonts/noto-sans-tc-68-600-normal.woff2 +0 -0
  359. package/dist/fonts/noto-sans-tc-68-700-normal.woff2 +0 -0
  360. package/dist/fonts/noto-sans-tc-69-400-normal.woff2 +0 -0
  361. package/dist/fonts/noto-sans-tc-69-500-normal.woff2 +0 -0
  362. package/dist/fonts/noto-sans-tc-69-600-normal.woff2 +0 -0
  363. package/dist/fonts/noto-sans-tc-69-700-normal.woff2 +0 -0
  364. package/dist/fonts/noto-sans-tc-70-400-normal.woff2 +0 -0
  365. package/dist/fonts/noto-sans-tc-70-500-normal.woff2 +0 -0
  366. package/dist/fonts/noto-sans-tc-70-600-normal.woff2 +0 -0
  367. package/dist/fonts/noto-sans-tc-70-700-normal.woff2 +0 -0
  368. package/dist/fonts/noto-sans-tc-71-400-normal.woff2 +0 -0
  369. package/dist/fonts/noto-sans-tc-71-500-normal.woff2 +0 -0
  370. package/dist/fonts/noto-sans-tc-71-600-normal.woff2 +0 -0
  371. package/dist/fonts/noto-sans-tc-71-700-normal.woff2 +0 -0
  372. package/dist/fonts/noto-sans-tc-72-400-normal.woff2 +0 -0
  373. package/dist/fonts/noto-sans-tc-72-500-normal.woff2 +0 -0
  374. package/dist/fonts/noto-sans-tc-72-600-normal.woff2 +0 -0
  375. package/dist/fonts/noto-sans-tc-72-700-normal.woff2 +0 -0
  376. package/dist/fonts/noto-sans-tc-73-400-normal.woff2 +0 -0
  377. package/dist/fonts/noto-sans-tc-73-500-normal.woff2 +0 -0
  378. package/dist/fonts/noto-sans-tc-73-600-normal.woff2 +0 -0
  379. package/dist/fonts/noto-sans-tc-73-700-normal.woff2 +0 -0
  380. package/dist/fonts/noto-sans-tc-74-400-normal.woff2 +0 -0
  381. package/dist/fonts/noto-sans-tc-74-500-normal.woff2 +0 -0
  382. package/dist/fonts/noto-sans-tc-74-600-normal.woff2 +0 -0
  383. package/dist/fonts/noto-sans-tc-74-700-normal.woff2 +0 -0
  384. package/dist/fonts/noto-sans-tc-75-400-normal.woff2 +0 -0
  385. package/dist/fonts/noto-sans-tc-75-500-normal.woff2 +0 -0
  386. package/dist/fonts/noto-sans-tc-75-600-normal.woff2 +0 -0
  387. package/dist/fonts/noto-sans-tc-75-700-normal.woff2 +0 -0
  388. package/dist/fonts/noto-sans-tc-76-400-normal.woff2 +0 -0
  389. package/dist/fonts/noto-sans-tc-76-500-normal.woff2 +0 -0
  390. package/dist/fonts/noto-sans-tc-76-600-normal.woff2 +0 -0
  391. package/dist/fonts/noto-sans-tc-76-700-normal.woff2 +0 -0
  392. package/dist/fonts/noto-sans-tc-77-400-normal.woff2 +0 -0
  393. package/dist/fonts/noto-sans-tc-77-500-normal.woff2 +0 -0
  394. package/dist/fonts/noto-sans-tc-77-600-normal.woff2 +0 -0
  395. package/dist/fonts/noto-sans-tc-77-700-normal.woff2 +0 -0
  396. package/dist/fonts/noto-sans-tc-78-400-normal.woff2 +0 -0
  397. package/dist/fonts/noto-sans-tc-78-500-normal.woff2 +0 -0
  398. package/dist/fonts/noto-sans-tc-78-600-normal.woff2 +0 -0
  399. package/dist/fonts/noto-sans-tc-78-700-normal.woff2 +0 -0
  400. package/dist/fonts/noto-sans-tc-79-400-normal.woff2 +0 -0
  401. package/dist/fonts/noto-sans-tc-79-500-normal.woff2 +0 -0
  402. package/dist/fonts/noto-sans-tc-79-600-normal.woff2 +0 -0
  403. package/dist/fonts/noto-sans-tc-79-700-normal.woff2 +0 -0
  404. package/dist/fonts/noto-sans-tc-80-400-normal.woff2 +0 -0
  405. package/dist/fonts/noto-sans-tc-80-500-normal.woff2 +0 -0
  406. package/dist/fonts/noto-sans-tc-80-600-normal.woff2 +0 -0
  407. package/dist/fonts/noto-sans-tc-80-700-normal.woff2 +0 -0
  408. package/dist/fonts/noto-sans-tc-81-400-normal.woff2 +0 -0
  409. package/dist/fonts/noto-sans-tc-81-500-normal.woff2 +0 -0
  410. package/dist/fonts/noto-sans-tc-81-600-normal.woff2 +0 -0
  411. package/dist/fonts/noto-sans-tc-81-700-normal.woff2 +0 -0
  412. package/dist/fonts/noto-sans-tc-82-400-normal.woff2 +0 -0
  413. package/dist/fonts/noto-sans-tc-82-500-normal.woff2 +0 -0
  414. package/dist/fonts/noto-sans-tc-82-600-normal.woff2 +0 -0
  415. package/dist/fonts/noto-sans-tc-82-700-normal.woff2 +0 -0
  416. package/dist/fonts/noto-sans-tc-83-400-normal.woff2 +0 -0
  417. package/dist/fonts/noto-sans-tc-83-500-normal.woff2 +0 -0
  418. package/dist/fonts/noto-sans-tc-83-600-normal.woff2 +0 -0
  419. package/dist/fonts/noto-sans-tc-83-700-normal.woff2 +0 -0
  420. package/dist/fonts/noto-sans-tc-84-400-normal.woff2 +0 -0
  421. package/dist/fonts/noto-sans-tc-84-500-normal.woff2 +0 -0
  422. package/dist/fonts/noto-sans-tc-84-600-normal.woff2 +0 -0
  423. package/dist/fonts/noto-sans-tc-84-700-normal.woff2 +0 -0
  424. package/dist/fonts/noto-sans-tc-85-400-normal.woff2 +0 -0
  425. package/dist/fonts/noto-sans-tc-85-500-normal.woff2 +0 -0
  426. package/dist/fonts/noto-sans-tc-85-600-normal.woff2 +0 -0
  427. package/dist/fonts/noto-sans-tc-85-700-normal.woff2 +0 -0
  428. package/dist/fonts/noto-sans-tc-86-400-normal.woff2 +0 -0
  429. package/dist/fonts/noto-sans-tc-86-500-normal.woff2 +0 -0
  430. package/dist/fonts/noto-sans-tc-86-600-normal.woff2 +0 -0
  431. package/dist/fonts/noto-sans-tc-86-700-normal.woff2 +0 -0
  432. package/dist/fonts/noto-sans-tc-87-400-normal.woff2 +0 -0
  433. package/dist/fonts/noto-sans-tc-87-500-normal.woff2 +0 -0
  434. package/dist/fonts/noto-sans-tc-87-600-normal.woff2 +0 -0
  435. package/dist/fonts/noto-sans-tc-87-700-normal.woff2 +0 -0
  436. package/dist/fonts/noto-sans-tc-88-400-normal.woff2 +0 -0
  437. package/dist/fonts/noto-sans-tc-88-500-normal.woff2 +0 -0
  438. package/dist/fonts/noto-sans-tc-88-600-normal.woff2 +0 -0
  439. package/dist/fonts/noto-sans-tc-88-700-normal.woff2 +0 -0
  440. package/dist/fonts/noto-sans-tc-89-400-normal.woff2 +0 -0
  441. package/dist/fonts/noto-sans-tc-89-500-normal.woff2 +0 -0
  442. package/dist/fonts/noto-sans-tc-89-600-normal.woff2 +0 -0
  443. package/dist/fonts/noto-sans-tc-89-700-normal.woff2 +0 -0
  444. package/dist/fonts/noto-sans-tc-90-400-normal.woff2 +0 -0
  445. package/dist/fonts/noto-sans-tc-90-500-normal.woff2 +0 -0
  446. package/dist/fonts/noto-sans-tc-90-600-normal.woff2 +0 -0
  447. package/dist/fonts/noto-sans-tc-90-700-normal.woff2 +0 -0
  448. package/dist/fonts/noto-sans-tc-91-400-normal.woff2 +0 -0
  449. package/dist/fonts/noto-sans-tc-91-500-normal.woff2 +0 -0
  450. package/dist/fonts/noto-sans-tc-91-600-normal.woff2 +0 -0
  451. package/dist/fonts/noto-sans-tc-91-700-normal.woff2 +0 -0
  452. package/dist/fonts/noto-sans-tc-92-400-normal.woff2 +0 -0
  453. package/dist/fonts/noto-sans-tc-92-500-normal.woff2 +0 -0
  454. package/dist/fonts/noto-sans-tc-92-600-normal.woff2 +0 -0
  455. package/dist/fonts/noto-sans-tc-92-700-normal.woff2 +0 -0
  456. package/dist/fonts/noto-sans-tc-93-400-normal.woff2 +0 -0
  457. package/dist/fonts/noto-sans-tc-93-500-normal.woff2 +0 -0
  458. package/dist/fonts/noto-sans-tc-93-600-normal.woff2 +0 -0
  459. package/dist/fonts/noto-sans-tc-93-700-normal.woff2 +0 -0
  460. package/dist/fonts/noto-sans-tc-94-400-normal.woff2 +0 -0
  461. package/dist/fonts/noto-sans-tc-94-500-normal.woff2 +0 -0
  462. package/dist/fonts/noto-sans-tc-94-600-normal.woff2 +0 -0
  463. package/dist/fonts/noto-sans-tc-94-700-normal.woff2 +0 -0
  464. package/dist/fonts/noto-sans-tc-95-400-normal.woff2 +0 -0
  465. package/dist/fonts/noto-sans-tc-95-500-normal.woff2 +0 -0
  466. package/dist/fonts/noto-sans-tc-95-600-normal.woff2 +0 -0
  467. package/dist/fonts/noto-sans-tc-95-700-normal.woff2 +0 -0
  468. package/dist/fonts/noto-sans-tc-96-400-normal.woff2 +0 -0
  469. package/dist/fonts/noto-sans-tc-96-500-normal.woff2 +0 -0
  470. package/dist/fonts/noto-sans-tc-96-600-normal.woff2 +0 -0
  471. package/dist/fonts/noto-sans-tc-96-700-normal.woff2 +0 -0
  472. package/dist/fonts/noto-sans-tc-cyrillic-400-normal.woff2 +0 -0
  473. package/dist/fonts/noto-sans-tc-cyrillic-500-normal.woff2 +0 -0
  474. package/dist/fonts/noto-sans-tc-cyrillic-600-normal.woff2 +0 -0
  475. package/dist/fonts/noto-sans-tc-cyrillic-700-normal.woff2 +0 -0
  476. package/dist/fonts/noto-sans-tc-latin-400-normal.woff2 +0 -0
  477. package/dist/fonts/noto-sans-tc-latin-500-normal.woff2 +0 -0
  478. package/dist/fonts/noto-sans-tc-latin-600-normal.woff2 +0 -0
  479. package/dist/fonts/noto-sans-tc-latin-700-normal.woff2 +0 -0
  480. package/dist/fonts/noto-sans-tc-latin-ext-400-normal.woff2 +0 -0
  481. package/dist/fonts/noto-sans-tc-latin-ext-500-normal.woff2 +0 -0
  482. package/dist/fonts/noto-sans-tc-latin-ext-600-normal.woff2 +0 -0
  483. package/dist/fonts/noto-sans-tc-latin-ext-700-normal.woff2 +0 -0
  484. package/dist/fonts/noto-sans-tc-vietnamese-400-normal.woff2 +0 -0
  485. package/dist/fonts/noto-sans-tc-vietnamese-500-normal.woff2 +0 -0
  486. package/dist/fonts/noto-sans-tc-vietnamese-600-normal.woff2 +0 -0
  487. package/dist/fonts/noto-sans-tc-vietnamese-700-normal.woff2 +0 -0
  488. package/dist/fonts.css +7543 -0
  489. package/dist/format-entry-B1gAZnIN.js +400 -0
  490. package/dist/format-entry-B1gAZnIN.js.map +1 -0
  491. package/dist/format-entry-BKj7P9i6.d.ts +64 -0
  492. package/dist/format.d.ts +2 -0
  493. package/dist/format.js +1 -0
  494. package/dist/index.d.ts +1435 -0
  495. package/dist/index.js +5875 -0
  496. package/dist/index.js.map +1 -0
  497. package/dist/styles.css +5240 -0
  498. package/dist/tokens.css +131 -0
  499. package/docs/AccentPicker.md +7 -0
  500. package/docs/ActionBar.md +17 -0
  501. package/docs/Alert.md +8 -0
  502. package/docs/AppShell.md +30 -0
  503. package/docs/Badge.md +17 -0
  504. package/docs/BarChart.md +7 -0
  505. package/docs/Breadcrumb.md +7 -0
  506. package/docs/Button.md +18 -0
  507. package/docs/Calendar.md +15 -0
  508. package/docs/Card.md +14 -0
  509. package/docs/Checkbox.md +8 -0
  510. package/docs/CodeView.md +21 -0
  511. package/docs/CommandPalette.md +30 -0
  512. package/docs/DangerZone.md +10 -0
  513. package/docs/DataTable.md +77 -0
  514. package/docs/DatePicker.md +7 -0
  515. package/docs/DateRangePicker.md +7 -0
  516. package/docs/DetailList.md +17 -0
  517. package/docs/Dialog.md +15 -0
  518. package/docs/Drawer.md +22 -0
  519. package/docs/EmptyState.md +6 -0
  520. package/docs/ErrorPage.md +7 -0
  521. package/docs/FileUpload.md +9 -0
  522. package/docs/FormGrid.md +7 -0
  523. package/docs/Format.md +27 -0
  524. package/docs/Graph.md +31 -0
  525. package/docs/Grid.md +18 -0
  526. package/docs/IconButton.md +12 -0
  527. package/docs/InlineCode.md +35 -0
  528. package/docs/KpiCard.md +11 -0
  529. package/docs/LayerGraph.md +32 -0
  530. package/docs/LineChart.md +10 -0
  531. package/docs/LoadingBar.md +7 -0
  532. package/docs/LoginCard.md +8 -0
  533. package/docs/Menu.md +20 -0
  534. package/docs/MobileTabBar.md +8 -0
  535. package/docs/MultiSelect.md +9 -0
  536. package/docs/NotificationBell.md +9 -0
  537. package/docs/Popover.md +9 -0
  538. package/docs/ProgressBar.md +7 -0
  539. package/docs/ProgressRing.md +7 -0
  540. package/docs/ProjectSwitcher.md +22 -0
  541. package/docs/RadioGroup.md +7 -0
  542. package/docs/SearchField.md +7 -0
  543. package/docs/Select.md +7 -0
  544. package/docs/SettingsLayout.md +8 -0
  545. package/docs/SideNav.md +11 -0
  546. package/docs/Skeleton.md +5 -0
  547. package/docs/Suggestion.md +15 -0
  548. package/docs/Switch.md +8 -0
  549. package/docs/Tabs.md +10 -0
  550. package/docs/Tag.md +11 -0
  551. package/docs/Term.md +30 -0
  552. package/docs/TextArea.md +7 -0
  553. package/docs/TextField.md +10 -0
  554. package/docs/ThemePicker.md +9 -0
  555. package/docs/Toast.md +7 -0
  556. package/docs/Tooltip.md +9 -0
  557. package/docs/TopBar.md +9 -0
  558. package/docs/Tour.md +24 -0
  559. package/docs/TreeList.md +93 -0
  560. package/docs/guidelines.md +269 -0
  561. package/docs/layout.md +35 -0
  562. package/docs/motion.md +63 -0
  563. package/package.json +59 -3
  564. package/README.md +0 -3
@@ -0,0 +1,400 @@
1
+ // src/i18n.ts
2
+ const I18N = {
3
+ locale: "zh-TW",
4
+ currency: "TWD",
5
+ messages: { en: {
6
+ "Email 或帳號": "Email or username",
7
+ "{label}:{a} 到 {b}": "{label}: {a} to {b}",
8
+ "{n} 個百分點": "{n} pts",
9
+ 上一頁: "Previous page",
10
+ 上個月: "Previous month",
11
+ "上傳失敗,請再試一次。": "Upload failed. Try again.",
12
+ 下一頁: "Next page",
13
+ 下個月: "Next month",
14
+ 主要導覽: "Main navigation",
15
+ 主題: "Theme",
16
+ 今天: "Today",
17
+ 全選: "Select all",
18
+ 全部: "All",
19
+ 全部標為已讀: "Mark all as read",
20
+ "共 {n} 筆": "{n} items",
21
+ 分頁: "Pagination",
22
+ 刪除: "Delete",
23
+ 危險操作: "Danger zone",
24
+ 取消選取: "Clear selection",
25
+ "可以直接輸入,例如 2026/11/14": "Type a date, e.g. 2026/11/14",
26
+ 回上一頁: "Go back",
27
+ 回首頁: "Go home",
28
+ "完成 ✓": "Done ✓",
29
+ 密碼: "Password",
30
+ 展開側邊欄: "Expand sidebar",
31
+ "已選 {n} 筆": "{n} selected",
32
+ 帳號: "Username",
33
+ 強調色: "Accent color",
34
+ "忘記密碼?": "Forgot password?",
35
+ 找不到符合的選項: "No matching options",
36
+ "拖放檔案,或 ": "Drop files here, or ",
37
+ 搜尋: "Search",
38
+ 操作: "Actions",
39
+ 收合側邊欄: "Collapse sidebar",
40
+ 放棄: "Discard",
41
+ "放棄未儲存的變更?": "Discard unsaved changes?",
42
+ "新增「{q}」": "Add “{q}”",
43
+ "日期格式不正確,請寫成 2026/11/14": "Invalid date. Use 2026/11/14.",
44
+ 更多操作: "More actions",
45
+ 更多: "More",
46
+ 全部頁面: "All pages",
47
+ "最近 30 天": "Last 30 days",
48
+ "最近 7 天": "Last 7 days",
49
+ 期間: "Period",
50
+ 未讀: "Unread",
51
+ 本月: "This month",
52
+ 沒有符合的資料: "No matching data",
53
+ 沒有通知: "No notifications",
54
+ 清除: "Clear",
55
+ 清除搜尋: "Clear search",
56
+ 登入: "Sign in",
57
+ 發生錯誤: "Something went wrong",
58
+ "移除 {name}": "Remove {name}",
59
+ "第 {a}–{b} 筆,共 {n} 筆": "{a}–{b} of {n}",
60
+ 繼續編輯: "Keep editing",
61
+ "自訂強調色(色碼)": "Custom accent color (hex)",
62
+ "色碼格式不正確,例如 #2457d6": "Invalid hex, e.g. #2457d6",
63
+ 設定分類: "Settings sections",
64
+ 請輸入密碼: "Enter your password",
65
+ 請輸入帳號: "Enter your username",
66
+ 請選擇: "Select",
67
+ 路徑: "Breadcrumb",
68
+ 較上週: "vs last week",
69
+ 載入中: "Loading",
70
+ "輸入 # 加 6 碼": "Enter # and 6 digits",
71
+ 通知: "Notifications",
72
+ "通知,{n} 則未讀": "Notifications, {n} unread",
73
+ "選取第 {n} 筆": "Select row {n}",
74
+ 選擇日期: "Choose date",
75
+ 選擇期間: "Choose period",
76
+ 選擇檔案: "choose files",
77
+ 重試: "Retry",
78
+ 開啟日曆: "Open calendar",
79
+ 關閉: "Close",
80
+ "關閉後,剛才的修改不會保留。": "If you close now, your changes will be lost.",
81
+ 關閉提示: "Dismiss",
82
+ 隱藏密碼: "Hide password",
83
+ 顯示密碼: "Show password",
84
+ "(今天)": " (today)",
85
+ 伺服器暫時無法回應: "The server is not responding",
86
+ 找不到這個頁面: "Page not found",
87
+ 沒有權限查看這個頁面: "You do not have access to this page",
88
+ "網址可能打錯了,或這個頁面已經移除。": "The address may be wrong, or the page has been removed.",
89
+ "這個問題已經記錄下來,請稍後重新整理再試。": "The problem has been logged. Refresh the page later.",
90
+ "請向管理員申請權限,或切換成有權限的帳號。": "Ask an admin for access, or switch to an account that has it.",
91
+ 自動: "Auto",
92
+ 淺色: "Light",
93
+ 深色: "Dark",
94
+ 藍: "Blue",
95
+ 靛: "Indigo",
96
+ 紫: "Purple",
97
+ 桃紅: "Pink",
98
+ 紅: "Red",
99
+ 橘: "Orange",
100
+ 綠: "Green",
101
+ 青: "Teal",
102
+ 草稿: "Draft",
103
+ 進行中: "In progress",
104
+ 審核中: "In review",
105
+ 完成: "Done",
106
+ 失敗: "Failed",
107
+ 檢視: "Views",
108
+ "{n} / {total} 筆": "{n} / {total}",
109
+ 欄位: "Columns",
110
+ 顯示的欄位: "Visible columns",
111
+ 清除篩選: "Clear filters",
112
+ 清除全部: "Clear all",
113
+ 篩選: "Filter",
114
+ 最低: "Min",
115
+ 最高: "Max",
116
+ "合計 {n} 筆": "Total: {n}",
117
+ 平均: "Avg",
118
+ "選取 {name}": "Select {name}",
119
+ "{n} 個新": "{n} new",
120
+ "{n} 個檔案": "{n} files",
121
+ "下載 {name}": "Download {name}",
122
+ "已選 {n} 個檔案": "{n} files selected",
123
+ "共 {size}": "{size} total",
124
+ 清除選取: "Clear selection",
125
+ 下載: "Download",
126
+ 全部展開: "Expand all",
127
+ 全部收合: "Collapse all",
128
+ 這裡還沒有檔案: "No files here yet",
129
+ 顯示全部: "Show all",
130
+ 收合: "Show less",
131
+ 依狀態篩選: "Filter by status",
132
+ 展開: "Expand",
133
+ 沒有項目: "Nothing here",
134
+ 即時: "Live",
135
+ 已過期: "Stale",
136
+ 離線: "Offline",
137
+ 切換專案: "Switch project",
138
+ "切換專案,目前是 {name}": "Switch project, now {name}",
139
+ 推測: "Inferred",
140
+ "{n} 個項目": "{n} items",
141
+ "{a} 個項目使用,共 {b} 次": "Used {b} times by {a} items",
142
+ 共用項目: "Shared",
143
+ 次數越多線越粗: "Thicker lines mean more often",
144
+ 架構圖: "Architecture",
145
+ "{n} 次": "{n} calls",
146
+ 原始碼: "Source",
147
+ "顯示全部 {n} 行": "Show all {n} lines",
148
+ "只顯示第 {n} 行前後": "Show only around line {n}",
149
+ "無法載入 {name} 的子項目": "Could not load the children of {name}",
150
+ "找不到符合「{q}」的結果": "No results for “{q}”",
151
+ 輸入名稱開始搜尋: "Type a name to search",
152
+ 搜尋中: "Searching",
153
+ 搜尋結果: "Search results",
154
+ 最近開啟: "Recently opened",
155
+ 選擇: "Select",
156
+ 打開: "Open",
157
+ 取消: "Cancel",
158
+ 略過: "Skip",
159
+ 上一步: "Back",
160
+ 下一步: "Next",
161
+ 建議修正: "Suggested fix",
162
+ 複製修正: "Copy fix",
163
+ 已複製: "Copied",
164
+ "原本:": "Before: ",
165
+ "改成:": "After: ",
166
+ 關閉說明: "Close explanation",
167
+ "(說明)": " (explain)",
168
+ "搜尋({k})": "Search ({k})",
169
+ 確定的關係: "Confirmed",
170
+ 推測的關係: "Inferred",
171
+ 外部項目: "External"
172
+ } }
173
+ };
174
+ function msgsFor(loc) {
175
+ return I18N.messages[loc] || I18N.messages[loc.split("-")[0]] || null;
176
+ }
177
+ /** Translates a built-in zh-TW string into the current locale; {name} placeholders take vars. */
178
+ function tr(key, vars) {
179
+ const out = (I18N.locale.startsWith("zh") ? null : msgsFor(I18N.locale))?.[key] ?? key;
180
+ return vars ? out.replace(/\{(\w+)\}/g, (a, k) => vars[k] !== void 0 ? String(vars[k]) : a) : out;
181
+ }
182
+ /** Switches the interface language and, optionally, the currency used by format.money. */
183
+ function setLocale(locale, opts) {
184
+ I18N.locale = locale || "zh-TW";
185
+ if (opts?.currency) I18N.currency = opts.currency;
186
+ if (typeof document !== "undefined") document.documentElement.setAttribute("lang", I18N.locale);
187
+ }
188
+ /** Adds or overrides translations for a locale. Keys are the zh-TW strings. */
189
+ function addMessages(locale, dict) {
190
+ I18N.messages[locale] = {
191
+ ...I18N.messages[locale],
192
+ ...dict
193
+ };
194
+ }
195
+ const isZhTW = () => /^zh-(TW|Hant)/i.test(I18N.locale);
196
+ // src/format.ts
197
+ const DECIMALS = {
198
+ money: 0,
199
+ percent: 1,
200
+ size: 1,
201
+ count: 0
202
+ };
203
+ const pad2 = (n) => String(n).padStart(2, "0");
204
+ function locale() {
205
+ return I18N.locale;
206
+ }
207
+ /** zh-TW: 2026/11/04(三). Other locales: their short date with weekday. */
208
+ function date(d, o = {}) {
209
+ if (!d) return "";
210
+ const wd = o.weekday !== false;
211
+ if (o.long) return new Intl.DateTimeFormat(I18N.locale, {
212
+ year: "numeric",
213
+ month: "long",
214
+ day: "numeric",
215
+ weekday: wd ? "long" : void 0
216
+ }).format(d);
217
+ if (isZhTW()) return fmtDate(d) + (wd ? `(${new Intl.DateTimeFormat("zh-TW", { weekday: "narrow" }).format(d)})` : "");
218
+ return new Intl.DateTimeFormat(I18N.locale, {
219
+ year: "numeric",
220
+ month: "2-digit",
221
+ day: "2-digit",
222
+ weekday: wd ? "short" : void 0
223
+ }).format(d);
224
+ }
225
+ /** zh-TW: 24-hour 15:57. Other locales: their own clock. */
226
+ function time(d) {
227
+ if (!d) return "";
228
+ return new Intl.DateTimeFormat(I18N.locale, isZhTW() ? {
229
+ hour: "2-digit",
230
+ minute: "2-digit",
231
+ hourCycle: "h23"
232
+ } : {
233
+ hour: "numeric",
234
+ minute: "2-digit"
235
+ }).format(d);
236
+ }
237
+ function dateTime(d, o) {
238
+ return d ? `${date(d, o)} ${time(d)}` : "";
239
+ }
240
+ /** Within 7 days: 「2 小時前」、「昨天」. Older: full date and time. Pass now to test. */
241
+ function relative(d, now = /* @__PURE__ */ new Date()) {
242
+ if (!d) return "";
243
+ const s = (now.getTime() - d.getTime()) / 1e3;
244
+ if (s < 0 || s >= 604800) return dateTime(d);
245
+ const rt = new Intl.RelativeTimeFormat(I18N.locale, { numeric: "auto" });
246
+ if (s < 60) return rt.format(0, "second");
247
+ if (s < 3600) return rt.format(-Math.floor(s / 60), "minute");
248
+ if (s < 86400) return rt.format(-Math.floor(s / 3600), "hour");
249
+ return rt.format(-Math.floor(s / 86400), "day");
250
+ }
251
+ function month(d) {
252
+ return new Intl.DateTimeFormat(I18N.locale, {
253
+ year: "numeric",
254
+ month: "long"
255
+ }).format(d);
256
+ }
257
+ /** Week starts on Sunday for zh-TW; other locales use Intl's week info when the browser has it. */
258
+ function firstDay() {
259
+ if (isZhTW()) return 0;
260
+ try {
261
+ const l = new Intl.Locale(I18N.locale);
262
+ const w = l.getWeekInfo ? l.getWeekInfo() : l.weekInfo;
263
+ if (w?.firstDay) return w.firstDay % 7;
264
+ } catch {}
265
+ return 0;
266
+ }
267
+ /** Narrow weekday names, starting from firstDay(). */
268
+ function weekdays() {
269
+ const fd = firstDay();
270
+ const f = new Intl.DateTimeFormat(I18N.locale, { weekday: "narrow" });
271
+ return Array.from({ length: 7 }, (_, i) => f.format(new Date(2026, 10, 1 + (fd + i) % 7)));
272
+ }
273
+ /** Decimals by unit: money 0, percent 1, size 1, count 0; pass a number to force it. */
274
+ function number(v, dec) {
275
+ const dd = typeof dec === "number" ? dec : dec ? DECIMALS[dec] : 0;
276
+ return new Intl.NumberFormat(I18N.locale, {
277
+ minimumFractionDigits: dd,
278
+ maximumFractionDigits: dd
279
+ }).format(v);
280
+ }
281
+ function percent(v, dec = 1) {
282
+ return new Intl.NumberFormat(I18N.locale, {
283
+ style: "percent",
284
+ minimumFractionDigits: dec,
285
+ maximumFractionDigits: dec
286
+ }).format(v / 100);
287
+ }
288
+ /** Only KPI cards abbreviate: 1,284 萬 in zh-TW (萬、億), 12.8M in English.
289
+ * like: format v with the unit and decimals that `like` gets, so a counting KPI keeps its width. */
290
+ function compact(v, like) {
291
+ const ref = like ?? v;
292
+ if (Math.abs(ref) < 1e4) return number(v);
293
+ if (/^zh/i.test(I18N.locale)) {
294
+ const a = Math.abs(ref);
295
+ const [unit, div, maxDec] = a >= 1e8 ? [
296
+ "億",
297
+ 1e8,
298
+ 2
299
+ ] : [
300
+ "萬",
301
+ 1e4,
302
+ 1
303
+ ];
304
+ const finalStr = new Intl.NumberFormat(I18N.locale, { maximumFractionDigits: maxDec }).format(a / div);
305
+ const sign = v < 0 ? "-" : "";
306
+ if (like === void 0) return `${sign}${finalStr} ${unit}`;
307
+ const digits = (finalStr.split(".")[1] || "").length;
308
+ return `${sign}${new Intl.NumberFormat(I18N.locale, {
309
+ minimumFractionDigits: digits,
310
+ maximumFractionDigits: digits
311
+ }).format(Math.abs(v) / div)} ${unit}`;
312
+ }
313
+ const nf = new Intl.NumberFormat(I18N.locale, {
314
+ notation: "compact",
315
+ maximumFractionDigits: 1
316
+ });
317
+ if (like === void 0) return nf.format(v);
318
+ const parts = nf.formatToParts(ref);
319
+ let num = "";
320
+ let dec = "";
321
+ for (const pt of parts) {
322
+ if (pt.type === "integer") num += pt.value;
323
+ if (pt.type === "fraction") {
324
+ num += "." + pt.value;
325
+ dec = pt.value;
326
+ }
327
+ }
328
+ const scale = 10 ** Math.round(Math.log10(Math.abs(ref) / (parseFloat(num) || 1)));
329
+ const inner = new Intl.NumberFormat(I18N.locale, {
330
+ minimumFractionDigits: dec.length,
331
+ maximumFractionDigits: dec.length
332
+ }).format(Math.abs(v) / scale);
333
+ let done = false;
334
+ const body = parts.map((pt) => {
335
+ if (pt.type === "integer" || pt.type === "group" || pt.type === "decimal" || pt.type === "fraction") {
336
+ if (done) return "";
337
+ done = true;
338
+ return inner;
339
+ }
340
+ return pt.value;
341
+ }).join("");
342
+ return (v < 0 && ref >= 0 ? "-" : "") + body;
343
+ }
344
+ /** zh-TW with TWD: NT$ 1,280, negatives -NT$ 1,280. Other locales and currencies: Intl's own symbol and order. */
345
+ function money(v, o = {}) {
346
+ const cur = o.currency || I18N.currency;
347
+ const body = o.compact ? compact(Math.abs(v), o.like !== void 0 ? Math.abs(o.like) : void 0) : number(Math.abs(v), "money");
348
+ if (isZhTW() && cur === "TWD") return `${v < 0 ? "-" : ""}NT$ ${body}`;
349
+ if (o.compact) return `${v < 0 ? "-" : ""}${body} ${cur}`;
350
+ return new Intl.NumberFormat(I18N.locale, {
351
+ style: "currency",
352
+ currency: cur,
353
+ currencyDisplay: "narrowSymbol",
354
+ minimumFractionDigits: 0,
355
+ maximumFractionDigits: cur === "TWD" || cur === "JPY" ? 0 : 2
356
+ }).format(v);
357
+ }
358
+ /** Bytes to 「186 KB」「54.9 MB」「1.2 GB」. */
359
+ function fileSize(b) {
360
+ if (b == null || Number.isNaN(b)) return "";
361
+ if (b < 1048576) return number(Math.max(1, Math.round(b / 1024))) + " KB";
362
+ if (b < 1073741824) return number(b / 1048576, 1) + " MB";
363
+ return number(b / 1073741824, 1) + " GB";
364
+ }
365
+ /** Shortens a path: keeps the first segment and the last two, 「src/…/hooks/ops.c:58」. */
366
+ function path(p, o = {}) {
367
+ const head = o.head ?? 1;
368
+ const tail = o.tail ?? 2;
369
+ const parts = String(p ?? "").split("/");
370
+ return parts.length > head + tail ? `${parts.slice(0, head).join("/")}/…/${parts.slice(-tail).join("/")}` : String(p ?? "");
371
+ }
372
+ /** Every date, number, amount, size and path shown in the UI goes through these. */
373
+ const format = {
374
+ locale,
375
+ date,
376
+ time,
377
+ dateTime,
378
+ relative,
379
+ month,
380
+ weekdays,
381
+ firstDay,
382
+ number,
383
+ percent,
384
+ compact,
385
+ money,
386
+ fileSize,
387
+ path
388
+ };
389
+ const fmtDate = (d) => d ? `${d.getFullYear()}/${pad2(d.getMonth() + 1)}/${pad2(d.getDate())}` : "";
390
+ function parseDate(s) {
391
+ const m = /^(\d{4})\/(\d{1,2})\/(\d{1,2})$/.exec(s || "");
392
+ if (!m) return null;
393
+ const d = new Date(+m[1], +m[2] - 1, +m[3]);
394
+ return d.getMonth() === +m[2] - 1 ? d : null;
395
+ }
396
+ const sameDay = (a, b) => !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
397
+ const dayAdd = (d, n) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);
398
+ export { parseDate as a, addMessages as c, format as i, setLocale as l, fileSize as n, sameDay as o, fmtDate as r, I18N as s, dayAdd as t, tr as u };
399
+
400
+ //# sourceMappingURL=format-entry-B1gAZnIN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-entry-B1gAZnIN.js","names":[],"sources":["../src/i18n.ts","../src/format.ts"],"sourcesContent":["/* ---------- i18n and formats ----------\n Every built-in string is the zh-TW text passed through tr(); other languages come from UI.addMessages().\n Dates and numbers go through UI.format, which uses Intl for the current locale. The zh-TW rules are the\n ones the design system chose; other locales use their own conventions from Intl. */\ninterface I18nState {\n locale: string;\n currency: string;\n messages: Record<string, Record<string, string>>;\n}\n\nexport const I18N: I18nState = {\n locale: 'zh-TW',\n currency: 'TWD',\n messages: {\n en: {\n 'Email 或帳號': 'Email or username',\n '{label}:{a} 到 {b}': '{label}: {a} to {b}',\n '{n} 個百分點': '{n} pts',\n 上一頁: 'Previous page',\n 上個月: 'Previous month',\n '上傳失敗,請再試一次。': 'Upload failed. Try again.',\n 下一頁: 'Next page',\n 下個月: 'Next month',\n 主要導覽: 'Main navigation',\n 主題: 'Theme',\n 今天: 'Today',\n 全選: 'Select all',\n 全部: 'All',\n 全部標為已讀: 'Mark all as read',\n '共 {n} 筆': '{n} items',\n 分頁: 'Pagination',\n 刪除: 'Delete',\n 危險操作: 'Danger zone',\n 取消選取: 'Clear selection',\n '可以直接輸入,例如 2026/11/14': 'Type a date, e.g. 2026/11/14',\n 回上一頁: 'Go back',\n 回首頁: 'Go home',\n '完成 ✓': 'Done ✓',\n 密碼: 'Password',\n 展開側邊欄: 'Expand sidebar',\n '已選 {n} 筆': '{n} selected',\n 帳號: 'Username',\n 強調色: 'Accent color',\n '忘記密碼?': 'Forgot password?',\n 找不到符合的選項: 'No matching options',\n '拖放檔案,或 ': 'Drop files here, or ',\n 搜尋: 'Search',\n 操作: 'Actions',\n 收合側邊欄: 'Collapse sidebar',\n 放棄: 'Discard',\n '放棄未儲存的變更?': 'Discard unsaved changes?',\n '新增「{q}」': 'Add “{q}”',\n '日期格式不正確,請寫成 2026/11/14': 'Invalid date. Use 2026/11/14.',\n 更多操作: 'More actions',\n 更多: 'More',\n 全部頁面: 'All pages',\n '最近 30 天': 'Last 30 days',\n '最近 7 天': 'Last 7 days',\n 期間: 'Period',\n 未讀: 'Unread',\n 本月: 'This month',\n 沒有符合的資料: 'No matching data',\n 沒有通知: 'No notifications',\n 清除: 'Clear',\n 清除搜尋: 'Clear search',\n 登入: 'Sign in',\n 發生錯誤: 'Something went wrong',\n '移除 {name}': 'Remove {name}',\n '第 {a}–{b} 筆,共 {n} 筆': '{a}–{b} of {n}',\n 繼續編輯: 'Keep editing',\n '自訂強調色(色碼)': 'Custom accent color (hex)',\n '色碼格式不正確,例如 #2457d6': 'Invalid hex, e.g. #2457d6',\n 設定分類: 'Settings sections',\n 請輸入密碼: 'Enter your password',\n 請輸入帳號: 'Enter your username',\n 請選擇: 'Select',\n 路徑: 'Breadcrumb',\n 較上週: 'vs last week',\n 載入中: 'Loading',\n '輸入 # 加 6 碼': 'Enter # and 6 digits',\n 通知: 'Notifications',\n '通知,{n} 則未讀': 'Notifications, {n} unread',\n '選取第 {n} 筆': 'Select row {n}',\n 選擇日期: 'Choose date',\n 選擇期間: 'Choose period',\n 選擇檔案: 'choose files',\n 重試: 'Retry',\n 開啟日曆: 'Open calendar',\n 關閉: 'Close',\n '關閉後,剛才的修改不會保留。': 'If you close now, your changes will be lost.',\n 關閉提示: 'Dismiss',\n 隱藏密碼: 'Hide password',\n 顯示密碼: 'Show password',\n '(今天)': ' (today)',\n 伺服器暫時無法回應: 'The server is not responding',\n 找不到這個頁面: 'Page not found',\n 沒有權限查看這個頁面: 'You do not have access to this page',\n '網址可能打錯了,或這個頁面已經移除。': 'The address may be wrong, or the page has been removed.',\n '這個問題已經記錄下來,請稍後重新整理再試。': 'The problem has been logged. Refresh the page later.',\n '請向管理員申請權限,或切換成有權限的帳號。': 'Ask an admin for access, or switch to an account that has it.',\n 自動: 'Auto',\n 淺色: 'Light',\n 深色: 'Dark',\n 藍: 'Blue',\n 靛: 'Indigo',\n 紫: 'Purple',\n 桃紅: 'Pink',\n 紅: 'Red',\n 橘: 'Orange',\n 綠: 'Green',\n 青: 'Teal',\n 草稿: 'Draft',\n 進行中: 'In progress',\n 審核中: 'In review',\n 完成: 'Done',\n 失敗: 'Failed',\n 檢視: 'Views',\n '{n} / {total} 筆': '{n} / {total}',\n 欄位: 'Columns',\n 顯示的欄位: 'Visible columns',\n 清除篩選: 'Clear filters',\n 清除全部: 'Clear all',\n 篩選: 'Filter',\n 最低: 'Min',\n 最高: 'Max',\n '合計 {n} 筆': 'Total: {n}',\n 平均: 'Avg',\n '選取 {name}': 'Select {name}',\n '{n} 個新': '{n} new',\n '{n} 個檔案': '{n} files',\n '下載 {name}': 'Download {name}',\n '已選 {n} 個檔案': '{n} files selected',\n '共 {size}': '{size} total',\n 清除選取: 'Clear selection',\n 下載: 'Download',\n 全部展開: 'Expand all',\n 全部收合: 'Collapse all',\n 這裡還沒有檔案: 'No files here yet',\n 顯示全部: 'Show all',\n 收合: 'Show less',\n 依狀態篩選: 'Filter by status',\n 展開: 'Expand',\n 沒有項目: 'Nothing here',\n 即時: 'Live',\n 已過期: 'Stale',\n 離線: 'Offline',\n 切換專案: 'Switch project',\n '切換專案,目前是 {name}': 'Switch project, now {name}',\n 推測: 'Inferred',\n '{n} 個項目': '{n} items',\n '{a} 個項目使用,共 {b} 次': 'Used {b} times by {a} items',\n 共用項目: 'Shared',\n 次數越多線越粗: 'Thicker lines mean more often',\n 架構圖: 'Architecture',\n '{n} 次': '{n} calls',\n 原始碼: 'Source',\n '顯示全部 {n} 行': 'Show all {n} lines',\n '只顯示第 {n} 行前後': 'Show only around line {n}',\n '無法載入 {name} 的子項目': 'Could not load the children of {name}',\n '找不到符合「{q}」的結果': 'No results for “{q}”',\n 輸入名稱開始搜尋: 'Type a name to search',\n 搜尋中: 'Searching',\n 搜尋結果: 'Search results',\n 最近開啟: 'Recently opened',\n 選擇: 'Select',\n 打開: 'Open',\n 取消: 'Cancel',\n 略過: 'Skip',\n 上一步: 'Back',\n 下一步: 'Next',\n 建議修正: 'Suggested fix',\n 複製修正: 'Copy fix',\n 已複製: 'Copied',\n '原本:': 'Before: ',\n '改成:': 'After: ',\n 關閉說明: 'Close explanation',\n '(說明)': ' (explain)',\n '搜尋({k})': 'Search ({k})',\n 確定的關係: 'Confirmed',\n 推測的關係: 'Inferred',\n 外部項目: 'External',\n },\n },\n};\n\nfunction msgsFor(loc: string): Record<string, string> | null {\n return I18N.messages[loc] || I18N.messages[loc.split('-')[0]] || null;\n}\n\n/** Translates a built-in zh-TW string into the current locale; {name} placeholders take vars. */\nexport function tr(key: string, vars?: Record<string, string | number>): string {\n const m = I18N.locale.startsWith('zh') ? null : msgsFor(I18N.locale);\n const out = m?.[key] ?? key;\n return vars ? out.replace(/\\{(\\w+)\\}/g, (a, k: string) => (vars[k] !== undefined ? String(vars[k]) : a)) : out;\n}\n\n/** Switches the interface language and, optionally, the currency used by format.money. */\nexport function setLocale(locale: string, opts?: { currency?: string }): void {\n I18N.locale = locale || 'zh-TW';\n if (opts?.currency) I18N.currency = opts.currency;\n if (typeof document !== 'undefined') document.documentElement.setAttribute('lang', I18N.locale);\n}\n\n/** Adds or overrides translations for a locale. Keys are the zh-TW strings. */\nexport function addMessages(locale: string, dict: Record<string, string>): void {\n I18N.messages[locale] = { ...I18N.messages[locale], ...dict };\n}\n\nexport const isZhTW = (): boolean => /^zh-(TW|Hant)/i.test(I18N.locale);\n","import { I18N, isZhTW } from './i18n';\n\n/* Dates and numbers for the current locale (setLocale). zh-TW follows the design system's rules\n (2026/11/04(三), 24-hour clock, NT$ 1,280, 萬 and 億 in KPI cards); other locales use Intl's conventions. */\n\nexport type Decimals = number | 'money' | 'percent' | 'size' | 'count';\n\nconst DECIMALS = { money: 0, percent: 1, size: 1, count: 0 } as const;\n\nconst pad2 = (n: number): string => String(n).padStart(2, '0');\n\nfunction locale(): string {\n return I18N.locale;\n}\n\n/** zh-TW: 2026/11/04(三). Other locales: their short date with weekday. */\nfunction date(d: Date | null | undefined, o: { weekday?: boolean; long?: boolean } = {}): string {\n if (!d) return '';\n const wd = o.weekday !== false;\n if (o.long) return new Intl.DateTimeFormat(I18N.locale, { year: 'numeric', month: 'long', day: 'numeric', weekday: wd ? 'long' : undefined }).format(d);\n if (isZhTW()) return fmtDate(d) + (wd ? `(${new Intl.DateTimeFormat('zh-TW', { weekday: 'narrow' }).format(d)})` : '');\n return new Intl.DateTimeFormat(I18N.locale, { year: 'numeric', month: '2-digit', day: '2-digit', weekday: wd ? 'short' : undefined }).format(d);\n}\n\n/** zh-TW: 24-hour 15:57. Other locales: their own clock. */\nfunction time(d: Date | null | undefined): string {\n if (!d) return '';\n return new Intl.DateTimeFormat(\n I18N.locale,\n isZhTW() ? { hour: '2-digit', minute: '2-digit', hourCycle: 'h23' } : { hour: 'numeric', minute: '2-digit' },\n ).format(d);\n}\n\nfunction dateTime(d: Date | null | undefined, o?: { weekday?: boolean }): string {\n return d ? `${date(d, o)} ${time(d)}` : '';\n}\n\n/** Within 7 days: 「2 小時前」、「昨天」. Older: full date and time. Pass now to test. */\nfunction relative(d: Date | null | undefined, now: Date = new Date()): string {\n if (!d) return '';\n const s = (now.getTime() - d.getTime()) / 1000;\n if (s < 0 || s >= 604800) return dateTime(d);\n const rt = new Intl.RelativeTimeFormat(I18N.locale, { numeric: 'auto' });\n if (s < 60) return rt.format(0, 'second');\n if (s < 3600) return rt.format(-Math.floor(s / 60), 'minute');\n if (s < 86400) return rt.format(-Math.floor(s / 3600), 'hour');\n return rt.format(-Math.floor(s / 86400), 'day');\n}\n\nfunction month(d: Date): string {\n return new Intl.DateTimeFormat(I18N.locale, { year: 'numeric', month: 'long' }).format(d);\n}\n\n/** Week starts on Sunday for zh-TW; other locales use Intl's week info when the browser has it. */\nfunction firstDay(): number {\n if (isZhTW()) return 0;\n try {\n const l = new Intl.Locale(I18N.locale) as Intl.Locale & { getWeekInfo?: () => { firstDay: number }; weekInfo?: { firstDay: number } };\n const w = l.getWeekInfo ? l.getWeekInfo() : l.weekInfo;\n if (w?.firstDay) return w.firstDay % 7;\n } catch {\n /* older browsers have no week info */\n }\n return 0;\n}\n\n/** Narrow weekday names, starting from firstDay(). */\nfunction weekdays(): string[] {\n const fd = firstDay();\n const f = new Intl.DateTimeFormat(I18N.locale, { weekday: 'narrow' });\n // 2026/11/01 is a Sunday.\n return Array.from({ length: 7 }, (_, i) => f.format(new Date(2026, 10, 1 + ((fd + i) % 7))));\n}\n\n/** Decimals by unit: money 0, percent 1, size 1, count 0; pass a number to force it. */\nfunction number(v: number, dec?: Decimals): string {\n const dd = typeof dec === 'number' ? dec : dec ? DECIMALS[dec] : 0;\n return new Intl.NumberFormat(I18N.locale, { minimumFractionDigits: dd, maximumFractionDigits: dd }).format(v);\n}\n\nfunction percent(v: number, dec = 1): string {\n return new Intl.NumberFormat(I18N.locale, { style: 'percent', minimumFractionDigits: dec, maximumFractionDigits: dec }).format(v / 100);\n}\n\n/** Only KPI cards abbreviate: 1,284 萬 in zh-TW (萬、億), 12.8M in English.\n * like: format v with the unit and decimals that `like` gets, so a counting KPI keeps its width. */\nfunction compact(v: number, like?: number): string {\n const ref = like ?? v;\n if (Math.abs(ref) < 1e4) return number(v);\n if (/^zh/i.test(I18N.locale)) {\n const a = Math.abs(ref);\n const [unit, div, maxDec] = a >= 1e8 ? (['億', 1e8, 2] as const) : (['萬', 1e4, 1] as const);\n const finalStr = new Intl.NumberFormat(I18N.locale, { maximumFractionDigits: maxDec }).format(a / div);\n const sign = v < 0 ? '-' : '';\n if (like === undefined) return `${sign}${finalStr} ${unit}`;\n const digits = (finalStr.split('.')[1] || '').length;\n return `${sign}${new Intl.NumberFormat(I18N.locale, { minimumFractionDigits: digits, maximumFractionDigits: digits }).format(Math.abs(v) / div)} ${unit}`;\n }\n const nf = new Intl.NumberFormat(I18N.locale, { notation: 'compact', maximumFractionDigits: 1 });\n if (like === undefined) return nf.format(v);\n const parts = nf.formatToParts(ref);\n let num = '';\n let dec = '';\n for (const pt of parts) {\n if (pt.type === 'integer') num += pt.value;\n if (pt.type === 'fraction') {\n num += '.' + pt.value;\n dec = pt.value;\n }\n }\n const mant = parseFloat(num) || 1;\n const scale = 10 ** Math.round(Math.log10(Math.abs(ref) / mant));\n const inner = new Intl.NumberFormat(I18N.locale, { minimumFractionDigits: dec.length, maximumFractionDigits: dec.length }).format(Math.abs(v) / scale);\n let done = false;\n const body = parts\n .map((pt) => {\n if (pt.type === 'integer' || pt.type === 'group' || pt.type === 'decimal' || pt.type === 'fraction') {\n if (done) return '';\n done = true;\n return inner;\n }\n return pt.value;\n })\n .join('');\n return (v < 0 && ref >= 0 ? '-' : '') + body;\n}\n\n/** zh-TW with TWD: NT$ 1,280, negatives -NT$ 1,280. Other locales and currencies: Intl's own symbol and order. */\nfunction money(v: number, o: { currency?: string; compact?: boolean; like?: number } = {}): string {\n const cur = o.currency || I18N.currency;\n const body = o.compact ? compact(Math.abs(v), o.like !== undefined ? Math.abs(o.like) : undefined) : number(Math.abs(v), 'money');\n if (isZhTW() && cur === 'TWD') return `${v < 0 ? '-' : ''}NT$ ${body}`;\n if (o.compact) return `${v < 0 ? '-' : ''}${body} ${cur}`;\n return new Intl.NumberFormat(I18N.locale, {\n style: 'currency',\n currency: cur,\n currencyDisplay: 'narrowSymbol',\n minimumFractionDigits: 0,\n maximumFractionDigits: cur === 'TWD' || cur === 'JPY' ? 0 : 2,\n }).format(v);\n}\n\n/** Bytes to 「186 KB」「54.9 MB」「1.2 GB」. */\nexport function fileSize(b: number | null | undefined): string {\n if (b == null || Number.isNaN(b)) return '';\n if (b < 1048576) return number(Math.max(1, Math.round(b / 1024))) + ' KB';\n if (b < 1073741824) return number(b / 1048576, 1) + ' MB';\n return number(b / 1073741824, 1) + ' GB';\n}\n\n/** Shortens a path: keeps the first segment and the last two, 「src/…/hooks/ops.c:58」. */\nfunction path(p: string | null | undefined, o: { head?: number; tail?: number } = {}): string {\n const head = o.head ?? 1;\n const tail = o.tail ?? 2;\n const parts = String(p ?? '').split('/');\n return parts.length > head + tail ? `${parts.slice(0, head).join('/')}/…/${parts.slice(-tail).join('/')}` : String(p ?? '');\n}\n\n/** Every date, number, amount, size and path shown in the UI goes through these. */\nexport const format = { locale, date, time, dateTime, relative, month, weekdays, firstDay, number, percent, compact, money, fileSize, path };\n\n/* Calendar helpers (local dates, no time). */\nexport const fmtDate = (d: Date | null | undefined): string => (d ? `${d.getFullYear()}/${pad2(d.getMonth() + 1)}/${pad2(d.getDate())}` : '');\n\nexport function parseDate(s: string | null | undefined): Date | null {\n const m = /^(\\d{4})\\/(\\d{1,2})\\/(\\d{1,2})$/.exec(s || '');\n if (!m) return null;\n const d = new Date(+m[1], +m[2] - 1, +m[3]);\n return d.getMonth() === +m[2] - 1 ? d : null;\n}\n\nexport const sameDay = (a: Date | null | undefined, b: Date | null | undefined): boolean =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n\nexport const dayAdd = (d: Date, n: number): Date => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\n"],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ type Decimals = number | 'money' | 'percent' | 'size' | 'count';
2
+ declare function locale(): string;
3
+ /** zh-TW: 2026/11/04(三). Other locales: their short date with weekday. */
4
+ declare function date(d: Date | null | undefined, o?: {
5
+ weekday?: boolean;
6
+ long?: boolean;
7
+ }): string;
8
+ /** zh-TW: 24-hour 15:57. Other locales: their own clock. */
9
+ declare function time(d: Date | null | undefined): string;
10
+ declare function dateTime(d: Date | null | undefined, o?: {
11
+ weekday?: boolean;
12
+ }): string;
13
+ /** Within 7 days: 「2 小時前」、「昨天」. Older: full date and time. Pass now to test. */
14
+ declare function relative(d: Date | null | undefined, now?: Date): string;
15
+ declare function month(d: Date): string;
16
+ /** Week starts on Sunday for zh-TW; other locales use Intl's week info when the browser has it. */
17
+ declare function firstDay(): number;
18
+ /** Narrow weekday names, starting from firstDay(). */
19
+ declare function weekdays(): string[];
20
+ /** Decimals by unit: money 0, percent 1, size 1, count 0; pass a number to force it. */
21
+ declare function number(v: number, dec?: Decimals): string;
22
+ declare function percent(v: number, dec?: number): string;
23
+ /** Only KPI cards abbreviate: 1,284 萬 in zh-TW (萬、億), 12.8M in English.
24
+ * like: format v with the unit and decimals that `like` gets, so a counting KPI keeps its width. */
25
+ declare function compact(v: number, like?: number): string;
26
+ /** zh-TW with TWD: NT$ 1,280, negatives -NT$ 1,280. Other locales and currencies: Intl's own symbol and order. */
27
+ declare function money(v: number, o?: {
28
+ currency?: string;
29
+ compact?: boolean;
30
+ like?: number;
31
+ }): string;
32
+ /** Bytes to 「186 KB」「54.9 MB」「1.2 GB」. */
33
+ declare function fileSize(b: number | null | undefined): string;
34
+ /** Shortens a path: keeps the first segment and the last two, 「src/…/hooks/ops.c:58」. */
35
+ declare function path(p: string | null | undefined, o?: {
36
+ head?: number;
37
+ tail?: number;
38
+ }): string;
39
+ /** Every date, number, amount, size and path shown in the UI goes through these. */
40
+ declare const format: {
41
+ locale: typeof locale;
42
+ date: typeof date;
43
+ time: typeof time;
44
+ dateTime: typeof dateTime;
45
+ relative: typeof relative;
46
+ month: typeof month;
47
+ weekdays: typeof weekdays;
48
+ firstDay: typeof firstDay;
49
+ number: typeof number;
50
+ percent: typeof percent;
51
+ compact: typeof compact;
52
+ money: typeof money;
53
+ fileSize: typeof fileSize;
54
+ path: typeof path;
55
+ };
56
+ /** Translates a built-in zh-TW string into the current locale; {name} placeholders take vars. */
57
+ declare function tr(key: string, vars?: Record<string, string | number>): string;
58
+ /** Switches the interface language and, optionally, the currency used by format.money. */
59
+ declare function setLocale(locale: string, opts?: {
60
+ currency?: string;
61
+ }): void;
62
+ /** Adds or overrides translations for a locale. Keys are the zh-TW strings. */
63
+ declare function addMessages(locale: string, dict: Record<string, string>): void;
64
+ export { format as a, Decimals as i, setLocale as n, tr as r, addMessages as t };
@@ -0,0 +1,2 @@
1
+ import { a as format, i as Decimals, n as setLocale, r as tr, t as addMessages } from "./format-entry-BKj7P9i6.js";
2
+ export { type Decimals, addMessages, format, setLocale, tr as t };
package/dist/format.js ADDED
@@ -0,0 +1 @@
1
+ export { c as addMessages, i as format, l as setLocale, u as t } from "./format-entry-B1gAZnIN.js";