@alfadocs/ui-kit-debug 0.30.5 → 0.31.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{accordion-CNcodXuO.js → accordion-bSU21uTV.js} +3 -3
- package/dist/_chunks/{accordion-CNcodXuO.js.map → accordion-bSU21uTV.js.map} +1 -1
- package/dist/_chunks/{agenda-card-DO9_yogb.js → agenda-card-UJA6Arbs.js} +3 -3
- package/dist/_chunks/{agenda-card-DO9_yogb.js.map → agenda-card-UJA6Arbs.js.map} +1 -1
- package/dist/_chunks/{agenda-tray-WLbfMip6.js → agenda-tray-1fAxNOMz.js} +4 -4
- package/dist/_chunks/{agenda-tray-WLbfMip6.js.map → agenda-tray-1fAxNOMz.js.map} +1 -1
- package/dist/_chunks/{ai-prompt-input-BXlwNnWe.js → ai-prompt-input-C6sCr1Vi.js} +11 -10
- package/dist/_chunks/ai-prompt-input-C6sCr1Vi.js.map +1 -0
- package/dist/_chunks/{alia-sidebar-C-232sD7.js → alia-sidebar-BEoMl6UL.js} +9 -9
- package/dist/_chunks/{alia-sidebar-C-232sD7.js.map → alia-sidebar-BEoMl6UL.js.map} +1 -1
- package/dist/_chunks/ar-CEpIJtcO.js +399 -0
- package/dist/_chunks/ar-CEpIJtcO.js.map +1 -0
- package/dist/_chunks/{audio-recorder-DL800PE_.js → audio-recorder-C1rhKhSN.js} +114 -114
- package/dist/_chunks/audio-recorder-C1rhKhSN.js.map +1 -0
- package/dist/_chunks/audio-visualiser-l6zPd0AG.js +162 -0
- package/dist/_chunks/audio-visualiser-l6zPd0AG.js.map +1 -0
- package/dist/_chunks/{autocomplete-CUh0f7Dj.js → autocomplete-DIgdhCGJ.js} +2 -2
- package/dist/_chunks/{autocomplete-CUh0f7Dj.js.map → autocomplete-DIgdhCGJ.js.map} +1 -1
- package/dist/_chunks/{avatar-D_H4emLo.js → avatar-BNQNhoyL.js} +19 -18
- package/dist/_chunks/avatar-BNQNhoyL.js.map +1 -0
- package/dist/_chunks/{badge-CIjQ1Us1.js → badge-CptERaHx.js} +2 -2
- package/dist/_chunks/{badge-CIjQ1Us1.js.map → badge-CptERaHx.js.map} +1 -1
- package/dist/_chunks/{booking-Cw92aqo3.js → booking-BIZ9GSer.js} +149 -160
- package/dist/_chunks/booking-BIZ9GSer.js.map +1 -0
- package/dist/_chunks/{breadcrumb--YI7lcHA.js → breadcrumb-CLlhx7qo.js} +2 -2
- package/dist/_chunks/{breadcrumb--YI7lcHA.js.map → breadcrumb-CLlhx7qo.js.map} +1 -1
- package/dist/_chunks/{button-group-Bh2g_Ng-.js → button-group-Ciq6J4IW.js} +15 -14
- package/dist/_chunks/button-group-Ciq6J4IW.js.map +1 -0
- package/dist/_chunks/{calendar-WWNx448i.js → calendar-YHFknAGv.js} +22 -22
- package/dist/_chunks/{calendar-WWNx448i.js.map → calendar-YHFknAGv.js.map} +1 -1
- package/dist/_chunks/calendar-clock-CYkcqdwl.js +19 -0
- package/dist/_chunks/calendar-clock-CYkcqdwl.js.map +1 -0
- package/dist/_chunks/{carousel.agent-C2Icc9_T.js → carousel.agent-DrX96W-1.js} +2 -2
- package/dist/_chunks/{carousel.agent-C2Icc9_T.js.map → carousel.agent-DrX96W-1.js.map} +1 -1
- package/dist/_chunks/{chart-BLvFl169.js → chart-DLkVn_ex.js} +2 -2
- package/dist/_chunks/{chart-BLvFl169.js.map → chart-DLkVn_ex.js.map} +1 -1
- package/dist/_chunks/{chat-container-izziXViv.js → chat-container-ogB4OskO.js} +24 -23
- package/dist/_chunks/chat-container-ogB4OskO.js.map +1 -0
- package/dist/_chunks/{chat-input-cyl_y9bh.js → chat-input-CQe7nR_v.js} +132 -118
- package/dist/_chunks/chat-input-CQe7nR_v.js.map +1 -0
- package/dist/_chunks/{chat-message-fg221-yx.js → chat-message-D53_fH2w.js} +2 -2
- package/dist/_chunks/{chat-message-fg221-yx.js.map → chat-message-D53_fH2w.js.map} +1 -1
- package/dist/_chunks/{checkbox-Dgp_cfUr.js → checkbox-DRcOdmXv.js} +3 -3
- package/dist/_chunks/{checkbox-Dgp_cfUr.js.map → checkbox-DRcOdmXv.js.map} +1 -1
- package/dist/_chunks/{checkbox-group-eVowqKcT.js → checkbox-group-CpUwlHug.js} +3 -3
- package/dist/_chunks/{checkbox-group-eVowqKcT.js.map → checkbox-group-CpUwlHug.js.map} +1 -1
- package/dist/_chunks/{collapsible-hHiyZp0b.js → collapsible-CERONory.js} +2 -2
- package/dist/_chunks/{collapsible-hHiyZp0b.js.map → collapsible-CERONory.js.map} +1 -1
- package/dist/_chunks/{color-picker-Bm-gzpsh.js → color-picker-9tL7pz5y.js} +192 -181
- package/dist/_chunks/color-picker-9tL7pz5y.js.map +1 -0
- package/dist/_chunks/{combobox-Da9eq00i.js → combobox-BC-DFx8G.js} +31 -30
- package/dist/_chunks/combobox-BC-DFx8G.js.map +1 -0
- package/dist/_chunks/{command-palette-11BieSNq.js → command-palette-BiPAAno-.js} +125 -123
- package/dist/_chunks/command-palette-BiPAAno-.js.map +1 -0
- package/dist/_chunks/{copy-field-BAF4mt9h.js → copy-field-CCq7j6Zc.js} +2 -2
- package/dist/_chunks/{copy-field-BAF4mt9h.js.map → copy-field-CCq7j6Zc.js.map} +1 -1
- package/dist/_chunks/{date-picker-D0Ry1dMz.js → date-picker-B94HAV4A.js} +4 -4
- package/dist/_chunks/{date-picker-D0Ry1dMz.js.map → date-picker-B94HAV4A.js.map} +1 -1
- package/dist/_chunks/{date-range-picker-DYgHzMOo.js → date-range-picker-D4dgDlLU.js} +73 -73
- package/dist/_chunks/date-range-picker-D4dgDlLU.js.map +1 -0
- package/dist/_chunks/{date-time-picker-CGmGtcyc.js → date-time-picker-D1GEzf8p.js} +5 -5
- package/dist/_chunks/{date-time-picker-CGmGtcyc.js.map → date-time-picker-D1GEzf8p.js.map} +1 -1
- package/dist/_chunks/de-Dfbeau59.js +477 -0
- package/dist/_chunks/de-Dfbeau59.js.map +1 -0
- package/dist/_chunks/{description-list-CWjnaDGn.js → description-list-BEbK2g93.js} +2 -2
- package/dist/_chunks/{description-list-CWjnaDGn.js.map → description-list-BEbK2g93.js.map} +1 -1
- package/dist/_chunks/{dialog-C-lTGVkB.js → dialog-Cee13rHU.js} +3 -3
- package/dist/_chunks/{dialog-C-lTGVkB.js.map → dialog-Cee13rHU.js.map} +1 -1
- package/dist/_chunks/{dropdown-menu-DZxwF23X.js → dropdown-menu-BC5ZdOMo.js} +3 -3
- package/dist/_chunks/{dropdown-menu-DZxwF23X.js.map → dropdown-menu-BC5ZdOMo.js.map} +1 -1
- package/dist/_chunks/{editable-currency-cell-renderer-CztRy_21.js → editable-currency-cell-renderer-BpicmolK.js} +308 -322
- package/dist/_chunks/editable-currency-cell-renderer-BpicmolK.js.map +1 -0
- package/dist/_chunks/el-Dro3J7CP.js +373 -0
- package/dist/_chunks/el-Dro3J7CP.js.map +1 -0
- package/dist/_chunks/{email-input-DvJ_kPKL.js → email-input-lQivsFrw.js} +3 -3
- package/dist/_chunks/{email-input-DvJ_kPKL.js.map → email-input-lQivsFrw.js.map} +1 -1
- package/dist/_chunks/es-Dvg8u70B.js +373 -0
- package/dist/_chunks/es-Dvg8u70B.js.map +1 -0
- package/dist/_chunks/{file-upload-DxAQprcU.js → file-upload-CdozCPct.js} +226 -233
- package/dist/_chunks/file-upload-CdozCPct.js.map +1 -0
- package/dist/_chunks/fr-VOGjBSPP.js +338 -0
- package/dist/_chunks/fr-VOGjBSPP.js.map +1 -0
- package/dist/_chunks/{freemium-paywall-B9c8Ylww.js → freemium-paywall-D1N02Oam.js} +4 -4
- package/dist/_chunks/{freemium-paywall-B9c8Ylww.js.map → freemium-paywall-D1N02Oam.js.map} +1 -1
- package/dist/_chunks/{header-DDj7uGD-.js → header-CTZWX-tm.js} +2 -2
- package/dist/_chunks/{header-DDj7uGD-.js.map → header-CTZWX-tm.js.map} +1 -1
- package/dist/_chunks/hi-BSDxWU_y.js +433 -0
- package/dist/_chunks/hi-BSDxWU_y.js.map +1 -0
- package/dist/_chunks/{icon-button-DPEqBKBQ.js → icon-button-CKEOrN37.js} +2 -2
- package/dist/_chunks/{icon-button-DPEqBKBQ.js.map → icon-button-CKEOrN37.js.map} +1 -1
- package/dist/_chunks/{icon-button-group-DeV3FpNY.js → icon-button-group-C48khLE0.js} +23 -22
- package/dist/_chunks/icon-button-group-C48khLE0.js.map +1 -0
- package/dist/_chunks/{isSameDay-DHG8Xade.js → isSameDay-DUEiAT0G.js} +2 -2
- package/dist/_chunks/{isSameDay-DHG8Xade.js.map → isSameDay-DUEiAT0G.js.map} +1 -1
- package/dist/_chunks/isSameWeek-Dfzu29cW.js +14 -0
- package/dist/_chunks/isSameWeek-Dfzu29cW.js.map +1 -0
- package/dist/_chunks/it-CuonvcI_.js +401 -0
- package/dist/_chunks/it-CuonvcI_.js.map +1 -0
- package/dist/_chunks/ja-DO57gIOT.js +366 -0
- package/dist/_chunks/ja-DO57gIOT.js.map +1 -0
- package/dist/_chunks/{key-value-pair-BvDY3zuc.js → key-value-pair-C8DaR3Xs.js} +2 -2
- package/dist/_chunks/{key-value-pair-BvDY3zuc.js.map → key-value-pair-C8DaR3Xs.js.map} +1 -1
- package/dist/_chunks/{list-BdvDctBz.js → list-BOwqwy03.js} +44 -43
- package/dist/_chunks/list-BOwqwy03.js.map +1 -0
- package/dist/_chunks/{locale-picker-CY89MChR.js → locale-picker-D99UyZVJ.js} +4 -4
- package/dist/_chunks/{locale-picker-CY89MChR.js.map → locale-picker-D99UyZVJ.js.map} +1 -1
- package/dist/_chunks/{map-view-DyB8tr6c.js → map-view-WEWqXzof.js} +569 -557
- package/dist/_chunks/{map-view-DyB8tr6c.js.map → map-view-WEWqXzof.js.map} +1 -1
- package/dist/_chunks/{message-card-D6iyPacd.js → message-card-BbRhZkDI.js} +3 -3
- package/dist/_chunks/{message-card-D6iyPacd.js.map → message-card-BbRhZkDI.js.map} +1 -1
- package/dist/_chunks/{message-tray-Bh-0ra-Y.js → message-tray-B762TKuv.js} +11 -10
- package/dist/_chunks/message-tray-B762TKuv.js.map +1 -0
- package/dist/_chunks/{multi-select-dSe6Xtc4.js → multi-select-DOLO3K_z.js} +26 -25
- package/dist/_chunks/multi-select-DOLO3K_z.js.map +1 -0
- package/dist/_chunks/{navigation-menu-CyS1fBJ7.js → navigation-menu-C6lBYVv9.js} +3 -3
- package/dist/_chunks/{navigation-menu-CyS1fBJ7.js.map → navigation-menu-C6lBYVv9.js.map} +1 -1
- package/dist/_chunks/nl-DjPaaWaW.js +326 -0
- package/dist/_chunks/nl-DjPaaWaW.js.map +1 -0
- package/dist/_chunks/{notification-card-vaMaA7Wa.js → notification-card-DMdO4g54.js} +2 -2
- package/dist/_chunks/{notification-card-vaMaA7Wa.js.map → notification-card-DMdO4g54.js.map} +1 -1
- package/dist/_chunks/{notification-tray-Cnum6LwM.js → notification-tray-Dl3FTleW.js} +17 -16
- package/dist/_chunks/notification-tray-Dl3FTleW.js.map +1 -0
- package/dist/_chunks/{number-input-BZXu6bPY.js → number-input-Dj5L3pXK.js} +2 -2
- package/dist/_chunks/{number-input-BZXu6bPY.js.map → number-input-Dj5L3pXK.js.map} +1 -1
- package/dist/_chunks/{otp-input-BDF_iNpa.js → otp-input-BEg_sn8A.js} +2 -2
- package/dist/_chunks/{otp-input-BDF_iNpa.js.map → otp-input-BEg_sn8A.js.map} +1 -1
- package/dist/_chunks/{pagination-BWaXF7W0.js → pagination-DQOgnxxw.js} +2 -2
- package/dist/_chunks/{pagination-BWaXF7W0.js.map → pagination-DQOgnxxw.js.map} +1 -1
- package/dist/_chunks/{parseISO-Dk4xa7q6.js → parseISO-DEpUNwxZ.js} +2 -2
- package/dist/_chunks/{parseISO-Dk4xa7q6.js.map → parseISO-DEpUNwxZ.js.map} +1 -1
- package/dist/_chunks/{patient-search-ZpHN-pgJ.js → patient-search-hFiYbqcl.js} +8 -8
- package/dist/_chunks/{patient-search-ZpHN-pgJ.js.map → patient-search-hFiYbqcl.js.map} +1 -1
- package/dist/_chunks/{patient-shell-CYaNkbA1.js → patient-shell-CDvMw_Nk.js} +6 -6
- package/dist/_chunks/{patient-shell-CYaNkbA1.js.map → patient-shell-CDvMw_Nk.js.map} +1 -1
- package/dist/_chunks/{payment-form-Ds3rxvad.js → payment-form-D5rgnZu7.js} +2 -2
- package/dist/_chunks/{payment-form-Ds3rxvad.js.map → payment-form-D5rgnZu7.js.map} +1 -1
- package/dist/_chunks/{pdf-viewer-CIuaocnq.js → pdf-viewer-DvtEHcEP.js} +347 -320
- package/dist/_chunks/{pdf-viewer-CIuaocnq.js.map → pdf-viewer-DvtEHcEP.js.map} +1 -1
- package/dist/_chunks/{phone-input-DKSHX7NQ.js → phone-input-DfZbPPvh.js} +217 -201
- package/dist/_chunks/phone-input-DfZbPPvh.js.map +1 -0
- package/dist/_chunks/pl-Cl4lOx2N.js +514 -0
- package/dist/_chunks/pl-Cl4lOx2N.js.map +1 -0
- package/dist/_chunks/{popover-BfHSBEKq.js → popover-Devce-tT.js} +3 -3
- package/dist/_chunks/{popover-BfHSBEKq.js.map → popover-Devce-tT.js.map} +1 -1
- package/dist/_chunks/practice-results-JQunxBIg.js +1618 -0
- package/dist/_chunks/practice-results-JQunxBIg.js.map +1 -0
- package/dist/_chunks/{privacy-lock-C6Ra5m3p.js → privacy-lock-DD-wHxBg.js} +3 -3
- package/dist/_chunks/{privacy-lock-C6Ra5m3p.js.map → privacy-lock-DD-wHxBg.js.map} +1 -1
- package/dist/_chunks/{progress-B-PSO5OS.js → progress-kzIRcdaq.js} +11 -10
- package/dist/_chunks/progress-kzIRcdaq.js.map +1 -0
- package/dist/_chunks/pt-D7qO5CzD.js +370 -0
- package/dist/_chunks/pt-D7qO5CzD.js.map +1 -0
- package/dist/_chunks/{public-footer.agent-Bc99tE5Z.js → public-footer.agent-Bh0rnx4i.js} +21 -14
- package/dist/_chunks/public-footer.agent-Bh0rnx4i.js.map +1 -0
- package/dist/_chunks/{public-header.agent-B-B0WDAi.js → public-header.agent-B2dDg2_d.js} +3 -3
- package/dist/_chunks/{public-header.agent-B-B0WDAi.js.map → public-header.agent-B2dDg2_d.js.map} +1 -1
- package/dist/_chunks/{radio-i4ogu3cq.js → radio-TWf9Q-mp.js} +2 -2
- package/dist/_chunks/{radio-i4ogu3cq.js.map → radio-TWf9Q-mp.js.map} +1 -1
- package/dist/_chunks/{radio-group-CTlGc36r.js → radio-group-BcF92GEF.js} +4 -4
- package/dist/_chunks/{radio-group-CTlGc36r.js.map → radio-group-BcF92GEF.js.map} +1 -1
- package/dist/_chunks/{react-day-picker-D3yzgvDB.js → react-day-picker-DsjfS7uI.js} +662 -615
- package/dist/_chunks/{react-day-picker-D3yzgvDB.js.map → react-day-picker-DsjfS7uI.js.map} +1 -1
- package/dist/_chunks/recaptcha-widget-CFYyLSEX.js +221 -0
- package/dist/_chunks/recaptcha-widget-CFYyLSEX.js.map +1 -0
- package/dist/_chunks/refresh-cw-CC8jSKMr.js +17 -0
- package/dist/_chunks/refresh-cw-CC8jSKMr.js.map +1 -0
- package/dist/_chunks/registry-nPAVE19X.js +21 -0
- package/dist/_chunks/registry-nPAVE19X.js.map +1 -0
- package/dist/_chunks/{resizable-COV-cnth.js → resizable-3vzqDlg6.js} +29 -28
- package/dist/_chunks/resizable-3vzqDlg6.js.map +1 -0
- package/dist/_chunks/{reviews-panel-bKEUKSic.js → reviews-panel-yanuBZs-.js} +4 -4
- package/dist/_chunks/{reviews-panel-bKEUKSic.js.map → reviews-panel-yanuBZs-.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-J-wAz9eN.js → rich-text-editor-CHmr9Bz8.js} +2 -2
- package/dist/_chunks/{rich-text-editor-J-wAz9eN.js.map → rich-text-editor-CHmr9Bz8.js.map} +1 -1
- package/dist/_chunks/ro-CP2-VJ_O.js +361 -0
- package/dist/_chunks/ro-CP2-VJ_O.js.map +1 -0
- package/dist/_chunks/ru-RPn9_Lpq.js +561 -0
- package/dist/_chunks/ru-RPn9_Lpq.js.map +1 -0
- package/dist/_chunks/{scroll-area-DEDU-lp-.js → scroll-area-BWqCkEGz.js} +2 -2
- package/dist/_chunks/{scroll-area-DEDU-lp-.js.map → scroll-area-BWqCkEGz.js.map} +1 -1
- package/dist/_chunks/{search-bar-BRMW1-WG.js → search-bar-CP6wUJFY.js} +3 -3
- package/dist/_chunks/{search-bar-BRMW1-WG.js.map → search-bar-CP6wUJFY.js.map} +1 -1
- package/dist/_chunks/{search-input-CIA6pPfn.js → search-input-C1C3jQpD.js} +24 -23
- package/dist/_chunks/search-input-C1C3jQpD.js.map +1 -0
- package/dist/_chunks/{select-C92AT_OZ.js → select-hsCaJSX3.js} +3 -3
- package/dist/_chunks/{select-C92AT_OZ.js.map → select-hsCaJSX3.js.map} +1 -1
- package/dist/_chunks/{sheet-D8Yl0nKR.js → sheet-BV-yuLE2.js} +3 -3
- package/dist/_chunks/{sheet-D8Yl0nKR.js.map → sheet-BV-yuLE2.js.map} +1 -1
- package/dist/_chunks/{sidebar-DkyC6GvS.js → sidebar-BbR8f6oe.js} +3 -3
- package/dist/_chunks/{sidebar-DkyC6GvS.js.map → sidebar-BbR8f6oe.js.map} +1 -1
- package/dist/_chunks/{signature-capture-DjMlFOzS.js → signature-capture-C-fF71xI.js} +213 -205
- package/dist/_chunks/signature-capture-C-fF71xI.js.map +1 -0
- package/dist/_chunks/{slider-CfEzeseL.js → slider-BHWzXdjt.js} +3 -3
- package/dist/_chunks/{slider-CfEzeseL.js.map → slider-BHWzXdjt.js.map} +1 -1
- package/dist/_chunks/{slot-grid-Q94gVmhn.js → slot-grid-Dz13dH82.js} +4 -4
- package/dist/_chunks/{slot-grid-Q94gVmhn.js.map → slot-grid-Dz13dH82.js.map} +1 -1
- package/dist/_chunks/smile-BSYLAHy6.js +17 -0
- package/dist/_chunks/smile-BSYLAHy6.js.map +1 -0
- package/dist/_chunks/{sparkline-B5Ms55PZ.js → sparkline-DEROcSl0.js} +2 -2
- package/dist/_chunks/{sparkline-B5Ms55PZ.js.map → sparkline-DEROcSl0.js.map} +1 -1
- package/dist/_chunks/sq-AQvefouo.js +355 -0
- package/dist/_chunks/sq-AQvefouo.js.map +1 -0
- package/dist/_chunks/{stepper-progress-jFY8BSf7.js → stepper-progress-DDjq5nei.js} +16 -15
- package/dist/_chunks/stepper-progress-DDjq5nei.js.map +1 -0
- package/dist/_chunks/streaming-text-GH07yIYh.js +127 -0
- package/dist/_chunks/streaming-text-GH07yIYh.js.map +1 -0
- package/dist/_chunks/sv-zkx9eBtD.js +376 -0
- package/dist/_chunks/sv-zkx9eBtD.js.map +1 -0
- package/dist/_chunks/{switch-D916VW86.js → switch-BJ6HD3Mn.js} +2 -2
- package/dist/_chunks/{switch-D916VW86.js.map → switch-BJ6HD3Mn.js.map} +1 -1
- package/dist/_chunks/{tabs-aEQfQV3x.js → tabs-BpPYVme_.js} +4 -4
- package/dist/_chunks/{tabs-aEQfQV3x.js.map → tabs-BpPYVme_.js.map} +1 -1
- package/dist/_chunks/{tag-bBPAvXyh.js → tag-CyoaEmf_.js} +2 -2
- package/dist/_chunks/{tag-bBPAvXyh.js.map → tag-CyoaEmf_.js.map} +1 -1
- package/dist/_chunks/{task-tray-6NlryfMJ.js → task-tray-DRK0b0Qb.js} +3 -3
- package/dist/_chunks/{task-tray-6NlryfMJ.js.map → task-tray-DRK0b0Qb.js.map} +1 -1
- package/dist/_chunks/{text-area-D5GAe8pV.js → text-area-BIx0tZ05.js} +27 -26
- package/dist/_chunks/text-area-BIx0tZ05.js.map +1 -0
- package/dist/_chunks/{text-input-CakysYnD.js → text-input-BaClJL8Y.js} +2 -2
- package/dist/_chunks/{text-input-CakysYnD.js.map → text-input-BaClJL8Y.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-JoeMs_ws.js → theme-toggle-DpC28kt5.js} +6 -6
- package/dist/_chunks/{theme-toggle-JoeMs_ws.js.map → theme-toggle-DpC28kt5.js.map} +1 -1
- package/dist/_chunks/{time-picker-DeVZkIY2.js → time-picker-B5umYwfv.js} +2 -2
- package/dist/_chunks/{time-picker-DeVZkIY2.js.map → time-picker-B5umYwfv.js.map} +1 -1
- package/dist/_chunks/{timeline-CR7HjZCK.js → timeline-D0Wo7v_o.js} +3 -3
- package/dist/_chunks/{timeline-CR7HjZCK.js.map → timeline-D0Wo7v_o.js.map} +1 -1
- package/dist/_chunks/{toast.agent-DVpKt38p.js → toast.agent-WHHfw5VX.js} +322 -320
- package/dist/_chunks/{toast.agent-DVpKt38p.js.map → toast.agent-WHHfw5VX.js.map} +1 -1
- package/dist/_chunks/{tooltip-ClJd0ciy.js → tooltip-DvmfrNvB.js} +29 -20
- package/dist/_chunks/tooltip-DvmfrNvB.js.map +1 -0
- package/dist/_chunks/{tooth-scheme-3mITSXiZ.js → tooth-scheme-CxlsLjfN.js} +2 -2
- package/dist/_chunks/{tooth-scheme-3mITSXiZ.js.map → tooth-scheme-CxlsLjfN.js.map} +1 -1
- package/dist/_chunks/tr-Dmr412Ac.js +378 -0
- package/dist/_chunks/tr-Dmr412Ac.js.map +1 -0
- package/dist/_chunks/{transaction-chip-z9ENE50O.js → transaction-chip-B8ujzowA.js} +47 -60
- package/dist/_chunks/transaction-chip-B8ujzowA.js.map +1 -0
- package/dist/_chunks/{transcript-panel-QUQ9XJmf.js → transcript-panel-DyhTpAP7.js} +21 -20
- package/dist/_chunks/transcript-panel-DyhTpAP7.js.map +1 -0
- package/dist/_chunks/{use-direction-D6rvvG9G.js → use-direction-Dp8h70PP.js} +7 -6
- package/dist/_chunks/use-direction-Dp8h70PP.js.map +1 -0
- package/dist/_chunks/use-isomorphic-layout-effect-BGfaCOP1.js +6 -0
- package/dist/_chunks/use-isomorphic-layout-effect-BGfaCOP1.js.map +1 -0
- package/dist/_chunks/use-media-query-CcAx5SMM.js +16 -0
- package/dist/_chunks/use-media-query-CcAx5SMM.js.map +1 -0
- package/dist/_chunks/{use-password-requirements-E0sSfx5X.js → use-password-requirements-DsgduV1x.js} +3 -3
- package/dist/_chunks/{use-password-requirements-E0sSfx5X.js.map → use-password-requirements-DsgduV1x.js.map} +1 -1
- package/dist/_chunks/use-scroll-to-first-error-4Za-u5Nw.js +43 -0
- package/dist/_chunks/use-scroll-to-first-error-4Za-u5Nw.js.map +1 -0
- package/dist/_chunks/{workflow-map-DlWBJJBt.js → workflow-map-BSvQS3be.js} +6 -6
- package/dist/_chunks/{workflow-map-DlWBJJBt.js.map → workflow-map-BSvQS3be.js.map} +1 -1
- package/dist/_chunks/zh-CN-DxVt64Zk.js +388 -0
- package/dist/_chunks/zh-CN-DxVt64Zk.js.map +1 -0
- package/dist/agent/registry.d.ts +1 -6
- package/dist/agent/registry.d.ts.map +1 -1
- package/dist/agent-catalog.json +42 -1
- package/dist/components/_shared/date-locale.d.ts +7 -2
- package/dist/components/_shared/date-locale.d.ts.map +1 -1
- package/dist/components/_shared/index.d.ts +1 -1
- package/dist/components/_shared/index.d.ts.map +1 -1
- package/dist/components/accordion/index.js +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/audio-recorder/audio-recorder.d.ts.map +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/audio-visualiser/audio-visualiser.d.ts.map +1 -1
- package/dist/components/audio-visualiser/index.js +1 -1
- package/dist/components/autocomplete/index.js +1 -1
- package/dist/components/avatar/avatar.d.ts.map +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/breadcrumb/index.js +1 -1
- package/dist/components/button/index.js +1 -1
- package/dist/components/button-group/button-group.d.ts.map +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/calendar/calendar.d.ts.map +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/carousel/index.js +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/chat-container/chat-container.d.ts.map +1 -1
- package/dist/components/chat-container/index.js +1 -1
- package/dist/components/chat-input/chat-input.d.ts.map +1 -1
- package/dist/components/chat-input/index.js +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/checkbox/index.js +1 -1
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/collapsible/index.js +1 -1
- package/dist/components/color-picker/color-picker.d.ts.map +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/command-palette/command-palette.d.ts.map +1 -1
- package/dist/components/command-palette/index.js +1 -1
- package/dist/components/copy-field/index.js +1 -1
- package/dist/components/data-table/cell-renderers/color-dot-cell-renderer.d.ts.map +1 -1
- package/dist/components/data-table/data-table.d.ts.map +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
- package/dist/components/date-range-picker/index.js +1 -1
- package/dist/components/date-time-picker/index.js +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/email-input/index.js +1 -1
- package/dist/components/file-upload/file-upload.d.ts.map +1 -1
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/header/index.js +1 -1
- package/dist/components/header-settings/index.js +6 -6
- package/dist/components/icon-button/index.js +1 -1
- package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/list/index.js +1 -1
- package/dist/components/list/list.d.ts.map +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/map-view/index.js +1 -1
- package/dist/components/map-view/map-view.d.ts +10 -0
- package/dist/components/map-view/map-view.d.ts.map +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/message-tray/message-tray.d.ts.map +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/multi-select/multi-select.d.ts.map +1 -1
- package/dist/components/navigation-menu/index.js +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
- package/dist/components/number-input/index.js +1 -1
- package/dist/components/otp-input/index.js +1 -1
- package/dist/components/pagination/index.js +1 -1
- package/dist/components/password-input/index.js +1 -1
- package/dist/components/patient-search/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/phone-input/phone-input.d.ts.map +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/practice-results/index.d.ts +4 -0
- package/dist/components/practice-results/index.d.ts.map +1 -0
- package/dist/components/practice-results/index.js +6 -0
- package/dist/components/practice-results/index.js.map +1 -0
- package/dist/components/practice-results/practice-results.agent.d.ts +4 -0
- package/dist/components/practice-results/practice-results.agent.d.ts.map +1 -0
- package/dist/components/practice-results/practice-results.d.ts +159 -0
- package/dist/components/practice-results/practice-results.d.ts.map +1 -0
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/progress/index.js +1 -1
- package/dist/components/progress/progress.d.ts.map +1 -1
- package/dist/components/public-footer/index.js +1 -1
- package/dist/components/public-footer/public-footer.d.ts.map +1 -1
- package/dist/components/public-header/index.js +1 -1
- package/dist/components/radio/index.js +1 -1
- package/dist/components/radio-group/index.js +2 -2
- package/dist/components/recaptcha-widget/index.js +1 -1
- package/dist/components/recaptcha-widget/recaptcha-widget.d.ts.map +1 -1
- package/dist/components/resizable/index.js +1 -1
- package/dist/components/resizable/resizable.d.ts.map +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/scroll-area/index.js +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/search-input/index.js +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/signature-capture/index.js +1 -1
- package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
- package/dist/components/slider/index.js +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/sparkline/index.js +1 -1
- package/dist/components/stepper-progress/index.js +1 -1
- package/dist/components/stepper-progress/stepper-progress.d.ts.map +1 -1
- package/dist/components/streaming-text/index.js +1 -1
- package/dist/components/streaming-text/streaming-text.d.ts.map +1 -1
- package/dist/components/switch/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tag/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/text-area/index.js +1 -1
- package/dist/components/text-area/text-area.d.ts.map +1 -1
- package/dist/components/text-input/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/time-picker/index.js +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/toast/toast.d.ts.map +1 -1
- package/dist/components/tooltip/index.js +1 -1
- package/dist/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/transaction-chip/index.js +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/hooks/index.js +69 -66
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-debounced-value.d.ts.map +1 -1
- package/dist/hooks/use-direction.d.ts.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts.map +1 -1
- package/dist/hooks/use-scroll-to-first-error.d.ts.map +1 -1
- package/dist/i18n/locales/ar.d.ts +92 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +82 -0
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +92 -0
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +81 -0
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +92 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +82 -0
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +92 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +92 -0
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +92 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +81 -0
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +92 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +81 -0
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +92 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +82 -0
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +92 -0
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +81 -0
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +92 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +82 -0
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +92 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +81 -0
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +92 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +82 -0
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +92 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +83 -0
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +92 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +82 -0
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +92 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +82 -0
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +92 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +82 -0
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +92 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +82 -0
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +92 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +82 -0
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +92 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +82 -0
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +532 -528
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +92 -0
- package/dist/locales/de.json +92 -0
- package/dist/locales/el.json +92 -0
- package/dist/locales/en.json +92 -0
- package/dist/locales/es.json +92 -0
- package/dist/locales/fr.json +92 -0
- package/dist/locales/hi.json +92 -0
- package/dist/locales/it.json +92 -0
- package/dist/locales/ja.json +92 -0
- package/dist/locales/nl.json +92 -0
- package/dist/locales/pl.json +92 -0
- package/dist/locales/pt.json +92 -0
- package/dist/locales/ro.json +92 -0
- package/dist/locales/ru.json +92 -0
- package/dist/locales/sq.json +92 -0
- package/dist/locales/sv.json +92 -0
- package/dist/locales/tr.json +92 -0
- package/dist/locales/zh.json +92 -0
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/patterns/patient-shell/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +5 -2
- package/dist/_chunks/ai-prompt-input-BXlwNnWe.js.map +0 -1
- package/dist/_chunks/audio-recorder-DL800PE_.js.map +0 -1
- package/dist/_chunks/audio-visualiser-I-T4Z7EU.js +0 -145
- package/dist/_chunks/audio-visualiser-I-T4Z7EU.js.map +0 -1
- package/dist/_chunks/avatar-D_H4emLo.js.map +0 -1
- package/dist/_chunks/booking-Cw92aqo3.js.map +0 -1
- package/dist/_chunks/button-group-Bh2g_Ng-.js.map +0 -1
- package/dist/_chunks/chat-container-izziXViv.js.map +0 -1
- package/dist/_chunks/chat-input-cyl_y9bh.js.map +0 -1
- package/dist/_chunks/color-picker-Bm-gzpsh.js.map +0 -1
- package/dist/_chunks/combobox-Da9eq00i.js.map +0 -1
- package/dist/_chunks/command-palette-11BieSNq.js.map +0 -1
- package/dist/_chunks/date-range-picker-DYgHzMOo.js.map +0 -1
- package/dist/_chunks/editable-currency-cell-renderer-CztRy_21.js.map +0 -1
- package/dist/_chunks/file-upload-DxAQprcU.js.map +0 -1
- package/dist/_chunks/icon-button-group-DeV3FpNY.js.map +0 -1
- package/dist/_chunks/list-BdvDctBz.js.map +0 -1
- package/dist/_chunks/message-tray-Bh-0ra-Y.js.map +0 -1
- package/dist/_chunks/multi-select-dSe6Xtc4.js.map +0 -1
- package/dist/_chunks/notification-tray-Cnum6LwM.js.map +0 -1
- package/dist/_chunks/phone-input-DKSHX7NQ.js.map +0 -1
- package/dist/_chunks/progress-B-PSO5OS.js.map +0 -1
- package/dist/_chunks/public-footer.agent-Bc99tE5Z.js.map +0 -1
- package/dist/_chunks/recaptcha-widget-BtBNb6tB.js +0 -192
- package/dist/_chunks/recaptcha-widget-BtBNb6tB.js.map +0 -1
- package/dist/_chunks/registry-C9nwlNyL.js +0 -21
- package/dist/_chunks/registry-C9nwlNyL.js.map +0 -1
- package/dist/_chunks/resizable-COV-cnth.js.map +0 -1
- package/dist/_chunks/search-input-CIA6pPfn.js.map +0 -1
- package/dist/_chunks/signature-capture-DjMlFOzS.js.map +0 -1
- package/dist/_chunks/stepper-progress-jFY8BSf7.js.map +0 -1
- package/dist/_chunks/streaming-text-BgjCTVOw.js +0 -105
- package/dist/_chunks/streaming-text-BgjCTVOw.js.map +0 -1
- package/dist/_chunks/text-area-D5GAe8pV.js.map +0 -1
- package/dist/_chunks/tooltip-ClJd0ciy.js.map +0 -1
- package/dist/_chunks/transaction-chip-z9ENE50O.js.map +0 -1
- package/dist/_chunks/transcript-panel-QUQ9XJmf.js.map +0 -1
- package/dist/_chunks/use-direction-D6rvvG9G.js.map +0 -1
- package/dist/_chunks/use-scroll-to-first-error-BrK7dKB_.js +0 -55
- package/dist/_chunks/use-scroll-to-first-error-BrK7dKB_.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recaptcha-widget-BtBNb6tB.js","sources":["../../src/components/recaptcha-widget/recaptcha-widget.agent.ts","../../src/components/recaptcha-widget/recaptcha-widget.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — RecaptchaWidget. */\n/* */\n/* Recaptcha already exposes a curated `RecaptchaWidgetHandle` via */\n/* useImperativeHandle. The adapter wires `execute` (issue token, write) */\n/* and `reset` (clear token, destructive) into that existing handle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { RecaptchaWidgetHandle } from './recaptcha-widget';\n\nexport const recaptchaWidgetAgent: AgentAdapter<RecaptchaWidgetHandle> = {\n id: 'recaptcha-widget',\n capabilities: ['submit'],\n state: {\n hasToken: {\n type: 'boolean',\n descriptionKey: 'ui.agent.recaptchaWidget.state.hasToken',\n description:\n 'True when the widget currently holds a valid verification token.',\n read: (handle) => handle.getResponse().length > 0,\n },\n },\n actions: {\n execute: {\n safety: 'write',\n descriptionKey: 'ui.agent.recaptchaWidget.actions.execute',\n description:\n 'Programmatically trigger the captcha challenge. Issues a token via the callback.',\n invoke: (handle) => {\n handle.execute();\n },\n },\n reset: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.recaptchaWidget.actions.reset',\n description:\n 'Clear the current token and re-roll the captcha. Irreversible.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'recaptcha-widget',\n description: 'Marks the RecaptchaWidget wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop (or the surrounding FormField id).',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\nimport { useTheme } from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { recaptchaWidgetAgent } from './recaptcha-widget.agent';\n\n/* ------------------------------------------------------------------ */\n/* Loader — idempotent across instances */\n/* ------------------------------------------------------------------ */\n\n/**\n * Google reCAPTCHA v2 ships as a global `grecaptcha` object loaded from\n * `https://www.google.com/recaptcha/api.js`. We lazy-load the script\n * once per page using a shared promise so N widgets on the same form\n * (or N renders of a single widget) all wait on the same fetch.\n *\n * The `?render=explicit` query parameter is required so we control\n * when each widget mounts via `grecaptcha.render`, rather than letting\n * the global auto-bind to every `.g-recaptcha` div on the page.\n */\nconst SCRIPT_SRC = 'https://www.google.com/recaptcha/api.js';\nconst SCRIPT_ID = 'alfadocs-ui-recaptcha-loader';\n\ninterface RecaptchaApi {\n render: (\n container: HTMLElement,\n parameters: {\n sitekey: string;\n theme?: 'light' | 'dark';\n size?: 'normal' | 'compact' | 'invisible';\n hl?: string;\n callback?: (token: string) => void;\n 'expired-callback'?: () => void;\n 'error-callback'?: () => void;\n },\n ) => number;\n reset: (widgetId?: number) => void;\n getResponse: (widgetId?: number) => string;\n execute: (widgetId?: number) => void;\n}\n\ndeclare global {\n interface Window {\n grecaptcha?: RecaptchaApi;\n ___grecaptchaOnLoad___?: () => void;\n }\n}\n\nlet loaderPromise: Promise<RecaptchaApi> | null = null;\n\nfunction loadRecaptcha(hl: string | undefined): Promise<RecaptchaApi> {\n if (typeof window === 'undefined') {\n return Promise.reject(new Error('recaptcha: window is not available'));\n }\n if (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n return Promise.resolve(window.grecaptcha);\n }\n if (loaderPromise) {\n return loaderPromise;\n }\n\n loaderPromise = new Promise<RecaptchaApi>((resolve, reject) => {\n const existing = document.getElementById(\n SCRIPT_ID,\n ) as HTMLScriptElement | null;\n\n const onReady = () => {\n if (window.grecaptcha && typeof window.grecaptcha.render === 'function') {\n resolve(window.grecaptcha);\n } else {\n reject(new Error('recaptcha: grecaptcha global missing after load'));\n }\n };\n\n window.___grecaptchaOnLoad___ = onReady;\n\n if (existing) {\n // Another instance kicked off the load — wait for the global\n // onload callback we just (re)installed.\n return;\n }\n\n const params = new URLSearchParams({\n onload: '___grecaptchaOnLoad___',\n render: 'explicit',\n });\n if (hl) params.set('hl', hl);\n\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = `${SCRIPT_SRC}?${params.toString()}`;\n script.async = true;\n script.defer = true;\n script.onerror = () => {\n loaderPromise = null;\n reject(new Error('recaptcha: script failed to load'));\n };\n document.head.appendChild(script);\n });\n\n return loaderPromise;\n}\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface RecaptchaWidgetHandle {\n /** Re-roll the captcha — clears the response token. */\n reset: () => void;\n /** Returns the current response token, or empty string when unsolved. */\n getResponse: () => string;\n /** Programmatically trigger an invisible captcha challenge. */\n execute: () => void;\n}\n\nexport interface RecaptchaWidgetProps {\n /** Google reCAPTCHA v2 site key. Required. */\n siteKey: string;\n /**\n * Visual theme. Defaults to the resolved DS theme (`useTheme`).\n * Pass `'light'` / `'dark'` to force.\n */\n theme?: 'light' | 'dark';\n /** Two-letter locale hint. Defaults to the current i18next language. */\n locale?: string;\n /** Widget size. */\n size?: 'normal' | 'compact' | 'invisible';\n /** Called with the verification token, or `null` when expired/reset. */\n onChange?: (token: string | null) => void;\n /** Called when the user solves but the token then times out. */\n onExpired?: () => void;\n /** Called when the script or challenge errors out. */\n onError?: () => void;\n /** Error message — wires aria-describedby + announces via the live region. */\n error?: string;\n /** Override the DOM id; defaults to the surrounding FormField id. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const RecaptchaWidget = forwardRef<\n RecaptchaWidgetHandle,\n RecaptchaWidgetProps\n>(function RecaptchaWidget(\n {\n siteKey,\n theme,\n locale,\n size = 'normal',\n onChange,\n onExpired,\n onError,\n error,\n id,\n className,\n },\n ref,\n) {\n const { t, i18n } = useTranslation();\n const formField = useFormField();\n const { resolvedTheme } = useTheme();\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const widgetIdRef = useRef<number | null>(null);\n const apiRef = useRef<RecaptchaApi | null>(null);\n const [statusMessage, setStatusMessage] = useState<string>('');\n\n const wrapperId = id ?? formField.id;\n const errorId = error ? `${wrapperId}-error` : undefined;\n const describedBy =\n [formField.describedBy, errorId].filter(Boolean).join(' ') || undefined;\n\n // Mirror the DS theme into reCAPTCHA's two-tone setting.\n const effectiveTheme: 'light' | 'dark' =\n theme ?? (resolvedTheme.startsWith('dark') ? 'dark' : 'light');\n const effectiveLocale = locale ?? i18n.language;\n\n // Stable callbacks via refs so we don't re-render the widget on\n // every parent state change.\n const onChangeRef = useRef(onChange);\n const onExpiredRef = useRef(onExpired);\n const onErrorRef = useRef(onError);\n onChangeRef.current = onChange;\n onExpiredRef.current = onExpired;\n onErrorRef.current = onError;\n\n const expiredLabel = t(\n 'inputs.recaptcha.expired',\n 'Verification expired — please retry.',\n );\n const errorLabel = t(\n 'inputs.recaptcha.error',\n 'Verification failed — please retry.',\n );\n\n useEffect(() => {\n if (!siteKey || !containerRef.current) return;\n let cancelled = false;\n\n loadRecaptcha(effectiveLocale)\n .then((api) => {\n if (cancelled || !containerRef.current) return;\n apiRef.current = api;\n widgetIdRef.current = api.render(containerRef.current, {\n sitekey: siteKey,\n theme: effectiveTheme,\n size,\n hl: effectiveLocale,\n callback: (token) => {\n setStatusMessage('');\n onChangeRef.current?.(token);\n },\n 'expired-callback': () => {\n setStatusMessage(expiredLabel);\n onChangeRef.current?.(null);\n onExpiredRef.current?.();\n },\n 'error-callback': () => {\n setStatusMessage(errorLabel);\n onChangeRef.current?.(null);\n onErrorRef.current?.();\n },\n });\n })\n .catch(() => {\n if (cancelled) return;\n setStatusMessage(errorLabel);\n onErrorRef.current?.();\n });\n\n return () => {\n cancelled = true;\n // grecaptcha has no public destroy. The shared script stays\n // loaded; we reset the widget so its iframe stops listening.\n if (apiRef.current && widgetIdRef.current !== null) {\n try {\n apiRef.current.reset(widgetIdRef.current);\n } catch {\n /* widget id may already be invalid — safe to ignore. */\n }\n }\n };\n // Re-render the widget when the underlying configuration changes.\n }, [\n siteKey,\n effectiveTheme,\n effectiveLocale,\n size,\n expiredLabel,\n errorLabel,\n ]);\n\n const agentHandle = useMemo<RecaptchaWidgetHandle>(\n () => ({\n reset: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n apiRef.current.reset(widgetIdRef.current);\n setStatusMessage('');\n onChangeRef.current?.(null);\n }\n },\n getResponse: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n return apiRef.current.getResponse(widgetIdRef.current);\n }\n return '';\n },\n execute: () => {\n if (apiRef.current && widgetIdRef.current !== null) {\n apiRef.current.execute(widgetIdRef.current);\n }\n },\n }),\n [],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(recaptchaWidgetAgent, agentHandle, wrapperId);\n\n const liveMessage = error || statusMessage;\n // For invisible widgets the iframe is offscreen, so we mark the\n // wrapper as a non-visual badge. Otherwise the wrapper just hosts\n // the rendered iframe and contributes no interactive role itself.\n const wrapperRole = size === 'invisible' ? 'presentation' : undefined;\n\n return (\n <div\n className={[\n 'ds:inline-block',\n // Keep the iframe inside the wrapper's stacking context so\n // popovers etc. above the form continue to overlay correctly.\n 'ds:relative ds:isolate',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-component=\"recaptcha-widget\"\n data-component-id={wrapperId}\n data-size={size}\n role={wrapperRole}\n >\n <div\n ref={containerRef}\n id={wrapperId}\n // The class name is the canonical hook Google's verifier\n // looks for when the page form is submitted server-side. Some\n // Symfony / Laravel validators short-circuit when this class\n // is missing, so we render it even though we're using\n // grecaptcha.render explicitly.\n className=\"g-recaptcha\"\n data-sitekey={siteKey}\n data-theme={effectiveTheme}\n data-size={size}\n aria-describedby={describedBy}\n aria-invalid={error || formField.invalid ? true : undefined}\n />\n {/* Live announcement for expired / error states. Empty when the\n widget is healthy so SR users aren't spammed. */}\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {liveMessage}\n </div>\n </div>\n );\n});\n"],"names":["recaptchaWidgetAgent","handle","SCRIPT_SRC","SCRIPT_ID","loaderPromise","loadRecaptcha","hl","resolve","reject","existing","onReady","params","script","RecaptchaWidget","forwardRef","siteKey","theme","locale","size","onChange","onExpired","onError","error","id","className","ref","t","i18n","useTranslation","formField","useFormField","resolvedTheme","useTheme","containerRef","useRef","widgetIdRef","apiRef","statusMessage","setStatusMessage","useState","wrapperId","errorId","describedBy","effectiveTheme","effectiveLocale","onChangeRef","onExpiredRef","onErrorRef","expiredLabel","errorLabel","useEffect","cancelled","api","token","_a","_b","agentHandle","useMemo","useImperativeHandle","useAgentRegistration","liveMessage","wrapperRole","jsxs","jsx"],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { useEffect as u } from "react";
|
|
2
|
-
function n(r, t, i) {
|
|
3
|
-
u(() => {
|
|
4
|
-
if (typeof window > "u") return;
|
|
5
|
-
const o = window.__alfadocs_agent;
|
|
6
|
-
if (!o || !i || t == null) return;
|
|
7
|
-
const e = {
|
|
8
|
-
id: r.id,
|
|
9
|
-
instanceId: i,
|
|
10
|
-
handle: t,
|
|
11
|
-
adapter: r
|
|
12
|
-
};
|
|
13
|
-
return o.register(e), () => {
|
|
14
|
-
o.unregister(r.id, i);
|
|
15
|
-
};
|
|
16
|
-
}, [r, t, i]);
|
|
17
|
-
}
|
|
18
|
-
export {
|
|
19
|
-
n as u
|
|
20
|
-
};
|
|
21
|
-
//# sourceMappingURL=registry-C9nwlNyL.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry-C9nwlNyL.js","sources":["../../src/agent/registry.ts"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent runtime registry — interface only. */\n/* */\n/* The kit declares the registry shape and a no-op subscription hook. */\n/* The platform-side UI bridge mounts the actual registry at app root and */\n/* consumes the registrations to drive components from a future MCP */\n/* server. With no registry mounted, `useAgentRegistration` is a no-op. */\n/* -------------------------------------------------------------------- */\n\nimport { useEffect } from 'react';\nimport type { AgentAdapter } from './types';\n\nexport interface AgentRegistration<THandle = unknown> {\n id: string;\n instanceId: string;\n handle: THandle;\n adapter: AgentAdapter<THandle>;\n}\n\nexport interface AgentRegistry {\n register: (registration: AgentRegistration) => void;\n unregister: (id: string, instanceId: string) => void;\n}\n\ndeclare global {\n interface Window {\n __alfadocs_agent?: AgentRegistry;\n }\n}\n\n/**\n * Register a live component instance with the host agent registry, if one\n * is mounted. No-op when `window.__alfadocs_agent` is undefined, so the\n * call is safe to add unconditionally inside any kit component.\n *\n * Re-registers when `instanceId` or `handle` changes; deregisters on\n * unmount.\n */\nexport function useAgentRegistration<THandle>(\n adapter: AgentAdapter<THandle>,\n handle: THandle | null | undefined,\n instanceId: string | null | undefined,\n): void {\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const registry = window.__alfadocs_agent;\n if (!registry || !instanceId || handle == null) return;\n\n const registration: AgentRegistration<THandle> = {\n id: adapter.id,\n instanceId,\n handle,\n adapter,\n };\n registry.register(registration as AgentRegistration);\n\n return () => {\n registry.unregister(adapter.id, instanceId);\n };\n }, [adapter, handle, instanceId]);\n}\n"],"names":["useAgentRegistration","adapter","handle","instanceId","useEffect","registry","registration"],"mappings":";AAsCO,SAASA,EACdC,GACAC,GACAC,GACM;AACN,EAAAC,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMC,IAAW,OAAO;AACxB,QAAI,CAACA,KAAY,CAACF,KAAcD,KAAU,KAAM;AAEhD,UAAMI,IAA2C;AAAA,MAC/C,IAAIL,EAAQ;AAAA,MACZ,YAAAE;AAAA,MACA,QAAAD;AAAA,MACA,SAAAD;AAAA,IAAA;AAEF,WAAAI,EAAS,SAASC,CAAiC,GAE5C,MAAM;AACX,MAAAD,EAAS,WAAWJ,EAAQ,IAAIE,CAAU;AAAA,IAC5C;AAAA,EACF,GAAG,CAACF,GAASC,GAAQC,CAAU,CAAC;AAClC;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resizable-COV-cnth.js","sources":["../../src/components/resizable/resizable-context.ts","../../src/components/resizable/resizable.agent.ts","../../src/components/resizable/resizable.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n type MutableRefObject,\n type RefObject,\n} from 'react';\n\nexport interface PanelConfig {\n id: string;\n index: number;\n defaultSize: number;\n minSize: number;\n maxSize: number;\n collapsible: boolean;\n collapsedSize: number;\n}\n\nexport interface ResizableContextShape {\n direction: 'horizontal' | 'vertical';\n sizes: number[];\n liveSizesRef: MutableRefObject<number[]>;\n panels: PanelConfig[];\n groupRef: RefObject<HTMLDivElement>;\n updateSizesImperative: (newSizes: number[]) => void;\n commitSizes: (newSizes: number[]) => void;\n registerPanelElement: (index: number, el: HTMLDivElement) => void;\n unregisterPanelElement: (index: number) => void;\n setAnnounceText: (text: string) => void;\n}\n\nexport const ResizableContext = createContext<ResizableContextShape | null>(\n null,\n);\n\nexport function useResizable(): ResizableContextShape {\n const ctx = useContext(ResizableContext);\n if (!ctx) {\n throw new Error('useResizable must be used within a PanelGroup');\n }\n return ctx;\n}\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — Resizable. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ResizableHandle } from './resizable';\n\nexport const resizableAgent: AgentAdapter<ResizableHandle> = {\n id: 'resizable',\n capabilities: ['range_navigate'],\n state: {\n sizes: {\n type: 'number[]',\n description: 'Current per-panel sizes as percentages of the group.',\n read: (handle) => handle.getSizes(),\n },\n },\n actions: {\n set_sizes: {\n safety: 'read',\n argsType: '{ sizes: number[] }',\n description: 'Replace the panel sizes (percentages, summing to 100).',\n invoke: (handle, args: { sizes: number[] }) => {\n handle.setSizes(args.sizes);\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'resizable' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on PanelGroup.',\n },\n item: {\n attr: 'data-panel-id',\n description:\n 'Each Panel forwards its `id` to react-resizable-panels which emits it as `data-panel-id`.',\n },\n },\n};\n","import {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type MutableRefObject,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n ResizableContext,\n useResizable,\n type PanelConfig,\n} from './resizable-context';\nimport { useAgentRegistration } from '../../agent';\nimport { resizableAgent } from './resizable.agent';\n\n// ─── storage ──────────────────────────────────────────────────────────────────\n\nconst STORAGE_PREFIX = 'ui-kit:resizable:';\n\nfunction loadFromStorage(groupId: string | undefined): number[] | null {\n if (!groupId) return null;\n try {\n const raw = localStorage.getItem(`${STORAGE_PREFIX}${groupId}`);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { v: number; sizes: number[] };\n if (parsed.v !== 1 || !Array.isArray(parsed.sizes)) return null;\n return parsed.sizes;\n } catch {\n return null;\n }\n}\n\nfunction saveToStorage(groupId: string, sizes: number[]): void {\n try {\n localStorage.setItem(\n `${STORAGE_PREFIX}${groupId}`,\n JSON.stringify({ v: 1, sizes }),\n );\n } catch {\n // QuotaExceeded or private mode\n }\n}\n\n// ─── size helpers ─────────────────────────────────────────────────────────────\n\nfunction normalizeSizes(raw: number[]): number[] {\n const total = raw.reduce((a, b) => a + b, 0);\n if (total === 0) return raw.map(() => 100 / raw.length);\n return raw.map((s) => (s / total) * 100);\n}\n\nfunction computeNewSizes(\n currentSizes: number[],\n handleIndex: number,\n deltaPercent: number,\n panels: PanelConfig[],\n groupSizePx: number,\n): number[] {\n const sizes = [...currentSizes];\n const li = handleIndex;\n const ri = handleIndex + 1;\n if (li >= sizes.length || ri >= sizes.length) return sizes;\n\n const lc = panels[li];\n const rc = panels[ri];\n const total = sizes[li] + sizes[ri];\n const collapseThreshold = groupSizePx > 0 ? (20 / groupSizePx) * 100 : 2;\n\n let newLeft = sizes[li] + deltaPercent;\n let newRight = total - newLeft;\n\n if (lc.collapsible && newLeft < lc.minSize) {\n if (newLeft < lc.minSize - collapseThreshold) {\n sizes[li] = lc.collapsedSize;\n sizes[ri] = total - lc.collapsedSize;\n return sizes;\n }\n newLeft = lc.minSize;\n newRight = total - newLeft;\n }\n\n if (rc.collapsible && newRight < rc.minSize) {\n if (newRight < rc.minSize - collapseThreshold) {\n sizes[ri] = rc.collapsedSize;\n sizes[li] = total - rc.collapsedSize;\n return sizes;\n }\n newRight = rc.minSize;\n newLeft = total - newRight;\n }\n\n const lMin = lc.collapsible ? lc.collapsedSize : lc.minSize;\n const rMin = rc.collapsible ? rc.collapsedSize : rc.minSize;\n\n newLeft = Math.max(lMin, Math.min(lc.maxSize, newLeft));\n newRight = total - newLeft;\n newRight = Math.max(rMin, Math.min(rc.maxSize, newRight));\n newLeft = total - newRight;\n newLeft = Math.max(lMin, Math.min(lc.maxSize, newLeft));\n\n sizes[li] = Math.max(0, newLeft);\n sizes[ri] = Math.max(0, total - sizes[li]);\n return sizes;\n}\n\n// ─── Handle CVA ──────────────────────────────────────────────────────────────\n// calc with underscores for Tailwind arbitrary value spaces\n// Extends hit area to --min-target-size via ::before pseudo-element\n\nconst handleVariants = cva(\n [\n 'ds:relative ds:flex ds:items-center ds:justify-center ds:shrink-0 ds:select-none',\n 'ds:bg-[var(--border)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:hover:bg-[var(--accent)] ds:data-[dragging]:bg-[var(--accent)]',\n \"ds:before:absolute ds:before:content-['']\",\n ],\n {\n variants: {\n orientation: {\n horizontal: [\n 'ds:[inline-size:var(--resizable-handle-size)] ds:cursor-col-resize ds:[block-size:100%]',\n 'ds:before:[block-size:100%]',\n 'ds:before:[inline-size:var(--min-target-size)]',\n 'ds:before:[inset-block:0]',\n 'ds:before:[inset-inline:calc(0px_-_(var(--min-target-size)_-_var(--resizable-handle-size))_/_2)]',\n ],\n vertical: [\n 'ds:[block-size:var(--resizable-handle-size)] ds:cursor-row-resize ds:[inline-size:100%]',\n 'ds:before:[inline-size:100%]',\n 'ds:before:[block-size:var(--min-target-size)]',\n 'ds:before:[inset-inline:0]',\n 'ds:before:[inset-block:calc(0px_-_(var(--min-target-size)_-_var(--resizable-handle-size))_/_2)]',\n ],\n },\n },\n defaultVariants: { orientation: 'horizontal' },\n },\n);\n\n// ─── PanelGroup CVA ──────────────────────────────────────────────────────────\n\nconst panelGroupVariants = cva('ds:flex ds:overflow-hidden', {\n variants: {\n direction: {\n horizontal: 'ds:flex-row',\n vertical: 'ds:flex-col',\n },\n },\n defaultVariants: { direction: 'horizontal' },\n});\n\n// ─── Panel CVA ────────────────────────────────────────────────────────────────\n\nconst panelVariants = cva(\n 'ds:[flex:0_0_var(--panel-self-size,50%)] ds:overflow-auto',\n {\n variants: {\n direction: {\n horizontal: 'ds:[min-inline-size:0]',\n vertical: 'ds:[min-block-size:0]',\n },\n },\n defaultVariants: { direction: 'horizontal' },\n },\n);\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\nexport interface PanelGroupProps {\n direction: 'horizontal' | 'vertical';\n groupId?: string;\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n onLayout?: (sizes: number[]) => void;\n className?: string;\n children: ReactNode;\n}\n\n// Curated agent-readiness handle — see resizable.agent.ts.\nexport interface ResizableHandle {\n getSizes: () => number[];\n setSizes: (sizes: number[]) => void;\n}\n\nexport interface PanelHandle {\n resize: (size: number) => void;\n}\n\nexport interface PanelProps {\n defaultSize: number;\n minSize?: number;\n maxSize?: number;\n collapsible?: boolean;\n collapsedSize?: number;\n className?: string;\n children?: ReactNode;\n}\n\nexport interface HandleProps {\n className?: string;\n}\n\n// Internal injection (not exported)\ntype PanelInternalProps = PanelProps & {\n _panelIndex?: number;\n _panelId?: string;\n};\n\ntype HandleInternalProps = HandleProps & {\n _handleIndex?: number;\n};\n\n// ─── PanelGroup ───────────────────────────────────────────────────────────────\n\nexport const PanelGroup = forwardRef<HTMLDivElement, PanelGroupProps>(\n ({ direction, groupId, id, onLayout, className, children }, outerRef) => {\n const baseId = useId();\n const groupRef = useRef<HTMLDivElement>(null!);\n const panelElementsRef = useRef<Map<number, HTMLDivElement>>(new Map());\n const storageTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const [announceText, setAnnounceText] = useState('');\n\n // Walk children to extract panel configs and inject internal indices\n const { panelConfigs, processedChildren } = useMemo(() => {\n const configs: PanelConfig[] = [];\n let panelIdx = 0;\n let handleIdx = 0;\n\n const walk = (child: ReactNode): ReactNode => {\n if (!isValidElement(child)) return child;\n if (child.type === Panel) {\n const idx = panelIdx;\n const p = child.props as PanelProps;\n configs.push({\n id: `${baseId}-panel-${idx}`,\n index: idx,\n defaultSize: p.defaultSize,\n minSize: p.minSize ?? 10,\n maxSize: p.maxSize ?? 90,\n collapsible: p.collapsible ?? false,\n collapsedSize: p.collapsedSize ?? 0,\n });\n panelIdx++;\n return cloneElement(child as ReactElement<PanelInternalProps>, {\n _panelIndex: idx,\n _panelId: `${baseId}-panel-${idx}`,\n });\n }\n if (child.type === Handle) {\n const idx = handleIdx++;\n return cloneElement(child as ReactElement<HandleInternalProps>, {\n _handleIndex: idx,\n });\n }\n return child;\n };\n\n return {\n panelConfigs: configs,\n processedChildren: Children.map(children, walk),\n };\n }, [children, baseId]);\n\n // Initial sizes from storage or defaults\n const [committedSizes, setCommittedSizes] = useState<number[]>(() => {\n if (panelConfigs.length === 0) return [];\n const stored = loadFromStorage(groupId);\n if (stored && stored.length === panelConfigs.length) return stored;\n return normalizeSizes(panelConfigs.map((p) => p.defaultSize));\n });\n\n const liveSizesRef = useRef<number[]>(committedSizes);\n\n useEffect(() => {\n liveSizesRef.current = committedSizes;\n }, [committedSizes]);\n\n const updateSizesImperative = useCallback((newSizes: number[]) => {\n liveSizesRef.current = newSizes;\n panelElementsRef.current.forEach((el, idx) => {\n if (idx < newSizes.length) {\n el.style.setProperty('--panel-self-size', `${newSizes[idx]}%`);\n }\n });\n }, []);\n\n const commitSizes = useCallback(\n (newSizes: number[]) => {\n liveSizesRef.current = newSizes;\n setCommittedSizes(newSizes);\n onLayout?.(newSizes);\n if (groupId) {\n if (storageTimeoutRef.current)\n clearTimeout(storageTimeoutRef.current);\n storageTimeoutRef.current = setTimeout(\n () => saveToStorage(groupId, newSizes),\n 120,\n );\n }\n },\n [groupId, onLayout],\n );\n\n // Apply CSS vars to panel elements when committed sizes change\n useLayoutEffect(() => {\n panelElementsRef.current.forEach((el, idx) => {\n if (idx < committedSizes.length) {\n el.style.setProperty('--panel-self-size', `${committedSizes[idx]}%`);\n }\n });\n }, [committedSizes]);\n\n const registerPanelElement = useCallback(\n (index: number, el: HTMLDivElement) => {\n panelElementsRef.current.set(index, el);\n const size = liveSizesRef.current[index];\n if (size !== undefined) {\n el.style.setProperty('--panel-self-size', `${size}%`);\n }\n },\n [],\n );\n\n const unregisterPanelElement = useCallback((index: number) => {\n panelElementsRef.current.delete(index);\n }, []);\n\n const setAnnounceCb = useCallback((text: string) => {\n setAnnounceText(text);\n }, []);\n\n const containerClass = panelGroupVariants({ direction, className });\n\n const ctxValue = {\n direction,\n sizes: committedSizes,\n liveSizesRef,\n panels: panelConfigs,\n groupRef,\n updateSizesImperative,\n commitSizes,\n registerPanelElement,\n unregisterPanelElement,\n setAnnounceText: setAnnounceCb,\n };\n\n const setRef = (el: HTMLDivElement | null) => {\n (groupRef as MutableRefObject<HTMLDivElement | null>).current = el;\n if (typeof outerRef === 'function') outerRef(el);\n else if (outerRef) outerRef.current = el;\n };\n\n // Agent handle for the root PanelGroup.\n const agentHandle = useMemo<ResizableHandle>(\n () => ({\n getSizes: () => [...liveSizesRef.current],\n setSizes: (next) => commitSizes(normalizeSizes(next)),\n }),\n [commitSizes],\n );\n useAgentRegistration(resizableAgent, agentHandle, id);\n\n return (\n <ResizableContext.Provider value={ctxValue}>\n <div\n ref={setRef}\n className={containerClass}\n data-component=\"resizable\"\n data-component-id={id}\n data-panel-group\n data-direction={direction}\n >\n {processedChildren}\n <span className=\"ds:sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {announceText}\n </span>\n </div>\n </ResizableContext.Provider>\n );\n },\n);\n\nPanelGroup.displayName = 'PanelGroup';\n\n// ─── Panel ────────────────────────────────────────────────────────────────────\n\nexport const Panel = forwardRef<PanelHandle, PanelInternalProps>(\n (\n {\n _panelIndex = 0,\n _panelId,\n minSize = 10,\n maxSize = 90,\n children,\n className,\n },\n ref,\n ) => {\n const {\n direction,\n liveSizesRef,\n panels,\n updateSizesImperative,\n commitSizes,\n registerPanelElement,\n unregisterPanelElement,\n } = useResizable();\n\n const panelRef = useRef<HTMLDivElement>(null!);\n\n useEffect(() => {\n const el = panelRef.current;\n if (!el) return;\n registerPanelElement(_panelIndex, el);\n return () => unregisterPanelElement(_panelIndex);\n }, [_panelIndex, registerPanelElement, unregisterPanelElement]);\n\n useImperativeHandle(\n ref,\n () => ({\n resize: (newSize: number) => {\n const currentSizes = [...liveSizesRef.current];\n const clamped = Math.max(minSize, Math.min(maxSize, newSize));\n const diff = clamped - (currentSizes[_panelIndex] ?? 0);\n if (Math.abs(diff) < 0.001) return;\n\n const newSizes = [...currentSizes];\n newSizes[_panelIndex] = clamped;\n\n const otherIndices = currentSizes\n .map((_, i) => i)\n .filter((i) => i !== _panelIndex);\n const otherTotal = otherIndices.reduce(\n (s, i) => s + (currentSizes[i] ?? 0),\n 0,\n );\n otherIndices.forEach((i) => {\n newSizes[i] =\n otherTotal > 0\n ? (currentSizes[i] ?? 0) -\n diff * ((currentSizes[i] ?? 0) / otherTotal)\n : (currentSizes[i] ?? 0) - diff / otherIndices.length;\n });\n\n updateSizesImperative(newSizes);\n commitSizes(newSizes);\n },\n }),\n [\n _panelIndex,\n minSize,\n maxSize,\n panels,\n liveSizesRef,\n updateSizesImperative,\n commitSizes,\n ],\n );\n\n return (\n <div\n ref={panelRef}\n id={_panelId}\n data-panel\n data-panel-index={_panelIndex}\n className={panelVariants({ direction, className })}\n >\n {children}\n </div>\n );\n },\n);\n\nPanel.displayName = 'Panel';\n\n// ─── Handle ───────────────────────────────────────────────────────────────────\n\nexport const Handle = forwardRef<HTMLDivElement, HandleInternalProps>(\n ({ _handleIndex = 0, className }, ref) => {\n const { t, i18n } = useTranslation();\n const {\n direction,\n sizes,\n liveSizesRef,\n panels,\n groupRef,\n updateSizesImperative,\n commitSizes,\n setAnnounceText,\n } = useResizable();\n\n const [isDragging, setIsDragging] = useState(false);\n const dragStateRef = useRef<{\n startX: number;\n startY: number;\n startSizes: number[];\n groupRect: DOMRect;\n } | null>(null);\n const announceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const announceRafRef = useRef<number | null>(null);\n const handleRef = useRef<HTMLDivElement>(null!);\n\n const scheduleAnnounce = useCallback(\n (size: number, immediate = false) => {\n if (announceRafRef.current !== null) {\n cancelAnimationFrame(announceRafRef.current);\n announceRafRef.current = null;\n }\n if (announceTimeoutRef.current) {\n clearTimeout(announceTimeoutRef.current);\n announceTimeoutRef.current = null;\n }\n const formatted = new Intl.NumberFormat(i18n.language, {\n style: 'percent',\n }).format(size / 100);\n const text = t('resizable.sizeAnnounce', { percent: formatted });\n if (immediate) {\n setAnnounceText(text);\n } else {\n // rAF coalesces calls within the same frame; 200ms debounce prevents spam\n announceRafRef.current = requestAnimationFrame(() => {\n announceRafRef.current = null;\n announceTimeoutRef.current = setTimeout(\n () => setAnnounceText(text),\n 200,\n );\n });\n }\n },\n [t, i18n.language, setAnnounceText],\n );\n\n const isRtl = useCallback(() => {\n if (!groupRef.current) return false;\n return getComputedStyle(groupRef.current).direction === 'rtl';\n }, [groupRef]);\n\n const onPointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!groupRef.current) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n e.currentTarget.style.setProperty('touch-action', 'none');\n dragStateRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startSizes: [...liveSizesRef.current],\n groupRect: groupRef.current.getBoundingClientRect(),\n };\n setIsDragging(true);\n };\n\n const onPointerMove = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragStateRef.current) return;\n const { startX, startY, startSizes, groupRect } = dragStateRef.current;\n const isHorizontal = direction === 'horizontal';\n const groupSize = isHorizontal ? groupRect.width : groupRect.height;\n if (groupSize === 0) return;\n\n const rawDelta = isHorizontal ? e.clientX - startX : e.clientY - startY;\n const effectiveDelta = isHorizontal && isRtl() ? -rawDelta : rawDelta;\n const percentDelta = (effectiveDelta / groupSize) * 100;\n\n const newSizes = computeNewSizes(\n startSizes,\n _handleIndex,\n percentDelta,\n panels,\n groupSize,\n );\n\n updateSizesImperative(newSizes);\n\n if (handleRef.current) {\n const rounded = Math.round(newSizes[_handleIndex]);\n handleRef.current.setAttribute('aria-valuenow', String(rounded));\n handleRef.current.setAttribute(\n 'aria-valuetext',\n new Intl.NumberFormat(i18n.language, { style: 'percent' }).format(\n rounded / 100,\n ),\n );\n }\n\n scheduleAnnounce(newSizes[_handleIndex]);\n };\n\n const onPointerUp = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragStateRef.current) return;\n e.currentTarget.releasePointerCapture(e.pointerId);\n e.currentTarget.style.removeProperty('touch-action');\n dragStateRef.current = null;\n setIsDragging(false);\n const finalSizes = liveSizesRef.current;\n commitSizes(finalSizes);\n scheduleAnnounce(finalSizes[_handleIndex], true);\n };\n\n const onPointerCancel = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragStateRef.current) return;\n e.currentTarget.releasePointerCapture(e.pointerId);\n e.currentTarget.style.removeProperty('touch-action');\n dragStateRef.current = null;\n setIsDragging(false);\n const finalSizes = liveSizesRef.current;\n commitSizes(finalSizes);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n const li = _handleIndex;\n const ri = _handleIndex + 1;\n if (li >= panels.length || ri >= panels.length) return;\n\n const lc = panels[li];\n const rc = panels[ri];\n const isHorizontal = direction === 'horizontal';\n const rtl = isHorizontal && isRtl();\n const step = e.shiftKey ? 10 : 1;\n const current = [...liveSizesRef.current];\n\n const growLeft = (amount = step): number[] | null => {\n const avail = Math.min(\n amount,\n lc.maxSize - current[li],\n current[ri] - (rc.collapsible ? rc.collapsedSize : rc.minSize),\n );\n if (avail <= 0) return null;\n const ns = [...current];\n ns[li] += avail;\n ns[ri] -= avail;\n return ns;\n };\n\n const shrinkLeft = (amount = step): number[] | null => {\n const lMin = lc.collapsible ? lc.collapsedSize : lc.minSize;\n const avail = Math.min(amount, current[li] - lMin);\n if (avail <= 0) return null;\n const ns = [...current];\n ns[li] -= avail;\n ns[ri] += avail;\n return ns;\n };\n\n let newSizes: number[] | null = null;\n\n switch (e.key) {\n case 'ArrowRight':\n if (!isHorizontal) break;\n e.preventDefault();\n newSizes = rtl ? shrinkLeft() : growLeft();\n break;\n case 'ArrowLeft':\n if (!isHorizontal) break;\n e.preventDefault();\n newSizes = rtl ? growLeft() : shrinkLeft();\n break;\n case 'ArrowDown':\n if (isHorizontal) break;\n e.preventDefault();\n newSizes = growLeft();\n break;\n case 'ArrowUp':\n if (isHorizontal) break;\n e.preventDefault();\n newSizes = shrinkLeft();\n break;\n case 'Home': {\n e.preventDefault();\n const lMin = lc.collapsible ? lc.collapsedSize : lc.minSize;\n const delta = current[li] - lMin;\n if (delta > 0) {\n const ns = [...current];\n ns[li] = lMin;\n ns[ri] += delta;\n newSizes = ns;\n }\n break;\n }\n case 'End': {\n e.preventDefault();\n const rMin = rc.collapsible ? rc.collapsedSize : rc.minSize;\n const avail = Math.min(lc.maxSize - current[li], current[ri] - rMin);\n if (avail > 0) {\n const ns = [...current];\n ns[li] += avail;\n ns[ri] -= avail;\n newSizes = ns;\n }\n break;\n }\n case 'Enter': {\n e.preventDefault();\n const panel = lc.collapsible ? lc : rc.collapsible ? rc : null;\n const pIdx = lc.collapsible ? li : rc.collapsible ? ri : -1;\n if (!panel || pIdx < 0) break;\n const partner = pIdx === li ? ri : li;\n const isCollapsed =\n Math.abs(current[pIdx] - panel.collapsedSize) < 0.5;\n const total = current[li] + current[ri];\n const ns = [...current];\n if (isCollapsed) {\n ns[pIdx] = panel.minSize;\n ns[partner] = total - panel.minSize;\n } else {\n ns[pIdx] = panel.collapsedSize;\n ns[partner] = total - panel.collapsedSize;\n }\n newSizes = ns;\n break;\n }\n default:\n break;\n }\n\n if (newSizes) {\n updateSizesImperative(newSizes);\n commitSizes(newSizes);\n scheduleAnnounce(newSizes[li], true);\n }\n };\n\n const li = _handleIndex;\n const ri = _handleIndex + 1;\n const leftPanel = panels[li];\n const rightPanel = panels[ri];\n const orientation =\n direction === 'horizontal'\n ? ('horizontal' as const)\n : ('vertical' as const);\n\n const formatValueText = (size: number) =>\n new Intl.NumberFormat(i18n.language, { style: 'percent' }).format(\n size / 100,\n );\n\n const setRefs = (el: HTMLDivElement | null) => {\n (handleRef as MutableRefObject<HTMLDivElement | null>).current = el;\n if (typeof ref === 'function') ref(el);\n else if (ref) ref.current = el;\n };\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- separator handle is keyboard-actionable via arrow keys to resize the adjacent panels\n <div\n ref={setRefs}\n role=\"separator\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- separator handle is keyboard-actionable via arrow keys to resize the adjacent panels\n tabIndex={0}\n aria-orientation={orientation}\n aria-valuemin={\n leftPanel\n ? leftPanel.collapsible\n ? leftPanel.collapsedSize\n : leftPanel.minSize\n : 0\n }\n aria-valuemax={leftPanel?.maxSize ?? 100}\n aria-valuenow={Math.round(sizes[li] ?? 0)}\n aria-valuetext={formatValueText(sizes[li] ?? 0)}\n aria-controls={\n [leftPanel?.id, rightPanel?.id].filter(Boolean).join(' ') || undefined\n }\n aria-label={t('resizable.resizeLabel')}\n data-dragging={isDragging ? '' : undefined}\n className={handleVariants({ orientation, className })}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n onKeyDown={onKeyDown}\n />\n );\n },\n);\n\nHandle.displayName = 'Handle';\n"],"names":["ResizableContext","createContext","useResizable","ctx","useContext","resizableAgent","handle","args","STORAGE_PREFIX","loadFromStorage","groupId","raw","parsed","saveToStorage","sizes","normalizeSizes","total","a","b","s","computeNewSizes","currentSizes","handleIndex","deltaPercent","panels","groupSizePx","li","ri","lc","rc","collapseThreshold","newLeft","newRight","lMin","rMin","handleVariants","cva","panelGroupVariants","panelVariants","PanelGroup","forwardRef","direction","id","onLayout","className","children","outerRef","baseId","useId","groupRef","useRef","panelElementsRef","storageTimeoutRef","announceText","setAnnounceText","useState","panelConfigs","processedChildren","useMemo","configs","panelIdx","handleIdx","walk","child","isValidElement","Panel","idx","p","cloneElement","Handle","Children","committedSizes","setCommittedSizes","stored","liveSizesRef","useEffect","updateSizesImperative","useCallback","newSizes","el","commitSizes","useLayoutEffect","registerPanelElement","index","size","unregisterPanelElement","setAnnounceCb","text","containerClass","ctxValue","setRef","agentHandle","next","useAgentRegistration","jsx","jsxs","_panelIndex","_panelId","minSize","maxSize","ref","panelRef","useImperativeHandle","newSize","clamped","diff","otherIndices","_","i","otherTotal","_handleIndex","t","i18n","useTranslation","isDragging","setIsDragging","dragStateRef","announceTimeoutRef","announceRafRef","handleRef","scheduleAnnounce","immediate","formatted","isRtl","onPointerDown","e","onPointerMove","startX","startY","startSizes","groupRect","isHorizontal","groupSize","rawDelta","percentDelta","rounded","onPointerUp","finalSizes","onPointerCancel","onKeyDown","rtl","step","current","growLeft","amount","avail","ns","shrinkLeft","delta","panel","pIdx","partner","isCollapsed","leftPanel","rightPanel","orientation","formatValueText"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-input-CIA6pPfn.js","sources":["../../src/components/search-input/search-input.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n type ChangeEvent,\n type FocusEvent,\n type FormEvent,\n type KeyboardEvent,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Search, X } from 'lucide-react';\nimport { TextInput } from '../text-input/text-input';\nimport { Spinner } from '../spinner/spinner';\nimport { useFormField } from '../form-field/form-field-context';\nimport { useDebouncedCallback } from '../_shared/use-debounced-callback';\n\nconst rootVariants = cva('ds:relative ds:w-full');\n\nconst clearButtonVariants = cva(\n [\n 'ds:absolute ds:inset-y-0 ds:end-0 ds:pe-3',\n 'ds:inline-flex ds:items-center ds:justify-center ds:pointer-events-auto',\n 'ds:text-muted-foreground ds:hover:text-foreground',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst expandButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:shrink-0',\n 'ds:size-[var(--min-target-size)] ds:rounded-[var(--radius-sm)]',\n 'ds:bg-background ds:border ds:border-border ds:text-muted-foreground',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:text-foreground ds:hover:bg-muted',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst expandableWrapperVariants = cva(\n [\n 'ds:inline-flex ds:items-center',\n 'ds:transition-[width] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n ].join(' '),\n);\n\ntype SearchInputRole = 'combobox';\n\nexport interface SearchInputProps {\n value?: string;\n defaultValue?: string;\n onChange?: (debouncedValue: string) => void;\n onInput?: (rawValue: string) => void;\n debounceMs?: number;\n isLoading?: boolean;\n variant?: 'inline' | 'expandable';\n size?: 'sm' | 'md' | 'lg';\n globalShortcut?: string;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n name?: string;\n id?: string;\n form?: string;\n autoComplete?: string;\n autoFocus?: boolean;\n 'aria-label'?: string;\n role?: SearchInputRole;\n 'aria-expanded'?: boolean;\n 'aria-controls'?: string;\n 'aria-activedescendant'?: string;\n}\n\nfunction isEditableElement(el: Element | null): boolean {\n if (!el) return false;\n const tag = el.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n if ((el as HTMLElement).isContentEditable) return true;\n return false;\n}\n\n/**\n * Imperative handle for agent-readiness + programmatic control.\n *\n * The forwarded ref intersects the underlying `HTMLInputElement` so\n * existing consumers (`ref.current.focus()` etc.) keep working — we\n * mutate the live input element to add the curated methods rather than\n * returning a new object from `useImperativeHandle`.\n */\nexport interface SearchInputHandle {\n getQuery: () => string;\n setQuery: (query: string) => void;\n clear: () => void;\n submit: () => void;\n /**\n * Expand-aware focus. Named `agentFocus` rather than `focus` because\n * the handle is grafted onto the underlying `HTMLInputElement` and the\n * native `focus` slot is non-writable.\n */\n agentFocus: () => void;\n}\n\n/**\n * Backwards-compatible alias retained for one release cycle — the\n * forwarded ref's value is structurally an `HTMLInputElement` with the\n * `SearchInputHandle` methods grafted on. Consumers can read it as\n * either type via a cast.\n */\nexport type SearchInputRefValue = HTMLInputElement & SearchInputHandle;\n\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n onInput,\n debounceMs = 200,\n isLoading = false,\n variant = 'inline',\n size = 'md',\n globalShortcut,\n placeholder,\n disabled,\n className,\n name,\n id,\n form,\n autoComplete = 'off',\n autoFocus,\n role,\n ...ariaProps\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const ctx = useFormField();\n const inputId = id ?? ctx.id;\n const effectiveDisabled = Boolean(ctx.disabled || disabled);\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n String(defaultValue ?? ''),\n );\n const rawValue = isControlled ? String(value) : internalValue;\n const hasValue = rawValue.length > 0;\n\n const innerRef = useRef<HTMLInputElement | null>(null);\n\n const [expanded, setExpanded] = useState<boolean>(\n variant === 'inline' || hasValue,\n );\n const pendingFocusRef = useRef<boolean>(false);\n\n useLayoutEffect(() => {\n if (pendingFocusRef.current && innerRef.current) {\n innerRef.current.focus();\n pendingFocusRef.current = false;\n }\n });\n\n const debouncedOnChange = useDebouncedCallback((next: string) => {\n onChange?.(next);\n }, debounceMs);\n\n const fireImmediate = useCallback(\n (next: string) => {\n debouncedOnChange.cancel();\n onChange?.(next);\n },\n [debouncedOnChange, onChange],\n );\n\n const commitValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n },\n [isControlled],\n );\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const next = event.target.value;\n commitValue(next);\n if (next === '') {\n fireImmediate('');\n } else {\n debouncedOnChange(next);\n }\n };\n\n const handleNativeInput = (event: FormEvent<HTMLInputElement>) => {\n const next = event.currentTarget.value;\n onInput?.(next);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key !== 'Escape') return;\n if (event.nativeEvent.isComposing) return;\n if (!hasValue) return;\n event.preventDefault();\n event.stopPropagation();\n commitValue('');\n onInput?.('');\n fireImmediate('');\n innerRef.current?.focus();\n };\n\n const handleClear = () => {\n commitValue('');\n onInput?.('');\n fireImmediate('');\n innerRef.current?.focus();\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n if (variant !== 'expandable') return;\n if (event.currentTarget.value === '') {\n setExpanded(false);\n }\n };\n\n const focusInput = useCallback(() => {\n if (variant === 'expandable' && !expanded) {\n pendingFocusRef.current = true;\n setExpanded(true);\n } else {\n innerRef.current?.focus();\n }\n }, [variant, expanded]);\n\n // Build a `SearchInputRefValue` (HTMLInputElement & SearchInputHandle)\n // by attaching the curated agent methods onto the live input element.\n // Returning a fresh object would break existing consumers who do\n // `ref.current.value`, `ref.current.focus()`, etc. Instead we extend\n // the underlying DOM node with the handle methods.\n useImperativeHandle(ref, () => {\n const node = innerRef.current;\n // `useImperativeHandle` may not return null in strict typing, but\n // the cast lets us yield the live DOM node on mount and `null`\n // before mount — React itself tolerates this.\n if (!node) return null as unknown as HTMLInputElement;\n // `focus` is a non-writable own property on HTMLInputElement, so\n // we use `defineProperty` (which honours `writable: true`) to\n // graft the curated methods. The native `focus()` is the\n // canonical one — for `variant=\"expandable\"` consumers should\n // call the named curated method via `agentRef` rather than via\n // the DOM ref.\n const extras: Record<string, (...args: unknown[]) => unknown> = {\n getQuery: () => rawValue,\n setQuery: (next: unknown) => {\n const value = String(next ?? '');\n commitValue(value);\n onInput?.(value);\n fireImmediate(value);\n },\n clear: () => {\n commitValue('');\n onInput?.('');\n fireImmediate('');\n innerRef.current?.focus();\n },\n submit: () => {\n fireImmediate(rawValue);\n },\n // Named `agentFocus` to avoid clashing with the native, read-only\n // `HTMLElement.focus` slot. The adapter wires `actions.focus` to\n // `agentFocus` so the expandable-aware path is preserved.\n agentFocus: () => {\n focusInput();\n },\n };\n for (const [name, fn] of Object.entries(extras)) {\n Object.defineProperty(node, name, {\n value: fn,\n configurable: true,\n writable: true,\n enumerable: false,\n });\n }\n return node;\n }, [rawValue, commitValue, onInput, fireImmediate, focusInput]);\n\n useEffect(() => {\n if (!globalShortcut) return;\n const onKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== globalShortcut) return;\n if (event.isComposing) return;\n if (event.defaultPrevented) return;\n if (isEditableElement(document.activeElement)) return;\n event.preventDefault();\n focusInput();\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [globalShortcut, focusInput]);\n\n const clearLabel = t('inputs.search.clear', 'Clear search');\n const loadingLabel = t('inputs.search.loading', 'Searching…');\n const defaultPlaceholder = t('inputs.search.placeholder', 'Search…');\n const resolvedPlaceholder = placeholder ?? defaultPlaceholder;\n\n if (variant === 'expandable' && !expanded) {\n return (\n <div\n data-component=\"search-input\"\n data-component-id={id}\n className={expandableWrapperVariants({ className })}\n >\n <button\n type=\"button\"\n aria-label={resolvedPlaceholder}\n aria-expanded={false}\n aria-controls={inputId}\n disabled={effectiveDisabled}\n onClick={() => {\n pendingFocusRef.current = true;\n setExpanded(true);\n }}\n className={expandButtonVariants()}\n >\n <Search aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n </div>\n );\n }\n\n const comboboxAria =\n role === 'combobox'\n ? {\n role: 'combobox' as const,\n 'aria-expanded': ariaProps['aria-expanded'],\n 'aria-controls': ariaProps['aria-controls'],\n 'aria-activedescendant': ariaProps['aria-activedescendant'],\n }\n : undefined;\n\n const showClear = hasValue && !isLoading && !effectiveDisabled;\n const endSlot = isLoading ? (\n <Spinner size=\"sm\" label={loadingLabel} />\n ) : showClear ? (\n <span className=\"ds:inline-block ds:size-4\" aria-hidden=\"true\" />\n ) : undefined;\n\n return (\n <div\n data-component=\"search-input\"\n data-component-id={id}\n className={rootVariants({ className })}\n >\n <TextInput\n ref={innerRef}\n id={inputId}\n type=\"search\"\n size={size}\n value={rawValue}\n disabled={effectiveDisabled}\n placeholder={resolvedPlaceholder}\n name={name}\n form={form}\n autoComplete={autoComplete}\n // eslint-disable-next-line jsx-a11y/no-autofocus -- forwarding caller-supplied autoFocus to the inner TextInput\n autoFocus={autoFocus}\n startAdornment={<Search />}\n endAdornment={endSlot}\n clearable={false}\n onChange={handleChange}\n onInput={handleNativeInput}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n aria-label={ariaProps['aria-label']}\n aria-busy={isLoading || undefined}\n {...comboboxAria}\n />\n {showClear ? (\n <button\n type=\"button\"\n aria-label={clearLabel}\n onClick={handleClear}\n className={clearButtonVariants()}\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : null}\n <span\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {isLoading ? loadingLabel : ''}\n </span>\n </div>\n );\n },\n);\n\nSearchInput.displayName = 'SearchInput';\n"],"names":["rootVariants","cva","clearButtonVariants","expandButtonVariants","expandableWrapperVariants","isEditableElement","el","tag","SearchInput","forwardRef","value","defaultValue","onChange","onInput","debounceMs","isLoading","variant","size","globalShortcut","placeholder","disabled","className","name","id","form","autoComplete","autoFocus","role","ariaProps","ref","t","useTranslation","ctx","useFormField","inputId","effectiveDisabled","isControlled","internalValue","setInternalValue","useState","rawValue","hasValue","innerRef","useRef","expanded","setExpanded","pendingFocusRef","useLayoutEffect","debouncedOnChange","useDebouncedCallback","next","fireImmediate","useCallback","commitValue","handleChange","event","handleNativeInput","handleKeyDown","_a","handleClear","handleBlur","focusInput","useImperativeHandle","node","extras","fn","useEffect","onKeyDown","clearLabel","loadingLabel","defaultPlaceholder","resolvedPlaceholder","jsx","Search","comboboxAria","showClear","endSlot","Spinner","jsxs","TextInput","X"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signature-capture-DjMlFOzS.js","sources":["../../src/components/signature-capture/signature-capture.agent.ts","../../src/components/signature-capture/signature-capture.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { SignatureCaptureHandle } from './signature-capture';\n\nexport const signatureCaptureAgent: AgentAdapter<SignatureCaptureHandle> = {\n id: 'signature-capture',\n capabilities: ['edit_inline', 'submit'],\n state: {\n isEmpty: {\n type: 'boolean',\n description: 'True when no signature has been drawn or typed.',\n read: (handle) => handle.isEmpty(),\n },\n },\n actions: {\n clear: {\n safety: 'destructive',\n description: 'Erase the current signature. Loses unsaved input.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n undo: {\n safety: 'write',\n description: 'Undo the last stroke.',\n invoke: (handle) => {\n handle.undo();\n },\n },\n confirm: {\n safety: 'write',\n description: 'Commit the signature and return its serialised payload.',\n invoke: (handle) => handle.confirm(),\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'signature-capture' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* SignatureCapture — thin React wrapper over signature_pad. */\n/* */\n/* - Library: `signature_pad` (08-third-party §Signature Pad). We */\n/* instantiate one pad per mounted canvas and expose imperative */\n/* clear / undo / isEmpty / confirm verbs to the consumer. */\n/* - Colors: `penColor` / `backgroundColor` default to */\n/* `--foreground` / `--background` via `getComputedStyle()`. Theme */\n/* switches are observed via a MutationObserver on `<html class>` */\n/* so the ink recolours when the theme flips. */\n/* - DPR scaling: canvas attribute `width/height = cssSize * DPR`; the */\n/* 2D context is scaled by the same factor. A `ResizeObserver` */\n/* replays strokes via `fromData()` on re-scale so nothing is lost. */\n/* - Typed fallback: keyboard-only path renders a text input styled in */\n/* italic `var(--font-sans)` (per 23-constraints §10 — serif is */\n/* marketing only). On confirm we render the string to an offscreen */\n/* canvas for the PNG/SVG export. */\n/* - Confirm payload: `{ png, svg, widthMm, heightMm, capturedAt, */\n/* sha256, strokes? }`. `sha256` is the SubtleCrypto digest of the */\n/* PNG bytes — tamper-evident for audit trails. */\n/* - Security: no `fetch` / `XMLHttpRequest` / `localStorage` / */\n/* `sessionStorage` in this file — the consumer owns persistence. */\n/* */\n/* TODO: */\n/* - 3× DPI re-render for print: currently `toDataURL('image/png')` */\n/* exports the live canvas (already at DPR). A proper 300-DPI */\n/* pipeline would create an offscreen canvas at `cssSize × 3` and */\n/* replay strokes via `fromData()` — deferred pending the print */\n/* bridge landing. */\n/* - Typed-fallback canvas font can't read CSS variables directly */\n/* (Canvas2D resolves fonts at paint time and won't expand */\n/* `var(--font-size-2xl)`); we use a fixed `32px italic` + the */\n/* user's font stack, which is visually close but not */\n/* theme-reactive. Will migrate once the typography tokens expose */\n/* a resolved `font` shorthand. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from 'react';\nimport SignaturePad from 'signature_pad';\nimport type { PointGroup } from 'signature_pad';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { signatureCaptureAgent } from './signature-capture.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface SignatureConfirmPayload {\n /** Data URL of the captured signature rendered as PNG. */\n png: string;\n /** SVG string trimmed to the stroke bounding box. */\n svg: string;\n /** Physical width in millimetres, derived from CSS px. */\n widthMm: number;\n /** Physical height in millimetres, derived from CSS px. */\n heightMm: number;\n /** ISO-8601 UTC timestamp for when `confirm()` resolved. */\n capturedAt: string;\n /** Hex-encoded SHA-256 digest of the PNG bytes. */\n sha256: string;\n /** Raw stroke data from `signature_pad.toData()` — optional for replays. */\n strokes?: PointGroup[];\n}\n\nexport interface SignatureCaptureProps {\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** Called with the export payload when the user confirms the signature. */\n onConfirm?: (payload: SignatureConfirmPayload) => void;\n /** Called after the pad is cleared (explicit user action). */\n onClear?: () => void;\n /** Called when the user starts drawing a new stroke. */\n onStart?: () => void;\n /** CSS width of the pad. Default 400. */\n width?: number | string;\n /** CSS height of the pad. Default 200. */\n height?: number | string;\n /** Pen colour override — defaults to `var(--foreground)`. */\n penColor?: string;\n /** Background override — defaults to `var(--background)`. */\n backgroundColor?: string;\n /** Show the typed-name fallback toggle. Default `true`. */\n allowTypedFallback?: boolean;\n /** Disable the entire component. */\n disabled?: boolean;\n /** Accessible label for the pad region. */\n ariaLabel?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport interface SignatureCaptureHandle {\n clear: () => void;\n undo: () => void;\n isEmpty: () => boolean;\n confirm: () => Promise<SignatureConfirmPayload | null>;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva(\n [\n 'ds:signature-capture-alfadocs ds:flex ds:flex-col',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)]',\n 'ds:p-[var(--spacing-sm)]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst padFrameVariants = cva(\n [\n 'ds:relative ds:block',\n 'ds:inline-size-[var(--signature-width)]',\n 'ds:block-size-[var(--signature-height)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[var(--background)]',\n 'ds:overflow-hidden',\n 'ds:touch-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst canvasVariants = cva(\n [\n 'ds:block',\n 'ds:inline-size-full',\n 'ds:block-size-full',\n 'ds:touch-none',\n 'ds:select-none',\n ].join(' '),\n);\n\nconst toolbarVariants = cva(\n ['ds:flex ds:items-center ds:flex-wrap ds:gap-[var(--spacing-xs)]'].join(' '),\n);\n\nconst actionButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-block-size-[var(--min-target-size)]',\n 'ds:min-inline-size-[var(--min-target-size)]',\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-transparent ds:text-[var(--foreground)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--muted)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst confirmButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-block-size-[var(--min-target-size)]',\n 'ds:min-inline-size-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--primary-hover)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst typedInputVariants = cva(\n [\n 'ds:block ds:inline-size-full',\n 'ds:min-block-size-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:font-[family-name:var(--font-sans)]',\n 'ds:italic',\n 'ds:tracking-[0.1em]',\n 'ds:text-[length:var(--font-size-lg)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst typedPreviewVariants = cva(\n [\n 'ds:flex ds:items-center ds:justify-center',\n 'ds:inline-size-[var(--signature-width)]',\n 'ds:block-size-[var(--signature-height)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:font-[family-name:var(--font-sans)]',\n 'ds:italic',\n 'ds:tracking-[0.1em]',\n 'ds:text-[length:var(--font-size-2xl)]',\n 'ds:p-[var(--spacing-md)]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\ntype SignatureState = 'empty' | 'drawing' | 'captured' | 'cleared';\n\n/**\n * Resolve a CSS custom property against `document.documentElement`. We\n * can't pass `var(--foreground)` to signature_pad directly — the lib\n * stamps the string straight into `ctx.strokeStyle`, which only accepts\n * concrete colour values. Looking the variable up at runtime keeps the\n * component in tokens-only compliance.\n */\nfunction resolveCssVar(name: string): string {\n if (typeof document === 'undefined') return '';\n const value = getComputedStyle(document.documentElement)\n .getPropertyValue(name)\n .trim();\n return value;\n}\n\nfunction toCssSize(v: number | string | undefined, fallback: string): string {\n if (typeof v === 'number') return `${v}px`;\n if (typeof v === 'string' && v.length > 0) return v;\n return fallback;\n}\n\nfunction parsePxValue(v: string, fallback: number): number {\n const n = parseFloat(v);\n if (!Number.isFinite(n)) return fallback;\n return n;\n}\n\n/** Hex-encode a Uint8Array. */\nfunction toHex(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 1) {\n const b = bytes[i];\n out += b.toString(16).padStart(2, '0');\n }\n return out;\n}\n\n/** Decode a base64 string into bytes without `atob` polyfills. */\nfunction base64ToBytes(b64: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i += 1) bytes[i] = bin.charCodeAt(i);\n return bytes;\n }\n // Fallback — node-style Buffer, gated behind a runtime check.\n const g = globalThis as {\n Buffer?: { from: (s: string, enc: string) => Uint8Array };\n };\n if (g.Buffer) return g.Buffer.from(b64, 'base64');\n return new Uint8Array();\n}\n\nasync function sha256Hex(bytes: Uint8Array): Promise<string> {\n const g = globalThis as { crypto?: Crypto };\n if (g.crypto?.subtle) {\n // Copy the bytes into a fresh ArrayBuffer so the slice is always an\n // ArrayBuffer (never a SharedArrayBuffer) — SubtleCrypto's BufferSource\n // narrowing doesn't accept the latter.\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n const digest = await g.crypto.subtle.digest('SHA-256', copy.buffer);\n return toHex(new Uint8Array(digest));\n }\n // No subtle crypto — return empty so callers can still use the rest\n // of the payload. Test env is expected to stub crypto.subtle.\n return '';\n}\n\n/**\n * Render the typed fallback string onto an offscreen canvas and return\n * it. Used by the confirm path when the user has typed their name\n * instead of drawing. Size is fixed at `32px italic` because Canvas2D\n * resolves fonts eagerly and can't expand `var(--font-size-*)`.\n */\nfunction renderTypedSignatureToCanvas(\n text: string,\n cssWidth: number,\n cssHeight: number,\n penColor: string,\n backgroundColor: string,\n): HTMLCanvasElement {\n const dpr = Math.max(\n 1,\n typeof window !== 'undefined' ? window.devicePixelRatio : 1,\n );\n const canvas = document.createElement('canvas');\n canvas.width = Math.floor(cssWidth * dpr);\n canvas.height = Math.floor(cssHeight * dpr);\n const ctx = canvas.getContext('2d');\n if (!ctx) return canvas;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n // Fill background with the token-resolved colour.\n ctx.fillStyle = backgroundColor || 'transparent';\n ctx.fillRect(0, 0, cssWidth, cssHeight);\n // Draw the typed signature centred.\n ctx.fillStyle = penColor || 'currentColor';\n ctx.font = '32px italic sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, cssWidth / 2, cssHeight / 2, cssWidth - 16);\n return canvas;\n}\n\n/* ------------------------------------------------------------------ */\n/* SignatureCapture */\n/* ------------------------------------------------------------------ */\n\nexport const SignatureCapture = forwardRef<\n SignatureCaptureHandle,\n SignatureCaptureProps\n>(\n (\n {\n id,\n onConfirm,\n onClear,\n onStart,\n width = 400,\n height = 200,\n penColor,\n backgroundColor,\n allowTypedFallback = true,\n disabled = false,\n ariaLabel,\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const rawId = useId();\n const idSafe = useMemo(\n () => `sig-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const liveRegionId = `${idSafe}-live`;\n\n const padFrameRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const signaturePadRef = useRef<SignaturePad | null>(null);\n\n const [mode, setMode] = useState<'draw' | 'typed'>('draw');\n const [typedValue, setTypedValue] = useState('');\n // Retained state — consumers may subscribe to the pad's lifecycle via\n // `onConfirm`/`onClear`/`onStart`; we still track the machine internally\n // so the live region + confirm button stay coherent.\n const signatureStateRef = useRef<SignatureState>('empty');\n const [announcement, setAnnouncement] = useState<string>('');\n const [resolvedPen, setResolvedPen] = useState<string>('');\n const [resolvedBg, setResolvedBg] = useState<string>('');\n\n // Stable callback refs so we can wire signature_pad once without\n // re-instantiating on every render.\n const onStartRef = useRef<SignatureCaptureProps['onStart']>(onStart);\n const onClearRef = useRef<SignatureCaptureProps['onClear']>(onClear);\n const onConfirmRef = useRef<SignatureCaptureProps['onConfirm']>(onConfirm);\n useEffect(() => {\n onStartRef.current = onStart;\n onClearRef.current = onClear;\n onConfirmRef.current = onConfirm;\n }, [onStart, onClear, onConfirm]);\n\n /* ---- Announce helper ---------------------------------------- */\n const announce = useCallback(\n (next: SignatureState) => {\n signatureStateRef.current = next;\n setAnnouncement(t(`signature.state.${next}`));\n },\n [t],\n );\n\n /* ---- Resolve tokens ----------------------------------------- */\n useEffect(() => {\n if (typeof document === 'undefined') return undefined;\n function resolveAll(): void {\n const pen = penColor ?? resolveCssVar('--foreground');\n const bg = backgroundColor ?? resolveCssVar('--background');\n // Fall back to `currentColor` / `transparent` — keyword literals\n // are token-neutral and honour the surrounding theme even when\n // the CSS variable is briefly unavailable (SSR, initial paint).\n setResolvedPen(pen || 'currentColor');\n setResolvedBg(bg || 'transparent');\n }\n resolveAll();\n // Watch for theme-class changes on <html>.\n const mo = new MutationObserver(() => {\n resolveAll();\n });\n mo.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => mo.disconnect();\n }, [penColor, backgroundColor]);\n\n /* ---- Apply colour changes to an existing pad ---------------- */\n useEffect(() => {\n const pad = signaturePadRef.current;\n if (!pad) return;\n if (resolvedPen) pad.penColor = resolvedPen;\n if (resolvedBg) pad.backgroundColor = resolvedBg;\n }, [resolvedPen, resolvedBg]);\n\n /* ---- Instantiate signature_pad ------------------------------ */\n useEffect(() => {\n if (mode !== 'draw') return undefined;\n const canvas = canvasRef.current;\n if (!canvas) return undefined;\n\n const pad = new SignaturePad(canvas, {\n penColor: resolvedPen || 'currentColor',\n backgroundColor: resolvedBg || 'transparent',\n minWidth: 0.5,\n maxWidth: 2.5,\n velocityFilterWeight: 0.7,\n });\n signaturePadRef.current = pad;\n\n const handleBegin = (): void => {\n announce('drawing');\n onStartRef.current?.();\n };\n const handleEnd = (): void => {\n // Keep state as 'drawing' — transition to 'captured' on confirm.\n };\n pad.addEventListener('beginStroke', handleBegin);\n pad.addEventListener('endStroke', handleEnd);\n\n // Initial DPR scale + announcement.\n scaleCanvas(canvas);\n announce('empty');\n\n return () => {\n pad.removeEventListener('beginStroke', handleBegin);\n pad.removeEventListener('endStroke', handleEnd);\n // Clear strokes from memory; 08-third-party §Signature Pad.\n pad.clear();\n pad.off();\n signaturePadRef.current = null;\n };\n // We intentionally re-create the pad only when switching between\n // typed and draw modes. Color updates flow through the effect above.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mode]);\n\n /* ---- Disabled state ----------------------------------------- */\n useEffect(() => {\n const pad = signaturePadRef.current;\n if (!pad) return;\n if (disabled) pad.off();\n else pad.on();\n }, [disabled, mode]);\n\n /* ---- DPR + ResizeObserver ----------------------------------- */\n // Hard-cap backing-store dimensions to bound memory. 4096 px × 4096 px at\n // 4 bytes per pixel is ~67 MB — generous for any realistic signature, but\n // well under the multi-GB allocation a careless or malicious prop could\n // request on a high-DPR display. See security-hardening.mdx.\n const MAX_CANVAS_PX = 4096;\n const scaleCanvas = useCallback(\n (canvas: HTMLCanvasElement) => {\n const rect = canvas.getBoundingClientRect();\n const dpr = Math.max(\n 1,\n typeof window !== 'undefined' ? window.devicePixelRatio : 1,\n );\n const rawWidth = Math.max(1, Math.floor(rect.width * dpr));\n const rawHeight = Math.max(1, Math.floor(rect.height * dpr));\n const targetWidth = Math.min(rawWidth, MAX_CANVAS_PX);\n const targetHeight = Math.min(rawHeight, MAX_CANVAS_PX);\n if (\n import.meta.env.DEV &&\n (rawWidth !== targetWidth || rawHeight !== targetHeight)\n ) {\n // Silent in production; a consumer shipping 10k × 10k probably wants\n // the nudge.\n console.warn(\n `[SignatureCapture] clamped canvas backing store from ${rawWidth}x${rawHeight} to ${targetWidth}x${targetHeight} (cap = ${MAX_CANVAS_PX}px).`,\n );\n }\n if (canvas.width === targetWidth && canvas.height === targetHeight)\n return;\n\n const pad = signaturePadRef.current;\n const prior = pad ? pad.toData() : null;\n canvas.width = targetWidth;\n canvas.height = targetHeight;\n const ctx = canvas.getContext('2d');\n if (ctx) ctx.scale(dpr, dpr);\n if (pad) {\n if (resolvedBg) pad.backgroundColor = resolvedBg;\n if (resolvedPen) pad.penColor = resolvedPen;\n pad.clear();\n if (prior && prior.length > 0) {\n pad.fromData(prior);\n }\n }\n },\n [resolvedBg, resolvedPen],\n );\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return undefined;\n if (typeof ResizeObserver === 'undefined') {\n scaleCanvas(canvas);\n return undefined;\n }\n const ro = new ResizeObserver(() => {\n scaleCanvas(canvas);\n });\n ro.observe(canvas);\n return () => ro.disconnect();\n }, [scaleCanvas]);\n\n /* ---- Imperative handle -------------------------------------- */\n const clear = useCallback(() => {\n const pad = signaturePadRef.current;\n if (pad) pad.clear();\n setTypedValue('');\n announce('cleared');\n onClearRef.current?.();\n }, [announce]);\n\n const undo = useCallback(() => {\n const pad = signaturePadRef.current;\n if (!pad) return;\n const data = pad.toData();\n if (!data || data.length === 0) return;\n data.pop();\n pad.fromData(data);\n if (data.length === 0) announce('empty');\n }, [announce]);\n\n const isEmpty = useCallback((): boolean => {\n if (mode === 'typed') return typedValue.trim().length === 0;\n const pad = signaturePadRef.current;\n return pad ? pad.isEmpty() : true;\n }, [mode, typedValue]);\n\n const confirm =\n useCallback(async (): Promise<SignatureConfirmPayload | null> => {\n const cssWidth = parsePxValue(\n typeof width === 'number' ? `${width}` : String(width),\n 400,\n );\n const cssHeight = parsePxValue(\n typeof height === 'number' ? `${height}` : String(height),\n 200,\n );\n\n let pngDataUrl = '';\n let svgString = '';\n let strokes: PointGroup[] | undefined;\n\n if (mode === 'draw') {\n const pad = signaturePadRef.current;\n if (!pad || pad.isEmpty()) return null;\n pngDataUrl = pad.toDataURL('image/png');\n svgString = pad.toSVG();\n strokes = pad.toData();\n } else {\n const value = typedValue.trim();\n if (value.length === 0) return null;\n const offscreen = renderTypedSignatureToCanvas(\n value,\n cssWidth,\n cssHeight,\n resolvedPen || 'currentColor',\n resolvedBg || 'transparent',\n );\n pngDataUrl = offscreen.toDataURL('image/png');\n // Inline SVG — we can't call toSVG() because signature_pad isn't\n // driving the canvas. Build a minimal SVG with the rendered text.\n const safeText = value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n svgString =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${cssWidth} ${cssHeight}\" width=\"${cssWidth}\" height=\"${cssHeight}\">` +\n `<text x=\"50%\" y=\"50%\" dominant-baseline=\"middle\" text-anchor=\"middle\" font-family=\"sans-serif\" font-style=\"italic\" font-size=\"32\" fill=\"${resolvedPen || 'currentColor'}\" letter-spacing=\"3\">${safeText}</text>` +\n `</svg>`;\n }\n\n // 96 CSS px = 25.4 mm (per W3C CSS absolute length definition).\n const widthMm = (cssWidth * 25.4) / 96;\n const heightMm = (cssHeight * 25.4) / 96;\n const capturedAt = new Date().toISOString();\n\n // Compute SHA-256 of the PNG bytes.\n let sha256 = '';\n if (pngDataUrl) {\n const commaIx = pngDataUrl.indexOf(',');\n const b64 = commaIx >= 0 ? pngDataUrl.slice(commaIx + 1) : '';\n const bytes = base64ToBytes(b64);\n sha256 = await sha256Hex(bytes);\n }\n\n const payload: SignatureConfirmPayload = {\n png: pngDataUrl,\n svg: svgString,\n widthMm,\n heightMm,\n capturedAt,\n sha256,\n strokes,\n };\n\n announce('captured');\n onConfirmRef.current?.(payload);\n return payload;\n }, [mode, typedValue, width, height, resolvedPen, resolvedBg, announce]);\n\n const agentHandle = useMemo<SignatureCaptureHandle>(\n () => ({\n clear,\n undo,\n isEmpty,\n confirm,\n }),\n [clear, undo, isEmpty, confirm],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(signatureCaptureAgent, agentHandle, id);\n\n /* ---- Derived UI state --------------------------------------- */\n const confirmDisabled = disabled || isEmpty();\n // Inline style — permitted per 23-constraints §Runtime-computed\n // dimensions (CSS custom property setter for dynamic width/height\n // from consumer props; the width rule lives in Tailwind arbitrary\n // values that read --signature-width / --signature-height).\n const sizeStyle: CSSProperties = {\n ['--signature-width' as unknown as keyof CSSProperties]: toCssSize(\n width,\n 'var(--signature-default-width)',\n ),\n ['--signature-height' as unknown as keyof CSSProperties]: toCssSize(\n height,\n 'var(--signature-default-height)',\n ),\n } as CSSProperties;\n\n /* ---- Render -------------------------------------------------- */\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel ?? t('signature.padLabel')}\n aria-disabled={disabled || undefined}\n className={[wrapperVariants(), className].filter(Boolean).join(' ')}\n // eslint-disable-next-line react/forbid-dom-props -- runtime-computed pad dimensions\n style={sizeStyle}\n data-component=\"signature-capture\"\n data-component-id={id}\n >\n {mode === 'draw' ? (\n <div ref={padFrameRef} className={padFrameVariants()}>\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={t('signature.padLabel')}\n className={canvasVariants()}\n data-testid=\"signature-canvas\"\n />\n </div>\n ) : (\n <label className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)]\">\n {t('signature.typedFallback.label')}\n </span>\n <input\n type=\"text\"\n value={typedValue}\n onChange={(e) => {\n setTypedValue(e.target.value);\n if (e.target.value.length > 0) announce('drawing');\n else announce('empty');\n }}\n placeholder={t('signature.typedFallback.placeholder')}\n aria-label={t('signature.typedFallback.label')}\n disabled={disabled}\n className={typedInputVariants()}\n data-testid=\"signature-typed-input\"\n />\n {typedValue ? (\n <div className={typedPreviewVariants()} aria-hidden=\"true\">\n {typedValue}\n </div>\n ) : null}\n </label>\n )}\n\n {/* Live region — state transitions (empty, drawing, captured, cleared) */}\n <div\n id={liveRegionId}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n data-testid=\"signature-live\"\n >\n {announcement}\n </div>\n\n <div\n className={toolbarVariants()}\n role=\"group\"\n aria-label={t('signature.padLabel')}\n >\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return;\n clear();\n }}\n aria-disabled={disabled || undefined}\n className={actionButtonVariants()}\n >\n {t('signature.clear')}\n </button>\n {mode === 'draw' ? (\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return;\n undo();\n }}\n aria-disabled={disabled || undefined}\n className={actionButtonVariants()}\n >\n {t('signature.undo')}\n </button>\n ) : null}\n {allowTypedFallback ? (\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return;\n setTypedValue('');\n setMode((m) => (m === 'draw' ? 'typed' : 'draw'));\n announce('cleared');\n }}\n aria-disabled={disabled || undefined}\n className={actionButtonVariants()}\n aria-pressed={mode === 'typed'}\n >\n {mode === 'draw'\n ? t('signature.typedFallback.toggle')\n : t('signature.typedFallback.toggleDraw')}\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={() => {\n if (confirmDisabled) return;\n void confirm();\n }}\n aria-disabled={confirmDisabled || undefined}\n aria-describedby={liveRegionId}\n className={confirmButtonVariants()}\n data-testid=\"signature-confirm\"\n >\n {t('signature.confirm')}\n </button>\n </div>\n </div>\n );\n },\n);\n\nSignatureCapture.displayName = 'SignatureCapture';\n\nexport {\n wrapperVariants as signatureWrapperVariants,\n actionButtonVariants as signatureActionButtonVariants,\n confirmButtonVariants as signatureConfirmButtonVariants,\n};\n"],"names":["signatureCaptureAgent","handle","wrapperVariants","cva","padFrameVariants","canvasVariants","toolbarVariants","actionButtonVariants","confirmButtonVariants","typedInputVariants","typedPreviewVariants","resolveCssVar","name","toCssSize","v","fallback","parsePxValue","n","toHex","bytes","out","i","b","base64ToBytes","b64","bin","g","sha256Hex","_a","copy","digest","renderTypedSignatureToCanvas","text","cssWidth","cssHeight","penColor","backgroundColor","dpr","canvas","ctx","SignatureCapture","forwardRef","id","onConfirm","onClear","onStart","width","height","allowTypedFallback","disabled","ariaLabel","className","ref","t","useTranslation","rawId","useId","liveRegionId","useMemo","padFrameRef","useRef","canvasRef","signaturePadRef","mode","setMode","useState","typedValue","setTypedValue","signatureStateRef","announcement","setAnnouncement","resolvedPen","setResolvedPen","resolvedBg","setResolvedBg","onStartRef","onClearRef","onConfirmRef","useEffect","announce","useCallback","next","resolveAll","pen","bg","mo","pad","SignaturePad","handleBegin","handleEnd","scaleCanvas","MAX_CANVAS_PX","rect","rawWidth","rawHeight","targetWidth","targetHeight","prior","ro","clear","undo","data","isEmpty","confirm","pngDataUrl","svgString","strokes","value","safeText","widthMm","heightMm","capturedAt","sha256","commaIx","payload","agentHandle","useImperativeHandle","useAgentRegistration","confirmDisabled","sizeStyle","jsxs","jsx","m"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stepper-progress-jFY8BSf7.js","sources":["../../src/components/stepper-progress/stepper-progress.agent.ts","../../src/components/stepper-progress/stepper-progress.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — StepperProgress. */\n/* */\n/* Pure indicator — the component itself has no internal step-change */\n/* affordance. The adapter exposes the active step + total and forwards */\n/* goto/next/previous to the consumer-supplied onStepChange handler so */\n/* an agent can drive a hosting wizard by step index. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { StepperProgressHandle } from './stepper-progress';\n\nexport const stepperProgressAgent: AgentAdapter<StepperProgressHandle> = {\n id: 'stepper-progress',\n capabilities: ['navigate'],\n state: {\n currentStep: {\n type: 'number',\n descriptionKey: 'ui.agent.stepperProgress.state.currentStep',\n description: 'Zero-indexed active step.',\n read: (handle) => handle.getCurrentStep(),\n },\n totalSteps: {\n type: 'number',\n descriptionKey: 'ui.agent.stepperProgress.state.totalSteps',\n description: 'Total number of steps in the flow.',\n read: (handle) => handle.getTotalSteps(),\n },\n },\n actions: {\n goto_step: {\n safety: 'read',\n argsType: '{ step: number }',\n descriptionKey: 'ui.agent.stepperProgress.actions.gotoStep',\n description:\n 'Request the host to activate the given step via onStepChange. No-op when no handler is wired.',\n invoke: (handle, args: { step: number }) => {\n handle.gotoStep(args.step);\n },\n },\n next: {\n safety: 'read',\n descriptionKey: 'ui.agent.stepperProgress.actions.next',\n description: 'Request the host to advance one step via onStepChange.',\n invoke: (handle) => {\n handle.next();\n },\n },\n previous: {\n safety: 'read',\n descriptionKey: 'ui.agent.stepperProgress.actions.previous',\n description: 'Request the host to retreat one step via onStepChange.',\n invoke: (handle) => {\n handle.previous();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'stepper-progress',\n description: 'Marks the StepperProgress root.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport type { StepSpec, StepState } from '../_shared/stepper';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { stepperProgressAgent } from './stepper-progress.agent';\n\n/* -------------------------------------------------------------------- */\n/* StepperProgress */\n/* */\n/* A lightweight \"Step N of M — {label}\" caption + fill bar. Pure */\n/* indicator — no revisit, no per-step click targets. For flows that */\n/* need editable completed steps, reach for `StepperAccordion`. */\n/* -------------------------------------------------------------------- */\n\ntype Size = 'sm' | 'default';\ntype CaptionPosition = 'top' | 'bottom';\ntype Tone = 'progress' | 'error' | 'complete';\n\nconst rootVariants = cva('ds:flex ds:w-full', {\n variants: {\n captionPosition: {\n top: 'ds:flex-col ds:gap-[var(--spacing-xs)]',\n bottom: 'ds:flex-col-reverse ds:gap-[var(--spacing-xs)]',\n },\n },\n defaultVariants: { captionPosition: 'top' },\n});\n\nconst trackVariants = cva(\n 'ds:relative ds:w-full ds:overflow-hidden ds:rounded-[var(--radius-full)] ds:bg-[var(--muted)]',\n {\n variants: {\n size: {\n sm: 'ds:h-[var(--spacing-xs)]',\n default: 'ds:h-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { size: 'default' },\n },\n);\n\nconst fillVariants = cva(\n [\n 'ds:block ds:h-full ds:rounded-[var(--radius-full)]',\n 'ds:[inline-size:calc(var(--stepper-progress-value,0)*1%)]',\n 'ds:transition-[inline-size,background-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n tone: {\n progress: 'ds:bg-[var(--primary)]',\n error: 'ds:bg-[var(--destructive)]',\n complete: 'ds:bg-[var(--success,var(--primary))]',\n },\n },\n defaultVariants: { tone: 'progress' },\n },\n);\n\nconst captionVariants = cva(\n 'ds:flex ds:items-baseline ds:gap-[var(--spacing-sm)] ds:flex-wrap',\n {\n variants: {\n tone: {\n progress: 'ds:text-[var(--foreground)]',\n error: 'ds:text-[var(--destructive)]',\n complete: 'ds:text-[var(--foreground)]',\n },\n },\n defaultVariants: { tone: 'progress' },\n },\n);\n\nexport interface StepperProgressProps\n extends\n Omit<ComponentPropsWithoutRef<'div'>, 'aria-label'>,\n VariantProps<typeof trackVariants>,\n VariantProps<typeof rootVariants> {\n /** Active step (0-indexed). */\n activeStep: number;\n /** Step specs — `label` is used in the caption for the active step. */\n steps: StepSpec[];\n /** Override the default `aria-label` on the progressbar. */\n 'aria-label'?: string;\n /** Hide the \"Step N of M — label\" caption. @default false */\n hideCaption?: boolean;\n /** Track size. @default 'default' */\n size?: Size;\n /** Caption position relative to the bar. @default 'top' */\n captionPosition?: CaptionPosition;\n /**\n * Consumer-supplied instance id, surfaced as `data-component-id` so an\n * agent / UI bridge can address this instance.\n */\n id?: string;\n /**\n * Called when an external driver (agent adapter) requests a step change.\n * StepperProgress is a pure indicator and does not own step state itself\n * — this hook lets a host wizard react to agent-driven navigation.\n */\n onStepChange?: (next: number) => void;\n}\n\n/**\n * Imperative handle for agent-readiness. Exposed via `ref`.\n *\n * The handle is the surface the future MCP UI bridge invokes through the\n * runtime registry. Methods are pure functions of the current props +\n * internal state; mutations route through the consumer's `onStepChange`.\n */\nexport interface StepperProgressHandle {\n getCurrentStep: () => number;\n getTotalSteps: () => number;\n gotoStep: (step: number) => void;\n next: () => void;\n previous: () => void;\n}\n\nconst StepperProgress = forwardRef<HTMLDivElement, StepperProgressProps>(\n (\n {\n activeStep,\n steps,\n 'aria-label': ariaLabel,\n hideCaption = false,\n size = 'default',\n captionPosition = 'top',\n id,\n onStepChange,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const fillRef = useRef<HTMLSpanElement>(null);\n\n const total = steps.length;\n const clampedActive = Math.max(0, Math.min(activeStep, total - 1));\n const activeSpec = steps[clampedActive];\n // The progress variant only renders one \"active\" step at a time — the\n // shared four-way state machine collapses to error-or-current here.\n const activeState: StepState =\n activeSpec?.status === 'error' ? 'error' : 'current';\n\n // Fill reaches through the completed segments plus the current one, so\n // a 4-step flow at index 1 fills 50% (2/4). Matches the user's mental\n // model for \"how far along am I\".\n const filledCount = clampedActive + 1;\n const targetPercent = total === 0 ? 0 : (filledCount / total) * 100;\n\n const tone: Tone =\n activeState === 'error'\n ? 'error'\n : clampedActive === total - 1 && total > 0\n ? 'complete'\n : 'progress';\n\n // Mount-in animation: paint at 0 on first render, then swap to the\n // target in a post-mount effect so the CSS transition animates from\n // empty → target. Matches the pattern in `components/progress`.\n const [hasMounted, setHasMounted] = useState(false);\n useEffect(() => {\n setHasMounted(true);\n }, []);\n const percent = hasMounted ? targetPercent : 0;\n\n // Setting a CSS custom property via `style.setProperty` (rather than a\n // JSX `style={{}}` attribute) is the sanctioned escape hatch for\n // runtime-computed CSS tokens per `src/docs/23-constraints.mdx` §4;\n // the `components/progress` bar uses the same pattern for its fill.\n useLayoutEffect(() => {\n fillRef.current?.style.setProperty(\n '--stepper-progress-value',\n String(percent),\n );\n }, [percent]);\n\n const captionText = t('navigation.stepper.stepOfTotal', {\n n: clampedActive + 1,\n total,\n });\n const label = ariaLabel ?? t('navigation.stepper.label');\n const errorCopy =\n activeState === 'error' && activeSpec?.description\n ? activeSpec.description\n : null;\n // `aria-valuetext` is the single AT source — the caption is aria-hidden\n // so anything the caption exposes (label, error description) must be\n // appended here too, or it's invisible to screen-reader users who set\n // `hideCaption`.\n const valueText = [\n captionText,\n activeSpec ? `— ${activeSpec.label}` : null,\n errorCopy,\n ]\n .filter(Boolean)\n .join(' ');\n\n const handle = useMemo<StepperProgressHandle>(\n () => ({\n getCurrentStep: () => clampedActive,\n getTotalSteps: () => total,\n gotoStep: (step: number) => {\n if (!onStepChange) return;\n const clamped = Math.max(0, Math.min(step, Math.max(total - 1, 0)));\n if (clamped !== clampedActive) onStepChange(clamped);\n },\n next: () => {\n if (!onStepChange) return;\n if (clampedActive < total - 1) onStepChange(clampedActive + 1);\n },\n previous: () => {\n if (!onStepChange) return;\n if (clampedActive > 0) onStepChange(clampedActive - 1);\n },\n }),\n [clampedActive, total, onStepChange],\n );\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n useAgentRegistration(stepperProgressAgent, handle, id);\n\n return (\n <div\n ref={rootRef}\n id={id}\n data-component=\"stepper-progress\"\n data-component-id={id}\n className={rootVariants({ captionPosition, className })}\n {...rest}\n >\n {hideCaption ? null : (\n <div className={captionVariants({ tone })} aria-hidden=\"true\">\n <span className=\"type-meta ds:font-[var(--font-weight-semibold)]\">\n {captionText}\n </span>\n {activeSpec ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n — {activeSpec.label}\n </span>\n ) : null}\n {errorCopy ? (\n <span className=\"type-meta ds:ms-auto ds:text-[var(--destructive)]\">\n {errorCopy}\n </span>\n ) : null}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={total}\n aria-valuenow={filledCount}\n aria-valuetext={valueText}\n className={trackVariants({ size })}\n >\n <span\n ref={fillRef}\n aria-hidden=\"true\"\n className={fillVariants({ tone })}\n />\n </div>\n </div>\n );\n },\n);\nStepperProgress.displayName = 'StepperProgress';\n\nexport { StepperProgress };\n"],"names":["stepperProgressAgent","handle","args","rootVariants","cva","trackVariants","fillVariants","captionVariants","StepperProgress","forwardRef","activeStep","steps","ariaLabel","hideCaption","size","captionPosition","id","onStepChange","className","rest","ref","t","useTranslation","fillRef","useRef","total","clampedActive","activeSpec","activeState","filledCount","targetPercent","tone","hasMounted","setHasMounted","useState","useEffect","percent","useLayoutEffect","_a","captionText","label","errorCopy","valueText","useMemo","step","clamped","rootRef","useImperativeHandle","useAgentRegistration","jsxs","jsx"],"mappings":"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"}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { jsxs as f, jsx as n } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef as y, useState as v, useEffect as b, Fragment as h } from "react";
|
|
3
|
-
import { c as x } from "./index-D2ZczOXr.js";
|
|
4
|
-
const g = x(
|
|
5
|
-
"type-body ds:block ds:whitespace-pre-wrap ds:break-words",
|
|
6
|
-
{
|
|
7
|
-
variants: {
|
|
8
|
-
// Family, weight, tracking, line-height all come from `.type-body` on the base.
|
|
9
|
-
// Size variants override --type-body-size to shift the ramp step.
|
|
10
|
-
size: {
|
|
11
|
-
sm: "ds:[--type-body-size:var(--font-size-sm)]",
|
|
12
|
-
md: "",
|
|
13
|
-
lg: "ds:[--type-body-size:var(--font-size-lg)]"
|
|
14
|
-
},
|
|
15
|
-
density: {
|
|
16
|
-
default: "",
|
|
17
|
-
compact: "ds:[--type-body-size:var(--font-size-sm)] ds:leading-snug"
|
|
18
|
-
}
|
|
19
|
-
},
|
|
20
|
-
defaultVariants: { size: "md", density: "default" }
|
|
21
|
-
}
|
|
22
|
-
);
|
|
23
|
-
function z(a) {
|
|
24
|
-
const e = [];
|
|
25
|
-
let s = a;
|
|
26
|
-
const r = /\*\*([^*]+)\*\*|`([^`]+)`|\n/;
|
|
27
|
-
for (; s.length > 0; ) {
|
|
28
|
-
const t = r.exec(s);
|
|
29
|
-
if (!t) {
|
|
30
|
-
e.push({ type: "text", value: s });
|
|
31
|
-
break;
|
|
32
|
-
}
|
|
33
|
-
t.index > 0 && e.push({ type: "text", value: s.slice(0, t.index) }), t[1] !== void 0 ? e.push({ type: "bold", value: t[1] }) : t[2] !== void 0 ? e.push({ type: "code", value: t[2] }) : e.push({ type: "br" }), s = s.slice(t.index + t[0].length);
|
|
34
|
-
}
|
|
35
|
-
return e;
|
|
36
|
-
}
|
|
37
|
-
function T(a) {
|
|
38
|
-
return z(a).map((e, s) => e.type === "bold" ? /* @__PURE__ */ n("strong", { children: e.value }, s) : e.type === "code" ? /* @__PURE__ */ n(
|
|
39
|
-
"code",
|
|
40
|
-
{
|
|
41
|
-
dir: "ltr",
|
|
42
|
-
className: "ds:rounded-[var(--radius-sm)] ds:bg-muted/20 ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:font-[family-name:var(--font-mono)] ds:text-[length:0.95em]",
|
|
43
|
-
children: e.value
|
|
44
|
-
},
|
|
45
|
-
s
|
|
46
|
-
) : e.type === "br" ? /* @__PURE__ */ n("br", {}, s) : /* @__PURE__ */ n(h, { children: e.value }, s));
|
|
47
|
-
}
|
|
48
|
-
const w = y(
|
|
49
|
-
({
|
|
50
|
-
content: a,
|
|
51
|
-
isStreaming: e,
|
|
52
|
-
renderMarkdown: s = !1,
|
|
53
|
-
ariaLive: r = "polite",
|
|
54
|
-
size: t = "md",
|
|
55
|
-
density: o = "default",
|
|
56
|
-
className: l,
|
|
57
|
-
...c
|
|
58
|
-
}, p) => {
|
|
59
|
-
const [i, d] = v(a);
|
|
60
|
-
b(() => {
|
|
61
|
-
if (!e) {
|
|
62
|
-
d(a);
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
const m = setTimeout(() => d(a), 100);
|
|
66
|
-
return () => clearTimeout(m);
|
|
67
|
-
}, [a, e]);
|
|
68
|
-
const u = s ? T(i) : i;
|
|
69
|
-
return /* @__PURE__ */ f(
|
|
70
|
-
"span",
|
|
71
|
-
{
|
|
72
|
-
ref: p,
|
|
73
|
-
"aria-live": r,
|
|
74
|
-
"aria-busy": e || void 0,
|
|
75
|
-
"data-component": "streaming-text",
|
|
76
|
-
className: g({ size: t, density: o, className: l }),
|
|
77
|
-
...c,
|
|
78
|
-
children: [
|
|
79
|
-
u,
|
|
80
|
-
e ? /* @__PURE__ */ n(
|
|
81
|
-
"span",
|
|
82
|
-
{
|
|
83
|
-
"aria-hidden": "true",
|
|
84
|
-
className: [
|
|
85
|
-
"ds:inline-block ds:align-baseline",
|
|
86
|
-
"ds:text-[color:var(--primary)]",
|
|
87
|
-
"ds:motion-safe:animate-[streaming-cursor-blink_1s_step-end_infinite]",
|
|
88
|
-
"ds:motion-reduce:opacity-100",
|
|
89
|
-
"ds:[.theme-accessible_&]:animate-none",
|
|
90
|
-
"ds:forced-colors:text-[CanvasText]",
|
|
91
|
-
"ds:ms-[1px]"
|
|
92
|
-
].join(" "),
|
|
93
|
-
children: "▍"
|
|
94
|
-
}
|
|
95
|
-
) : null
|
|
96
|
-
]
|
|
97
|
-
}
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
);
|
|
101
|
-
w.displayName = "StreamingText";
|
|
102
|
-
export {
|
|
103
|
-
w as S
|
|
104
|
-
};
|
|
105
|
-
//# sourceMappingURL=streaming-text-BgjCTVOw.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streaming-text-BgjCTVOw.js","sources":["../../src/components/streaming-text/streaming-text.tsx"],"sourcesContent":["import {\n forwardRef,\n Fragment,\n useEffect,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst containerVariants = cva(\n 'type-body ds:block ds:whitespace-pre-wrap ds:break-words',\n {\n variants: {\n // Family, weight, tracking, line-height all come from `.type-body` on the base.\n // Size variants override --type-body-size to shift the ramp step.\n size: {\n sm: 'ds:[--type-body-size:var(--font-size-sm)]',\n md: '',\n lg: 'ds:[--type-body-size:var(--font-size-lg)]',\n },\n density: {\n default: '',\n compact: 'ds:[--type-body-size:var(--font-size-sm)] ds:leading-snug',\n },\n },\n defaultVariants: { size: 'md', density: 'default' },\n },\n);\n\ntype NativeProps = Omit<\n HTMLAttributes<HTMLSpanElement>,\n 'children' | 'aria-busy' | 'aria-live'\n>;\n\nexport interface StreamingTextProps\n extends NativeProps, VariantProps<typeof containerVariants> {\n /** Accumulated plain-text content. Parent appends tokens as they arrive. */\n content: string;\n /** While true the blinking cursor is shown and aria-busy is set. */\n isStreaming: boolean;\n /** When true, parse a small, safe subset of markdown (bold, inline code, line-breaks).\n * No HTML passes through; no dangerouslySetInnerHTML is ever used. */\n renderMarkdown?: boolean;\n /** Announce updates more aggressively when the streamed content is primary\n * (not wrapped by a higher-level log region). Defaults to 'polite'; never\n * set to 'assertive' for streamed output. */\n ariaLive?: 'polite' | 'off';\n}\n\n/* ------------------------------------------------------------------ */\n/* Safe, dependency-free markdown-ish renderer. */\n/* Handles **bold**, `inline code`, and newlines. Anything that looks */\n/* like HTML stays as text — no dangerouslySetInnerHTML. */\n/* ------------------------------------------------------------------ */\n\ntype Token =\n | { type: 'text'; value: string }\n | { type: 'bold'; value: string }\n | { type: 'code'; value: string }\n | { type: 'br' };\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let remaining = input;\n // Alternation: bold | code | newline | text.\n const pattern = /\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\n/;\n while (remaining.length > 0) {\n const match = pattern.exec(remaining);\n if (!match) {\n tokens.push({ type: 'text', value: remaining });\n break;\n }\n if (match.index > 0) {\n tokens.push({ type: 'text', value: remaining.slice(0, match.index) });\n }\n if (match[1] !== undefined) {\n tokens.push({ type: 'bold', value: match[1] });\n } else if (match[2] !== undefined) {\n tokens.push({ type: 'code', value: match[2] });\n } else {\n tokens.push({ type: 'br' });\n }\n remaining = remaining.slice(match.index + match[0].length);\n }\n return tokens;\n}\n\nfunction renderTokens(input: string): ReactNode {\n return tokenize(input).map((tok, i) => {\n if (tok.type === 'bold') return <strong key={i}>{tok.value}</strong>;\n if (tok.type === 'code') {\n return (\n <code\n key={i}\n dir=\"ltr\"\n className=\"ds:rounded-[var(--radius-sm)] ds:bg-muted/20 ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:font-[family-name:var(--font-mono)] ds:text-[length:0.95em]\"\n >\n {tok.value}\n </code>\n );\n }\n if (tok.type === 'br') return <br key={i} />;\n return <Fragment key={i}>{tok.value}</Fragment>;\n });\n}\n\nexport const StreamingText = forwardRef<HTMLSpanElement, StreamingTextProps>(\n (\n {\n content,\n isStreaming,\n renderMarkdown = false,\n ariaLive = 'polite',\n size = 'md',\n density = 'default',\n className,\n ...rest\n },\n ref,\n ) => {\n // Throttle visible content to at most ~10 updates per second so assistive\n // tech doesn't receive one announcement per token. We keep the full text in\n // a ref and push it to state on a timer.\n const [visible, setVisible] = useState<string>(content);\n\n useEffect(() => {\n if (!isStreaming) {\n // Streaming ended — flush immediately.\n setVisible(content);\n return;\n }\n // Global `setTimeout` works in both Node and browsers — avoid the\n // `window.` prefix so SSR (Next.js App Router, Remix) doesn't throw.\n const handle = setTimeout(() => setVisible(content), 100);\n return () => clearTimeout(handle);\n }, [content, isStreaming]);\n\n const body = renderMarkdown ? renderTokens(visible) : visible;\n\n return (\n <span\n ref={ref}\n aria-live={ariaLive}\n aria-busy={isStreaming || undefined}\n data-component=\"streaming-text\"\n className={containerVariants({ size, density, className })}\n {...rest}\n >\n {body}\n {isStreaming ? (\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:inline-block ds:align-baseline',\n 'ds:text-[color:var(--primary)]',\n 'ds:motion-safe:animate-[streaming-cursor-blink_1s_step-end_infinite]',\n 'ds:motion-reduce:opacity-100',\n 'ds:[.theme-accessible_&]:animate-none',\n 'ds:forced-colors:text-[CanvasText]',\n 'ds:ms-[1px]',\n ].join(' ')}\n >\n {'\\u258D'}\n </span>\n ) : null}\n </span>\n );\n },\n);\n\nStreamingText.displayName = 'StreamingText';\n"],"names":["containerVariants","cva","tokenize","input","tokens","remaining","pattern","match","renderTokens","tok","i","jsx","Fragment","StreamingText","forwardRef","content","isStreaming","renderMarkdown","ariaLive","size","density","className","rest","ref","visible","setVisible","useState","useEffect","handle","body","jsxs"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"text-area-D5GAe8pV.js","sources":["../../src/components/text-area/text-area.agent.ts","../../src/components/text-area/text-area.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — TextArea. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TextAreaHandle } from './text-area';\n\nexport const textAreaAgent: AgentAdapter<TextAreaHandle> = {\n id: 'text-area',\n capabilities: ['edit_inline'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.textArea.state.value',\n description: 'Current value of the textarea.',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.textArea.state.isEmpty',\n description: 'Whether the textarea has no value.',\n read: (handle) => handle.getValue() === '',\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n descriptionKey: 'ui.agent.textArea.actions.setValue',\n description: 'Replace the textarea value.',\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.textArea.actions.clear',\n description: 'Empty the textarea. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n focus: {\n safety: 'read',\n descriptionKey: 'ui.agent.textArea.actions.focus',\n description: 'Move keyboard focus to the textarea.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'text-area',\n description: 'Marks the TextArea wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type CompositionEvent,\n type TextareaHTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\nimport { useAgentRegistration } from '../../agent';\nimport { textAreaAgent } from './text-area.agent';\n\n/** Agent-readiness curated handle for TextArea. */\nexport interface TextAreaHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n clear: () => void;\n focus: () => void;\n}\n\nconst textAreaVariants = cva(\n [\n 'ds:block ds:w-full ds:border ds:rounded-[var(--radius-sm)] ds:bg-input ds:text-foreground',\n 'ds:shadow-[var(--shadow-input)]',\n 'ds:leading-[var(--line-height-base)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-xs)]',\n 'ds:focus:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:read-only:bg-muted ds:read-only:cursor-default ds:read-only:shadow-none',\n 'ds:transition-[height,color,background-color,border-color,box-shadow] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:placeholder:text-muted-foreground',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:min-h-8 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:min-h-[var(--min-target-size)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:min-h-[calc(var(--min-target-size)*1.5)] ds:text-[length:var(--font-size-lg)]',\n },\n tone: {\n default: 'ds:border-border',\n error: 'ds:border-destructive',\n },\n resize: {\n auto: 'ds:resize-none',\n manual: 'ds:resize-y',\n },\n },\n defaultVariants: { size: 'md', tone: 'default', resize: 'manual' },\n },\n);\n\nconst counterToneClass = (ratio: number): string => {\n if (ratio >= 1) return 'ds:text-destructive';\n if (ratio >= 0.9) return 'ds:text-warning';\n return 'ds:text-muted-foreground';\n};\n\ntype NativeTextareaProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'children' | 'size'\n>;\n\nexport interface TextAreaProps\n extends\n NativeTextareaProps,\n Pick<VariantProps<typeof textAreaVariants>, 'size' | 'tone'> {\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n autoResize?: boolean;\n minRows?: number;\n maxRows?: number;\n showCounter?: boolean;\n}\n\nconst codePointLength = (value: string): number => [...value].length;\n\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n size = 'md',\n tone = 'default',\n autoResize = false,\n minRows = 2,\n maxRows,\n showCounter,\n className,\n id,\n disabled,\n value,\n defaultValue,\n maxLength,\n rows,\n onChange,\n onCompositionStart,\n onCompositionEnd,\n onInput,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const ctx = useFormField();\n const textAreaId = id ?? ctx.id;\n const effectiveDisabled = ctx.disabled || disabled;\n const effectiveTone: 'default' | 'error' = ctx.invalid ? 'error' : tone;\n\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n String(defaultValue ?? ''),\n );\n const currentValue = isControlled ? String(value) : internalValue;\n\n const composingRef = useRef(false);\n\n const resizeTextArea = useCallback(() => {\n const el = innerRef.current;\n if (!el || !autoResize) return;\n\n const styles = window.getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight);\n const paddingTop = parseFloat(styles.paddingTop);\n const paddingBottom = parseFloat(styles.paddingBottom);\n const borderTop = parseFloat(styles.borderTopWidth);\n const borderBottom = parseFloat(styles.borderBottomWidth);\n const verticalChrome =\n paddingTop + paddingBottom + borderTop + borderBottom;\n\n const minH =\n (Number.isFinite(lineHeight) ? lineHeight : 24) * minRows +\n verticalChrome;\n const maxH =\n typeof maxRows === 'number'\n ? (Number.isFinite(lineHeight) ? lineHeight : 24) * maxRows +\n verticalChrome\n : Number.POSITIVE_INFINITY;\n\n // EXCEPTION to constraint #4 (no inline styles): height is computed from\n // runtime scrollHeight and cannot be expressed as a static Tailwind class.\n el.style.height = 'auto';\n const next = Math.max(minH, Math.min(el.scrollHeight, maxH));\n el.style.height = `${next}px`;\n }, [autoResize, minRows, maxRows]);\n\n useLayoutEffect(() => {\n if (!autoResize) return;\n resizeTextArea();\n }, [autoResize, resizeTextArea, currentValue]);\n\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(event.target.value);\n }\n if (composingRef.current) return;\n onChange?.(event);\n };\n\n const handleCompositionStart = (\n event: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = true;\n onCompositionStart?.(event);\n };\n\n const handleCompositionEnd = (\n event: CompositionEvent<HTMLTextAreaElement>,\n ) => {\n composingRef.current = false;\n onCompositionEnd?.(event);\n const target = event.currentTarget;\n if (!isControlled) {\n setInternalValue(target.value);\n }\n // Synthesise a ChangeEvent from the CompositionEvent so consumers receive\n // a single post-IME change. nativeEvent is still the CompositionEvent, so\n // consumers inspecting `nativeEvent.inputType` will not find the usual\n // \"insertCompositionText\" value — documented as a known limitation.\n onChange?.({\n ...event,\n target,\n currentTarget: target,\n } as unknown as ChangeEvent<HTMLTextAreaElement>);\n if (autoResize) resizeTextArea();\n };\n\n const writeValueToTextArea = useCallback((next: string) => {\n const node = innerRef.current;\n if (!node) return;\n const prototype = Object.getPrototypeOf(node) as HTMLTextAreaElement;\n const setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;\n setter?.call(node, next);\n node.dispatchEvent(new Event('input', { bubbles: true }));\n node.dispatchEvent(new Event('change', { bubbles: true }));\n }, []);\n\n const agentHandle = useMemo<TextAreaHandle>(\n () => ({\n getValue: () => innerRef.current?.value ?? '',\n setValue: (next) => writeValueToTextArea(next),\n clear: () => writeValueToTextArea(''),\n focus: () => innerRef.current?.focus(),\n }),\n [writeValueToTextArea],\n );\n useAgentRegistration(textAreaAgent, agentHandle, id);\n\n const counterEnabled =\n typeof maxLength === 'number' && (showCounter ?? true) && maxLength > 0;\n\n const current = codePointLength(currentValue);\n const remaining = counterEnabled\n ? Math.max(0, (maxLength as number) - current)\n : 0;\n const ratio = counterEnabled ? current / (maxLength as number) : 0;\n\n const [announced, setAnnounced] = useState<string>('');\n useEffect(() => {\n if (!counterEnabled) return;\n const handle = window.setTimeout(() => {\n if (composingRef.current) return;\n setAnnounced(\n t('inputs.textarea.charactersRemaining', {\n count: remaining,\n defaultValue: '{{count}} characters remaining',\n }),\n );\n }, 500);\n return () => window.clearTimeout(handle);\n }, [counterEnabled, remaining, t]);\n\n const counterId = counterEnabled ? `${textAreaId}-counter` : undefined;\n const describedBy =\n [ctx.describedBy || undefined, counterId].filter(Boolean).join(' ') ||\n undefined;\n\n const resizeVariant: 'auto' | 'manual' = autoResize ? 'auto' : 'manual';\n\n return (\n <div\n data-component=\"text-area\"\n data-component-id={id}\n className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <textarea\n ref={setRefs}\n id={textAreaId}\n value={isControlled ? currentValue : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n disabled={effectiveDisabled}\n aria-describedby={describedBy}\n aria-invalid={ctx.invalid || undefined}\n aria-required={ctx.required || undefined}\n maxLength={maxLength}\n rows={autoResize ? minRows : rows}\n onChange={handleChange}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n onInput={onInput}\n className={textAreaVariants({\n size,\n tone: effectiveTone,\n resize: resizeVariant,\n className,\n })}\n {...props}\n />\n {counterEnabled ? (\n <div\n id={counterId}\n className=\"ds:flex ds:justify-end type-meta ds:tabular-nums\"\n >\n <span aria-hidden=\"true\" className={counterToneClass(ratio)}>\n {current} / {maxLength}\n </span>\n <span className=\"ds:sr-only\" aria-live=\"polite\">\n {announced}\n </span>\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nTextArea.displayName = 'TextArea';\n"],"names":["textAreaAgent","handle","args","textAreaVariants","cva","counterToneClass","ratio","codePointLength","value","TextArea","forwardRef","size","tone","autoResize","minRows","maxRows","showCounter","className","id","disabled","defaultValue","maxLength","rows","onChange","onCompositionStart","onCompositionEnd","onInput","props","ref","t","useTranslation","ctx","useFormField","textAreaId","effectiveDisabled","effectiveTone","innerRef","useRef","setRefs","useCallback","node","isControlled","internalValue","setInternalValue","useState","currentValue","composingRef","resizeTextArea","el","styles","lineHeight","paddingTop","paddingBottom","borderTop","borderBottom","verticalChrome","minH","maxH","next","useLayoutEffect","handleChange","event","handleCompositionStart","handleCompositionEnd","target","writeValueToTextArea","prototype","setter","_a","agentHandle","useMemo","useAgentRegistration","counterEnabled","current","remaining","announced","setAnnounced","useEffect","counterId","describedBy","resizeVariant","jsxs","jsx"],"mappings":"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"}
|