@lerianstudio/sindarian-ui 2.0.0-beta.24 → 2.0.0-beta.26

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 (337) hide show
  1. package/dist/charts/chart.js +4 -231
  2. package/dist/charts/index.js +1 -11
  3. package/dist/components/breadcrumb/get-breadcrumb-paths.js +1 -18
  4. package/dist/components/breadcrumb/index.js +1 -37
  5. package/dist/components/card/account-card/index.js +1 -69
  6. package/dist/components/card/basic-card/index.js +1 -20
  7. package/dist/components/card/dashboard-card/index.js +1 -20
  8. package/dist/components/card/entity-card/index.js +1 -68
  9. package/dist/components/card/index.js +1 -20
  10. package/dist/components/dialog/confirmation-dialog/index.d.ts.map +1 -1
  11. package/dist/components/dialog/confirmation-dialog/index.js +1 -96
  12. package/dist/components/dialog/confirmation-dialog/use-confirm-dialog.js +1 -55
  13. package/dist/components/dialog/index.js +1 -19
  14. package/dist/components/dialog/large-dialog/index.d.ts +2 -2
  15. package/dist/components/dialog/large-dialog/index.d.ts.map +1 -1
  16. package/dist/components/dialog/large-dialog/index.js +1 -21
  17. package/dist/components/entity-box/index.js +1 -67
  18. package/dist/components/entity-data-table/index.js +1 -20
  19. package/dist/components/form/combo-box-field/index.js +1 -35
  20. package/dist/components/form/country-field/index.js +1 -11
  21. package/dist/components/form/date-picker-field/index.js +1 -83
  22. package/dist/components/form/date-range-field/index.js +1 -58
  23. package/dist/components/form/date-time-picker-field/index.js +1 -114
  24. package/dist/components/form/file-upload-field/index.js +1 -69
  25. package/dist/components/form/index.js +1 -31
  26. package/dist/components/form/input-field/index.js +1 -96
  27. package/dist/components/form/otp-field/index.js +1 -19
  28. package/dist/components/form/pagination-limit-field/index.js +1 -10
  29. package/dist/components/form/password-field/index.d.ts.map +1 -1
  30. package/dist/components/form/password-field/index.js +1 -16
  31. package/dist/components/form/radio-group-field/index.js +1 -36
  32. package/dist/components/form/renderable-label.js +1 -57
  33. package/dist/components/form/select-field/index.js +1 -68
  34. package/dist/components/form/state-field/index.js +1 -42
  35. package/dist/components/form/switch-field/index.js +1 -16
  36. package/dist/components/form/textarea-field/index.js +1 -23
  37. package/dist/components/page/index.js +1 -20
  38. package/dist/components/page-header/index.js +1 -80
  39. package/dist/components/pagination/index.js +1 -10
  40. package/dist/components/table/id-table-cell.js +1 -109
  41. package/dist/components/table/index.js +1 -19
  42. package/dist/components/table/locked-table-actions.js +1 -41
  43. package/dist/components/table/name-table-cell.js +1 -58
  44. package/dist/components/ui/accordion/index.js +1 -62
  45. package/dist/components/ui/alert/index.js +1 -45
  46. package/dist/components/ui/alert-dialog/index.js +1 -84
  47. package/dist/components/ui/autocomplete/index.js +1 -440
  48. package/dist/components/ui/autosize-textarea/index.js +1 -89
  49. package/dist/components/ui/avatar/index.js +1 -51
  50. package/dist/components/ui/badge/index.js +1 -83
  51. package/dist/components/ui/breadcrumb/index.js +1 -35
  52. package/dist/components/ui/button/index.js +1 -65
  53. package/dist/components/ui/button/styles.css +2 -1
  54. package/dist/components/ui/calendar/index.js +1 -118
  55. package/dist/components/ui/card/index.js +1 -32
  56. package/dist/components/ui/checkbox/index.js +1 -44
  57. package/dist/components/ui/collapsible/index.js +1 -50
  58. package/dist/components/ui/command/index.js +1 -95
  59. package/dist/components/ui/copy-field/index.js +1 -163
  60. package/dist/components/ui/dialog/index.d.ts +4 -1
  61. package/dist/components/ui/dialog/index.d.ts.map +1 -1
  62. package/dist/components/ui/dialog/index.js +1 -80
  63. package/dist/components/ui/dialog/styles.css +2 -1
  64. package/dist/components/ui/dropdown-menu/index.js +1 -110
  65. package/dist/components/ui/field/index.js +1 -82
  66. package/dist/components/ui/file-upload/index.js +1 -574
  67. package/dist/components/ui/form.js +1 -162
  68. package/dist/components/ui/hover-card/index.js +1 -51
  69. package/dist/components/ui/icon-button/index.js +1 -35
  70. package/dist/components/ui/input/adornment.js +1 -21
  71. package/dist/components/ui/input/index.js +1 -99
  72. package/dist/components/ui/input/styles.css +29 -12
  73. package/dist/components/ui/label/index.js +1 -45
  74. package/dist/components/ui/lerian-wordmark/index.js +1 -7
  75. package/dist/components/ui/loading-button/index.js +1 -9
  76. package/dist/components/ui/multiple-select/index.js +1 -235
  77. package/dist/components/ui/otp-input/index.js +1 -62
  78. package/dist/components/ui/paper/index.js +1 -8
  79. package/dist/components/ui/paper-collapsible/index.js +1 -24
  80. package/dist/components/ui/popover/index.js +1 -55
  81. package/dist/components/ui/progress/index.js +1 -66
  82. package/dist/components/ui/qr-code/index.js +1 -27
  83. package/dist/components/ui/radio-group/index.js +1 -48
  84. package/dist/components/ui/scroll-area/index.js +1 -49
  85. package/dist/components/ui/select/index.js +1 -119
  86. package/dist/components/ui/select/styles.css +6 -3
  87. package/dist/components/ui/separator/index.js +1 -43
  88. package/dist/components/ui/sheet/index.d.ts +7 -2
  89. package/dist/components/ui/sheet/index.d.ts.map +1 -1
  90. package/dist/components/ui/sheet/index.js +1 -136
  91. package/dist/components/ui/sidebar/index.js +1 -27
  92. package/dist/components/ui/sidebar/next-router.cjs +1 -119
  93. package/dist/components/ui/sidebar/sidebar-back-button.js +1 -8
  94. package/dist/components/ui/sidebar/sidebar-components.js +1 -23
  95. package/dist/components/ui/sidebar/sidebar-expand-button.js +1 -49
  96. package/dist/components/ui/sidebar/sidebar-item-button.js +1 -21
  97. package/dist/components/ui/sidebar/sidebar-item-collapsible.js +1 -52
  98. package/dist/components/ui/sidebar/sidebar-item-icon-button.js +1 -18
  99. package/dist/components/ui/sidebar/sidebar-item.js +1 -44
  100. package/dist/components/ui/sidebar/sidebar-provider.js +1 -201
  101. package/dist/components/ui/sidebar/sidebar-root.d.ts +3 -1
  102. package/dist/components/ui/sidebar/sidebar-root.d.ts.map +1 -1
  103. package/dist/components/ui/sidebar/sidebar-root.js +1 -130
  104. package/dist/components/ui/sidebar/sidebar-router.js +1 -126
  105. package/dist/components/ui/sidebar/sidebar-trigger.js +1 -57
  106. package/dist/components/ui/skeleton/index.js +1 -8
  107. package/dist/components/ui/stepper/index.js +1 -29
  108. package/dist/components/ui/switch/index.js +1 -43
  109. package/dist/components/ui/table/index.js +1 -56
  110. package/dist/components/ui/tabs/index.js +1 -55
  111. package/dist/components/ui/textarea/index.js +1 -8
  112. package/dist/components/ui/time-picker/index.js +1 -85
  113. package/dist/components/ui/toast/index.js +1 -3
  114. package/dist/components/ui/toast/toaster.js +1 -16
  115. package/dist/components/ui/toggle-group/index.js +1 -156
  116. package/dist/components/ui/tooltip/index.js +1 -81
  117. package/dist/domain/blotter/index.js +1 -20
  118. package/dist/domain/delinquency-aging/aging-buckets.js +1 -120
  119. package/dist/domain/delinquency-aging/index.js +1 -222
  120. package/dist/domain/figure/index.js +1 -19
  121. package/dist/domain/format.js +1 -137
  122. package/dist/domain/index.js +1 -43
  123. package/dist/domain/key-id/index.js +1 -174
  124. package/dist/domain/ledger-sheet/index.js +1 -28
  125. package/dist/domain/money-diff.js +1 -48
  126. package/dist/domain/money-math.js +1 -104
  127. package/dist/domain/money-text/index.js +1 -123
  128. package/dist/domain/section-label/index.js +1 -17
  129. package/dist/domain/status-rail/index.js +1 -76
  130. package/dist/domain/threshold-gauge/index.js +1 -161
  131. package/dist/enterprise/alert-banner/index.js +1 -24
  132. package/dist/enterprise/app-shell/index.js +1 -87
  133. package/dist/enterprise/cursor-pager/index.js +1 -26
  134. package/dist/enterprise/data-table/column-size.js +1 -103
  135. package/dist/enterprise/data-table/index.d.ts.map +1 -1
  136. package/dist/enterprise/data-table/index.js +1 -345
  137. package/dist/enterprise/date-range-picker/index.js +1 -115
  138. package/dist/enterprise/detail-panel/index.js +1 -20
  139. package/dist/enterprise/empty-state/index.d.ts +6 -1
  140. package/dist/enterprise/empty-state/index.d.ts.map +1 -1
  141. package/dist/enterprise/empty-state/index.js +1 -13
  142. package/dist/enterprise/index.js +1 -39
  143. package/dist/enterprise/number-input/index.js +1 -252
  144. package/dist/enterprise/search-input/index.js +1 -121
  145. package/dist/enterprise/stat-card/index.js +1 -75
  146. package/dist/enterprise/status-badge/index.js +1 -120
  147. package/dist/enterprise/use-is-mobile.js +1 -68
  148. package/dist/enterprise/virtualized-table/index.js +1 -141
  149. package/dist/esm/charts/chart.js +4 -190
  150. package/dist/esm/charts/index.js +1 -3
  151. package/dist/esm/components/breadcrumb/get-breadcrumb-paths.js +1 -12
  152. package/dist/esm/components/breadcrumb/index.js +1 -30
  153. package/dist/esm/components/card/account-card/index.js +1 -53
  154. package/dist/esm/components/card/basic-card/index.js +1 -14
  155. package/dist/esm/components/card/dashboard-card/index.js +1 -14
  156. package/dist/esm/components/card/entity-card/index.js +1 -52
  157. package/dist/esm/components/card/index.js +1 -4
  158. package/dist/esm/components/dialog/confirmation-dialog/index.d.ts.map +1 -1
  159. package/dist/esm/components/dialog/confirmation-dialog/index.js +1 -60
  160. package/dist/esm/components/dialog/confirmation-dialog/use-confirm-dialog.js +1 -49
  161. package/dist/esm/components/dialog/index.js +1 -3
  162. package/dist/esm/components/dialog/large-dialog/index.d.ts +2 -2
  163. package/dist/esm/components/dialog/large-dialog/index.d.ts.map +1 -1
  164. package/dist/esm/components/dialog/large-dialog/index.js +1 -16
  165. package/dist/esm/components/entity-box/index.js +1 -56
  166. package/dist/esm/components/entity-data-table/index.js +1 -17
  167. package/dist/esm/components/form/combo-box-field/index.js +1 -28
  168. package/dist/esm/components/form/country-field/index.js +1 -7
  169. package/dist/esm/components/form/date-picker-field/index.js +1 -43
  170. package/dist/esm/components/form/date-range-field/index.js +1 -18
  171. package/dist/esm/components/form/date-time-picker-field/index.js +1 -74
  172. package/dist/esm/components/form/file-upload-field/index.js +1 -65
  173. package/dist/esm/components/form/index.js +1 -15
  174. package/dist/esm/components/form/input-field/index.js +1 -92
  175. package/dist/esm/components/form/otp-field/index.js +1 -15
  176. package/dist/esm/components/form/pagination-limit-field/index.js +1 -6
  177. package/dist/esm/components/form/password-field/index.d.ts.map +1 -1
  178. package/dist/esm/components/form/password-field/index.js +1 -10
  179. package/dist/esm/components/form/radio-group-field/index.js +1 -32
  180. package/dist/esm/components/form/renderable-label.js +1 -54
  181. package/dist/esm/components/form/select-field/index.js +1 -64
  182. package/dist/esm/components/form/state-field/index.js +1 -35
  183. package/dist/esm/components/form/switch-field/index.js +1 -12
  184. package/dist/esm/components/form/textarea-field/index.js +1 -19
  185. package/dist/esm/components/page/index.js +1 -15
  186. package/dist/esm/components/page-header/index.js +1 -71
  187. package/dist/esm/components/pagination/index.js +1 -6
  188. package/dist/esm/components/table/id-table-cell.js +1 -105
  189. package/dist/esm/components/table/index.js +1 -3
  190. package/dist/esm/components/table/locked-table-actions.js +1 -37
  191. package/dist/esm/components/table/name-table-cell.js +1 -54
  192. package/dist/esm/components/ui/accordion/index.js +1 -24
  193. package/dist/esm/components/ui/alert/index.js +1 -38
  194. package/dist/esm/components/ui/alert-dialog/index.js +1 -39
  195. package/dist/esm/components/ui/autocomplete/index.js +1 -392
  196. package/dist/esm/components/ui/autosize-textarea/index.js +1 -51
  197. package/dist/esm/components/ui/avatar/index.js +1 -14
  198. package/dist/esm/components/ui/badge/index.js +1 -79
  199. package/dist/esm/components/ui/breadcrumb/index.js +1 -27
  200. package/dist/esm/components/ui/button/index.js +1 -60
  201. package/dist/esm/components/ui/calendar/index.js +1 -82
  202. package/dist/esm/components/ui/card/index.js +1 -24
  203. package/dist/esm/components/ui/checkbox/index.js +1 -9
  204. package/dist/esm/components/ui/collapsible/index.js +1 -13
  205. package/dist/esm/components/ui/command/index.js +1 -51
  206. package/dist/esm/components/ui/copy-field/index.js +1 -127
  207. package/dist/esm/components/ui/dialog/index.d.ts +4 -1
  208. package/dist/esm/components/ui/dialog/index.d.ts.map +1 -1
  209. package/dist/esm/components/ui/dialog/index.js +1 -36
  210. package/dist/esm/components/ui/dropdown-menu/index.js +1 -60
  211. package/dist/esm/components/ui/field/index.js +1 -71
  212. package/dist/esm/components/ui/file-upload/index.js +1 -536
  213. package/dist/esm/components/ui/form.js +1 -118
  214. package/dist/esm/components/ui/hover-card/index.js +1 -14
  215. package/dist/esm/components/ui/icon-button/index.js +1 -31
  216. package/dist/esm/components/ui/input/adornment.js +1 -17
  217. package/dist/esm/components/ui/input/index.js +1 -60
  218. package/dist/esm/components/ui/label/index.js +1 -10
  219. package/dist/esm/components/ui/lerian-wordmark/index.js +1 -4
  220. package/dist/esm/components/ui/loading-button/index.js +1 -7
  221. package/dist/esm/components/ui/multiple-select/index.js +1 -196
  222. package/dist/esm/components/ui/otp-input/index.js +1 -21
  223. package/dist/esm/components/ui/paper/index.js +1 -5
  224. package/dist/esm/components/ui/paper-collapsible/index.js +1 -19
  225. package/dist/esm/components/ui/popover/index.js +1 -17
  226. package/dist/esm/components/ui/progress/index.js +1 -31
  227. package/dist/esm/components/ui/qr-code/index.js +1 -24
  228. package/dist/esm/components/ui/radio-group/index.js +1 -12
  229. package/dist/esm/components/ui/scroll-area/index.js +1 -13
  230. package/dist/esm/components/ui/select/index.js +1 -74
  231. package/dist/esm/components/ui/separator/index.js +1 -8
  232. package/dist/esm/components/ui/sheet/index.d.ts +7 -2
  233. package/dist/esm/components/ui/sheet/index.d.ts.map +1 -1
  234. package/dist/esm/components/ui/sheet/index.js +1 -92
  235. package/dist/esm/components/ui/sidebar/index.js +1 -11
  236. package/dist/esm/components/ui/sidebar/next-router.cjs +1 -119
  237. package/dist/esm/components/ui/sidebar/sidebar-back-button.js +1 -5
  238. package/dist/esm/components/ui/sidebar/sidebar-components.js +1 -15
  239. package/dist/esm/components/ui/sidebar/sidebar-expand-button.js +1 -42
  240. package/dist/esm/components/ui/sidebar/sidebar-item-button.js +1 -18
  241. package/dist/esm/components/ui/sidebar/sidebar-item-collapsible.js +1 -44
  242. package/dist/esm/components/ui/sidebar/sidebar-item-icon-button.js +1 -14
  243. package/dist/esm/components/ui/sidebar/sidebar-item.js +1 -40
  244. package/dist/esm/components/ui/sidebar/sidebar-provider.js +1 -193
  245. package/dist/esm/components/ui/sidebar/sidebar-root.d.ts +3 -1
  246. package/dist/esm/components/ui/sidebar/sidebar-root.d.ts.map +1 -1
  247. package/dist/esm/components/ui/sidebar/sidebar-root.js +1 -126
  248. package/dist/esm/components/ui/sidebar/sidebar-router.js +1 -89
  249. package/dist/esm/components/ui/sidebar/sidebar-trigger.js +1 -53
  250. package/dist/esm/components/ui/skeleton/index.js +1 -6
  251. package/dist/esm/components/ui/stepper/index.js +1 -20
  252. package/dist/esm/components/ui/switch/index.js +1 -8
  253. package/dist/esm/components/ui/table/index.js +1 -44
  254. package/dist/esm/components/ui/tabs/index.js +1 -17
  255. package/dist/esm/components/ui/textarea/index.js +1 -6
  256. package/dist/esm/components/ui/time-picker/index.js +1 -49
  257. package/dist/esm/components/ui/toast/index.js +1 -2
  258. package/dist/esm/components/ui/toast/toaster.js +1 -13
  259. package/dist/esm/components/ui/toggle-group/index.js +1 -120
  260. package/dist/esm/components/ui/tooltip/index.js +1 -43
  261. package/dist/esm/domain/blotter/index.js +1 -16
  262. package/dist/esm/domain/delinquency-aging/aging-buckets.js +1 -115
  263. package/dist/esm/domain/delinquency-aging/index.js +1 -218
  264. package/dist/esm/domain/figure/index.js +1 -15
  265. package/dist/esm/domain/format.js +1 -128
  266. package/dist/esm/domain/index.js +1 -19
  267. package/dist/esm/domain/key-id/index.js +1 -169
  268. package/dist/esm/domain/ledger-sheet/index.js +1 -24
  269. package/dist/esm/domain/money-diff.js +1 -45
  270. package/dist/esm/domain/money-math.js +1 -98
  271. package/dist/esm/domain/money-text/index.js +1 -118
  272. package/dist/esm/domain/section-label/index.js +1 -14
  273. package/dist/esm/domain/status-rail/index.js +1 -71
  274. package/dist/esm/domain/threshold-gauge/index.js +1 -157
  275. package/dist/esm/enterprise/alert-banner/index.js +1 -21
  276. package/dist/esm/enterprise/app-shell/index.js +1 -51
  277. package/dist/esm/enterprise/cursor-pager/index.js +1 -23
  278. package/dist/esm/enterprise/data-table/column-size.js +1 -97
  279. package/dist/esm/enterprise/data-table/index.d.ts.map +1 -1
  280. package/dist/esm/enterprise/data-table/index.js +1 -342
  281. package/dist/esm/enterprise/date-range-picker/index.js +1 -112
  282. package/dist/esm/enterprise/detail-panel/index.js +1 -17
  283. package/dist/esm/enterprise/empty-state/index.d.ts +6 -1
  284. package/dist/esm/enterprise/empty-state/index.d.ts.map +1 -1
  285. package/dist/esm/enterprise/empty-state/index.js +1 -10
  286. package/dist/esm/enterprise/index.js +1 -22
  287. package/dist/esm/enterprise/number-input/index.js +1 -214
  288. package/dist/esm/enterprise/search-input/index.js +1 -85
  289. package/dist/esm/enterprise/stat-card/index.js +1 -72
  290. package/dist/esm/enterprise/status-badge/index.js +1 -116
  291. package/dist/esm/enterprise/use-is-mobile.js +1 -31
  292. package/dist/esm/enterprise/virtualized-table/index.js +1 -138
  293. package/dist/esm/hooks/use-click-away.js +1 -22
  294. package/dist/esm/hooks/use-pagination.js +1 -38
  295. package/dist/esm/hooks/use-stepper.js +1 -22
  296. package/dist/esm/hooks/use-time.js +1 -13
  297. package/dist/esm/hooks/use-toast.js +1 -107
  298. package/dist/esm/index.js +1 -77
  299. package/dist/esm/lib/storage/get-storage-object.js +1 -17
  300. package/dist/esm/lib/storage/get-storage.js +1 -14
  301. package/dist/esm/lib/storage/index.js +1 -2
  302. package/dist/esm/lib/typography.js +1 -31
  303. package/dist/esm/lib/utils.js +1 -41
  304. package/dist/esm/theme/get-theme-script.js +1 -41
  305. package/dist/esm/theme/index.js +1 -4
  306. package/dist/esm/theme/mode-toggle.js +1 -45
  307. package/dist/esm/theme/theme-provider.js +1 -122
  308. package/dist/esm/toast/helpers.js +1 -36
  309. package/dist/esm/toast/index.js +1 -4
  310. package/dist/esm/types/metadata-type.js +1 -1
  311. package/dist/esm/utils/countries.cjs +1 -17
  312. package/dist/esm/utils/country-utils.js +1 -18
  313. package/dist/esm/utils/currency-codes.js +1 -181
  314. package/dist/globals.css +1 -0
  315. package/dist/hooks/use-click-away.js +1 -29
  316. package/dist/hooks/use-pagination.js +1 -41
  317. package/dist/hooks/use-stepper.js +1 -26
  318. package/dist/hooks/use-time.js +1 -20
  319. package/dist/hooks/use-toast.js +1 -111
  320. package/dist/index.js +1 -96
  321. package/dist/lib/storage/get-storage-object.js +1 -23
  322. package/dist/lib/storage/get-storage.js +1 -17
  323. package/dist/lib/storage/index.js +1 -18
  324. package/dist/lib/typography.js +1 -34
  325. package/dist/lib/utils.js +1 -45
  326. package/dist/theme/get-theme-script.js +1 -44
  327. package/dist/theme/index.js +1 -11
  328. package/dist/theme/mode-toggle.js +1 -48
  329. package/dist/theme/theme-provider.js +1 -160
  330. package/dist/toast/helpers.js +1 -41
  331. package/dist/toast/index.js +1 -10
  332. package/dist/tokens.css +7 -4
  333. package/dist/types/metadata-type.js +1 -2
  334. package/dist/utils/countries.cjs +1 -17
  335. package/dist/utils/country-utils.js +1 -25
  336. package/dist/utils/currency-codes.js +1 -184
  337. package/package.json +4 -3
