@mieweb/ui 0.3.0-dev.73 → 0.3.0-dev.75

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 (135) hide show
  1. package/dist/ag-grid.cjs +31 -21
  2. package/dist/ag-grid.cjs.map +1 -1
  3. package/dist/ag-grid.js +31 -21
  4. package/dist/ag-grid.js.map +1 -1
  5. package/dist/brands/bluehive.css +5 -5
  6. package/dist/brands/mieweb.css +5 -5
  7. package/dist/brands/ozwell.css +5 -5
  8. package/dist/brands/webchart.css +5 -5
  9. package/dist/{chunk-N2YMRZ7P.cjs → chunk-2EPJ5SMX.cjs} +5 -5
  10. package/dist/{chunk-N2YMRZ7P.cjs.map → chunk-2EPJ5SMX.cjs.map} +1 -1
  11. package/dist/{chunk-QDGZBDBI.cjs → chunk-2LF7PSSX.cjs} +3 -3
  12. package/dist/{chunk-QDGZBDBI.cjs.map → chunk-2LF7PSSX.cjs.map} +1 -1
  13. package/dist/{chunk-O43QBXRX.js → chunk-43GBCUSQ.js} +3 -3
  14. package/dist/{chunk-O43QBXRX.js.map → chunk-43GBCUSQ.js.map} +1 -1
  15. package/dist/{chunk-MOULJE34.js → chunk-4DMZAVB2.js} +6 -6
  16. package/dist/chunk-4DMZAVB2.js.map +1 -0
  17. package/dist/{chunk-OJ64Q3A5.js → chunk-5PUEQH2L.js} +3 -3
  18. package/dist/{chunk-OJ64Q3A5.js.map → chunk-5PUEQH2L.js.map} +1 -1
  19. package/dist/{chunk-VKTQQOUH.js → chunk-5U7IIMKH.js} +4 -4
  20. package/dist/{chunk-VKTQQOUH.js.map → chunk-5U7IIMKH.js.map} +1 -1
  21. package/dist/{chunk-TSZRR2ZK.cjs → chunk-67QT2WYS.cjs} +3 -3
  22. package/dist/{chunk-TSZRR2ZK.cjs.map → chunk-67QT2WYS.cjs.map} +1 -1
  23. package/dist/{chunk-LXHPW2ZF.cjs → chunk-7BARESXI.cjs} +3 -3
  24. package/dist/{chunk-LXHPW2ZF.cjs.map → chunk-7BARESXI.cjs.map} +1 -1
  25. package/dist/{chunk-BBQZNIB4.js → chunk-AL6ASCL6.js} +9 -9
  26. package/dist/{chunk-BBQZNIB4.js.map → chunk-AL6ASCL6.js.map} +1 -1
  27. package/dist/{chunk-AUXHRAID.cjs → chunk-CHMMHFOW.cjs} +9 -9
  28. package/dist/{chunk-AUXHRAID.cjs.map → chunk-CHMMHFOW.cjs.map} +1 -1
  29. package/dist/{chunk-JDI45GEY.js → chunk-CWDQ7OPJ.js} +3 -3
  30. package/dist/{chunk-JDI45GEY.js.map → chunk-CWDQ7OPJ.js.map} +1 -1
  31. package/dist/{chunk-Z4HZ35KX.cjs → chunk-DEZ7XSTG.cjs} +3 -3
  32. package/dist/{chunk-Z4HZ35KX.cjs.map → chunk-DEZ7XSTG.cjs.map} +1 -1
  33. package/dist/{chunk-GPBQCGKA.cjs → chunk-DT4CHRTJ.cjs} +382 -380
  34. package/dist/chunk-DT4CHRTJ.cjs.map +1 -0
  35. package/dist/{chunk-QMQE4PDD.cjs → chunk-E3GBBYAO.cjs} +6 -6
  36. package/dist/{chunk-QMQE4PDD.cjs.map → chunk-E3GBBYAO.cjs.map} +1 -1
  37. package/dist/{chunk-IMNLYVXJ.cjs → chunk-EUUQVDXX.cjs} +6 -6
  38. package/dist/{chunk-IMNLYVXJ.cjs.map → chunk-EUUQVDXX.cjs.map} +1 -1
  39. package/dist/{chunk-TF5OZDFU.js → chunk-FMGX2AM2.js} +6 -6
  40. package/dist/{chunk-TF5OZDFU.js.map → chunk-FMGX2AM2.js.map} +1 -1
  41. package/dist/{chunk-5NSURWMM.js → chunk-FYEK4RZ3.js} +4 -4
  42. package/dist/{chunk-5NSURWMM.js.map → chunk-FYEK4RZ3.js.map} +1 -1
  43. package/dist/{chunk-DLLVXNAQ.js → chunk-G7P5X2F4.js} +5 -5
  44. package/dist/{chunk-DLLVXNAQ.js.map → chunk-G7P5X2F4.js.map} +1 -1
  45. package/dist/{chunk-QEAIFTUL.cjs → chunk-HT3SXDFF.cjs} +5 -5
  46. package/dist/{chunk-QEAIFTUL.cjs.map → chunk-HT3SXDFF.cjs.map} +1 -1
  47. package/dist/{chunk-DCDXOT3A.js → chunk-IEVAVY43.js} +3 -3
  48. package/dist/{chunk-DCDXOT3A.js.map → chunk-IEVAVY43.js.map} +1 -1
  49. package/dist/{chunk-EMMQPDOY.cjs → chunk-KLLGX5O3.cjs} +4 -4
  50. package/dist/{chunk-EMMQPDOY.cjs.map → chunk-KLLGX5O3.cjs.map} +1 -1
  51. package/dist/{chunk-ND75VHB7.cjs → chunk-MIGLLTTD.cjs} +4 -4
  52. package/dist/{chunk-ND75VHB7.cjs.map → chunk-MIGLLTTD.cjs.map} +1 -1
  53. package/dist/{chunk-3DM6LMZG.js → chunk-MUYTGWGE.js} +4 -3
  54. package/dist/chunk-MUYTGWGE.js.map +1 -0
  55. package/dist/{chunk-VQW36LLX.cjs → chunk-NVHAQOHH.cjs} +3 -3
  56. package/dist/{chunk-VQW36LLX.cjs.map → chunk-NVHAQOHH.cjs.map} +1 -1
  57. package/dist/{chunk-4ASPCSWT.js → chunk-PU6ZC4GI.js} +3 -3
  58. package/dist/{chunk-4ASPCSWT.js.map → chunk-PU6ZC4GI.js.map} +1 -1
  59. package/dist/{chunk-JE4AH2TZ.cjs → chunk-Q2EWNXIB.cjs} +6 -6
  60. package/dist/chunk-Q2EWNXIB.cjs.map +1 -0
  61. package/dist/{chunk-PLIK3DN6.cjs → chunk-QASIWBXU.cjs} +4 -3
  62. package/dist/chunk-QASIWBXU.cjs.map +1 -0
  63. package/dist/{chunk-V2O636JO.js → chunk-QBFNONJD.js} +5 -5
  64. package/dist/{chunk-V2O636JO.js.map → chunk-QBFNONJD.js.map} +1 -1
  65. package/dist/{chunk-YR365F2H.cjs → chunk-QG7CJH4O.cjs} +3 -3
  66. package/dist/{chunk-YR365F2H.cjs.map → chunk-QG7CJH4O.cjs.map} +1 -1
  67. package/dist/{chunk-ZGSPFVGL.cjs → chunk-QNTUYH6G.cjs} +4 -4
  68. package/dist/{chunk-ZGSPFVGL.cjs.map → chunk-QNTUYH6G.cjs.map} +1 -1
  69. package/dist/{chunk-YN3ZIUYC.js → chunk-TRZXK57D.js} +6 -6
  70. package/dist/{chunk-YN3ZIUYC.js.map → chunk-TRZXK57D.js.map} +1 -1
  71. package/dist/{chunk-NDHW3ZRF.js → chunk-VCO2IZOG.js} +3 -3
  72. package/dist/{chunk-NDHW3ZRF.js.map → chunk-VCO2IZOG.js.map} +1 -1
  73. package/dist/{chunk-7XWPUWSL.js → chunk-WFS6R2F5.js} +3 -3
  74. package/dist/{chunk-7XWPUWSL.js.map → chunk-WFS6R2F5.js.map} +1 -1
  75. package/dist/{chunk-JCHVLSXS.js → chunk-WORZLEUZ.js} +382 -380
  76. package/dist/chunk-WORZLEUZ.js.map +1 -0
  77. package/dist/{chunk-RCMF6KZA.js → chunk-YTZPVEIO.js} +3 -3
  78. package/dist/{chunk-RCMF6KZA.js.map → chunk-YTZPVEIO.js.map} +1 -1
  79. package/dist/{chunk-6EN6ZIW3.js → chunk-YY23MK3V.js} +4 -4
  80. package/dist/{chunk-6EN6ZIW3.js.map → chunk-YY23MK3V.js.map} +1 -1
  81. package/dist/{chunk-QXJMKJJV.cjs → chunk-ZKFVGYBK.cjs} +3 -3
  82. package/dist/{chunk-QXJMKJJV.cjs.map → chunk-ZKFVGYBK.cjs.map} +1 -1
  83. package/dist/{chunk-Z2ABQA5Z.cjs → chunk-ZRI6OXQD.cjs} +3 -3
  84. package/dist/{chunk-Z2ABQA5Z.cjs.map → chunk-ZRI6OXQD.cjs.map} +1 -1
  85. package/dist/components/AudioPlayer/index.cjs +6 -6
  86. package/dist/components/AudioPlayer/index.js +1 -1
  87. package/dist/components/AudioRecorder/index.cjs +6 -6
  88. package/dist/components/AudioRecorder/index.js +1 -1
  89. package/dist/components/Card/index.cjs +15 -15
  90. package/dist/components/Card/index.js +1 -1
  91. package/dist/components/Checkbox/index.cjs +4 -4
  92. package/dist/components/Checkbox/index.js +1 -1
  93. package/dist/components/CountryCodeDropdown/index.cjs +4 -4
  94. package/dist/components/CountryCodeDropdown/index.js +1 -1
  95. package/dist/components/DateInput/index.cjs +2 -2
  96. package/dist/components/DateInput/index.js +1 -1
  97. package/dist/components/Dropdown/index.cjs +7 -7
  98. package/dist/components/Dropdown/index.js +1 -1
  99. package/dist/components/Pagination/index.cjs +4 -4
  100. package/dist/components/Pagination/index.js +1 -1
  101. package/dist/components/PhoneInput/index.cjs +3 -3
  102. package/dist/components/PhoneInput/index.js +1 -1
  103. package/dist/components/Progress/index.cjs +6 -6
  104. package/dist/components/Progress/index.js +1 -1
  105. package/dist/components/QuickAction/index.cjs +6 -6
  106. package/dist/components/QuickAction/index.js +1 -1
  107. package/dist/components/Radio/index.cjs +4 -4
  108. package/dist/components/Radio/index.js +1 -1
  109. package/dist/components/SchedulePicker/index.cjs +10 -10
  110. package/dist/components/SchedulePicker/index.js +1 -1
  111. package/dist/components/Select/index.cjs +3 -3
  112. package/dist/components/Select/index.js +1 -1
  113. package/dist/components/Slider/index.cjs +5 -5
  114. package/dist/components/Slider/index.js +1 -1
  115. package/dist/components/Spinner/index.cjs +5 -5
  116. package/dist/components/Spinner/index.js +1 -1
  117. package/dist/components/Switch/index.cjs +4 -4
  118. package/dist/components/Switch/index.js +1 -1
  119. package/dist/components/Tabs/index.cjs +7 -7
  120. package/dist/components/Tabs/index.js +1 -1
  121. package/dist/components/Text/index.cjs +4 -4
  122. package/dist/components/Text/index.js +1 -1
  123. package/dist/index.cjs +773 -804
  124. package/dist/index.cjs.map +1 -1
  125. package/dist/index.js +489 -520
  126. package/dist/index.js.map +1 -1
  127. package/dist/styles/init.css +24 -11
  128. package/dist/styles.css +1 -1
  129. package/package.json +1 -1
  130. package/dist/chunk-3DM6LMZG.js.map +0 -1
  131. package/dist/chunk-GPBQCGKA.cjs.map +0 -1
  132. package/dist/chunk-JCHVLSXS.js.map +0 -1
  133. package/dist/chunk-JE4AH2TZ.cjs.map +0 -1
  134. package/dist/chunk-MOULJE34.js.map +0 -1
  135. package/dist/chunk-PLIK3DN6.cjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mieweb/ui",
3
- "version": "0.3.0-dev.73",
3
+ "version": "0.3.0-dev.75",
4
4
  "description": "A themeable, accessible React component library built with Tailwind CSS",