@@ -1,111 +1 @@
1
- 'use client';
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.DEFAULT_DURATION = void 0;
5
- exports.useToast = useToast;
6
- exports.toast = toast;
7
- const sonner_1 = require("sonner");
8
- /**
9
- * Lifetime of every non-destructive toast, and the `<Toaster />` fallback for
10
- * anything raised without one. The two must not drift apart, so the Toaster
11
- * imports this rather than repeating the literal.
12
- */
13
- exports.DEFAULT_DURATION = 10000;
14
- /**
15
- * A destructive toast reports something the operator has to read -- a refused
16
- * money operation, a failed copy of a show-once secret, a language switch that
17
- * did not take. It stays up until dismissed instead of auto-closing.
18
- *
19
- * `Infinity` is how sonner disables the auto-close timer (it short-circuits the
20
- * timer effect rather than calling `setTimeout(fn, Infinity)`, which would fire
21
- * immediately). `<Toaster />` already passes `closeButton`, and sonner gates the
22
- * close button on that flag alone, never on the duration -- so a persistent
23
- * toast still renders its dismiss affordance.
24
- */
25
- const PERSIST_UNTIL_DISMISSED = Infinity;
26
- const isPlainText = (value) => value === undefined || typeof value === 'string';
27
- /**
28
- * Two identical errors share one toast instead of stacking: same variant, same
29
- * text -- same id, and sonner updates the one already on screen.
30
- *
31
- * Unbounded stacking is worse for a persistent toast than for a transient one.
32
- * `<Toaster />` shows three at a time and renders the rest `opacity: 0;
33
- * pointer-events: none`, so a fourth error nobody can read is also a fourth
34
- * error nobody can close -- and without an auto-dismiss, nothing ahead of it
35
- * clears on its own.
36
- *
37
- * Only plain-text toasts collapse. A `ReactNode` has no stable key and
38
- * `String(node)` would fold unrelated errors onto one id.
39
- *
40
- * ponytail: the ceiling is still three. Distinct persistent errors past the
41
- * third queue behind the front three until one is dismissed; lifting that means
42
- * raising `visibleToasts`, not more work here.
43
- */
44
- function collapseKey(title, description) {
45
- if (!isPlainText(title) || !isPlainText(description)) {
46
- return undefined;
47
- }
48
- return `destructive:${JSON.stringify([title ?? null, description ?? null])}`;
49
- }
50
- function toast({ title, description, variant, duration, id, ...rest }) {
51
- const message = title ?? '';
52
- const toastId = variant === 'destructive' && id === undefined
53
- ? collapseKey(title, description)
54
- : id;
55
- const options = {
56
- description,
57
- ...rest,
58
- ...(toastId !== undefined && { id: toastId }),
59
- duration: duration ??
60
- (variant === 'destructive' ? PERSIST_UNTIL_DISMISSED : exports.DEFAULT_DURATION)
61
- };
62
- let raisedId;
63
- switch (variant) {
64
- case 'success':
65
- raisedId = sonner_1.toast.success(message, options);
66
- break;
67
- case 'warning':
68
- raisedId = sonner_1.toast.warning(message, options);
69
- break;
70
- case 'destructive':
71
- raisedId = sonner_1.toast.error(message, options);
72
- break;
73
- default:
74
- raisedId = (0, sonner_1.toast)(message, options);
75
- break;
76
- }
77
- return {
78
- id: raisedId,
79
- dismiss: () => sonner_1.toast.dismiss(raisedId),
80
- update: (props) => {
81
- (0, sonner_1.toast)(props.title ?? message, {
82
- ...rest,
83
- id: raisedId,
84
- description: props.description ?? description,
85
- duration: props.duration ?? options.duration
86
- });
87
- }
88
- };
89
- }
90
- /**
91
- * Backward-compatible hook that wraps Sonner's toast API.
92
- *
93
- * Returns the same shape as the original Radix-based useToast:
94
- * - `toast()` to create a toast
95
- * - `dismiss()` to dismiss a toast by id (or all if no id)
96
- * - `toasts` array (always empty -- Sonner manages its own state internally)
97
- */
98
- function useToast() {
99
- return {
100
- toast,
101
- dismiss: (toastId) => {
102
- if (toastId !== undefined) {
103
- sonner_1.toast.dismiss(toastId);
104
- }
105
- else {
106
- sonner_1.toast.dismiss();
107
- }
108
- },
109
- toasts: []
110
- };
111
- }
1
+ "use client";"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.DEFAULT_DURATION=void 0;exports.useToast=useToast;exports.toast=toast;const sonner_1=require("sonner");exports.DEFAULT_DURATION=1e4;const PERSIST_UNTIL_DISMISSED=Infinity;const isPlainText=s=>s===void 0||typeof s==="string";function collapseKey(s,e){if(!isPlainText(s)||!isPlainText(e)){return void 0}return`destructive:${JSON.stringify([s??null,e??null])}`}function toast({title:s,description:e,variant:o,duration:c,id:u,...d}){const n=s??"";const a=o==="destructive"&&u===void 0?collapseKey(s,e):u;const i={description:e,...d,...a!==void 0&&{id:a},duration:c??(o==="destructive"?PERSIST_UNTIL_DISMISSED:exports.DEFAULT_DURATION)};let t;switch(o){case"success":t=sonner_1.toast.success(n,i);break;case"warning":t=sonner_1.toast.warning(n,i);break;case"destructive":t=sonner_1.toast.error(n,i);break;default:t=(0,sonner_1.toast)(n,i);break}return{id:t,dismiss:()=>sonner_1.toast.dismiss(t),update:r=>{(0,sonner_1.toast)(r.title??n,{...d,id:t,description:r.description??e,duration:r.duration??i.duration})}}}function useToast(){return{toast,dismiss:s=>{if(s!==void 0){sonner_1.toast.dismiss(s)}else{sonner_1.toast.dismiss()}},toasts:[]}}
package/dist/index.js CHANGED
@@ -1,96 +1 @@
1
- 'use client';
2
- "use strict";
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k;
5
- var desc = Object.getOwnPropertyDescriptor(m, k);
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k]; } };
8
- }
9
- Object.defineProperty(o, k2, desc);
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k;
12
- o[k2] = m[k];
13
- }));
14
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
- };
17
- Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.cn = exports.ApplicationBreadcrumb = void 0;
19
- // Primitives
20
- __exportStar(require("./components/ui/alert"), exports);
21
- __exportStar(require("./components/ui/autocomplete"), exports);
22
- __exportStar(require("./hooks/use-click-away"), exports);
23
- __exportStar(require("./components/ui/autosize-textarea"), exports);
24
- __exportStar(require("./components/ui/avatar"), exports);
25
- __exportStar(require("./components/ui/badge"), exports);
26
- __exportStar(require("./components/ui/breadcrumb"), exports);
27
- __exportStar(require("./components/ui/button"), exports);
28
- __exportStar(require("./components/ui/icon-button"), exports);
29
- __exportStar(require("./components/ui/calendar"), exports);
30
- __exportStar(require("./components/ui/card"), exports);
31
- __exportStar(require("./components/ui/checkbox"), exports);
32
- __exportStar(require("./components/ui/collapsible"), exports);
33
- __exportStar(require("./components/ui/command"), exports);
34
- __exportStar(require("./components/ui/copy-field"), exports);
35
- __exportStar(require("./components/ui/dialog"), exports);
36
- __exportStar(require("./components/ui/dropdown-menu"), exports);
37
- __exportStar(require("./components/ui/input"), exports);
38
- __exportStar(require("./components/ui/otp-input"), exports);
39
- __exportStar(require("./components/ui/label"), exports);
40
- __exportStar(require("./components/ui/lerian-wordmark"), exports);
41
- __exportStar(require("./components/ui/loading-button"), exports);
42
- __exportStar(require("./components/ui/multiple-select"), exports);
43
- __exportStar(require("./components/ui/paper"), exports);
44
- __exportStar(require("./components/ui/paper-collapsible"), exports);
45
- __exportStar(require("./components/ui/popover"), exports);
46
- __exportStar(require("./components/ui/progress"), exports);
47
- __exportStar(require("./components/ui/qr-code"), exports);
48
- __exportStar(require("./components/ui/select"), exports);
49
- __exportStar(require("./components/ui/separator"), exports);
50
- __exportStar(require("./components/ui/sheet"), exports);
51
- __exportStar(require("./components/ui/sidebar"), exports);
52
- __exportStar(require("./components/ui/skeleton"), exports);
53
- __exportStar(require("./components/ui/stepper"), exports);
54
- __exportStar(require("./hooks/use-stepper"), exports);
55
- __exportStar(require("./components/ui/switch"), exports);
56
- __exportStar(require("./components/ui/table"), exports);
57
- __exportStar(require("./components/ui/tabs"), exports);
58
- __exportStar(require("./components/ui/textarea"), exports);
59
- __exportStar(require("./components/ui/toast"), exports);
60
- __exportStar(require("./components/ui/toast/toaster"), exports);
61
- __exportStar(require("./hooks/use-toast"), exports);
62
- __exportStar(require("./components/ui/time-picker"), exports);
63
- __exportStar(require("./hooks/use-time"), exports);
64
- __exportStar(require("./components/ui/tooltip"), exports);
65
- __exportStar(require("./components/ui/form"), exports);
66
- // Components
67
- var breadcrumb_1 = require("./components/breadcrumb");
68
- Object.defineProperty(exports, "ApplicationBreadcrumb", { enumerable: true, get: function () { return breadcrumb_1.Breadcrumb; } });
69
- __exportStar(require("./components/breadcrumb/get-breadcrumb-paths"), exports);
70
- __exportStar(require("./components/card"), exports);
71
- __exportStar(require("./components/dialog"), exports);
72
- __exportStar(require("./components/entity-box"), exports);
73
- __exportStar(require("./components/entity-data-table"), exports);
74
- __exportStar(require("./components/form"), exports);
75
- __exportStar(require("./components/page"), exports);
76
- __exportStar(require("./components/page-header"), exports);
77
- __exportStar(require("./components/pagination"), exports);
78
- __exportStar(require("./components/table"), exports);
79
- // Enterprise surface (sindarian-x absorption — see docs/plans/2026-08-26-sindarian-x-retirement/)
80
- __exportStar(require("./enterprise"), exports);
81
- __exportStar(require("./theme"), exports);
82
- __exportStar(require("./toast"), exports);
83
- __exportStar(require("./charts"), exports);
84
- __exportStar(require("./domain"), exports);
85
- // Primitives absorbed from sindarian-x (see docs/plans/2026-08-26-sindarian-x-retirement/)
86
- __exportStar(require("./components/ui/accordion"), exports);
87
- __exportStar(require("./components/ui/alert-dialog"), exports);
88
- __exportStar(require("./components/ui/file-upload"), exports);
89
- __exportStar(require("./components/ui/hover-card"), exports);
90
- __exportStar(require("./components/ui/radio-group"), exports);
91
- __exportStar(require("./components/ui/scroll-area"), exports);
92
- __exportStar(require("./components/ui/toggle-group"), exports);
93
- // Utilities
94
- var utils_1 = require("./lib/utils");
95
- Object.defineProperty(exports, "cn", { enumerable: true, get: function () { return utils_1.cn; } });
96
- __exportStar(require("./lib/typography"), exports);
1
+ "use client";"use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(t,r,e,o){if(o===void 0)o=e;var i=Object.getOwnPropertyDescriptor(r,e);if(!i||("get"in i?!r.__esModule:i.writable||i.configurable)){i={enumerable:true,get:function(){return r[e]}}}Object.defineProperty(t,o,i)}):(function(t,r,e,o){if(o===void 0)o=e;t[o]=r[e]}));var __exportStar=this&&this.__exportStar||function(t,r){for(var e in t)if(e!=="default"&&!Object.prototype.hasOwnProperty.call(r,e))__createBinding(r,t,e)};Object.defineProperty(exports,"__esModule",{value:true});exports.cn=exports.ApplicationBreadcrumb=void 0;__exportStar(require("./components/ui/alert"),exports);__exportStar(require("./components/ui/autocomplete"),exports);__exportStar(require("./hooks/use-click-away"),exports);__exportStar(require("./components/ui/autosize-textarea"),exports);__exportStar(require("./components/ui/avatar"),exports);__exportStar(require("./components/ui/badge"),exports);__exportStar(require("./components/ui/breadcrumb"),exports);__exportStar(require("./components/ui/button"),exports);__exportStar(require("./components/ui/icon-button"),exports);__exportStar(require("./components/ui/calendar"),exports);__exportStar(require("./components/ui/card"),exports);__exportStar(require("./components/ui/checkbox"),exports);__exportStar(require("./components/ui/collapsible"),exports);__exportStar(require("./components/ui/command"),exports);__exportStar(require("./components/ui/copy-field"),exports);__exportStar(require("./components/ui/dialog"),exports);__exportStar(require("./components/ui/dropdown-menu"),exports);__exportStar(require("./components/ui/input"),exports);__exportStar(require("./components/ui/otp-input"),exports);__exportStar(require("./components/ui/label"),exports);__exportStar(require("./components/ui/lerian-wordmark"),exports);__exportStar(require("./components/ui/loading-button"),exports);__exportStar(require("./components/ui/multiple-select"),exports);__exportStar(require("./components/ui/paper"),exports);__exportStar(require("./components/ui/paper-collapsible"),exports);__exportStar(require("./components/ui/popover"),exports);__exportStar(require("./components/ui/progress"),exports);__exportStar(require("./components/ui/qr-code"),exports);__exportStar(require("./components/ui/select"),exports);__exportStar(require("./components/ui/separator"),exports);__exportStar(require("./components/ui/sheet"),exports);__exportStar(require("./components/ui/sidebar"),exports);__exportStar(require("./components/ui/skeleton"),exports);__exportStar(require("./components/ui/stepper"),exports);__exportStar(require("./hooks/use-stepper"),exports);__exportStar(require("./components/ui/switch"),exports);__exportStar(require("./components/ui/table"),exports);__exportStar(require("./components/ui/tabs"),exports);__exportStar(require("./components/ui/textarea"),exports);__exportStar(require("./components/ui/toast"),exports);__exportStar(require("./components/ui/toast/toaster"),exports);__exportStar(require("./hooks/use-toast"),exports);__exportStar(require("./components/ui/time-picker"),exports);__exportStar(require("./hooks/use-time"),exports);__exportStar(require("./components/ui/tooltip"),exports);__exportStar(require("./components/ui/form"),exports);var breadcrumb_1=require("./components/breadcrumb");Object.defineProperty(exports,"ApplicationBreadcrumb",{enumerable:true,get:function(){return breadcrumb_1.Breadcrumb}});__exportStar(require("./components/breadcrumb/get-breadcrumb-paths"),exports);__exportStar(require("./components/card"),exports);__exportStar(require("./components/dialog"),exports);__exportStar(require("./components/entity-box"),exports);__exportStar(require("./components/entity-data-table"),exports);__exportStar(require("./components/form"),exports);__exportStar(require("./components/page"),exports);__exportStar(require("./components/page-header"),exports);__exportStar(require("./components/pagination"),exports);__exportStar(require("./components/table"),exports);__exportStar(require("./enterprise"),exports);__exportStar(require("./theme"),exports);__exportStar(require("./toast"),exports);__exportStar(require("./charts"),exports);__exportStar(require("./domain"),exports);__exportStar(require("./components/ui/accordion"),exports);__exportStar(require("./components/ui/alert-dialog"),exports);__exportStar(require("./components/ui/file-upload"),exports);__exportStar(require("./components/ui/hover-card"),exports);__exportStar(require("./components/ui/radio-group"),exports);__exportStar(require("./components/ui/scroll-area"),exports);__exportStar(require("./components/ui/toggle-group"),exports);var utils_1=require("./lib/utils");Object.defineProperty(exports,"cn",{enumerable:true,get:function(){return utils_1.cn}});__exportStar(require("./lib/typography"),exports);
@@ -1,23 +1 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getStorageObject = getStorageObject;
7
- const get_storage_1 = require("./get-storage");
8
- const isEmpty_js_1 = __importDefault(require("lodash/isEmpty.js"));
9
- const isNil_js_1 = __importDefault(require("lodash/isNil.js"));
10
- function getStorageObject(key, defaultValue) {
11
- try {
12
- const dataString = (0, get_storage_1.getStorage)(key, defaultValue);
13
- const isNilOrEmpty = (0, isNil_js_1.default)(dataString) || (0, isEmpty_js_1.default)(dataString);
14
- return isNilOrEmpty ? {} : JSON.parse(dataString);
15
- }
16
- catch (error) {
17
- // Only log errors when not in test environment
18
- if (process.env.NODE_ENV !== 'test') {
19
- console.error(error);
20
- }
21
- return defaultValue;
22
- }
23
- }
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{"default":t}};Object.defineProperty(exports,"__esModule",{value:true});exports.getStorageObject=getStorageObject;const get_storage_1=require("./get-storage");const isEmpty_js_1=__importDefault(require("lodash/isEmpty.js"));const isNil_js_1=__importDefault(require("lodash/isNil.js"));function getStorageObject(t,r){try{const e=(0,get_storage_1.getStorage)(t,r);const s=(0,isNil_js_1.default)(e)||(0,isEmpty_js_1.default)(e);return s?{}:JSON.parse(e)}catch(e){if(process.env.NODE_ENV!=="test"){console.error(e)}return r}}
@@ -1,17 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getStorage = getStorage;
4
- const isServer = typeof window === 'undefined';
5
- function getStorage(key, defaultValue) {
6
- if (isServer) {
7
- return defaultValue;
8
- }
9
- let value;
10
- try {
11
- value = localStorage.getItem(key) || undefined;
12
- }
13
- catch (_e) {
14
- // Unsupported
15
- }
16
- return value || defaultValue;
17
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.getStorage=getStorage;const isServer=typeof window==="undefined";function getStorage(r,e){if(isServer){return e}let t;try{t=localStorage.getItem(r)||void 0}catch(o){}return t||e}
@@ -1,18 +1 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./get-storage"), exports);
18
- __exportStar(require("./get-storage-object"), exports);
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(i,t,e,r){if(r===void 0)r=e;var n=Object.getOwnPropertyDescriptor(t,e);if(!n||("get"in n?!t.__esModule:n.writable||n.configurable)){n={enumerable:true,get:function(){return t[e]}}}Object.defineProperty(i,r,n)}):(function(i,t,e,r){if(r===void 0)r=e;i[r]=t[e]}));var __exportStar=this&&this.__exportStar||function(i,t){for(var e in i)if(e!=="default"&&!Object.prototype.hasOwnProperty.call(t,e))__createBinding(t,i,e)};Object.defineProperty(exports,"__esModule",{value:true});__exportStar(require("./get-storage"),exports);__exportStar(require("./get-storage-object"),exports);
@@ -1,34 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SECTION_LABEL_CLASS = exports.LABEL_VOICE_CLASS = void 0;
4
- /**
5
- * THE canonical quiet-label voice: sentence-case, one step down in size,
6
- * medium weight, muted ink. Used by column heads, panel headings, key/value
7
- * labels, captions — anywhere the console needs a quiet label.
8
- *
9
- * This is product-console's table-head voice, copied rather than invented. The
10
- * kit's own `TableHead` paints `text-muted-foreground … font-medium` inside a
11
- * `text-sm` `Table` (`components/ui/table/index.tsx:20,90`), and
12
- * product-console renders every data table through that primitive
13
- * (`src/components/table/data-table.tsx:14`). It replaced the retired "Ledger"
14
- * voice — `text-[11px] uppercase tracking-[0.08em]` — which shouted a register
15
- * no sibling console speaks.
16
- *
17
- * Do NOT re-state the cluster by hand; compose extra classes via
18
- * `cn(LABEL_VOICE_CLASS, ...)`.
19
- */
20
- exports.LABEL_VOICE_CLASS = 'text-sm font-medium text-muted-foreground';
21
- /**
22
- * Alias of {@link LABEL_VOICE_CLASS} for section headings. Kept as a distinct
23
- * name so section-level headings can diverge later without touching every
24
- * quiet-label call site.
25
- *
26
- * It stays an alias on purpose. product-console's panel/section TITLE voice is
27
- * `text-muted-foreground text-lg font-medium` (`EntityBoxHeaderTitle`,
28
- * `components/entity-box/index.tsx:108`) — but that voice already ships as a
29
- * component, and every live `SectionLabel` call site is a caption or a small
30
- * heading (a stat-card label, an inline rate label), not an EntityBox-scale
31
- * panel title. Promoting this constant to `text-lg` would duplicate a voice the
32
- * kit already owns and inflate those captions.
33
- */
34
- exports.SECTION_LABEL_CLASS = exports.LABEL_VOICE_CLASS;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.SECTION_LABEL_CLASS=exports.LABEL_VOICE_CLASS=void 0;exports.LABEL_VOICE_CLASS="text-sm font-medium text-muted-foreground";exports.SECTION_LABEL_CLASS=exports.LABEL_VOICE_CLASS;
package/dist/lib/utils.js CHANGED
@@ -1,45 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.cn = cn;
4
- exports.keepOpenOnToast = keepOpenOnToast;
5
- const clsx_1 = require("clsx");
6
- const tailwind_merge_1 = require("tailwind-merge");
7
- /**
8
- * The kit's button variants are component classes in `@layer components`, not
9
- * Tailwind utilities, so stock tailwind-merge has no group for them: it kept
10
- * `button-primary button-destructive` together and let stylesheet source order
11
- * pick the winner. Declaring the group makes the last one win, like every other
12
- * conflict `cn` resolves.
13
- *
14
- * Variant classes only. `button-base`, `button-disabled`, `button-read-only`
15
- * and `button-small` compose with a variant instead of conflicting with it, so
16
- * they stay out of the group and are never merged away.
17
- */
18
- const twMerge = (0, tailwind_merge_1.extendTailwindMerge)({
19
- extend: {
20
- classGroups: {
21
- 'sindarian-button-variant': [
22
- 'button-plain',
23
- 'button-primary',
24
- 'button-secondary',
25
- 'button-tertiary',
26
- 'button-outline',
27
- 'button-link',
28
- 'button-destructive'
29
- ]
30
- }
31
- }
32
- });
33
- function cn(...inputs) {
34
- return twMerge((0, clsx_1.clsx)(inputs));
35
- }
36
- /** Wraps a Radix `onInteractOutside` so a press on a toast never dismisses the layer under it. */
37
- function keepOpenOnToast(onInteractOutside) {
38
- return (event) => {
39
- if (event.target?.closest('[data-sonner-toaster]')) {
40
- event.preventDefault();
41
- return;
42
- }
43
- onInteractOutside?.(event);
44
- };
45
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.cn=cn;exports.keepOpenOnToast=keepOpenOnToast;const clsx_1=require("clsx");const tailwind_merge_1=require("tailwind-merge");const twMerge=(0,tailwind_merge_1.extendTailwindMerge)({extend:{classGroups:{"sindarian-button-variant":["button-plain","button-primary","button-secondary","button-tertiary","button-outline","button-link","button-destructive"]}}});function cn(...t){return twMerge((0,clsx_1.clsx)(t))}function keepOpenOnToast(t){return e=>{if(e.target?.closest("[data-sonner-toaster]")){e.preventDefault();return}t?.(e)}}
@@ -1,44 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getThemeScript = getThemeScript;
4
- /**
5
- * Pre-paint theme script (FOUC guard). Returns a minified IIFE string that
6
- * reads the persisted preference from localStorage, resolves it the way
7
- * ThemeProvider does, and toggles the `.dark` class on the page root element
8
- * before first paint — so the page never flashes the wrong theme while React
9
- * hydrates. ThemeProvider owns the class from mount onward.
10
- *
11
- * The resolution mirrors ThemeProvider's exactly: an exact "dark"/"light"/
12
- * "system" stored value wins; anything else — absent or corrupted — falls back
13
- * to `defaultTheme`, which is then resolved ("dark" → dark, "light" → light,
14
- * "system" → the media query). Pass the SAME `defaultTheme` you give
15
- * ThemeProvider, or the two disagree on a first visit.
16
- * `get-theme-script.test.tsx` pins that agreement case by case.
17
- *
18
- * Server-safe: this module references no browser globals at module scope; the
19
- * returned string runs in the browser only, inside a try/catch.
20
- *
21
- * Consumer usage — inject in the page <head>, ideally as the first script:
22
- *
23
- * <script dangerouslySetInnerHTML={{ __html: getThemeScript() }} />
24
- *
25
- * A dark-by-default app passes both arguments:
26
- *
27
- * <script dangerouslySetInnerHTML={{ __html: getThemeScript('app.theme', 'dark') }} />
28
- */
29
- /**
30
- * JSON string literal with `<` escaped, so no embedded value can close the
31
- * inline <script> element it is written into. `<` is `<` to the JS parser,
32
- * so the emitted script still compares against the original text.
33
- */
34
- function jsString(value) {
35
- return JSON.stringify(value).replace(/</g, '\\u003C');
36
- }
37
- function getThemeScript(storageKey = 'sindarian.theme', defaultTheme = 'system') {
38
- // The storage read gets its OWN try/catch, mirroring ThemeProvider, which
39
- // isolates the same read. A browser with site data blocked throws on
40
- // getItem; if that escaped to the outer catch the class would never be
41
- // applied at all and a dark user would flash light before hydration.
42
- // Resolution starts from defaultTheme and storage only narrows it.
43
- return `(function(){try{var r=${jsString(defaultTheme)};try{var t=localStorage.getItem(${jsString(storageKey)});if(t==="dark"||t==="light"||t==="system")r=t}catch(e){}var d=r==="dark"||(r==="system"&&matchMedia("(prefers-color-scheme: dark)").matches);document.documentElement.classList.toggle("dark",d)}catch(e){}})()`;
44
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.getThemeScript=getThemeScript;function jsString(e){return JSON.stringify(e).replace(/</g,"\\u003C")}function getThemeScript(e="sindarian.theme",t="system"){return`(function(){try{var r=${jsString(t)};try{var t=localStorage.getItem(${jsString(e)});if(t==="dark"||t==="light"||t==="system")r=t}catch(e){}var d=r==="dark"||(r==="system"&&matchMedia("(prefers-color-scheme: dark)").matches);document.documentElement.classList.toggle("dark",d)}catch(e){}})()`}
@@ -1,11 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ModeToggle = exports.getThemeScript = exports.useTheme = exports.ThemeProvider = void 0;
4
- // Owned by lane theme-toasts-charts — see docs/plans/2026-08-26-sindarian-x-retirement/
5
- var theme_provider_1 = require("./theme-provider");
6
- Object.defineProperty(exports, "ThemeProvider", { enumerable: true, get: function () { return theme_provider_1.ThemeProvider; } });
7
- Object.defineProperty(exports, "useTheme", { enumerable: true, get: function () { return theme_provider_1.useTheme; } });
8
- var get_theme_script_1 = require("./get-theme-script");
9
- Object.defineProperty(exports, "getThemeScript", { enumerable: true, get: function () { return get_theme_script_1.getThemeScript; } });
10
- var mode_toggle_1 = require("./mode-toggle");
11
- Object.defineProperty(exports, "ModeToggle", { enumerable: true, get: function () { return mode_toggle_1.ModeToggle; } });
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.ModeToggle=exports.getThemeScript=exports.useTheme=exports.ThemeProvider=void 0;var theme_provider_1=require("./theme-provider");Object.defineProperty(exports,"ThemeProvider",{enumerable:true,get:function(){return theme_provider_1.ThemeProvider}});Object.defineProperty(exports,"useTheme",{enumerable:true,get:function(){return theme_provider_1.useTheme}});var get_theme_script_1=require("./get-theme-script");Object.defineProperty(exports,"getThemeScript",{enumerable:true,get:function(){return get_theme_script_1.getThemeScript}});var mode_toggle_1=require("./mode-toggle");Object.defineProperty(exports,"ModeToggle",{enumerable:true,get:function(){return mode_toggle_1.ModeToggle}});
@@ -1,48 +1 @@
1
- 'use client';
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.ModeToggle = ModeToggle;
5
- const jsx_runtime_1 = require("react/jsx-runtime");
6
- const lucide_react_1 = require("lucide-react");
7
- const utils_1 = require("../lib/utils");
8
- const theme_provider_1 = require("./theme-provider");
9
- const SEGMENTS = [
10
- { value: 'light', icon: lucide_react_1.Sun },
11
- { value: 'system', icon: lucide_react_1.Monitor },
12
- { value: 'dark', icon: lucide_react_1.Moon }
13
- ];
14
- const DEFAULT_LABELS = {
15
- light: 'Light',
16
- system: 'System',
17
- dark: 'Dark',
18
- group: 'Theme'
19
- };
20
- /**
21
- * Merge overrides over the defaults, IGNORING blank ones. A plain spread lets
22
- * `labels={{ light: '' }}` win, and every segment here is icon-only — so a blank
23
- * override leaves a button (or the whole group) with `aria-label=""`, which names
24
- * it "" AND suppresses the element's other naming routes. That is strictly worse
25
- * than the missing translation it came from: an untranslated English label is
26
- * usable, a nameless button is not. A blank string is a missing value, not a
27
- * chosen one.
28
- */
29
- function resolveLabels(labels) {
30
- const resolved = { ...DEFAULT_LABELS };
31
- for (const key of Object.keys(DEFAULT_LABELS)) {
32
- const override = labels?.[key];
33
- if (override?.trim())
34
- resolved[key] = override;
35
- }
36
- return resolved;
37
- }
38
- function ModeToggle({ labels, className }) {
39
- const { theme, setTheme } = (0, theme_provider_1.useTheme)();
40
- const resolved = resolveLabels(labels);
41
- return ((0, jsx_runtime_1.jsx)("div", { role: "group", "aria-label": resolved.group, className: (0, utils_1.cn)('border-input bg-card grid w-fit grid-cols-3 rounded-md border p-0.5 shadow-[var(--shadow-card)]', className), children: SEGMENTS.map(({ value, icon: Icon }) => {
42
- const active = value === theme;
43
- const label = resolved[value];
44
- return ((0, jsx_runtime_1.jsx)("button", { type: "button", "aria-pressed": active, "aria-label": label, title: label, onClick: () => setTheme(value), className: (0, utils_1.cn)('focus-visible:ring-ring flex items-center justify-center rounded-sm px-2 py-1.5 transition-colors duration-150 ease-out focus-visible:ring-2 focus-visible:outline-none', active
45
- ? 'bg-secondary text-secondary-foreground'
46
- : 'text-muted-foreground hover:text-foreground'), children: (0, jsx_runtime_1.jsx)(Icon, { className: "size-4", "aria-hidden": true }) }, value));
47
- }) }));
48
- }
1
+ "use client";"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.ModeToggle=ModeToggle;const jsx_runtime_1=require("react/jsx-runtime");const lucide_react_1=require("lucide-react");const utils_1=require("../lib/utils");const theme_provider_1=require("./theme-provider");const SEGMENTS=[{value:"light",icon:lucide_react_1.Sun},{value:"system",icon:lucide_react_1.Monitor},{value:"dark",icon:lucide_react_1.Moon}];const DEFAULT_LABELS={light:"Light",system:"System",dark:"Dark",group:"Theme"};function resolveLabels(s){const e={...DEFAULT_LABELS};for(const r of Object.keys(DEFAULT_LABELS)){const t=s?.[r];if(t?.trim())e[r]=t}return e}function ModeToggle({labels:s,className:e}){const{theme:r,setTheme:t}=(0,theme_provider_1.useTheme)();const i=resolveLabels(s);return(0,jsx_runtime_1.jsx)("div",{role:"group","aria-label":i.group,className:(0,utils_1.cn)("border-input bg-card grid w-fit grid-cols-3 rounded-md border p-0.5 shadow-[var(--shadow-card)]",e),children:SEGMENTS.map(({value:o,icon:u})=>{const n=o===r;const c=i[o];return(0,jsx_runtime_1.jsx)("button",{type:"button","aria-pressed":n,"aria-label":c,title:c,onClick:()=>t(o),className:(0,utils_1.cn)("focus-visible:ring-ring flex items-center justify-center rounded-sm px-2 py-1.5 transition-colors duration-150 ease-out focus-visible:ring-2 focus-visible:outline-none",n?"bg-secondary text-secondary-foreground":"text-muted-foreground hover:text-foreground"),children:(0,jsx_runtime_1.jsx)(u,{className:"size-4","aria-hidden":true})},o)})})}