5
5
  "author": "Medical Informatics Engineering, Inc.",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Tabs/Tabs.tsx"],"names":[],"mappings":";;;;;AAcA,IAAM,WAAA,GAAoB,KAAA,CAAA,aAAA;AAAA,EACxB;AACF,CAAA;AAEA,SAAS,cAAA,GAAiB;AACxB,EAAA,MAAM,OAAA,GAAgB,iBAAW,WAAW,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAA;AACT;AAoCA,SAAS,IAAA,CAAK;AAAA,EACZ,KAAA,EAAO,eAAA;AAAA,EACP,YAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA,GAAU,WAAA;AAAA,EACV,QAAA;AAAA,EACA;AACF,CAAA,EAAc;AACZ,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAU,KAAA,CAAA,QAAA;AAAA,IACtD,YAAA,IAAgB;AAAA,GAClB;AAEA,EAAA,MAAM,eAAe,eAAA,KAAoB,MAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,eAAe,eAAA,GAAkB,iBAAA;AAE/C,EAAA,MAAM,iBAAA,GAA0B,KAAA,CAAA,WAAA;AAAA,IAC9B,CAAC,QAAA,KAAqB;AACpB,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,oBAAA,CAAqB,QAAQ,CAAA;AAAA,MAC/B;AACA,MAAA,aAAA,GAAgB,QAAQ,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,cAAc,aAAa;AAAA,GAC9B;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,WAAA,CAAY,QAAA;AAAA,IAAZ;AAAA,MACC,KAAA,EAAO,EAAE,KAAA,EAAO,aAAA,EAAe,mBAAmB,OAAA,EAAQ;AAAA,MAE1D,QAAA,kBAAA,GAAA,CAAC,SAAI,WAAA,EAAU,MAAA,EAAO,WAAW,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EACpD,QAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA;AAMnB,IAAM,gBAAA,GAAmB,GAAA,CAAI,CAAC,mBAAmB,CAAA,EAAG;AAAA,EAClD,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,SAAA,EAAW,8BAAA;AAAA,MACX,KAAA,EAAO,+BAAA;AAAA,MACP,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS;AAAA;AAEb,CAAC;AAOD,IAAM,QAAA,GAAiB,KAAA,CAAA,UAAA;AAAA,EACrB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,cAAA,EAAe;AACnC,IAAA,MAAM,OAAA,GAAgB,aAAuB,IAAI,CAAA;AAGjD,IAAA,MAAM,aAAA,GAAsB,KAAA,CAAA,WAAA;AAAA,MAC1B,CAAC,CAAA,KAA2C;AAC1C,QAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,QAAA,IAAI,CAAC,IAAA,EAAM;AAEX,QAAA,MAAM,WAAW,KAAA,CAAM,IAAA;AAAA,UACrB,IAAA,CAAK,gBAAA;AAAA,YACH;AAAA;AACF,SACF;AACA,QAAA,MAAM,eAAe,QAAA,CAAS,SAAA;AAAA,UAC5B,CAAC,OAAA,KAAY,OAAA,KAAY,QAAA,CAAS;AAAA,SACpC;AAEA,QAAA,IAAI,SAAA;AAEJ,QAAA,QAAQ,EAAE,GAAA;AAAK,UACb,KAAK,YAAA;AAAA,UACL,KAAK,WAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,SAAA,GACE,YAAA,KAAiB,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,IAAI,YAAA,GAAe,CAAA;AAC5D,YAAA,QAAA,CAAS,SAAS,GAAG,KAAA,EAAM;AAC3B,YAAA;AAAA,UACF,KAAK,WAAA;AAAA,UACL,KAAK,SAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,SAAA,GACE,YAAA,KAAiB,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,IAAI,YAAA,GAAe,CAAA;AAC5D,YAAA,QAAA,CAAS,SAAS,GAAG,KAAA,EAAM;AAC3B,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,QAAA,CAAS,CAAC,GAAG,KAAA,EAAM;AACnB,YAAA;AAAA,UACF,KAAK,KAAA;AACH,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG,KAAA,EAAM;AACrC,YAAA;AAAA;AACJ,MACF,CAAA;AAAA,MACA;AAAC,KACH;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,CAAC,IAAA,KAAS;AAEb,UAAC,QAA0D,OAAA,GACzD,IAAA;AACF,UAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,YAAA,GAAA,CAAI,IAAI,CAAA;AAAA,UACV,WAAW,GAAA,EAAK;AACd,YAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,UAChB;AAAA,QACF,CAAA;AAAA,QACA,IAAA,EAAK,SAAA;AAAA,QACL,WAAA,EAAU,WAAA;AAAA,QACV,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW,aAAA;AAAA,QACX,WAAW,EAAA,CAAG,gBAAA,CAAiB,EAAE,OAAA,EAAS,GAAG,SAAS,CAAA;AAAA,QACrD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;AAMvB,IAAM,mBAAA,GAAsB,GAAA;AAAA,EAC1B;AAAA,IACE,+CAAA;AAAA,IACA,yCAAA;AAAA,IACA,mBAAA;AAAA,IACA,qGAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,SAAA,EAAW;AAAA,UACT,kBAAA;AAAA,UACA,+BAAA;AAAA,UACA,6CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,gCAAA;AAAA,UACA,6CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,kBAAA;AAAA,UACA,wCAAA;AAAA,UACA,6CAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ;AAYA,IAAM,WAAA,GAAoB,KAAA,CAAA,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,IAAA,EAAM,UAAU,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACjE,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,aAAA,EAAe,OAAA,KAAY,cAAA,EAAe;AACxE,IAAA,MAAM,aAAa,aAAA,KAAkB,KAAA;AAErC,IAAA,uBACE,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,KAAA;AAAA,QACL,WAAA,EAAU,cAAA;AAAA,QACV,eAAA,EAAe,UAAA;AAAA,QACf,eAAA,EAAe,YAAY,KAAK,CAAA,CAAA;AAAA,QAChC,EAAA,EAAI,OAAO,KAAK,CAAA,CAAA;AAAA,QAChB,QAAA,EAAU,aAAa,CAAA,GAAI,EAAA;AAAA,QAC3B,YAAA,EAAY,aAAa,QAAA,GAAW,UAAA;AAAA,QACpC,QAAA;AAAA,QACA,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,QAClC,WAAW,EAAA,CAAG,mBAAA,CAAoB,EAAE,OAAA,EAAS,GAAG,SAAS,CAAA;AAAA,QACxD,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,IAAA,wBACE,MAAA,EAAA,EAAK,WAAA,EAAU,mBAAA,EAAoB,SAAA,EAAU,YAC3C,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,UAED;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AAgB1B,IAAM,WAAA,GAAoB,KAAA,CAAA,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,UAAA,GAAa,OAAO,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACrE,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAc,GAAI,cAAA,EAAe;AAChD,IAAA,MAAM,aAAa,aAAA,KAAkB,KAAA;AAErC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,WAAA,EAAU,cAAA;AAAA,QACV,EAAA,EAAI,YAAY,KAAK,CAAA,CAAA;AAAA,QACrB,iBAAA,EAAiB,OAAO,KAAK,CAAA,CAAA;AAAA,QAC7B,QAAA,EAAU,CAAA;AAAA,QACV,QAAQ,CAAC,UAAA;AAAA,QACT,YAAA,EAAY,aAAa,QAAA,GAAW,UAAA;AAAA,QACpC,SAAA,EAAW,EAAA;AAAA,UACT,yFAAA;AAAA,UACA,CAAC,UAAA,IAAc,QAAA;AAAA,UACf;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-3DM6LMZG.js","sourcesContent":["import * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Tabs Context\n// ============================================================================\n\ninterface TabsContextValue {\n value: string;\n onValueChange: (value: string) => void;\n variant: 'underline' | 'pills' | 'enclosed';\n}\n\nconst TabsContext = React.createContext<TabsContextValue | undefined>(\n undefined\n);\n\nfunction useTabsContext() {\n const context = React.useContext(TabsContext);\n if (!context) {\n throw new Error('Tabs components must be used within a Tabs provider');\n }\n return context;\n}\n\n// ============================================================================\n// Tabs Root\n// ============================================================================\n\nexport interface TabsProps {\n /** The controlled value of the selected tab */\n value?: string;\n /** The default value of the selected tab (uncontrolled) */\n defaultValue?: string;\n /** Callback when the selected tab changes */\n onValueChange?: (value: string) => void;\n /** Visual variant of the tabs */\n variant?: 'underline' | 'pills' | 'enclosed';\n /** Tab content */\n children: React.ReactNode;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Accessible tabs component with keyboard navigation.\n *\n * @example\n * ```tsx\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n * ```\n */\nfunction Tabs({\n value: controlledValue,\n defaultValue,\n onValueChange,\n variant = 'underline',\n children,\n className,\n}: TabsProps) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(\n defaultValue || ''\n );\n\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onValueChange?.(newValue);\n },\n [isControlled, onValueChange]\n );\n\n return (\n <TabsContext.Provider\n value={{ value, onValueChange: handleValueChange, variant }}\n >\n <div data-slot=\"tabs\" className={cn('w-full', className)}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\nTabs.displayName = 'Tabs';\n\n// ============================================================================\n// Tabs List\n// ============================================================================\n\nconst tabsListVariants = cva(['flex items-center'], {\n variants: {\n variant: {\n underline: 'border-b border-border gap-0',\n pills: 'gap-1 p-1 rounded-lg bg-muted',\n enclosed: 'gap-0 border-b border-border',\n },\n },\n defaultVariants: {\n variant: 'underline',\n },\n});\n\nexport type TabsListProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Container for tab triggers.\n */\nconst TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, ...props }, ref) => {\n const { variant } = useTabsContext();\n const listRef = React.useRef<HTMLDivElement>(null);\n\n // Keyboard navigation\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const list = listRef.current;\n if (!list) return;\n\n const triggers = Array.from(\n list.querySelectorAll<HTMLButtonElement>(\n '[role=\"tab\"]:not([disabled])'\n )\n );\n const currentIndex = triggers.findIndex(\n (trigger) => trigger === document.activeElement\n );\n\n let nextIndex: number;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n e.preventDefault();\n nextIndex =\n currentIndex === triggers.length - 1 ? 0 : currentIndex + 1;\n triggers[nextIndex]?.focus();\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n e.preventDefault();\n nextIndex =\n currentIndex === 0 ? triggers.length - 1 : currentIndex - 1;\n triggers[nextIndex]?.focus();\n break;\n case 'Home':\n e.preventDefault();\n triggers[0]?.focus();\n break;\n case 'End':\n e.preventDefault();\n triggers[triggers.length - 1]?.focus();\n break;\n }\n },\n []\n );\n\n return (\n <div\n ref={(node) => {\n // Combine refs\n (listRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n role=\"tablist\"\n data-slot=\"tabs-list\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n );\n }\n);\n\nTabsList.displayName = 'TabsList';\n\n// ============================================================================\n// Tabs Trigger\n// ============================================================================\n\nconst tabsTriggerVariants = cva(\n [\n 'inline-flex items-center justify-center gap-2',\n 'font-medium transition-all duration-200',\n 'whitespace-nowrap',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n ],\n {\n variants: {\n variant: {\n underline: [\n 'px-4 py-2 -mb-px',\n 'border-b-2 border-transparent',\n 'text-muted-foreground hover:text-foreground',\n 'data-[state=active]:border-primary-700 data-[state=active]:text-primary-800',\n ],\n pills: [\n 'px-3 py-1.5 rounded-md text-sm',\n 'text-muted-foreground hover:text-foreground',\n 'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm',\n ],\n enclosed: [\n 'px-4 py-2 -mb-px',\n 'border border-transparent rounded-t-lg',\n 'text-muted-foreground hover:text-foreground',\n 'data-[state=active]:border-border data-[state=active]:border-b-background data-[state=active]:bg-background data-[state=active]:text-foreground',\n ],\n },\n },\n defaultVariants: {\n variant: 'underline',\n },\n }\n);\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** The value that identifies this tab */\n value: string;\n /** Icon to show before the label */\n icon?: React.ReactNode;\n}\n\n/**\n * A tab trigger button.\n */\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ className, value, icon, children, disabled, ...props }, ref) => {\n const { value: selectedValue, onValueChange, variant } = useTabsContext();\n const isSelected = selectedValue === value;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n data-slot=\"tabs-trigger\"\n aria-selected={isSelected}\n aria-controls={`tabpanel-${value}`}\n id={`tab-${value}`}\n tabIndex={isSelected ? 0 : -1}\n data-state={isSelected ? 'active' : 'inactive'}\n disabled={disabled}\n onClick={() => onValueChange(value)}\n className={cn(tabsTriggerVariants({ variant }), className)}\n {...props}\n >\n {icon && (\n <span data-slot=\"tabs-trigger-icon\" className=\"shrink-0\">\n {icon}\n </span>\n )}\n {children}\n </button>\n );\n }\n);\n\nTabsTrigger.displayName = 'TabsTrigger';\n\n// ============================================================================\n// Tabs Content\n// ============================================================================\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The value that identifies this content panel */\n value: string;\n /** Force mount the content (useful for animations) */\n forceMount?: boolean;\n}\n\n/**\n * Content panel for a tab.\n */\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, value, forceMount = false, children, ...props }, ref) => {\n const { value: selectedValue } = useTabsContext();\n const isSelected = selectedValue === value;\n\n if (!isSelected && !forceMount) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n data-slot=\"tabs-content\"\n id={`tabpanel-${value}`}\n aria-labelledby={`tab-${value}`}\n tabIndex={0}\n hidden={!isSelected}\n data-state={isSelected ? 'active' : 'inactive'}\n className={cn(\n 'focus-visible:ring-ring mt-4 rounded-lg focus-visible:ring-2 focus-visible:outline-none',\n !isSelected && 'hidden',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nTabsContent.displayName = 'TabsContent';\n\nexport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n tabsListVariants,\n tabsTriggerVariants,\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/AudioPlayer/AudioPlayer.tsx"],"names":["cva","jsx","jsxs","cn","React","AudioPlayer"],"mappings":"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","file":"chunk-GPBQCGKA.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Types & Interfaces\n// ============================================================================\n\nexport type AudioPlayerState =\n | 'idle'\n | 'loading'\n | 'playing'\n | 'paused'\n | 'error';\n\n/** Ref handle for controlling AudioPlayer programmatically */\nexport interface AudioPlayerRef {\n /** The underlying container element */\n container: HTMLDivElement | null;\n /** Seek to a specific time in seconds */\n seekTo: (time: number) => void;\n /** Start playback */\n play: () => void;\n /** Pause playback */\n pause: () => void;\n /** Get current playback time in seconds */\n getCurrentTime: () => number;\n /** Get total duration in seconds */\n getDuration: () => number;\n}\n\nexport interface AudioPlayerProps extends VariantProps<\n typeof audioPlayerVariants\n> {\n /** Audio source URL */\n src: string;\n /** Title/label for the audio (used for accessibility and display) */\n title?: string;\n /** Callback when playback state changes */\n onStateChange?: (state: AudioPlayerState) => void;\n /** Callback when playback ends */\n onEnded?: () => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Callback when time updates during playback */\n onTimeUpdate?: (currentTime: number, duration: number) => void;\n /** Whether to show the time display */\n showTime?: boolean;\n /** Whether to show the duration (for inline variant) */\n showDuration?: boolean;\n /** Waveform color (for waveform variant) */\n waveColor?: string;\n /** Progress/played waveform color (for waveform variant) */\n progressColor?: string;\n /** Height of the waveform (for waveform variant) */\n waveformHeight?: number;\n /** Whether to show hover cursor on waveform for click-to-seek preview (for waveform variant) */\n showWaveformHoverCursor?: boolean;\n /** Color of the hover cursor line (for waveform variant) */\n waveformCursorColor?: string;\n /** Whether the player is disabled */\n disabled?: boolean;\n /** Additional class name */\n className?: string;\n /** Accessible label */\n 'aria-label'?: string;\n /** Playback speed options */\n playbackRates?: number[];\n /** Whether to show playback speed control */\n showPlaybackRate?: boolean;\n /** Whether to preload audio (set to false for lists with many items) */\n preload?: boolean;\n /** Fallback duration in seconds to display before audio metadata is loaded */\n fallbackDuration?: number;\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst audioPlayerVariants = cva('', {\n variants: {\n variant: {\n inline: 'inline-flex items-center gap-2',\n compact: [\n 'flex items-center gap-3 p-3',\n 'rounded-lg border border-border',\n 'bg-card text-card-foreground',\n ],\n waveform: [\n 'flex flex-col gap-3 p-4',\n 'rounded-xl border border-border',\n 'bg-card text-card-foreground',\n ],\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n compoundVariants: [\n { variant: 'compact', size: 'sm', class: 'p-2 gap-2' },\n { variant: 'compact', size: 'lg', class: 'p-4 gap-4' },\n { variant: 'waveform', size: 'sm', class: 'p-3 gap-2' },\n { variant: 'waveform', size: 'lg', class: 'p-5 gap-4' },\n ],\n defaultVariants: {\n variant: 'compact',\n size: 'md',\n },\n});\n\nconst playButtonVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-full transition-all duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'active:scale-95',\n ],\n {\n variants: {\n variant: {\n inline: [\n 'text-neutral-500 hover:text-neutral-700 hover:bg-neutral-100',\n 'dark:text-neutral-400 dark:hover:text-neutral-200 dark:hover:bg-neutral-800',\n ],\n compact: [\n 'bg-primary-600 text-white',\n 'hover:bg-primary-700',\n 'active:bg-primary-800',\n ],\n waveform: [\n 'bg-primary-600 text-white',\n 'hover:bg-primary-700',\n 'active:bg-primary-800',\n ],\n },\n size: {\n sm: 'h-7 w-7',\n md: 'h-9 w-9',\n lg: 'h-11 w-11',\n },\n },\n defaultVariants: {\n variant: 'compact',\n size: 'md',\n },\n }\n);\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nexport function formatTime(seconds: number): string {\n if (!isFinite(seconds) || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nfunction PlayIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction PauseIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" />\n </svg>\n );\n}\n\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn('animate-spin', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Progress Bar Component (for compact variant)\n// ============================================================================\n\ninterface ProgressBarProps {\n currentTime: number;\n duration: number;\n onSeek: (time: number) => void;\n disabled?: boolean;\n}\n\nfunction ProgressBar({\n currentTime,\n duration,\n onSeek,\n disabled,\n}: ProgressBarProps) {\n const progressRef = React.useRef<HTMLDivElement>(null);\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !progressRef.current || duration <= 0) return;\n const rect = progressRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const percentage = x / rect.width;\n onSeek(percentage * duration);\n };\n\n return (\n <div\n ref={progressRef}\n data-slot=\"audio-player-progress\"\n role=\"slider\"\n aria-label=\"Audio progress\"\n aria-valuemin={0}\n aria-valuemax={duration}\n aria-valuenow={currentTime}\n aria-valuetext={`${formatTime(currentTime)} of ${formatTime(duration)}`}\n tabIndex={disabled ? -1 : 0}\n className={cn(\n 'relative h-1.5 flex-1 cursor-pointer rounded-full bg-neutral-200 dark:bg-neutral-700',\n disabled && 'cursor-not-allowed opacity-50'\n )}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (disabled) return;\n const step = duration * 0.05; // 5% steps\n if (e.key === 'ArrowRight') {\n onSeek(Math.min(currentTime + step, duration));\n } else if (e.key === 'ArrowLeft') {\n onSeek(Math.max(currentTime - step, 0));\n }\n }}\n >\n <div\n className=\"bg-primary-600 absolute inset-y-0 left-0 rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n <div\n className=\"bg-primary-600 absolute top-1/2 h-3 w-3 -translate-y-1/2 rounded-full shadow-sm transition-all\"\n style={{ left: `calc(${progress}% - 6px)` }}\n />\n </div>\n );\n}\n\n// ============================================================================\n// Waveform Component (lazy-loaded WaveSurfer)\n// ============================================================================\n\n/** Methods exposed by Waveform via ref */\nexport interface WaveformMethods {\n seekTo: (time: number) => void;\n play: () => void;\n pause: () => void;\n getCurrentTime: () => number;\n getDuration: () => number;\n}\n\ninterface WaveformProps {\n src: string;\n isPlaying: boolean;\n playbackRate?: number;\n onReady: (duration: number) => void;\n onTimeUpdate: (time: number, duration: number) => void;\n onFinish: () => void;\n onSeek: (time: number) => void;\n waveColor?: string;\n progressColor?: string;\n height?: number;\n showHoverCursor?: boolean;\n onHoverTimeChange?: (time: number | null) => void;\n cursorColor?: string;\n /** Ref to expose waveform control methods */\n waveformRef?: React.MutableRefObject<WaveformMethods | null>;\n}\n\nfunction Waveform({\n src,\n isPlaying,\n playbackRate = 1,\n onReady,\n onTimeUpdate,\n onFinish,\n onSeek,\n waveColor,\n progressColor,\n height = 64,\n showHoverCursor = false,\n waveformRef,\n onHoverTimeChange,\n cursorColor = 'var(--color-red-500, rgb(239, 68, 68))',\n}: WaveformProps) {\n const containerRef = React.useRef<HTMLDivElement>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wavesurferRef = React.useRef<any>(null);\n const [isLoaded, setIsLoaded] = React.useState(false);\n const [isHovering, setIsHovering] = React.useState(false);\n const [hoverPosition, setHoverPosition] = React.useState(0);\n\n // Expose methods via ref for external control\n React.useEffect(() => {\n if (waveformRef) {\n waveformRef.current = {\n seekTo: (time: number) => {\n if (wavesurferRef.current && isLoaded) {\n const duration = wavesurferRef.current.getDuration();\n if (duration > 0) {\n const clampedTime = Math.min(Math.max(time, 0), duration);\n const progress = clampedTime / duration;\n wavesurferRef.current.seekTo(progress);\n }\n }\n },\n play: () => {\n if (wavesurferRef.current && isLoaded) {\n wavesurferRef.current.play();\n }\n },\n pause: () => {\n if (wavesurferRef.current && isLoaded) {\n wavesurferRef.current.pause();\n }\n },\n getCurrentTime: () => {\n return wavesurferRef.current?.getCurrentTime?.() ?? 0;\n },\n getDuration: () => {\n return wavesurferRef.current?.getDuration?.() ?? 0;\n },\n };\n }\n return () => {\n if (waveformRef) {\n waveformRef.current = null;\n }\n };\n }, [waveformRef, isLoaded]);\n\n // Initialize WaveSurfer\n React.useEffect(() => {\n if (!containerRef.current) return;\n\n const initWaveSurfer = async () => {\n try {\n const WaveSurfer = (await import('wavesurfer.js')).default;\n\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n }\n\n wavesurferRef.current = WaveSurfer.create({\n container: containerRef.current!,\n waveColor: waveColor || '#d1d5db',\n progressColor: progressColor || 'var(--color-primary-600, #2563eb)',\n cursorColor: 'transparent',\n barWidth: 2,\n barGap: 2,\n barRadius: 2,\n height,\n normalize: true,\n interact: !showHoverCursor,\n });\n\n const emitTimeUpdate = () => {\n onTimeUpdate(\n wavesurferRef.current.getCurrentTime(),\n wavesurferRef.current.getDuration()\n );\n };\n\n wavesurferRef.current.on('ready', () => {\n setIsLoaded(true);\n const duration = wavesurferRef.current.getDuration();\n onReady(duration);\n onTimeUpdate(wavesurferRef.current.getCurrentTime(), duration);\n });\n\n wavesurferRef.current.on('timeupdate', emitTimeUpdate);\n wavesurferRef.current.on('audioprocess', emitTimeUpdate);\n\n wavesurferRef.current.on('seeking', () => {\n emitTimeUpdate();\n });\n\n if (!showHoverCursor) {\n wavesurferRef.current.on('interaction', () => {\n onSeek(wavesurferRef.current.getCurrentTime());\n });\n }\n\n wavesurferRef.current.on('finish', () => {\n onFinish();\n });\n\n wavesurferRef.current.load(src);\n } catch (error) {\n console.error('Failed to load WaveSurfer:', error);\n }\n };\n\n setIsLoaded(false);\n initWaveSurfer();\n\n return () => {\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src, showHoverCursor]);\n\n // Handle play/pause\n React.useEffect(() => {\n if (!wavesurferRef.current || !isLoaded) return;\n\n if (isPlaying) {\n wavesurferRef.current.play();\n } else {\n wavesurferRef.current.pause();\n }\n }, [isPlaying, isLoaded]);\n\n // Handle playback rate changes\n React.useEffect(() => {\n if (!wavesurferRef.current || !isLoaded) return;\n wavesurferRef.current.setPlaybackRate(playbackRate);\n }, [playbackRate, isLoaded]);\n\n // Hover cursor handlers\n const handleMouseMove = showHoverCursor\n ? (e: React.MouseEvent<HTMLDivElement>) => {\n if (!containerRef.current || !wavesurferRef.current || !isLoaded)\n return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(e.clientX - rect.left, rect.width));\n const percentage = x / rect.width;\n const duration = wavesurferRef.current.getDuration();\n setHoverPosition(percentage * 100);\n onHoverTimeChange?.(percentage * duration);\n }\n : undefined;\n\n const handleMouseEnter = showHoverCursor\n ? () => setIsHovering(true)\n : undefined;\n\n const handleMouseLeave = showHoverCursor\n ? () => {\n setIsHovering(false);\n setHoverPosition(0);\n onHoverTimeChange?.(null);\n }\n : undefined;\n\n const handleClick = showHoverCursor\n ? (e: React.MouseEvent<HTMLDivElement>) => {\n if (!containerRef.current || !wavesurferRef.current || !isLoaded)\n return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(e.clientX - rect.left, rect.width));\n const percentage = x / rect.width;\n const duration = wavesurferRef.current.getDuration();\n const time = duration * percentage;\n wavesurferRef.current.seekTo(percentage);\n onSeek(time);\n onTimeUpdate(time, duration);\n onHoverTimeChange?.(null);\n }\n : undefined;\n\n const handleKeyDown = showHoverCursor\n ? (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!wavesurferRef.current || !isLoaded) return;\n const duration = wavesurferRef.current.getDuration();\n const currentTime = wavesurferRef.current.getCurrentTime();\n const step = duration * 0.05; // 5% steps\n\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n const newTime = Math.min(currentTime + step, duration);\n wavesurferRef.current.seekTo(newTime / duration);\n onSeek(newTime);\n onTimeUpdate(newTime, duration);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n const newTime = Math.max(currentTime - step, 0);\n wavesurferRef.current.seekTo(newTime / duration);\n onSeek(newTime);\n onTimeUpdate(newTime, duration);\n }\n }\n : undefined;\n\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player-waveform\"\n role={showHoverCursor ? 'slider' : undefined}\n aria-label={showHoverCursor ? 'Audio progress' : undefined}\n aria-valuemin={showHoverCursor ? 0 : undefined}\n aria-valuemax={\n showHoverCursor && wavesurferRef.current\n ? wavesurferRef.current.getDuration()\n : undefined\n }\n aria-valuenow={\n showHoverCursor && wavesurferRef.current\n ? wavesurferRef.current.getCurrentTime()\n : undefined\n }\n tabIndex={showHoverCursor ? 0 : undefined}\n className={cn(\n 'relative w-full rounded-lg bg-neutral-100 dark:bg-neutral-800',\n showHoverCursor && 'cursor-pointer',\n !isLoaded && 'animate-pulse'\n )}\n style={{ height }}\n onMouseMove={handleMouseMove}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {/* Hover cursor line */}\n {showHoverCursor && isHovering && isLoaded && (\n <div\n className=\"pointer-events-none absolute top-0 bottom-0 z-10 w-0.5\"\n style={{ left: `${hoverPosition}%`, backgroundColor: cursorColor }}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Main AudioPlayer Component\n// ============================================================================\n\n/**\n * A versatile audio player component with multiple display variants.\n *\n * @example\n * ```tsx\n * // Inline - minimal, just play button and duration\n * <AudioPlayer src=\"/audio.mp3\" variant=\"inline\" showDuration />\n *\n * // Compact - play button, progress bar, and time\n * <AudioPlayer src=\"/audio.mp3\" variant=\"compact\" showTime />\n *\n * // Waveform - full visualization with WaveSurfer\n * <AudioPlayer src=\"/audio.mp3\" variant=\"waveform\" showTime />\n *\n * // With ref for programmatic control\n * const playerRef = useRef<AudioPlayerRef>(null);\n * <AudioPlayer ref={playerRef} src=\"/audio.mp3\" variant=\"waveform\" />\n * // Then: playerRef.current?.seekTo(30); playerRef.current?.play();\n * ```\n */\nconst AudioPlayer = React.forwardRef<AudioPlayerRef, AudioPlayerProps>(function AudioPlayer(\n {\n src,\n title,\n variant = 'compact',\n size = 'md',\n onStateChange,\n onEnded,\n onError,\n onTimeUpdate,\n showTime = true,\n showDuration = true,\n waveColor,\n progressColor,\n waveformHeight = 64,\n showWaveformHoverCursor = true,\n waveformCursorColor,\n disabled = false,\n className,\n 'aria-label': ariaLabel,\n playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2],\n showPlaybackRate = false,\n /** Whether to preload audio (set to false for lists with many items) */\n preload = false,\n /** Fallback duration in seconds to display before audio is loaded */\n fallbackDuration,\n },\n ref\n) {\n const [state, setState] = React.useState<AudioPlayerState>('idle');\n const [currentTime, setCurrentTime] = React.useState(0);\n const [duration, setDuration] = React.useState(0);\n const [playbackRate, setPlaybackRate] = React.useState(1);\n const [audioInitialized, setAudioInitialized] = React.useState(false);\n const [hoverTime, setHoverTime] = React.useState<number | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const audioRef = React.useRef<globalThis.HTMLAudioElement | null>(null);\n const waveformMethodsRef = React.useRef<WaveformMethods | null>(null);\n\n const isPlaying = state === 'playing';\n const isLoading = state === 'loading';\n const displayDuration = duration > 0 ? duration : (fallbackDuration ?? 0);\n\n // Update state helper\n const updateState = React.useCallback(\n (newState: AudioPlayerState) => {\n setState(newState);\n onStateChange?.(newState);\n },\n [onStateChange]\n );\n\n // Initialize audio element (for non-waveform variants)\n const initAudio = React.useCallback(() => {\n if (variant === 'waveform' || audioInitialized) return null;\n\n const audio = new globalThis.Audio(src);\n audioRef.current = audio;\n setAudioInitialized(true);\n\n audio.addEventListener('loadstart', () => updateState('loading'));\n audio.addEventListener('canplay', () => {\n updateState('idle');\n });\n audio.addEventListener('loadedmetadata', () => {\n setDuration(audio.duration);\n onTimeUpdate?.(audio.currentTime, audio.duration);\n });\n audio.addEventListener('timeupdate', () => {\n setCurrentTime(audio.currentTime);\n onTimeUpdate?.(audio.currentTime, audio.duration);\n });\n audio.addEventListener('ended', () => {\n updateState('idle');\n setCurrentTime(0);\n onEnded?.();\n });\n audio.addEventListener('error', () => {\n updateState('error');\n onError?.(new Error('Failed to load audio'));\n });\n\n return audio;\n }, [\n src,\n variant,\n audioInitialized,\n updateState,\n onTimeUpdate,\n onEnded,\n onError,\n ]);\n\n // Expose methods via ref for external control\n React.useImperativeHandle(\n ref,\n () => ({\n get container() {\n return containerRef.current;\n },\n seekTo: (time: number) => {\n if (variant === 'waveform') {\n waveformMethodsRef.current?.seekTo(time);\n } else {\n // Lazily initialize audio if not yet created\n if (!audioRef.current) {\n initAudio();\n }\n if (audioRef.current) {\n audioRef.current.currentTime = time;\n }\n }\n },\n play: () => {\n if (variant === 'waveform') {\n if (waveformMethodsRef.current) {\n waveformMethodsRef.current.play();\n updateState('playing');\n }\n } else {\n // Lazily initialize audio if not yet created\n if (!audioRef.current) {\n initAudio();\n }\n if (audioRef.current) {\n audioRef.current.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n }\n }\n },\n pause: () => {\n if (variant === 'waveform') {\n if (waveformMethodsRef.current) {\n waveformMethodsRef.current.pause();\n updateState('paused');\n }\n } else if (audioRef.current) {\n audioRef.current.pause();\n updateState('paused');\n }\n },\n getCurrentTime: () => {\n if (variant === 'waveform') {\n return waveformMethodsRef.current?.getCurrentTime() ?? 0;\n }\n return audioRef.current?.currentTime ?? 0;\n },\n getDuration: () => {\n if (variant === 'waveform') {\n return waveformMethodsRef.current?.getDuration() ?? 0;\n }\n const rawDuration = audioRef.current?.duration;\n return Number.isFinite(rawDuration) ? rawDuration! : 0;\n },\n }),\n [variant, initAudio, updateState, onError]\n );\n\n // Auto-initialize if preload is true\n React.useEffect(() => {\n if (preload && !audioInitialized && variant !== 'waveform') {\n initAudio();\n }\n }, [preload, audioInitialized, variant, initAudio]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.src = '';\n }\n };\n }, []);\n\n // Handle playback rate changes\n React.useEffect(() => {\n if (audioRef.current) {\n audioRef.current.playbackRate = playbackRate;\n }\n }, [playbackRate]);\n\n const handlePlay = React.useCallback(() => {\n if (disabled) return;\n\n // Waveform variant uses WaveSurfer for playback - just toggle state\n if (variant === 'waveform') {\n if (isLoading) return;\n updateState(isPlaying ? 'paused' : 'playing');\n return;\n }\n\n // Lazy initialize audio on first play\n if (!audioInitialized && !isLoading) {\n const audio = initAudio();\n if (audio) {\n updateState('loading');\n audio.addEventListener(\n 'canplay',\n () => {\n audio.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n },\n { once: true }\n );\n }\n return;\n }\n\n if (isLoading) return;\n\n if (isPlaying) {\n if (audioRef.current) {\n audioRef.current.pause();\n }\n updateState('paused');\n } else {\n if (audioRef.current) {\n audioRef.current.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n }\n }\n }, [\n disabled,\n variant,\n audioInitialized,\n isLoading,\n isPlaying,\n initAudio,\n updateState,\n onError,\n ]);\n\n const handleSeek = React.useCallback(\n (time: number) => {\n if (audioRef.current) {\n audioRef.current.currentTime = time;\n setCurrentTime(time);\n onTimeUpdate?.(time, audioRef.current.duration);\n }\n },\n [onTimeUpdate]\n );\n\n // Waveform callbacks\n const handleWaveformReady = React.useCallback(\n (dur: number) => {\n setDuration(dur);\n setState('idle');\n onTimeUpdate?.(currentTime, dur);\n },\n [currentTime, onTimeUpdate]\n );\n\n const handleWaveformTimeUpdate = React.useCallback(\n (time: number, dur: number) => {\n setCurrentTime(time);\n if (dur > 0) {\n setDuration(dur);\n }\n onTimeUpdate?.(time, dur);\n },\n [onTimeUpdate]\n );\n\n const handleWaveformFinish = React.useCallback(() => {\n updateState('idle');\n setCurrentTime(0);\n onEnded?.();\n }, [updateState, onEnded]);\n\n const handleWaveformSeek = React.useCallback((time: number) => {\n setCurrentTime(time);\n }, []);\n\n const handleHoverTimeChange = React.useCallback((time: number | null) => {\n setHoverTime(time);\n }, []);\n\n const iconSize =\n size === 'sm' ? 'h-3.5 w-3.5' : size === 'lg' ? 'h-5 w-5' : 'h-4 w-4';\n\n const getAriaLabel = () => {\n if (ariaLabel) return ariaLabel;\n if (title) return `${isPlaying ? 'Pause' : 'Play'} ${title}`;\n return isPlaying ? 'Pause audio' : 'Play audio';\n };\n\n const renderPlayButton = () => (\n <button\n type=\"button\"\n data-slot=\"audio-player-play-btn\"\n onClick={handlePlay}\n disabled={disabled || isLoading}\n className={cn(playButtonVariants({ variant, size }))}\n aria-label={getAriaLabel()}\n aria-pressed={isPlaying}\n >\n {isLoading ? (\n <SpinnerIcon className={iconSize} />\n ) : isPlaying ? (\n <PauseIcon className={iconSize} />\n ) : (\n <PlayIcon className={iconSize} />\n )}\n </button>\n );\n\n const renderTime = (useHoverTime = false) => {\n if (!showTime) return null;\n const displayTime =\n useHoverTime && hoverTime !== null ? hoverTime : currentTime;\n const isShowingHoverTime = useHoverTime && hoverTime !== null;\n return (\n <span\n data-slot=\"audio-player-time\"\n className={cn(\n 'font-mono text-xs tabular-nums',\n isShowingHoverTime\n ? 'text-primary-600 dark:text-primary-400'\n : 'text-neutral-500 dark:text-neutral-400'\n )}\n >\n {formatTime(displayTime)} / {formatTime(displayDuration)}\n </span>\n );\n };\n\n const renderPlaybackRateControl = () => {\n if (!showPlaybackRate) return null;\n return (\n <select\n data-slot=\"audio-player-rate\"\n value={playbackRate}\n onChange={(e) => setPlaybackRate(Number(e.target.value))}\n className=\"rounded border border-neutral-200 bg-transparent px-1 py-0.5 text-xs dark:border-neutral-700\"\n aria-label=\"Playback speed\"\n >\n {playbackRates.map((rate) => (\n <option key={rate} value={rate}>\n {rate}x\n </option>\n ))}\n </select>\n );\n };\n\n // ============================================================================\n // Inline Variant\n // ============================================================================\n if (variant === 'inline') {\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"inline\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {renderPlayButton()}\n {title && (\n <span\n data-slot=\"audio-player-title\"\n className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {title}\n </span>\n )}\n {showDuration && displayDuration > 0 && (\n <span\n data-slot=\"audio-player-duration\"\n className=\"font-mono text-xs text-neutral-500 tabular-nums dark:text-neutral-400\"\n >\n {isPlaying ? formatTime(currentTime) : formatTime(displayDuration)}\n </span>\n )}\n </div>\n );\n }\n\n // Compact Variant\n // ============================================================================\n if (variant === 'compact') {\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"compact\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {renderPlayButton()}\n <ProgressBar\n currentTime={currentTime}\n duration={displayDuration}\n onSeek={handleSeek}\n disabled={disabled}\n />\n {renderTime()}\n {renderPlaybackRateControl()}\n </div>\n );\n }\n\n // ============================================================================\n // Waveform Variant\n // ============================================================================\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"waveform\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {title && (\n <span\n data-slot=\"audio-player-title\"\n className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {title}\n </span>\n )}\n <Waveform\n src={src}\n isPlaying={isPlaying}\n playbackRate={playbackRate}\n onReady={handleWaveformReady}\n onTimeUpdate={handleWaveformTimeUpdate}\n onFinish={handleWaveformFinish}\n onSeek={handleWaveformSeek}\n waveColor={waveColor}\n progressColor={progressColor}\n height={waveformHeight}\n showHoverCursor={showWaveformHoverCursor}\n onHoverTimeChange={handleHoverTimeChange}\n cursorColor={waveformCursorColor}\n waveformRef={waveformMethodsRef}\n />\n <div\n data-slot=\"audio-player-controls\"\n className=\"flex items-center gap-3\"\n >\n {renderPlayButton()}\n <div className=\"flex flex-1 items-center justify-between\">\n {renderTime(true)}\n {renderPlaybackRateControl()}\n </div>\n </div>\n </div>\n );\n});\n\nAudioPlayer.displayName = 'AudioPlayer';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { AudioPlayer, audioPlayerVariants, playButtonVariants, ProgressBar };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/AudioPlayer/AudioPlayer.tsx"],"names":["AudioPlayer"],"mappings":"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","file":"chunk-JCHVLSXS.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Types & Interfaces\n// ============================================================================\n\nexport type AudioPlayerState =\n | 'idle'\n | 'loading'\n | 'playing'\n | 'paused'\n | 'error';\n\n/** Ref handle for controlling AudioPlayer programmatically */\nexport interface AudioPlayerRef {\n /** The underlying container element */\n container: HTMLDivElement | null;\n /** Seek to a specific time in seconds */\n seekTo: (time: number) => void;\n /** Start playback */\n play: () => void;\n /** Pause playback */\n pause: () => void;\n /** Get current playback time in seconds */\n getCurrentTime: () => number;\n /** Get total duration in seconds */\n getDuration: () => number;\n}\n\nexport interface AudioPlayerProps extends VariantProps<\n typeof audioPlayerVariants\n> {\n /** Audio source URL */\n src: string;\n /** Title/label for the audio (used for accessibility and display) */\n title?: string;\n /** Callback when playback state changes */\n onStateChange?: (state: AudioPlayerState) => void;\n /** Callback when playback ends */\n onEnded?: () => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Callback when time updates during playback */\n onTimeUpdate?: (currentTime: number, duration: number) => void;\n /** Whether to show the time display */\n showTime?: boolean;\n /** Whether to show the duration (for inline variant) */\n showDuration?: boolean;\n /** Waveform color (for waveform variant) */\n waveColor?: string;\n /** Progress/played waveform color (for waveform variant) */\n progressColor?: string;\n /** Height of the waveform (for waveform variant) */\n waveformHeight?: number;\n /** Whether to show hover cursor on waveform for click-to-seek preview (for waveform variant) */\n showWaveformHoverCursor?: boolean;\n /** Color of the hover cursor line (for waveform variant) */\n waveformCursorColor?: string;\n /** Whether the player is disabled */\n disabled?: boolean;\n /** Additional class name */\n className?: string;\n /** Accessible label */\n 'aria-label'?: string;\n /** Playback speed options */\n playbackRates?: number[];\n /** Whether to show playback speed control */\n showPlaybackRate?: boolean;\n /** Whether to preload audio (set to false for lists with many items) */\n preload?: boolean;\n /** Fallback duration in seconds to display before audio metadata is loaded */\n fallbackDuration?: number;\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst audioPlayerVariants = cva('', {\n variants: {\n variant: {\n inline: 'inline-flex items-center gap-2',\n compact: [\n 'flex items-center gap-3 p-3',\n 'rounded-lg border border-border',\n 'bg-card text-card-foreground',\n ],\n waveform: [\n 'flex flex-col gap-3 p-4',\n 'rounded-xl border border-border',\n 'bg-card text-card-foreground',\n ],\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n compoundVariants: [\n { variant: 'compact', size: 'sm', class: 'p-2 gap-2' },\n { variant: 'compact', size: 'lg', class: 'p-4 gap-4' },\n { variant: 'waveform', size: 'sm', class: 'p-3 gap-2' },\n { variant: 'waveform', size: 'lg', class: 'p-5 gap-4' },\n ],\n defaultVariants: {\n variant: 'compact',\n size: 'md',\n },\n});\n\nconst playButtonVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'rounded-full transition-all duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'active:scale-95',\n ],\n {\n variants: {\n variant: {\n inline: [\n 'text-neutral-500 hover:text-neutral-700 hover:bg-neutral-100',\n 'dark:text-neutral-400 dark:hover:text-neutral-200 dark:hover:bg-neutral-800',\n ],\n compact: [\n 'bg-primary-600 text-white',\n 'hover:bg-primary-700',\n 'active:bg-primary-800',\n ],\n waveform: [\n 'bg-primary-600 text-white',\n 'hover:bg-primary-700',\n 'active:bg-primary-800',\n ],\n },\n size: {\n sm: 'h-7 w-7',\n md: 'h-9 w-9',\n lg: 'h-11 w-11',\n },\n },\n defaultVariants: {\n variant: 'compact',\n size: 'md',\n },\n }\n);\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nexport function formatTime(seconds: number): string {\n if (!isFinite(seconds) || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nfunction PlayIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction PauseIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" />\n </svg>\n );\n}\n\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn('animate-spin', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Progress Bar Component (for compact variant)\n// ============================================================================\n\ninterface ProgressBarProps {\n currentTime: number;\n duration: number;\n onSeek: (time: number) => void;\n disabled?: boolean;\n}\n\nfunction ProgressBar({\n currentTime,\n duration,\n onSeek,\n disabled,\n}: ProgressBarProps) {\n const progressRef = React.useRef<HTMLDivElement>(null);\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !progressRef.current || duration <= 0) return;\n const rect = progressRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const percentage = x / rect.width;\n onSeek(percentage * duration);\n };\n\n return (\n <div\n ref={progressRef}\n data-slot=\"audio-player-progress\"\n role=\"slider\"\n aria-label=\"Audio progress\"\n aria-valuemin={0}\n aria-valuemax={duration}\n aria-valuenow={currentTime}\n aria-valuetext={`${formatTime(currentTime)} of ${formatTime(duration)}`}\n tabIndex={disabled ? -1 : 0}\n className={cn(\n 'relative h-1.5 flex-1 cursor-pointer rounded-full bg-neutral-200 dark:bg-neutral-700',\n disabled && 'cursor-not-allowed opacity-50'\n )}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (disabled) return;\n const step = duration * 0.05; // 5% steps\n if (e.key === 'ArrowRight') {\n onSeek(Math.min(currentTime + step, duration));\n } else if (e.key === 'ArrowLeft') {\n onSeek(Math.max(currentTime - step, 0));\n }\n }}\n >\n <div\n className=\"bg-primary-600 absolute inset-y-0 left-0 rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n <div\n className=\"bg-primary-600 absolute top-1/2 h-3 w-3 -translate-y-1/2 rounded-full shadow-sm transition-all\"\n style={{ left: `calc(${progress}% - 6px)` }}\n />\n </div>\n );\n}\n\n// ============================================================================\n// Waveform Component (lazy-loaded WaveSurfer)\n// ============================================================================\n\n/** Methods exposed by Waveform via ref */\nexport interface WaveformMethods {\n seekTo: (time: number) => void;\n play: () => void;\n pause: () => void;\n getCurrentTime: () => number;\n getDuration: () => number;\n}\n\ninterface WaveformProps {\n src: string;\n isPlaying: boolean;\n playbackRate?: number;\n onReady: (duration: number) => void;\n onTimeUpdate: (time: number, duration: number) => void;\n onFinish: () => void;\n onSeek: (time: number) => void;\n waveColor?: string;\n progressColor?: string;\n height?: number;\n showHoverCursor?: boolean;\n onHoverTimeChange?: (time: number | null) => void;\n cursorColor?: string;\n /** Ref to expose waveform control methods */\n waveformRef?: React.MutableRefObject<WaveformMethods | null>;\n}\n\nfunction Waveform({\n src,\n isPlaying,\n playbackRate = 1,\n onReady,\n onTimeUpdate,\n onFinish,\n onSeek,\n waveColor,\n progressColor,\n height = 64,\n showHoverCursor = false,\n waveformRef,\n onHoverTimeChange,\n cursorColor = 'var(--color-red-500, rgb(239, 68, 68))',\n}: WaveformProps) {\n const containerRef = React.useRef<HTMLDivElement>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wavesurferRef = React.useRef<any>(null);\n const [isLoaded, setIsLoaded] = React.useState(false);\n const [isHovering, setIsHovering] = React.useState(false);\n const [hoverPosition, setHoverPosition] = React.useState(0);\n\n // Expose methods via ref for external control\n React.useEffect(() => {\n if (waveformRef) {\n waveformRef.current = {\n seekTo: (time: number) => {\n if (wavesurferRef.current && isLoaded) {\n const duration = wavesurferRef.current.getDuration();\n if (duration > 0) {\n const clampedTime = Math.min(Math.max(time, 0), duration);\n const progress = clampedTime / duration;\n wavesurferRef.current.seekTo(progress);\n }\n }\n },\n play: () => {\n if (wavesurferRef.current && isLoaded) {\n wavesurferRef.current.play();\n }\n },\n pause: () => {\n if (wavesurferRef.current && isLoaded) {\n wavesurferRef.current.pause();\n }\n },\n getCurrentTime: () => {\n return wavesurferRef.current?.getCurrentTime?.() ?? 0;\n },\n getDuration: () => {\n return wavesurferRef.current?.getDuration?.() ?? 0;\n },\n };\n }\n return () => {\n if (waveformRef) {\n waveformRef.current = null;\n }\n };\n }, [waveformRef, isLoaded]);\n\n // Initialize WaveSurfer\n React.useEffect(() => {\n if (!containerRef.current) return;\n\n const initWaveSurfer = async () => {\n try {\n const WaveSurfer = (await import('wavesurfer.js')).default;\n\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n }\n\n wavesurferRef.current = WaveSurfer.create({\n container: containerRef.current!,\n waveColor: waveColor || '#d1d5db',\n progressColor: progressColor || 'var(--color-primary-600, #2563eb)',\n cursorColor: 'transparent',\n barWidth: 2,\n barGap: 2,\n barRadius: 2,\n height,\n normalize: true,\n interact: !showHoverCursor,\n });\n\n const emitTimeUpdate = () => {\n onTimeUpdate(\n wavesurferRef.current.getCurrentTime(),\n wavesurferRef.current.getDuration()\n );\n };\n\n wavesurferRef.current.on('ready', () => {\n setIsLoaded(true);\n const duration = wavesurferRef.current.getDuration();\n onReady(duration);\n onTimeUpdate(wavesurferRef.current.getCurrentTime(), duration);\n });\n\n wavesurferRef.current.on('timeupdate', emitTimeUpdate);\n wavesurferRef.current.on('audioprocess', emitTimeUpdate);\n\n wavesurferRef.current.on('seeking', () => {\n emitTimeUpdate();\n });\n\n if (!showHoverCursor) {\n wavesurferRef.current.on('interaction', () => {\n onSeek(wavesurferRef.current.getCurrentTime());\n });\n }\n\n wavesurferRef.current.on('finish', () => {\n onFinish();\n });\n\n wavesurferRef.current.load(src);\n } catch (error) {\n console.error('Failed to load WaveSurfer:', error);\n }\n };\n\n setIsLoaded(false);\n initWaveSurfer();\n\n return () => {\n if (wavesurferRef.current) {\n wavesurferRef.current.destroy();\n wavesurferRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src, showHoverCursor]);\n\n // Handle play/pause\n React.useEffect(() => {\n if (!wavesurferRef.current || !isLoaded) return;\n\n if (isPlaying) {\n wavesurferRef.current.play();\n } else {\n wavesurferRef.current.pause();\n }\n }, [isPlaying, isLoaded]);\n\n // Handle playback rate changes\n React.useEffect(() => {\n if (!wavesurferRef.current || !isLoaded) return;\n wavesurferRef.current.setPlaybackRate(playbackRate);\n }, [playbackRate, isLoaded]);\n\n // Hover cursor handlers\n const handleMouseMove = showHoverCursor\n ? (e: React.MouseEvent<HTMLDivElement>) => {\n if (!containerRef.current || !wavesurferRef.current || !isLoaded)\n return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(e.clientX - rect.left, rect.width));\n const percentage = x / rect.width;\n const duration = wavesurferRef.current.getDuration();\n setHoverPosition(percentage * 100);\n onHoverTimeChange?.(percentage * duration);\n }\n : undefined;\n\n const handleMouseEnter = showHoverCursor\n ? () => setIsHovering(true)\n : undefined;\n\n const handleMouseLeave = showHoverCursor\n ? () => {\n setIsHovering(false);\n setHoverPosition(0);\n onHoverTimeChange?.(null);\n }\n : undefined;\n\n const handleClick = showHoverCursor\n ? (e: React.MouseEvent<HTMLDivElement>) => {\n if (!containerRef.current || !wavesurferRef.current || !isLoaded)\n return;\n const rect = containerRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(e.clientX - rect.left, rect.width));\n const percentage = x / rect.width;\n const duration = wavesurferRef.current.getDuration();\n const time = duration * percentage;\n wavesurferRef.current.seekTo(percentage);\n onSeek(time);\n onTimeUpdate(time, duration);\n onHoverTimeChange?.(null);\n }\n : undefined;\n\n const handleKeyDown = showHoverCursor\n ? (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!wavesurferRef.current || !isLoaded) return;\n const duration = wavesurferRef.current.getDuration();\n const currentTime = wavesurferRef.current.getCurrentTime();\n const step = duration * 0.05; // 5% steps\n\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n const newTime = Math.min(currentTime + step, duration);\n wavesurferRef.current.seekTo(newTime / duration);\n onSeek(newTime);\n onTimeUpdate(newTime, duration);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n const newTime = Math.max(currentTime - step, 0);\n wavesurferRef.current.seekTo(newTime / duration);\n onSeek(newTime);\n onTimeUpdate(newTime, duration);\n }\n }\n : undefined;\n\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player-waveform\"\n role={showHoverCursor ? 'slider' : undefined}\n aria-label={showHoverCursor ? 'Audio progress' : undefined}\n aria-valuemin={showHoverCursor ? 0 : undefined}\n aria-valuemax={\n showHoverCursor && wavesurferRef.current\n ? wavesurferRef.current.getDuration()\n : undefined\n }\n aria-valuenow={\n showHoverCursor && wavesurferRef.current\n ? wavesurferRef.current.getCurrentTime()\n : undefined\n }\n tabIndex={showHoverCursor ? 0 : undefined}\n className={cn(\n 'relative w-full rounded-lg bg-neutral-100 dark:bg-neutral-800',\n showHoverCursor && 'cursor-pointer',\n !isLoaded && 'animate-pulse'\n )}\n style={{ height }}\n onMouseMove={handleMouseMove}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {/* Hover cursor line */}\n {showHoverCursor && isHovering && isLoaded && (\n <div\n className=\"pointer-events-none absolute top-0 bottom-0 z-10 w-0.5\"\n style={{ left: `${hoverPosition}%`, backgroundColor: cursorColor }}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Main AudioPlayer Component\n// ============================================================================\n\n/**\n * A versatile audio player component with multiple display variants.\n *\n * @example\n * ```tsx\n * // Inline - minimal, just play button and duration\n * <AudioPlayer src=\"/audio.mp3\" variant=\"inline\" showDuration />\n *\n * // Compact - play button, progress bar, and time\n * <AudioPlayer src=\"/audio.mp3\" variant=\"compact\" showTime />\n *\n * // Waveform - full visualization with WaveSurfer\n * <AudioPlayer src=\"/audio.mp3\" variant=\"waveform\" showTime />\n *\n * // With ref for programmatic control\n * const playerRef = useRef<AudioPlayerRef>(null);\n * <AudioPlayer ref={playerRef} src=\"/audio.mp3\" variant=\"waveform\" />\n * // Then: playerRef.current?.seekTo(30); playerRef.current?.play();\n * ```\n */\nconst AudioPlayer = React.forwardRef<AudioPlayerRef, AudioPlayerProps>(function AudioPlayer(\n {\n src,\n title,\n variant = 'compact',\n size = 'md',\n onStateChange,\n onEnded,\n onError,\n onTimeUpdate,\n showTime = true,\n showDuration = true,\n waveColor,\n progressColor,\n waveformHeight = 64,\n showWaveformHoverCursor = true,\n waveformCursorColor,\n disabled = false,\n className,\n 'aria-label': ariaLabel,\n playbackRates = [0.5, 0.75, 1, 1.25, 1.5, 2],\n showPlaybackRate = false,\n /** Whether to preload audio (set to false for lists with many items) */\n preload = false,\n /** Fallback duration in seconds to display before audio is loaded */\n fallbackDuration,\n },\n ref\n) {\n const [state, setState] = React.useState<AudioPlayerState>('idle');\n const [currentTime, setCurrentTime] = React.useState(0);\n const [duration, setDuration] = React.useState(0);\n const [playbackRate, setPlaybackRate] = React.useState(1);\n const [audioInitialized, setAudioInitialized] = React.useState(false);\n const [hoverTime, setHoverTime] = React.useState<number | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const audioRef = React.useRef<globalThis.HTMLAudioElement | null>(null);\n const waveformMethodsRef = React.useRef<WaveformMethods | null>(null);\n\n const isPlaying = state === 'playing';\n const isLoading = state === 'loading';\n const displayDuration = duration > 0 ? duration : (fallbackDuration ?? 0);\n\n // Update state helper\n const updateState = React.useCallback(\n (newState: AudioPlayerState) => {\n setState(newState);\n onStateChange?.(newState);\n },\n [onStateChange]\n );\n\n // Initialize audio element (for non-waveform variants)\n const initAudio = React.useCallback(() => {\n if (variant === 'waveform' || audioInitialized) return null;\n\n const audio = new globalThis.Audio(src);\n audioRef.current = audio;\n setAudioInitialized(true);\n\n audio.addEventListener('loadstart', () => updateState('loading'));\n audio.addEventListener('canplay', () => {\n updateState('idle');\n });\n audio.addEventListener('loadedmetadata', () => {\n setDuration(audio.duration);\n onTimeUpdate?.(audio.currentTime, audio.duration);\n });\n audio.addEventListener('timeupdate', () => {\n setCurrentTime(audio.currentTime);\n onTimeUpdate?.(audio.currentTime, audio.duration);\n });\n audio.addEventListener('ended', () => {\n updateState('idle');\n setCurrentTime(0);\n onEnded?.();\n });\n audio.addEventListener('error', () => {\n updateState('error');\n onError?.(new Error('Failed to load audio'));\n });\n\n return audio;\n }, [\n src,\n variant,\n audioInitialized,\n updateState,\n onTimeUpdate,\n onEnded,\n onError,\n ]);\n\n // Expose methods via ref for external control\n React.useImperativeHandle(\n ref,\n () => ({\n get container() {\n return containerRef.current;\n },\n seekTo: (time: number) => {\n if (variant === 'waveform') {\n waveformMethodsRef.current?.seekTo(time);\n } else {\n // Lazily initialize audio if not yet created\n if (!audioRef.current) {\n initAudio();\n }\n if (audioRef.current) {\n audioRef.current.currentTime = time;\n }\n }\n },\n play: () => {\n if (variant === 'waveform') {\n if (waveformMethodsRef.current) {\n waveformMethodsRef.current.play();\n updateState('playing');\n }\n } else {\n // Lazily initialize audio if not yet created\n if (!audioRef.current) {\n initAudio();\n }\n if (audioRef.current) {\n audioRef.current.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n }\n }\n },\n pause: () => {\n if (variant === 'waveform') {\n if (waveformMethodsRef.current) {\n waveformMethodsRef.current.pause();\n updateState('paused');\n }\n } else if (audioRef.current) {\n audioRef.current.pause();\n updateState('paused');\n }\n },\n getCurrentTime: () => {\n if (variant === 'waveform') {\n return waveformMethodsRef.current?.getCurrentTime() ?? 0;\n }\n return audioRef.current?.currentTime ?? 0;\n },\n getDuration: () => {\n if (variant === 'waveform') {\n return waveformMethodsRef.current?.getDuration() ?? 0;\n }\n const rawDuration = audioRef.current?.duration;\n return Number.isFinite(rawDuration) ? rawDuration! : 0;\n },\n }),\n [variant, initAudio, updateState, onError]\n );\n\n // Auto-initialize if preload is true\n React.useEffect(() => {\n if (preload && !audioInitialized && variant !== 'waveform') {\n initAudio();\n }\n }, [preload, audioInitialized, variant, initAudio]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n if (audioRef.current) {\n audioRef.current.pause();\n audioRef.current.src = '';\n }\n };\n }, []);\n\n // Handle playback rate changes\n React.useEffect(() => {\n if (audioRef.current) {\n audioRef.current.playbackRate = playbackRate;\n }\n }, [playbackRate]);\n\n const handlePlay = React.useCallback(() => {\n if (disabled) return;\n\n // Waveform variant uses WaveSurfer for playback - just toggle state\n if (variant === 'waveform') {\n if (isLoading) return;\n updateState(isPlaying ? 'paused' : 'playing');\n return;\n }\n\n // Lazy initialize audio on first play\n if (!audioInitialized && !isLoading) {\n const audio = initAudio();\n if (audio) {\n updateState('loading');\n audio.addEventListener(\n 'canplay',\n () => {\n audio.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n },\n { once: true }\n );\n }\n return;\n }\n\n if (isLoading) return;\n\n if (isPlaying) {\n if (audioRef.current) {\n audioRef.current.pause();\n }\n updateState('paused');\n } else {\n if (audioRef.current) {\n audioRef.current.play().catch((error) => {\n updateState('error');\n onError?.(error);\n });\n updateState('playing');\n }\n }\n }, [\n disabled,\n variant,\n audioInitialized,\n isLoading,\n isPlaying,\n initAudio,\n updateState,\n onError,\n ]);\n\n const handleSeek = React.useCallback(\n (time: number) => {\n if (audioRef.current) {\n audioRef.current.currentTime = time;\n setCurrentTime(time);\n onTimeUpdate?.(time, audioRef.current.duration);\n }\n },\n [onTimeUpdate]\n );\n\n // Waveform callbacks\n const handleWaveformReady = React.useCallback(\n (dur: number) => {\n setDuration(dur);\n setState('idle');\n onTimeUpdate?.(currentTime, dur);\n },\n [currentTime, onTimeUpdate]\n );\n\n const handleWaveformTimeUpdate = React.useCallback(\n (time: number, dur: number) => {\n setCurrentTime(time);\n if (dur > 0) {\n setDuration(dur);\n }\n onTimeUpdate?.(time, dur);\n },\n [onTimeUpdate]\n );\n\n const handleWaveformFinish = React.useCallback(() => {\n updateState('idle');\n setCurrentTime(0);\n onEnded?.();\n }, [updateState, onEnded]);\n\n const handleWaveformSeek = React.useCallback((time: number) => {\n setCurrentTime(time);\n }, []);\n\n const handleHoverTimeChange = React.useCallback((time: number | null) => {\n setHoverTime(time);\n }, []);\n\n const iconSize =\n size === 'sm' ? 'h-3.5 w-3.5' : size === 'lg' ? 'h-5 w-5' : 'h-4 w-4';\n\n const getAriaLabel = () => {\n if (ariaLabel) return ariaLabel;\n if (title) return `${isPlaying ? 'Pause' : 'Play'} ${title}`;\n return isPlaying ? 'Pause audio' : 'Play audio';\n };\n\n const renderPlayButton = () => (\n <button\n type=\"button\"\n data-slot=\"audio-player-play-btn\"\n onClick={handlePlay}\n disabled={disabled || isLoading}\n className={cn(playButtonVariants({ variant, size }))}\n aria-label={getAriaLabel()}\n aria-pressed={isPlaying}\n >\n {isLoading ? (\n <SpinnerIcon className={iconSize} />\n ) : isPlaying ? (\n <PauseIcon className={iconSize} />\n ) : (\n <PlayIcon className={iconSize} />\n )}\n </button>\n );\n\n const renderTime = (useHoverTime = false) => {\n if (!showTime) return null;\n const displayTime =\n useHoverTime && hoverTime !== null ? hoverTime : currentTime;\n const isShowingHoverTime = useHoverTime && hoverTime !== null;\n return (\n <span\n data-slot=\"audio-player-time\"\n className={cn(\n 'font-mono text-xs tabular-nums',\n isShowingHoverTime\n ? 'text-primary-600 dark:text-primary-400'\n : 'text-neutral-500 dark:text-neutral-400'\n )}\n >\n {formatTime(displayTime)} / {formatTime(displayDuration)}\n </span>\n );\n };\n\n const renderPlaybackRateControl = () => {\n if (!showPlaybackRate) return null;\n return (\n <select\n data-slot=\"audio-player-rate\"\n value={playbackRate}\n onChange={(e) => setPlaybackRate(Number(e.target.value))}\n className=\"rounded border border-neutral-200 bg-transparent px-1 py-0.5 text-xs dark:border-neutral-700\"\n aria-label=\"Playback speed\"\n >\n {playbackRates.map((rate) => (\n <option key={rate} value={rate}>\n {rate}x\n </option>\n ))}\n </select>\n );\n };\n\n // ============================================================================\n // Inline Variant\n // ============================================================================\n if (variant === 'inline') {\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"inline\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {renderPlayButton()}\n {title && (\n <span\n data-slot=\"audio-player-title\"\n className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {title}\n </span>\n )}\n {showDuration && displayDuration > 0 && (\n <span\n data-slot=\"audio-player-duration\"\n className=\"font-mono text-xs text-neutral-500 tabular-nums dark:text-neutral-400\"\n >\n {isPlaying ? formatTime(currentTime) : formatTime(displayDuration)}\n </span>\n )}\n </div>\n );\n }\n\n // Compact Variant\n // ============================================================================\n if (variant === 'compact') {\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"compact\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {renderPlayButton()}\n <ProgressBar\n currentTime={currentTime}\n duration={displayDuration}\n onSeek={handleSeek}\n disabled={disabled}\n />\n {renderTime()}\n {renderPlaybackRateControl()}\n </div>\n );\n }\n\n // ============================================================================\n // Waveform Variant\n // ============================================================================\n return (\n <div\n ref={containerRef}\n data-slot=\"audio-player\"\n data-variant=\"waveform\"\n className={cn(audioPlayerVariants({ variant, size }), className)}\n >\n {title && (\n <span\n data-slot=\"audio-player-title\"\n className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {title}\n </span>\n )}\n <Waveform\n src={src}\n isPlaying={isPlaying}\n playbackRate={playbackRate}\n onReady={handleWaveformReady}\n onTimeUpdate={handleWaveformTimeUpdate}\n onFinish={handleWaveformFinish}\n onSeek={handleWaveformSeek}\n waveColor={waveColor}\n progressColor={progressColor}\n height={waveformHeight}\n showHoverCursor={showWaveformHoverCursor}\n onHoverTimeChange={handleHoverTimeChange}\n cursorColor={waveformCursorColor}\n waveformRef={waveformMethodsRef}\n />\n <div\n data-slot=\"audio-player-controls\"\n className=\"flex items-center gap-3\"\n >\n {renderPlayButton()}\n <div className=\"flex flex-1 items-center justify-between\">\n {renderTime(true)}\n {renderPlaybackRateControl()}\n </div>\n </div>\n </div>\n );\n});\n\nAudioPlayer.displayName = 'AudioPlayer';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { AudioPlayer, audioPlayerVariants, playButtonVariants, ProgressBar };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/SchedulePicker/SchedulePicker.tsx"],"names":["cva","React","jsxs","cn","jsx"],"mappings":"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","file":"chunk-JE4AH2TZ.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Date Button Component\n// ============================================================================\n\nconst dateButtonVariants = cva(\n [\n 'flex-shrink-0 rounded-xl border px-3 py-2 text-center transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2',\n 'dark:focus:ring-offset-neutral-900',\n ],\n {\n variants: {\n selected: {\n true: 'border-primary-500 bg-primary-50 dark:bg-primary-900/20',\n false:\n 'border-neutral-200 hover:border-neutral-300 dark:border-neutral-700 dark:hover:border-neutral-600',\n },\n },\n defaultVariants: {\n selected: false,\n },\n }\n);\n\nexport interface DateButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof dateButtonVariants> {\n /** The date to display */\n date: Date;\n}\n\n/**\n * A button for selecting a date in the schedule picker.\n */\nconst DateButton = React.forwardRef<HTMLButtonElement, DateButtonProps>(\n ({ className, date, selected, ...props }, ref) => {\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"schedule-date-btn\"\n className={cn(dateButtonVariants({ selected }), className)}\n {...props}\n >\n <div\n data-slot=\"schedule-date-weekday\"\n className=\"text-xs text-neutral-500 dark:text-neutral-400\"\n >\n {date.toLocaleDateString('en-US', { weekday: 'short' })}\n </div>\n <div\n data-slot=\"schedule-date-day\"\n className=\"text-lg font-semibold text-neutral-900 dark:text-white\"\n >\n {date.getDate()}\n </div>\n <div\n data-slot=\"schedule-date-month\"\n className=\"text-xs text-neutral-500 dark:text-neutral-400\"\n >\n {date.toLocaleDateString('en-US', { month: 'short' })}\n </div>\n </button>\n );\n }\n);\n\nDateButton.displayName = 'DateButton';\n\n// ============================================================================\n// Time Button Component\n// ============================================================================\n\nconst timeButtonVariants = cva(\n [\n 'rounded-xl border px-2 py-2 text-sm transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2',\n 'dark:focus:ring-offset-neutral-900',\n ],\n {\n variants: {\n selected: {\n true: 'border-primary-500 bg-primary-50 dark:bg-primary-900/20',\n false:\n 'border-neutral-200 hover:border-neutral-300 dark:border-neutral-700 dark:hover:border-neutral-600',\n },\n },\n defaultVariants: {\n selected: false,\n },\n }\n);\n\nexport interface TimeButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof timeButtonVariants> {\n /** The time string to display (e.g., \"8:00 AM\") */\n time: string;\n}\n\n/**\n * A button for selecting a time in the schedule picker.\n */\nconst TimeButton = React.forwardRef<HTMLButtonElement, TimeButtonProps>(\n ({ className, time, selected, ...props }, ref) => {\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"schedule-time-btn\"\n className={cn(timeButtonVariants({ selected }), className)}\n {...props}\n >\n {time}\n </button>\n );\n }\n);\n\nTimeButton.displayName = 'TimeButton';\n\n// ============================================================================\n// Radio Option Component\n// ============================================================================\n\nconst radioOptionVariants = cva(\n [\n 'cursor-pointer rounded-xl border bg-card p-4 transition-all',\n 'focus-within:outline-none focus-within:ring-2 focus-within:ring-primary-500',\n ],\n {\n variants: {\n selected: {\n true: 'border-2 border-primary-500 ring-2 ring-primary-200 dark:ring-primary-800',\n false: 'border-border',\n },\n },\n defaultVariants: {\n selected: false,\n },\n }\n);\n\nexport interface RadioOptionProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>,\n VariantProps<typeof radioOptionVariants> {\n /** Title text for the option */\n title: React.ReactNode;\n /** Description text for the option */\n description?: React.ReactNode;\n /** Whether this option is selected */\n selected?: boolean;\n}\n\n/**\n * A radio-style option card component.\n */\nconst RadioOption = React.forwardRef<HTMLDivElement, RadioOptionProps>(\n (\n { className, title, description, selected, children, onClick, ...props },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"schedule-radio\"\n className={cn(radioOptionVariants({ selected }), className)}\n onClick={onClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n }}\n {...props}\n >\n <div className=\"flex items-center gap-3\">\n <div\n data-slot=\"schedule-radio-indicator\"\n className={cn(\n 'flex h-5 w-5 items-center justify-center rounded-full border-2',\n selected\n ? 'border-primary-500 bg-primary-500'\n : 'border-neutral-300'\n )}\n >\n {selected && (\n <div\n data-slot=\"schedule-radio-dot\"\n className=\"h-2 w-2 rounded-full bg-white\"\n />\n )}\n </div>\n <div>\n <div\n data-slot=\"schedule-radio-title\"\n className=\"font-medium text-neutral-900 dark:text-white\"\n >\n {title}\n </div>\n {description && (\n <div\n data-slot=\"schedule-radio-desc\"\n className=\"text-sm text-neutral-500 dark:text-neutral-400\"\n >\n {description}\n </div>\n )}\n </div>\n </div>\n {children}\n </div>\n );\n }\n);\n\nRadioOption.displayName = 'RadioOption';\n\n// ============================================================================\n// Date Picker Component\n// ============================================================================\n\nexport interface DatePickerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Array of available dates to display */\n dates: Date[];\n /** Currently selected date */\n selectedDate?: Date | null;\n /** Callback when a date is selected */\n onDateSelect?: (date: Date) => void;\n /** Label text above the date picker */\n label?: string;\n}\n\n/**\n * A horizontal scrollable date picker component.\n */\nconst DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n className,\n dates,\n selectedDate,\n onDateSelect,\n label = 'Select Date',\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"schedule-date-picker\"\n className={className}\n {...props}\n >\n <label\n data-slot=\"schedule-date-label\"\n className=\"mb-2 block text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {label}\n </label>\n {/* Negative margin + padding allows focus ring to render without clipping */}\n <div\n data-slot=\"schedule-date-list\"\n className=\"-m-1 flex gap-2 overflow-x-auto p-1\"\n >\n {dates.map((date, index) => (\n <DateButton\n key={index}\n date={date}\n selected={selectedDate?.toDateString() === date.toDateString()}\n onClick={(e) => {\n e.stopPropagation();\n onDateSelect?.(date);\n }}\n />\n ))}\n </div>\n </div>\n );\n }\n);\n\nDatePicker.displayName = 'DatePicker';\n\n// ============================================================================\n// Time Picker Component\n// ============================================================================\n\nexport interface TimePickerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Array of available time strings (e.g., [\"8:00 AM\", \"8:30 AM\"]) */\n times: string[];\n /** Currently selected time string */\n selectedTime?: string | null;\n /** Callback when a time is selected */\n onTimeSelect?: (time: string) => void;\n /** Label text above the time picker */\n label?: string;\n /** Number of columns for the time grid */\n columns?: 4 | 6;\n}\n\n/**\n * A grid-based time picker component.\n */\nconst TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>(\n (\n {\n className,\n times,\n selectedTime,\n onTimeSelect,\n label = 'Select Time',\n columns = 6,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"schedule-time-picker\"\n className={className}\n {...props}\n >\n <label\n data-slot=\"schedule-time-label\"\n className=\"mb-2 block text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {label}\n </label>\n {/* Negative margin + padding allows focus ring to render without clipping */}\n <div\n data-slot=\"schedule-time-grid\"\n className={cn(\n '-m-1 grid gap-2 p-1',\n columns === 4 ? 'grid-cols-4' : 'grid-cols-4 sm:grid-cols-6'\n )}\n >\n {times.map((time) => (\n <TimeButton\n key={time}\n time={time}\n selected={selectedTime === time}\n onClick={(e) => {\n e.stopPropagation();\n onTimeSelect?.(time);\n }}\n />\n ))}\n </div>\n </div>\n );\n }\n);\n\nTimePicker.displayName = 'TimePicker';\n\n// ============================================================================\n// Schedule Picker Component (Composite)\n// ============================================================================\n\nexport interface SchedulePickerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Array of available dates to display */\n dates: Date[];\n /** Array of available time strings */\n times: string[];\n /** Currently selected date */\n selectedDate?: Date | null;\n /** Currently selected time */\n selectedTime?: string | null;\n /** Callback when a date is selected */\n onDateSelect?: (date: Date) => void;\n /** Callback when a time is selected */\n onTimeSelect?: (time: string) => void;\n /** Label for the date picker */\n dateLabel?: string;\n /** Label for the time picker */\n timeLabel?: string;\n /** Number of columns for time grid */\n timeColumns?: 4 | 6;\n /** Whether to show time picker (hidden until date is selected) */\n showTimePicker?: boolean;\n}\n\n/**\n * A complete schedule picker with date and time selection.\n *\n * @example\n * ```tsx\n * <SchedulePicker\n * dates={availableDates}\n * times={availableTimes}\n * selectedDate={selectedDate}\n * selectedTime={selectedTime}\n * onDateSelect={setSelectedDate}\n * onTimeSelect={setSelectedTime}\n * />\n * ```\n */\nconst SchedulePicker = React.forwardRef<HTMLDivElement, SchedulePickerProps>(\n (\n {\n className,\n dates,\n times,\n selectedDate,\n selectedTime,\n onDateSelect,\n onTimeSelect,\n dateLabel = 'Select Date',\n timeLabel = 'Select Time',\n timeColumns = 6,\n showTimePicker = true,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"schedule-picker\"\n className={cn('space-y-4', className)}\n {...props}\n >\n <DatePicker\n dates={dates}\n selectedDate={selectedDate}\n onDateSelect={onDateSelect}\n label={dateLabel}\n />\n {showTimePicker && selectedDate && (\n <TimePicker\n times={times}\n selectedTime={selectedTime}\n onTimeSelect={onTimeSelect}\n label={timeLabel}\n columns={timeColumns}\n />\n )}\n </div>\n );\n }\n);\n\nSchedulePicker.displayName = 'SchedulePicker';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n DateButton,\n TimeButton,\n RadioOption,\n DatePicker,\n TimePicker,\n SchedulePicker,\n dateButtonVariants,\n timeButtonVariants,\n radioOptionVariants,\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/SchedulePicker/SchedulePicker.tsx"],"names":[],"mappings":"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","file":"chunk-MOULJE34.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Date Button Component\n// ============================================================================\n\nconst dateButtonVariants = cva(\n [\n 'flex-shrink-0 rounded-xl border px-3 py-2 text-center transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2',\n 'dark:focus:ring-offset-neutral-900',\n ],\n {\n variants: {\n selected: {\n true: 'border-primary-500 bg-primary-50 dark:bg-primary-900/20',\n false:\n 'border-neutral-200 hover:border-neutral-300 dark:border-neutral-700 dark:hover:border-neutral-600',\n },\n },\n defaultVariants: {\n selected: false,\n },\n }\n);\n\nexport interface DateButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof dateButtonVariants> {\n /** The date to display */\n date: Date;\n}\n\n/**\n * A button for selecting a date in the schedule picker.\n */\nconst DateButton = React.forwardRef<HTMLButtonElement, DateButtonProps>(\n ({ className, date, selected, ...props }, ref) => {\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"schedule-date-btn\"\n className={cn(dateButtonVariants({ selected }), className)}\n {...props}\n >\n <div\n data-slot=\"schedule-date-weekday\"\n className=\"text-xs text-neutral-500 dark:text-neutral-400\"\n >\n {date.toLocaleDateString('en-US', { weekday: 'short' })}\n </div>\n <div\n data-slot=\"schedule-date-day\"\n className=\"text-lg font-semibold text-neutral-900 dark:text-white\"\n >\n {date.getDate()}\n </div>\n <div\n data-slot=\"schedule-date-month\"\n className=\"text-xs text-neutral-500 dark:text-neutral-400\"\n >\n {date.toLocaleDateString('en-US', { month: 'short' })}\n </div>\n </button>\n );\n }\n);\n\nDateButton.displayName = 'DateButton';\n\n// ============================================================================\n// Time Button Component\n// ============================================================================\n\nconst timeButtonVariants = cva(\n [\n 'rounded-xl border px-2 py-2 text-sm transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2',\n 'dark:focus:ring-offset-neutral-900',\n ],\n {\n variants: {\n selected: {\n true: 'border-primary-500 bg-primary-50 dark:bg-primary-900/20',\n false:\n 'border-neutral-200 hover:border-neutral-300 dark:border-neutral-700 dark:hover:border-neutral-600',\n },\n },\n defaultVariants: {\n selected: false,\n },\n }\n);\n\nexport interface TimeButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof timeButtonVariants> {\n /** The time string to display (e.g., \"8:00 AM\") */\n time: string;\n}\n\n/**\n * A button for selecting a time in the schedule picker.\n */\nconst TimeButton = React.forwardRef<HTMLButtonElement, TimeButtonProps>(\n ({ className, time, selected, ...props }, ref) => {\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"schedule-time-btn\"\n className={cn(timeButtonVariants({ selected }), className)}\n {...props}\n >\n {time}\n </button>\n );\n }\n);\n\nTimeButton.displayName = 'TimeButton';\n\n// ============================================================================\n// Radio Option Component\n// ============================================================================\n\nconst radioOptionVariants = cva(\n [\n 'cursor-pointer rounded-xl border bg-card p-4 transition-all',\n 'focus-within:outline-none focus-within:ring-2 focus-within:ring-primary-500',\n ],\n {\n variants: {\n selected: {\n true: 'border-2 border-primary-500 ring-2 ring-primary-200 dark:ring-primary-800',\n false: 'border-border',\n },\n },\n defaultVariants: {\n selected: false,\n },\n }\n);\n\nexport interface RadioOptionProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>,\n VariantProps<typeof radioOptionVariants> {\n /** Title text for the option */\n title: React.ReactNode;\n /** Description text for the option */\n description?: React.ReactNode;\n /** Whether this option is selected */\n selected?: boolean;\n}\n\n/**\n * A radio-style option card component.\n */\nconst RadioOption = React.forwardRef<HTMLDivElement, RadioOptionProps>(\n (\n { className, title, description, selected, children, onClick, ...props },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"schedule-radio\"\n className={cn(radioOptionVariants({ selected }), className)}\n onClick={onClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n }}\n {...props}\n >\n <div className=\"flex items-center gap-3\">\n <div\n data-slot=\"schedule-radio-indicator\"\n className={cn(\n 'flex h-5 w-5 items-center justify-center rounded-full border-2',\n selected\n ? 'border-primary-500 bg-primary-500'\n : 'border-neutral-300'\n )}\n >\n {selected && (\n <div\n data-slot=\"schedule-radio-dot\"\n className=\"h-2 w-2 rounded-full bg-white\"\n />\n )}\n </div>\n <div>\n <div\n data-slot=\"schedule-radio-title\"\n className=\"font-medium text-neutral-900 dark:text-white\"\n >\n {title}\n </div>\n {description && (\n <div\n data-slot=\"schedule-radio-desc\"\n className=\"text-sm text-neutral-500 dark:text-neutral-400\"\n >\n {description}\n </div>\n )}\n </div>\n </div>\n {children}\n </div>\n );\n }\n);\n\nRadioOption.displayName = 'RadioOption';\n\n// ============================================================================\n// Date Picker Component\n// ============================================================================\n\nexport interface DatePickerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Array of available dates to display */\n dates: Date[];\n /** Currently selected date */\n selectedDate?: Date | null;\n /** Callback when a date is selected */\n onDateSelect?: (date: Date) => void;\n /** Label text above the date picker */\n label?: string;\n}\n\n/**\n * A horizontal scrollable date picker component.\n */\nconst DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n className,\n dates,\n selectedDate,\n onDateSelect,\n label = 'Select Date',\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"schedule-date-picker\"\n className={className}\n {...props}\n >\n <label\n data-slot=\"schedule-date-label\"\n className=\"mb-2 block text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {label}\n </label>\n {/* Negative margin + padding allows focus ring to render without clipping */}\n <div\n data-slot=\"schedule-date-list\"\n className=\"-m-1 flex gap-2 overflow-x-auto p-1\"\n >\n {dates.map((date, index) => (\n <DateButton\n key={index}\n date={date}\n selected={selectedDate?.toDateString() === date.toDateString()}\n onClick={(e) => {\n e.stopPropagation();\n onDateSelect?.(date);\n }}\n />\n ))}\n </div>\n </div>\n );\n }\n);\n\nDatePicker.displayName = 'DatePicker';\n\n// ============================================================================\n// Time Picker Component\n// ============================================================================\n\nexport interface TimePickerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Array of available time strings (e.g., [\"8:00 AM\", \"8:30 AM\"]) */\n times: string[];\n /** Currently selected time string */\n selectedTime?: string | null;\n /** Callback when a time is selected */\n onTimeSelect?: (time: string) => void;\n /** Label text above the time picker */\n label?: string;\n /** Number of columns for the time grid */\n columns?: 4 | 6;\n}\n\n/**\n * A grid-based time picker component.\n */\nconst TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>(\n (\n {\n className,\n times,\n selectedTime,\n onTimeSelect,\n label = 'Select Time',\n columns = 6,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"schedule-time-picker\"\n className={className}\n {...props}\n >\n <label\n data-slot=\"schedule-time-label\"\n className=\"mb-2 block text-sm font-medium text-neutral-700 dark:text-neutral-300\"\n >\n {label}\n </label>\n {/* Negative margin + padding allows focus ring to render without clipping */}\n <div\n data-slot=\"schedule-time-grid\"\n className={cn(\n '-m-1 grid gap-2 p-1',\n columns === 4 ? 'grid-cols-4' : 'grid-cols-4 sm:grid-cols-6'\n )}\n >\n {times.map((time) => (\n <TimeButton\n key={time}\n time={time}\n selected={selectedTime === time}\n onClick={(e) => {\n e.stopPropagation();\n onTimeSelect?.(time);\n }}\n />\n ))}\n </div>\n </div>\n );\n }\n);\n\nTimePicker.displayName = 'TimePicker';\n\n// ============================================================================\n// Schedule Picker Component (Composite)\n// ============================================================================\n\nexport interface SchedulePickerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Array of available dates to display */\n dates: Date[];\n /** Array of available time strings */\n times: string[];\n /** Currently selected date */\n selectedDate?: Date | null;\n /** Currently selected time */\n selectedTime?: string | null;\n /** Callback when a date is selected */\n onDateSelect?: (date: Date) => void;\n /** Callback when a time is selected */\n onTimeSelect?: (time: string) => void;\n /** Label for the date picker */\n dateLabel?: string;\n /** Label for the time picker */\n timeLabel?: string;\n /** Number of columns for time grid */\n timeColumns?: 4 | 6;\n /** Whether to show time picker (hidden until date is selected) */\n showTimePicker?: boolean;\n}\n\n/**\n * A complete schedule picker with date and time selection.\n *\n * @example\n * ```tsx\n * <SchedulePicker\n * dates={availableDates}\n * times={availableTimes}\n * selectedDate={selectedDate}\n * selectedTime={selectedTime}\n * onDateSelect={setSelectedDate}\n * onTimeSelect={setSelectedTime}\n * />\n * ```\n */\nconst SchedulePicker = React.forwardRef<HTMLDivElement, SchedulePickerProps>(\n (\n {\n className,\n dates,\n times,\n selectedDate,\n selectedTime,\n onDateSelect,\n onTimeSelect,\n dateLabel = 'Select Date',\n timeLabel = 'Select Time',\n timeColumns = 6,\n showTimePicker = true,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"schedule-picker\"\n className={cn('space-y-4', className)}\n {...props}\n >\n <DatePicker\n dates={dates}\n selectedDate={selectedDate}\n onDateSelect={onDateSelect}\n label={dateLabel}\n />\n {showTimePicker && selectedDate && (\n <TimePicker\n times={times}\n selectedTime={selectedTime}\n onTimeSelect={onTimeSelect}\n label={timeLabel}\n columns={timeColumns}\n />\n )}\n </div>\n );\n }\n);\n\nSchedulePicker.displayName = 'SchedulePicker';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n DateButton,\n TimeButton,\n RadioOption,\n DatePicker,\n TimePicker,\n SchedulePicker,\n dateButtonVariants,\n timeButtonVariants,\n radioOptionVariants,\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Tabs/Tabs.tsx"],"names":["React","jsx","cn","cva","jsxs"],"mappings":"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","file":"chunk-PLIK3DN6.cjs","sourcesContent":["import * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Tabs Context\n// ============================================================================\n\ninterface TabsContextValue {\n value: string;\n onValueChange: (value: string) => void;\n variant: 'underline' | 'pills' | 'enclosed';\n}\n\nconst TabsContext = React.createContext<TabsContextValue | undefined>(\n undefined\n);\n\nfunction useTabsContext() {\n const context = React.useContext(TabsContext);\n if (!context) {\n throw new Error('Tabs components must be used within a Tabs provider');\n }\n return context;\n}\n\n// ============================================================================\n// Tabs Root\n// ============================================================================\n\nexport interface TabsProps {\n /** The controlled value of the selected tab */\n value?: string;\n /** The default value of the selected tab (uncontrolled) */\n defaultValue?: string;\n /** Callback when the selected tab changes */\n onValueChange?: (value: string) => void;\n /** Visual variant of the tabs */\n variant?: 'underline' | 'pills' | 'enclosed';\n /** Tab content */\n children: React.ReactNode;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Accessible tabs component with keyboard navigation.\n *\n * @example\n * ```tsx\n * <Tabs defaultValue=\"tab1\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Tab 1</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Tab 2</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">Content 1</TabsContent>\n * <TabsContent value=\"tab2\">Content 2</TabsContent>\n * </Tabs>\n * ```\n */\nfunction Tabs({\n value: controlledValue,\n defaultValue,\n onValueChange,\n variant = 'underline',\n children,\n className,\n}: TabsProps) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(\n defaultValue || ''\n );\n\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onValueChange?.(newValue);\n },\n [isControlled, onValueChange]\n );\n\n return (\n <TabsContext.Provider\n value={{ value, onValueChange: handleValueChange, variant }}\n >\n <div data-slot=\"tabs\" className={cn('w-full', className)}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\nTabs.displayName = 'Tabs';\n\n// ============================================================================\n// Tabs List\n// ============================================================================\n\nconst tabsListVariants = cva(['flex items-center'], {\n variants: {\n variant: {\n underline: 'border-b border-border gap-0',\n pills: 'gap-1 p-1 rounded-lg bg-muted',\n enclosed: 'gap-0 border-b border-border',\n },\n },\n defaultVariants: {\n variant: 'underline',\n },\n});\n\nexport type TabsListProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Container for tab triggers.\n */\nconst TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, ...props }, ref) => {\n const { variant } = useTabsContext();\n const listRef = React.useRef<HTMLDivElement>(null);\n\n // Keyboard navigation\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const list = listRef.current;\n if (!list) return;\n\n const triggers = Array.from(\n list.querySelectorAll<HTMLButtonElement>(\n '[role=\"tab\"]:not([disabled])'\n )\n );\n const currentIndex = triggers.findIndex(\n (trigger) => trigger === document.activeElement\n );\n\n let nextIndex: number;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n e.preventDefault();\n nextIndex =\n currentIndex === triggers.length - 1 ? 0 : currentIndex + 1;\n triggers[nextIndex]?.focus();\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n e.preventDefault();\n nextIndex =\n currentIndex === 0 ? triggers.length - 1 : currentIndex - 1;\n triggers[nextIndex]?.focus();\n break;\n case 'Home':\n e.preventDefault();\n triggers[0]?.focus();\n break;\n case 'End':\n e.preventDefault();\n triggers[triggers.length - 1]?.focus();\n break;\n }\n },\n []\n );\n\n return (\n <div\n ref={(node) => {\n // Combine refs\n (listRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n role=\"tablist\"\n data-slot=\"tabs-list\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n );\n }\n);\n\nTabsList.displayName = 'TabsList';\n\n// ============================================================================\n// Tabs Trigger\n// ============================================================================\n\nconst tabsTriggerVariants = cva(\n [\n 'inline-flex items-center justify-center gap-2',\n 'font-medium transition-all duration-200',\n 'whitespace-nowrap',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n ],\n {\n variants: {\n variant: {\n underline: [\n 'px-4 py-2 -mb-px',\n 'border-b-2 border-transparent',\n 'text-muted-foreground hover:text-foreground',\n 'data-[state=active]:border-primary-700 data-[state=active]:text-primary-800',\n ],\n pills: [\n 'px-3 py-1.5 rounded-md text-sm',\n 'text-muted-foreground hover:text-foreground',\n 'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm',\n ],\n enclosed: [\n 'px-4 py-2 -mb-px',\n 'border border-transparent rounded-t-lg',\n 'text-muted-foreground hover:text-foreground',\n 'data-[state=active]:border-border data-[state=active]:border-b-background data-[state=active]:bg-background data-[state=active]:text-foreground',\n ],\n },\n },\n defaultVariants: {\n variant: 'underline',\n },\n }\n);\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** The value that identifies this tab */\n value: string;\n /** Icon to show before the label */\n icon?: React.ReactNode;\n}\n\n/**\n * A tab trigger button.\n */\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ className, value, icon, children, disabled, ...props }, ref) => {\n const { value: selectedValue, onValueChange, variant } = useTabsContext();\n const isSelected = selectedValue === value;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n data-slot=\"tabs-trigger\"\n aria-selected={isSelected}\n aria-controls={`tabpanel-${value}`}\n id={`tab-${value}`}\n tabIndex={isSelected ? 0 : -1}\n data-state={isSelected ? 'active' : 'inactive'}\n disabled={disabled}\n onClick={() => onValueChange(value)}\n className={cn(tabsTriggerVariants({ variant }), className)}\n {...props}\n >\n {icon && (\n <span data-slot=\"tabs-trigger-icon\" className=\"shrink-0\">\n {icon}\n </span>\n )}\n {children}\n </button>\n );\n }\n);\n\nTabsTrigger.displayName = 'TabsTrigger';\n\n// ============================================================================\n// Tabs Content\n// ============================================================================\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The value that identifies this content panel */\n value: string;\n /** Force mount the content (useful for animations) */\n forceMount?: boolean;\n}\n\n/**\n * Content panel for a tab.\n */\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, value, forceMount = false, children, ...props }, ref) => {\n const { value: selectedValue } = useTabsContext();\n const isSelected = selectedValue === value;\n\n if (!isSelected && !forceMount) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n data-slot=\"tabs-content\"\n id={`tabpanel-${value}`}\n aria-labelledby={`tab-${value}`}\n tabIndex={0}\n hidden={!isSelected}\n data-state={isSelected ? 'active' : 'inactive'}\n className={cn(\n 'focus-visible:ring-ring mt-4 rounded-lg focus-visible:ring-2 focus-visible:outline-none',\n !isSelected && 'hidden',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nTabsContent.displayName = 'TabsContent';\n\nexport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n tabsListVariants,\n tabsTriggerVariants,\n};\n"]}