@intellectif/lk-react 23.1.0 → 23.1.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/CHANGELOG.md +23 -0
- package/README.md +9 -5
- package/dist/ActivityErrorBoundary-B379hvtL.cjs +39 -0
- package/dist/ActivityErrorBoundary-B379hvtL.cjs.map +1 -0
- package/dist/ActivityErrorBoundary-Dw6SbWv3.js +34 -0
- package/dist/ActivityErrorBoundary-Dw6SbWv3.js.map +1 -0
- package/dist/ActivityMedia-CQQTRNl7.cjs +641 -0
- package/dist/ActivityMedia-CQQTRNl7.cjs.map +1 -0
- package/dist/ActivityMedia-vDiP-Psa.js +636 -0
- package/dist/ActivityMedia-vDiP-Psa.js.map +1 -0
- package/dist/ActivityPreview-1hhTkYuj.js +240 -0
- package/dist/ActivityPreview-1hhTkYuj.js.map +1 -0
- package/dist/ActivityPreview-BKr34exz.cjs +245 -0
- package/dist/ActivityPreview-BKr34exz.cjs.map +1 -0
- package/dist/ActivitySequence-CkX87pfB.js +839 -0
- package/dist/ActivitySequence-CkX87pfB.js.map +1 -0
- package/dist/ActivitySequence-CmoSyDnp.cjs +844 -0
- package/dist/ActivitySequence-CmoSyDnp.cjs.map +1 -0
- package/dist/Dictation-BlxRp-3k.js +926 -0
- package/dist/Dictation-BlxRp-3k.js.map +1 -0
- package/dist/Dictation-jECzL88E.cjs +931 -0
- package/dist/Dictation-jECzL88E.cjs.map +1 -0
- package/dist/FeedbackRegion-BNNMtTY-.cjs +108 -0
- package/dist/FeedbackRegion-BNNMtTY-.cjs.map +1 -0
- package/dist/FeedbackRegion-CyPSp8bA.js +85 -0
- package/dist/FeedbackRegion-CyPSp8bA.js.map +1 -0
- package/dist/FillInTheBlanks-B6xzqYXx.js +474 -0
- package/dist/FillInTheBlanks-B6xzqYXx.js.map +1 -0
- package/dist/FillInTheBlanks-BpKhdHg2.cjs +479 -0
- package/dist/FillInTheBlanks-BpKhdHg2.cjs.map +1 -0
- package/dist/GapSelect-DUSiaEQH.js +441 -0
- package/dist/GapSelect-DUSiaEQH.js.map +1 -0
- package/dist/GapSelect-payTq_Zn.cjs +446 -0
- package/dist/GapSelect-payTq_Zn.cjs.map +1 -0
- package/dist/InteractiveVideo-BguGv-HA.cjs +2955 -0
- package/dist/InteractiveVideo-BguGv-HA.cjs.map +1 -0
- package/dist/InteractiveVideo-Cg2jbU3j.js +2944 -0
- package/dist/InteractiveVideo-Cg2jbU3j.js.map +1 -0
- package/dist/LkAiProvider-DAPpA3PQ.d.cts +84 -0
- package/dist/LkAiProvider-DAPpA3PQ.d.cts.map +1 -0
- package/dist/LkAiProvider-QdEcIhoo.d.ts +84 -0
- package/dist/LkAiProvider-QdEcIhoo.d.ts.map +1 -0
- package/dist/LkIntlProvider-D_FdYXjQ.js +375 -0
- package/dist/LkIntlProvider-D_FdYXjQ.js.map +1 -0
- package/dist/LkIntlProvider-oi57lYB0.cjs +410 -0
- package/dist/LkIntlProvider-oi57lYB0.cjs.map +1 -0
- package/dist/MultipleChoice-COn5MtKY.cjs +433 -0
- package/dist/MultipleChoice-COn5MtKY.cjs.map +1 -0
- package/dist/MultipleChoice-Dra0_KYD.js +428 -0
- package/dist/MultipleChoice-Dra0_KYD.js.map +1 -0
- package/dist/PronunciationFeedback-DlMPGjkR.cjs +831 -0
- package/dist/PronunciationFeedback-DlMPGjkR.cjs.map +1 -0
- package/dist/PronunciationFeedback-Dxd6XPkO.js +772 -0
- package/dist/PronunciationFeedback-Dxd6XPkO.js.map +1 -0
- package/dist/ReadAloud-C8RhaUqV.js +1092 -0
- package/dist/{chunk-DC4CQCK5.js.map → ReadAloud-C8RhaUqV.js.map} +1 -1
- package/dist/ReadAloud-akDehitT.cjs +1103 -0
- package/dist/ReadAloud-akDehitT.cjs.map +1 -0
- package/dist/StimulusPanel-BgzByfkb.js +74 -0
- package/dist/StimulusPanel-BgzByfkb.js.map +1 -0
- package/dist/StimulusPanel-b66gaN3i.cjs +79 -0
- package/dist/StimulusPanel-b66gaN3i.cjs.map +1 -0
- package/dist/ThemeProvider-B6DyGqzh.d.cts +62 -0
- package/dist/ThemeProvider-B6DyGqzh.d.cts.map +1 -0
- package/dist/ThemeProvider-BCrxBaY-.d.ts +62 -0
- package/dist/ThemeProvider-BCrxBaY-.d.ts.map +1 -0
- package/dist/ThemeProvider-BRN1tj4n.cjs +187 -0
- package/dist/ThemeProvider-BRN1tj4n.cjs.map +1 -0
- package/dist/ThemeProvider-C7K9iMLX.js +158 -0
- package/dist/ThemeProvider-C7K9iMLX.js.map +1 -0
- package/dist/WrittenResponse-Bj3eFmGl.cjs +491 -0
- package/dist/WrittenResponse-Bj3eFmGl.cjs.map +1 -0
- package/dist/WrittenResponse-Cl8G6nO_.js +486 -0
- package/dist/WrittenResponse-Cl8G6nO_.js.map +1 -0
- package/dist/ai/LkAiProvider.cjs +34 -14
- package/dist/ai/LkAiProvider.cjs.map +1 -1
- package/dist/ai/LkAiProvider.d.cts +2 -83
- package/dist/ai/LkAiProvider.d.ts +2 -83
- package/dist/ai/LkAiProvider.js +33 -2
- package/dist/ai/LkAiProvider.js.map +1 -1
- package/dist/ai/useAiHelp.cjs +7 -25
- package/dist/ai/useAiHelp.d.cts +175 -177
- package/dist/ai/useAiHelp.d.cts.map +1 -0
- package/dist/ai/useAiHelp.d.ts +175 -177
- package/dist/ai/useAiHelp.d.ts.map +1 -0
- package/dist/ai/useAiHelp.js +3 -4
- package/dist/components/ActivityPreview.cjs +3 -29
- package/dist/components/ActivityPreview.d.cts +2 -81
- package/dist/components/ActivityPreview.d.ts +2 -81
- package/dist/components/ActivityPreview.js +2 -20
- package/dist/components/ActivitySequence.cjs +3 -30
- package/dist/components/ActivitySequence.d.cts +2 -432
- package/dist/components/ActivitySequence.d.ts +2 -432
- package/dist/components/ActivitySequence.js +2 -21
- package/dist/components/Dictation.cjs +4 -21
- package/dist/components/Dictation.d.cts +2 -19
- package/dist/components/Dictation.d.ts +2 -19
- package/dist/components/Dictation.js +3 -12
- package/dist/components/FillInTheBlanks.cjs +4 -20
- package/dist/components/FillInTheBlanks.d.cts +2 -30
- package/dist/components/FillInTheBlanks.d.ts +2 -30
- package/dist/components/FillInTheBlanks.js +3 -11
- package/dist/components/GapSelect.cjs +4 -20
- package/dist/components/GapSelect.d.cts +2 -27
- package/dist/components/GapSelect.d.ts +2 -27
- package/dist/components/GapSelect.js +3 -11
- package/dist/components/InteractiveVideo.cjs +5 -32
- package/dist/components/InteractiveVideo.d.cts +3 -291
- package/dist/components/InteractiveVideo.d.ts +3 -291
- package/dist/components/InteractiveVideo.js +3 -19
- package/dist/components/MultipleChoice.cjs +4 -20
- package/dist/components/MultipleChoice.d.cts +2 -26
- package/dist/components/MultipleChoice.d.ts +2 -26
- package/dist/components/MultipleChoice.js +3 -11
- package/dist/components/PronunciationFeedback.cjs +4 -17
- package/dist/components/PronunciationFeedback.d.cts +2 -90
- package/dist/components/PronunciationFeedback.d.ts +2 -90
- package/dist/components/PronunciationFeedback.js +3 -8
- package/dist/components/ReadAloud.cjs +4 -22
- package/dist/components/ReadAloud.d.cts +7 -11
- package/dist/components/ReadAloud.d.cts.map +1 -0
- package/dist/components/ReadAloud.d.ts +7 -11
- package/dist/components/ReadAloud.d.ts.map +1 -0
- package/dist/components/ReadAloud.js +3 -13
- package/dist/components/StimulusPanel.cjs +3 -14
- package/dist/components/StimulusPanel.d.cts +2 -51
- package/dist/components/StimulusPanel.d.ts +2 -51
- package/dist/components/StimulusPanel.js +2 -5
- package/dist/components/WrittenResponse.cjs +4 -19
- package/dist/components/WrittenResponse.d.cts +3 -18
- package/dist/components/WrittenResponse.d.ts +3 -18
- package/dist/components/WrittenResponse.js +3 -10
- package/dist/direction-Dq0_HtA5.js +183 -0
- package/dist/direction-Dq0_HtA5.js.map +1 -0
- package/dist/direction-K1pj0HCA.cjs +200 -0
- package/dist/direction-K1pj0HCA.cjs.map +1 -0
- package/dist/hooks/useActivityState.cjs +28 -10
- package/dist/hooks/useActivityState.cjs.map +1 -1
- package/dist/hooks/useActivityState.d.cts +25 -24
- package/dist/hooks/useActivityState.d.cts.map +1 -0
- package/dist/hooks/useActivityState.d.ts +25 -24
- package/dist/hooks/useActivityState.d.ts.map +1 -0
- package/dist/hooks/useActivityState.js +28 -2
- package/dist/hooks/useActivityState.js.map +1 -1
- package/dist/hooks/useSpeechRecorder.cjs +5 -16
- package/dist/hooks/useSpeechRecorder.d.cts +2 -127
- package/dist/hooks/useSpeechRecorder.d.ts +2 -127
- package/dist/hooks/useSpeechRecorder.js +3 -3
- package/dist/hooks/useXAPI.cjs +126 -10
- package/dist/hooks/useXAPI.cjs.map +1 -1
- package/dist/hooks/useXAPI.d.cts +14 -14
- package/dist/hooks/useXAPI.d.cts.map +1 -0
- package/dist/hooks/useXAPI.d.ts +14 -14
- package/dist/hooks/useXAPI.d.ts.map +1 -0
- package/dist/hooks/useXAPI.js +126 -2
- package/dist/hooks/useXAPI.js.map +1 -1
- package/dist/i18n/LkIntlProvider.cjs +9 -32
- package/dist/i18n/LkIntlProvider.d.cts +34 -38
- package/dist/i18n/LkIntlProvider.d.cts.map +1 -0
- package/dist/i18n/LkIntlProvider.d.ts +34 -38
- package/dist/i18n/LkIntlProvider.d.ts.map +1 -0
- package/dist/i18n/LkIntlProvider.js +3 -3
- package/dist/index-6P4rJHrJ.d.cts +432 -0
- package/dist/index-6P4rJHrJ.d.cts.map +1 -0
- package/dist/index-90CX504k.d.ts +90 -0
- package/dist/index-90CX504k.d.ts.map +1 -0
- package/dist/index-B_SgnjsC.d.cts +291 -0
- package/dist/index-B_SgnjsC.d.cts.map +1 -0
- package/dist/index-BavVW5z5.d.cts +25 -0
- package/dist/index-BavVW5z5.d.cts.map +1 -0
- package/dist/index-BhHv6Fiu.d.cts +28 -0
- package/dist/index-BhHv6Fiu.d.cts.map +1 -0
- package/dist/index-Bsu8VciA.d.ts +432 -0
- package/dist/index-Bsu8VciA.d.ts.map +1 -0
- package/dist/index-C1KGpD1k.d.ts +49 -0
- package/dist/index-C1KGpD1k.d.ts.map +1 -0
- package/dist/index-CKTpYTCC.d.cts +49 -0
- package/dist/index-CKTpYTCC.d.cts.map +1 -0
- package/dist/index-CO_SRFJj.d.ts +16 -0
- package/dist/index-CO_SRFJj.d.ts.map +1 -0
- package/dist/index-CSsuUsP7.d.cts +124 -0
- package/dist/index-CSsuUsP7.d.cts.map +1 -0
- package/dist/index-CunUyeuN.d.cts +78 -0
- package/dist/index-CunUyeuN.d.cts.map +1 -0
- package/dist/index-CzfRzks6.d.cts +90 -0
- package/dist/index-CzfRzks6.d.cts.map +1 -0
- package/dist/index-D14xtpBS.d.cts +24 -0
- package/dist/index-D14xtpBS.d.cts.map +1 -0
- package/dist/index-DHRPAPZf.d.ts +291 -0
- package/dist/index-DHRPAPZf.d.ts.map +1 -0
- package/dist/index-DLV6cK26.d.cts +16 -0
- package/dist/index-DLV6cK26.d.cts.map +1 -0
- package/dist/index-DbCCQ9cP.d.ts +124 -0
- package/dist/index-DbCCQ9cP.d.ts.map +1 -0
- package/dist/index-DeV5B2m5.d.ts +24 -0
- package/dist/index-DeV5B2m5.d.ts.map +1 -0
- package/dist/index-TZCJVSge.d.ts +28 -0
- package/dist/index-TZCJVSge.d.ts.map +1 -0
- package/dist/index-ZVvLHsd3.d.ts +25 -0
- package/dist/index-ZVvLHsd3.d.ts.map +1 -0
- package/dist/index-eQwBgpSw.d.ts +78 -0
- package/dist/index-eQwBgpSw.d.ts.map +1 -0
- package/dist/index.cjs +118 -163
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +20 -24
- package/dist/index.d.ts +20 -24
- package/dist/index.js +84 -29
- package/dist/index.js.map +1 -1
- package/dist/theme/ThemeProvider.cjs +8 -28
- package/dist/theme/ThemeProvider.d.cts +2 -59
- package/dist/theme/ThemeProvider.d.ts +2 -59
- package/dist/theme/ThemeProvider.js +3 -3
- package/dist/tries-CbbtZkdG.cjs +363 -0
- package/dist/tries-CbbtZkdG.cjs.map +1 -0
- package/dist/tries-DTHSrLCm.js +310 -0
- package/dist/tries-DTHSrLCm.js.map +1 -0
- package/dist/types-BOQd93x3.d.cts +994 -0
- package/dist/types-BOQd93x3.d.cts.map +1 -0
- package/dist/types-HIrgF_mS.d.ts +994 -0
- package/dist/types-HIrgF_mS.d.ts.map +1 -0
- package/dist/useAiHelp-B-ccDL5Q.js +906 -0
- package/dist/useAiHelp-B-ccDL5Q.js.map +1 -0
- package/dist/useAiHelp-h9yOLFqt.cjs +995 -0
- package/dist/useAiHelp-h9yOLFqt.cjs.map +1 -0
- package/dist/useSpeechRecorder--O_f-xvt.cjs +720 -0
- package/dist/useSpeechRecorder--O_f-xvt.cjs.map +1 -0
- package/dist/useSpeechRecorder-DtAYvl02.d.cts +154 -0
- package/dist/useSpeechRecorder-DtAYvl02.d.cts.map +1 -0
- package/dist/useSpeechRecorder-DtAYvl02.d.ts +154 -0
- package/dist/useSpeechRecorder-DtAYvl02.d.ts.map +1 -0
- package/dist/useSpeechRecorder-zIi9Dlw8.js +709 -0
- package/dist/useSpeechRecorder-zIi9Dlw8.js.map +1 -0
- package/package.json +10 -11
- package/dist/WrittenResponse-B7A5gHMj.d.ts +0 -115
- package/dist/WrittenResponse-BpL9p2Hn.d.cts +0 -115
- package/dist/ai/useAiHelp.cjs.map +0 -1
- package/dist/ai/useAiHelp.js.map +0 -1
- package/dist/chunk-2PNSVBLQ.cjs +0 -54
- package/dist/chunk-2PNSVBLQ.cjs.map +0 -1
- package/dist/chunk-2TW6WLBC.js +0 -80
- package/dist/chunk-2TW6WLBC.js.map +0 -1
- package/dist/chunk-4ZZWZSWI.js +0 -61
- package/dist/chunk-4ZZWZSWI.js.map +0 -1
- package/dist/chunk-6N43WDVG.js +0 -29
- package/dist/chunk-6N43WDVG.js.map +0 -1
- package/dist/chunk-7ALBSPYR.cjs +0 -436
- package/dist/chunk-7ALBSPYR.cjs.map +0 -1
- package/dist/chunk-7NFY3M3W.js +0 -234
- package/dist/chunk-7NFY3M3W.js.map +0 -1
- package/dist/chunk-7SB2MJA4.js +0 -29
- package/dist/chunk-7SB2MJA4.js.map +0 -1
- package/dist/chunk-ABJJ3LII.js +0 -434
- package/dist/chunk-ABJJ3LII.js.map +0 -1
- package/dist/chunk-BIGGXHAW.cjs +0 -342
- package/dist/chunk-BIGGXHAW.cjs.map +0 -1
- package/dist/chunk-C7QZE5BI.js +0 -430
- package/dist/chunk-C7QZE5BI.js.map +0 -1
- package/dist/chunk-CWTUWNV3.cjs +0 -2937
- package/dist/chunk-CWTUWNV3.cjs.map +0 -1
- package/dist/chunk-DC4CQCK5.js +0 -915
- package/dist/chunk-DS6HN3YR.cjs +0 -496
- package/dist/chunk-DS6HN3YR.cjs.map +0 -1
- package/dist/chunk-FDQR4GAZ.js +0 -240
- package/dist/chunk-FDQR4GAZ.js.map +0 -1
- package/dist/chunk-FKGMSOJF.js +0 -394
- package/dist/chunk-FKGMSOJF.js.map +0 -1
- package/dist/chunk-G6PXJ2SA.js +0 -823
- package/dist/chunk-G6PXJ2SA.js.map +0 -1
- package/dist/chunk-HNLRVRQR.js +0 -335
- package/dist/chunk-HNLRVRQR.js.map +0 -1
- package/dist/chunk-J3C72RPK.cjs +0 -31
- package/dist/chunk-J3C72RPK.cjs.map +0 -1
- package/dist/chunk-K63VPFOV.cjs +0 -134
- package/dist/chunk-K63VPFOV.cjs.map +0 -1
- package/dist/chunk-KFLIDTDU.cjs +0 -825
- package/dist/chunk-KFLIDTDU.cjs.map +0 -1
- package/dist/chunk-KHKH5LCT.cjs +0 -250
- package/dist/chunk-KHKH5LCT.cjs.map +0 -1
- package/dist/chunk-LBEKRN6Y.cjs +0 -664
- package/dist/chunk-LBEKRN6Y.cjs.map +0 -1
- package/dist/chunk-LPUWXIPR.cjs +0 -578
- package/dist/chunk-LPUWXIPR.cjs.map +0 -1
- package/dist/chunk-MCO52PV5.js +0 -520
- package/dist/chunk-MCO52PV5.js.map +0 -1
- package/dist/chunk-MKXEM2C5.cjs +0 -396
- package/dist/chunk-MKXEM2C5.cjs.map +0 -1
- package/dist/chunk-MXNC5UNO.js +0 -563
- package/dist/chunk-MXNC5UNO.js.map +0 -1
- package/dist/chunk-NAK55BYU.cjs +0 -859
- package/dist/chunk-NAK55BYU.cjs.map +0 -1
- package/dist/chunk-NDBMKGQ5.cjs +0 -599
- package/dist/chunk-NDBMKGQ5.cjs.map +0 -1
- package/dist/chunk-OD65OZIW.cjs +0 -159
- package/dist/chunk-OD65OZIW.cjs.map +0 -1
- package/dist/chunk-ORT3KLGI.js +0 -50
- package/dist/chunk-ORT3KLGI.js.map +0 -1
- package/dist/chunk-PNNUPUH4.cjs +0 -82
- package/dist/chunk-PNNUPUH4.cjs.map +0 -1
- package/dist/chunk-PWHECW6N.js +0 -2934
- package/dist/chunk-PWHECW6N.js.map +0 -1
- package/dist/chunk-RBS5A2DF.js +0 -857
- package/dist/chunk-RBS5A2DF.js.map +0 -1
- package/dist/chunk-RPWUDXG5.cjs +0 -63
- package/dist/chunk-RPWUDXG5.cjs.map +0 -1
- package/dist/chunk-TCDJY3H6.js +0 -494
- package/dist/chunk-TCDJY3H6.js.map +0 -1
- package/dist/chunk-TP5UMRAU.cjs +0 -918
- package/dist/chunk-TP5UMRAU.cjs.map +0 -1
- package/dist/chunk-TS7J6DTY.js +0 -597
- package/dist/chunk-TS7J6DTY.js.map +0 -1
- package/dist/chunk-TUVENMXB.cjs +0 -20
- package/dist/chunk-TUVENMXB.cjs.map +0 -1
- package/dist/chunk-UDCQTOVU.cjs +0 -523
- package/dist/chunk-UDCQTOVU.cjs.map +0 -1
- package/dist/chunk-UHKZXOXD.js +0 -128
- package/dist/chunk-UHKZXOXD.js.map +0 -1
- package/dist/chunk-V6BA44DS.cjs +0 -236
- package/dist/chunk-V6BA44DS.cjs.map +0 -1
- package/dist/chunk-XO5R73Y4.js +0 -653
- package/dist/chunk-XO5R73Y4.js.map +0 -1
- package/dist/chunk-XOR4MPEN.cjs +0 -31
- package/dist/chunk-XOR4MPEN.cjs.map +0 -1
- package/dist/chunk-YORQQXGO.js +0 -155
- package/dist/chunk-YORQQXGO.js.map +0 -1
- package/dist/chunk-YY4PFR3Z.cjs +0 -432
- package/dist/chunk-YY4PFR3Z.cjs.map +0 -1
- package/dist/chunk-ZPI6Q42R.js +0 -17
- package/dist/chunk-ZPI6Q42R.js.map +0 -1
- package/dist/components/ActivityPreview.cjs.map +0 -1
- package/dist/components/ActivityPreview.js.map +0 -1
- package/dist/components/ActivitySequence.cjs.map +0 -1
- package/dist/components/ActivitySequence.js.map +0 -1
- package/dist/components/Dictation.cjs.map +0 -1
- package/dist/components/Dictation.js.map +0 -1
- package/dist/components/FillInTheBlanks.cjs.map +0 -1
- package/dist/components/FillInTheBlanks.js.map +0 -1
- package/dist/components/GapSelect.cjs.map +0 -1
- package/dist/components/GapSelect.js.map +0 -1
- package/dist/components/InteractiveVideo.cjs.map +0 -1
- package/dist/components/InteractiveVideo.js.map +0 -1
- package/dist/components/MultipleChoice.cjs.map +0 -1
- package/dist/components/MultipleChoice.js.map +0 -1
- package/dist/components/PronunciationFeedback.cjs.map +0 -1
- package/dist/components/PronunciationFeedback.js.map +0 -1
- package/dist/components/ReadAloud.cjs.map +0 -1
- package/dist/components/ReadAloud.js.map +0 -1
- package/dist/components/StimulusPanel.cjs.map +0 -1
- package/dist/components/StimulusPanel.js.map +0 -1
- package/dist/components/WrittenResponse.cjs.map +0 -1
- package/dist/components/WrittenResponse.js.map +0 -1
- package/dist/hooks/useSpeechRecorder.cjs.map +0 -1
- package/dist/hooks/useSpeechRecorder.js.map +0 -1
- package/dist/i18n/LkIntlProvider.cjs.map +0 -1
- package/dist/i18n/LkIntlProvider.js.map +0 -1
- package/dist/machine-CuwKqWXC.d.cts +0 -26
- package/dist/machine-CuwKqWXC.d.ts +0 -26
- package/dist/theme/ThemeProvider.cjs.map +0 -1
- package/dist/theme/ThemeProvider.js.map +0 -1
- package/dist/types-C4IsUQsK.d.ts +0 -989
- package/dist/types-CJgZWtl4.d.cts +0 -989
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
let react = require("react");
|
|
3
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
|
+
//#region src/theme/dark-theme.ts
|
|
5
|
+
/**
|
|
6
|
+
* Dark-mode colour overrides, merged over {@link defaultTheme} by
|
|
7
|
+
* `ThemeProvider`. Colours only — spacing/typography/shape/motion are
|
|
8
|
+
* theme-invariant. All pairs verified WCAG 2.2 AA against the dark surface.
|
|
9
|
+
*/
|
|
10
|
+
const darkTheme = {
|
|
11
|
+
"--lk-color-primary": "#fafafa",
|
|
12
|
+
"--lk-color-primary-hover": "#e4e4e7",
|
|
13
|
+
"--lk-color-surface": "#09090b",
|
|
14
|
+
"--lk-color-surface-raised": "#18181b",
|
|
15
|
+
"--lk-color-border": "#27272a",
|
|
16
|
+
"--lk-color-text": "#fafafa",
|
|
17
|
+
"--lk-color-text-muted": "#a1a1aa",
|
|
18
|
+
"--lk-color-success": "#4ade80",
|
|
19
|
+
"--lk-color-error": "#f87171",
|
|
20
|
+
"--lk-color-warning": "#fbbf24",
|
|
21
|
+
"--lk-color-focus-ring": "#fafafa"
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/theme/tokens.ts
|
|
25
|
+
/**
|
|
26
|
+
* Canonical default theme token values. `defaults.css` mirrors these exactly.
|
|
27
|
+
* Palette is a neutral monochrome, deliberately unbranded, so the SDK carries
|
|
28
|
+
* nobody's look out of the box; consumers rebrand via `ThemeProvider`. All
|
|
29
|
+
* colour pairs are verified to meet WCAG 2.2 AA: 4.5:1 for normal text, 3:1 for
|
|
30
|
+
* UI / focus ring (see theme/__tests__/contrast.test.ts).
|
|
31
|
+
*/
|
|
32
|
+
const defaultTheme = {
|
|
33
|
+
"--lk-color-primary": "#18181b",
|
|
34
|
+
"--lk-color-primary-hover": "#27272a",
|
|
35
|
+
"--lk-color-surface": "#ffffff",
|
|
36
|
+
"--lk-color-surface-raised": "#fafafa",
|
|
37
|
+
"--lk-color-border": "#e4e4e7",
|
|
38
|
+
"--lk-color-text": "#18181b",
|
|
39
|
+
"--lk-color-text-muted": "#52525b",
|
|
40
|
+
"--lk-color-success": "#15803d",
|
|
41
|
+
"--lk-color-error": "#b91c1c",
|
|
42
|
+
"--lk-color-warning": "#b45309",
|
|
43
|
+
"--lk-color-focus-ring": "#18181b",
|
|
44
|
+
"--lk-color-media-accent": "#ffffff",
|
|
45
|
+
"--lk-iv-caption-color": "#ffffff",
|
|
46
|
+
"--lk-iv-caption-secondary-color": "#ffe066",
|
|
47
|
+
"--lk-iv-caption-secondary-scale": "0.85",
|
|
48
|
+
"--lk-iv-caption-gap": "0.25em",
|
|
49
|
+
"--lk-spacing-xs": "4px",
|
|
50
|
+
"--lk-spacing-sm": "8px",
|
|
51
|
+
"--lk-spacing-md": "16px",
|
|
52
|
+
"--lk-spacing-lg": "24px",
|
|
53
|
+
"--lk-spacing-xl": "32px",
|
|
54
|
+
"--lk-font-family-base": "system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif",
|
|
55
|
+
"--lk-font-size-sm": "0.875rem",
|
|
56
|
+
"--lk-font-size-base": "1rem",
|
|
57
|
+
"--lk-font-size-lg": "1.125rem",
|
|
58
|
+
"--lk-font-weight-normal": "400",
|
|
59
|
+
"--lk-font-weight-bold": "700",
|
|
60
|
+
"--lk-line-height-base": "1.5",
|
|
61
|
+
"--lk-radius-sm": "0.25rem",
|
|
62
|
+
"--lk-radius-base": "0.5rem",
|
|
63
|
+
"--lk-radius-lg": "0.75rem",
|
|
64
|
+
"--lk-transition-fast": "150ms ease",
|
|
65
|
+
"--lk-transition-base": "250ms ease"
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/theme/tailwind.ts
|
|
69
|
+
/**
|
|
70
|
+
* Token-prefix → Tailwind bucket. `--lk-font-weight-*`, `--lk-line-height-*`
|
|
71
|
+
* and `--lk-transition-*` are intentionally absent: the first two have no
|
|
72
|
+
* matching `theme.extend` group here, and the transition tokens hold a
|
|
73
|
+
* `<duration> <easing>` shorthand that would emit invalid
|
|
74
|
+
* `transition-duration: 150ms ease` if mapped to Tailwind's `transitionDuration`.
|
|
75
|
+
*/
|
|
76
|
+
const BUCKETS = [
|
|
77
|
+
["--lk-color-", "colors"],
|
|
78
|
+
["--lk-spacing-", "spacing"],
|
|
79
|
+
["--lk-radius-", "borderRadius"],
|
|
80
|
+
["--lk-font-family-", "fontFamily"],
|
|
81
|
+
["--lk-font-size-", "fontSize"]
|
|
82
|
+
];
|
|
83
|
+
/**
|
|
84
|
+
* Converts SDK theme tokens into a Tailwind `theme.extend` object so Tailwind
|
|
85
|
+
* projects consume the same `--lk-*` tokens as the components — one shared
|
|
86
|
+
* source of truth rather than a parallel, conflicting palette.
|
|
87
|
+
*/
|
|
88
|
+
function createTailwindTheme(theme) {
|
|
89
|
+
const merged = {
|
|
90
|
+
...defaultTheme,
|
|
91
|
+
...theme
|
|
92
|
+
};
|
|
93
|
+
const extension = {
|
|
94
|
+
colors: {},
|
|
95
|
+
spacing: {},
|
|
96
|
+
borderRadius: {},
|
|
97
|
+
fontFamily: {},
|
|
98
|
+
fontSize: {}
|
|
99
|
+
};
|
|
100
|
+
for (const [tokenName, fallback] of Object.entries(merged)) for (const [prefix, bucket] of BUCKETS) if (tokenName.startsWith(prefix)) {
|
|
101
|
+
extension[bucket][`lk-${tokenName.slice(prefix.length)}`] = `var(${tokenName}, ${fallback})`;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
return extension;
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
107
|
+
//#region src/theme/ThemeProvider.tsx
|
|
108
|
+
const ThemeContext = (0, react.createContext)(defaultTheme);
|
|
109
|
+
const DARK_QUERY = "(prefers-color-scheme: dark)";
|
|
110
|
+
/** Subscribe to OS dark-mode changes; no-op when there is no `window`. */
|
|
111
|
+
function subscribePrefersDark(onChange) {
|
|
112
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return () => {};
|
|
113
|
+
const mql = window.matchMedia(DARK_QUERY);
|
|
114
|
+
mql.addEventListener("change", onChange);
|
|
115
|
+
return () => mql.removeEventListener("change", onChange);
|
|
116
|
+
}
|
|
117
|
+
/** Current OS dark-mode preference; `false` when there is no `window`. */
|
|
118
|
+
function getPrefersDark() {
|
|
119
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return false;
|
|
120
|
+
return window.matchMedia(DARK_QUERY).matches;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Provides theme tokens to descendant activity components as scoped inline CSS
|
|
124
|
+
* custom properties on a wrapper `<div>`, and via {@link useTheme}.
|
|
125
|
+
*
|
|
126
|
+
* Resolution: an explicit `theme` prop merges over {@link defaultTheme} (and
|
|
127
|
+
* suppresses dark auto-detect). With no `theme` prop, the OS
|
|
128
|
+
* `prefers-color-scheme: dark` preference auto-applies {@link darkTheme}.
|
|
129
|
+
* SSR-safe: the server snapshot is always light, so hydration never mismatches.
|
|
130
|
+
*/
|
|
131
|
+
function ThemeProvider({ theme, children }) {
|
|
132
|
+
const prefersDark = (0, react.useSyncExternalStore)(subscribePrefersDark, getPrefersDark, () => false);
|
|
133
|
+
const activeTheme = (0, react.useMemo)(() => {
|
|
134
|
+
if (theme !== void 0) return {
|
|
135
|
+
...defaultTheme,
|
|
136
|
+
...theme
|
|
137
|
+
};
|
|
138
|
+
return prefersDark ? {
|
|
139
|
+
...defaultTheme,
|
|
140
|
+
...darkTheme
|
|
141
|
+
} : defaultTheme;
|
|
142
|
+
}, [theme, prefersDark]);
|
|
143
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ThemeContext.Provider, {
|
|
144
|
+
value: activeTheme,
|
|
145
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
146
|
+
style: activeTheme,
|
|
147
|
+
children
|
|
148
|
+
})
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/** Returns the currently active theme tokens (defaults when no provider). */
|
|
152
|
+
function useTheme() {
|
|
153
|
+
return (0, react.useContext)(ThemeContext);
|
|
154
|
+
}
|
|
155
|
+
//#endregion
|
|
156
|
+
Object.defineProperty(exports, "ThemeProvider", {
|
|
157
|
+
enumerable: true,
|
|
158
|
+
get: function() {
|
|
159
|
+
return ThemeProvider;
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
Object.defineProperty(exports, "createTailwindTheme", {
|
|
163
|
+
enumerable: true,
|
|
164
|
+
get: function() {
|
|
165
|
+
return createTailwindTheme;
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
Object.defineProperty(exports, "darkTheme", {
|
|
169
|
+
enumerable: true,
|
|
170
|
+
get: function() {
|
|
171
|
+
return darkTheme;
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
Object.defineProperty(exports, "defaultTheme", {
|
|
175
|
+
enumerable: true,
|
|
176
|
+
get: function() {
|
|
177
|
+
return defaultTheme;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
Object.defineProperty(exports, "useTheme", {
|
|
181
|
+
enumerable: true,
|
|
182
|
+
get: function() {
|
|
183
|
+
return useTheme;
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
//# sourceMappingURL=ThemeProvider-BRN1tj4n.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeProvider-BRN1tj4n.cjs","names":["createContext","useSyncExternalStore","useMemo","useContext"],"sources":["../src/theme/dark-theme.ts","../src/theme/tokens.ts","../src/theme/tailwind.ts","../src/theme/ThemeProvider.tsx"],"sourcesContent":["import type { ThemeTokens } from '@intellectif/lk-core';\n\n/**\n * Dark-mode colour overrides, merged over {@link defaultTheme} by\n * `ThemeProvider`. Colours only — spacing/typography/shape/motion are\n * theme-invariant. All pairs verified WCAG 2.2 AA against the dark surface.\n */\nexport const darkTheme: Partial<ThemeTokens> = {\n '--lk-color-primary': '#fafafa',\n '--lk-color-primary-hover': '#e4e4e7',\n '--lk-color-surface': '#09090b',\n '--lk-color-surface-raised': '#18181b',\n '--lk-color-border': '#27272a',\n '--lk-color-text': '#fafafa',\n '--lk-color-text-muted': '#a1a1aa',\n '--lk-color-success': '#4ade80',\n '--lk-color-error': '#f87171',\n '--lk-color-warning': '#fbbf24',\n '--lk-color-focus-ring': '#fafafa',\n};\n","import type { ThemeTokens } from '@intellectif/lk-core';\n\n/**\n * Canonical default theme token values. `defaults.css` mirrors these exactly.\n * Palette is a neutral monochrome, deliberately unbranded, so the SDK carries\n * nobody's look out of the box; consumers rebrand via `ThemeProvider`. All\n * colour pairs are verified to meet WCAG 2.2 AA: 4.5:1 for normal text, 3:1 for\n * UI / focus ring (see theme/__tests__/contrast.test.ts).\n */\nexport const defaultTheme: ThemeTokens = {\n // ── Colours (light) — neutral monochrome; semantic success/error/warning\n // retained for status legibility ────────────────────────────────────────\n '--lk-color-primary': '#18181b',\n '--lk-color-primary-hover': '#27272a',\n '--lk-color-surface': '#ffffff',\n '--lk-color-surface-raised': '#fafafa',\n '--lk-color-border': '#e4e4e7',\n '--lk-color-text': '#18181b',\n '--lk-color-text-muted': '#52525b',\n '--lk-color-success': '#15803d',\n '--lk-color-error': '#b91c1c',\n '--lk-color-warning': '#b45309',\n '--lk-color-focus-ring': '#18181b',\n '--lk-color-media-accent': '#ffffff',\n // An interactive video's two caption lines. The second is warm yellow, the\n // convention for a second subtitle line, and clears 4.5:1 on the caption box\n // whatever the video shows through it (see contrast.test.ts).\n '--lk-iv-caption-color': '#ffffff',\n '--lk-iv-caption-secondary-color': '#ffe066',\n '--lk-iv-caption-secondary-scale': '0.85',\n '--lk-iv-caption-gap': '0.25em',\n\n // ── Spacing ──────────────────────────────────────────────────────────────\n '--lk-spacing-xs': '4px',\n '--lk-spacing-sm': '8px',\n '--lk-spacing-md': '16px',\n '--lk-spacing-lg': '24px',\n '--lk-spacing-xl': '32px',\n\n // ── Typography ───────────────────────────────────────────────────────────\n '--lk-font-family-base':\n 'system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n '--lk-font-size-sm': '0.875rem',\n '--lk-font-size-base': '1rem',\n '--lk-font-size-lg': '1.125rem',\n '--lk-font-weight-normal': '400',\n '--lk-font-weight-bold': '700',\n '--lk-line-height-base': '1.5',\n\n // ── Shape ────────────────────────────────────────────────────────────────\n '--lk-radius-sm': '0.25rem',\n '--lk-radius-base': '0.5rem',\n '--lk-radius-lg': '0.75rem',\n\n // ── Motion ───────────────────────────────────────────────────────────────\n '--lk-transition-fast': '150ms ease',\n '--lk-transition-base': '250ms ease',\n};\n","import type { ThemeTokens } from '@intellectif/lk-core';\nimport { defaultTheme } from './tokens.js';\n\n/**\n * Shape consumed by a Tailwind config's `theme.extend`. Every entry is a\n * `var(--lk-token, <fallback>)` reference: the var keeps utilities live\n * (ThemeProvider / dark-mode override at runtime); the fallback makes them\n * work with zero setup (no provider, no `defaults.css` import).\n */\nexport interface TailwindThemeExtension {\n colors: Record<string, string>;\n spacing: Record<string, string>;\n borderRadius: Record<string, string>;\n fontFamily: Record<string, string>;\n fontSize: Record<string, string>;\n}\n\n/**\n * Token-prefix → Tailwind bucket. `--lk-font-weight-*`, `--lk-line-height-*`\n * and `--lk-transition-*` are intentionally absent: the first two have no\n * matching `theme.extend` group here, and the transition tokens hold a\n * `<duration> <easing>` shorthand that would emit invalid\n * `transition-duration: 150ms ease` if mapped to Tailwind's `transitionDuration`.\n */\nconst BUCKETS = [\n ['--lk-color-', 'colors'],\n ['--lk-spacing-', 'spacing'],\n ['--lk-radius-', 'borderRadius'],\n ['--lk-font-family-', 'fontFamily'],\n ['--lk-font-size-', 'fontSize'],\n] as const;\n\n/**\n * Converts SDK theme tokens into a Tailwind `theme.extend` object so Tailwind\n * projects consume the same `--lk-*` tokens as the components — one shared\n * source of truth rather than a parallel, conflicting palette.\n */\nexport function createTailwindTheme(theme: Partial<ThemeTokens>): TailwindThemeExtension {\n const merged: Record<string, string> = { ...defaultTheme, ...theme };\n const extension: TailwindThemeExtension = {\n colors: {},\n spacing: {},\n borderRadius: {},\n fontFamily: {},\n fontSize: {},\n };\n\n for (const [tokenName, fallback] of Object.entries(merged)) {\n for (const [prefix, bucket] of BUCKETS) {\n if (tokenName.startsWith(prefix)) {\n extension[bucket][`lk-${tokenName.slice(prefix.length)}`] =\n `var(${tokenName}, ${fallback})`;\n break;\n }\n }\n }\n\n return extension;\n}\n","'use client';\n\nimport type { ThemeTokens } from '@intellectif/lk-core';\nimport {\n type CSSProperties,\n createContext,\n type ReactNode,\n useContext,\n useMemo,\n useSyncExternalStore,\n} from 'react';\nimport { darkTheme } from './dark-theme.js';\nimport { defaultTheme } from './tokens.js';\n\nexport { darkTheme } from './dark-theme.js';\nexport { createTailwindTheme, type TailwindThemeExtension } from './tailwind.js';\nexport { defaultTheme } from './tokens.js';\n\nconst ThemeContext = createContext<ThemeTokens>(defaultTheme);\n\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\n\n/** Subscribe to OS dark-mode changes; no-op when there is no `window`. */\nfunction subscribePrefersDark(onChange: () => void): () => void {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return () => {};\n }\n const mql = window.matchMedia(DARK_QUERY);\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n}\n\n/** Current OS dark-mode preference; `false` when there is no `window`. */\nfunction getPrefersDark(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return false;\n }\n return window.matchMedia(DARK_QUERY).matches;\n}\n\nexport interface ThemeProviderProps {\n /** Partial token overrides. When provided, dark auto-detection is disabled. */\n theme?: Partial<ThemeTokens>;\n children: ReactNode;\n}\n\n/**\n * Provides theme tokens to descendant activity components as scoped inline CSS\n * custom properties on a wrapper `<div>`, and via {@link useTheme}.\n *\n * Resolution: an explicit `theme` prop merges over {@link defaultTheme} (and\n * suppresses dark auto-detect). With no `theme` prop, the OS\n * `prefers-color-scheme: dark` preference auto-applies {@link darkTheme}.\n * SSR-safe: the server snapshot is always light, so hydration never mismatches.\n */\nexport function ThemeProvider({ theme, children }: ThemeProviderProps): React.JSX.Element {\n const prefersDark = useSyncExternalStore(subscribePrefersDark, getPrefersDark, () => false);\n\n const activeTheme = useMemo<ThemeTokens>(() => {\n if (theme !== undefined) {\n return { ...defaultTheme, ...theme };\n }\n return prefersDark ? { ...defaultTheme, ...darkTheme } : defaultTheme;\n }, [theme, prefersDark]);\n\n return (\n <ThemeContext.Provider value={activeTheme}>\n <div style={activeTheme as CSSProperties}>{children}</div>\n </ThemeContext.Provider>\n );\n}\n\n/** Returns the currently active theme tokens (defaults when no provider). */\nexport function useTheme(): ThemeTokens {\n return useContext(ThemeContext);\n}\n"],"mappings":";;;;;;;;AAOA,MAAa,YAAkC;CAC7C,sBAAsB;CACtB,4BAA4B;CAC5B,sBAAsB;CACtB,6BAA6B;CAC7B,qBAAqB;CACrB,mBAAmB;CACnB,yBAAyB;CACzB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,yBAAyB;AAC3B;;;;;;;;;;ACVA,MAAa,eAA4B;CAGvC,sBAAsB;CACtB,4BAA4B;CAC5B,sBAAsB;CACtB,6BAA6B;CAC7B,qBAAqB;CACrB,mBAAmB;CACnB,yBAAyB;CACzB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,yBAAyB;CACzB,2BAA2B;CAI3B,yBAAyB;CACzB,mCAAmC;CACnC,mCAAmC;CACnC,uBAAuB;CAGvB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CAGnB,yBACE;CACF,qBAAqB;CACrB,uBAAuB;CACvB,qBAAqB;CACrB,2BAA2B;CAC3B,yBAAyB;CACzB,yBAAyB;CAGzB,kBAAkB;CAClB,oBAAoB;CACpB,kBAAkB;CAGlB,wBAAwB;CACxB,wBAAwB;AAC1B;;;;;;;;;;ACjCA,MAAM,UAAU;CACd,CAAC,eAAe,QAAQ;CACxB,CAAC,iBAAiB,SAAS;CAC3B,CAAC,gBAAgB,cAAc;CAC/B,CAAC,qBAAqB,YAAY;CAClC,CAAC,mBAAmB,UAAU;AAChC;;;;;;AAOA,SAAgB,oBAAoB,OAAqD;CACvF,MAAM,SAAiC;EAAE,GAAG;EAAc,GAAG;CAAM;CACnE,MAAM,YAAoC;EACxC,QAAQ,CAAC;EACT,SAAS,CAAC;EACV,cAAc,CAAC;EACf,YAAY,CAAC;EACb,UAAU,CAAC;CACb;CAEA,KAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,MAAM,GACvD,KAAK,MAAM,CAAC,QAAQ,WAAW,SAC7B,IAAI,UAAU,WAAW,MAAM,GAAG;EAChC,UAAU,OAAO,CAAC,MAAM,UAAU,MAAM,OAAO,MAAM,OACnD,OAAO,UAAU,IAAI,SAAS;EAChC;CACF;CAIJ,OAAO;AACT;;;ACxCA,MAAM,gBAAA,GAAeA,MAAAA,cAAAA,CAA2B,YAAY;AAE5D,MAAM,aAAa;;AAGnB,SAAS,qBAAqB,UAAkC;CAC9D,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAChE,aAAa,CAAC;CAEhB,MAAM,MAAM,OAAO,WAAW,UAAU;CACxC,IAAI,iBAAiB,UAAU,QAAQ;CACvC,aAAa,IAAI,oBAAoB,UAAU,QAAQ;AACzD;;AAGA,SAAS,iBAA0B;CACjC,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAChE,OAAO;CAET,OAAO,OAAO,WAAW,UAAU,CAAC,CAAC;AACvC;;;;;;;;;;AAiBA,SAAgB,cAAc,EAAE,OAAO,YAAmD;CACxF,MAAM,eAAA,GAAcC,MAAAA,qBAAAA,CAAqB,sBAAsB,sBAAsB,KAAK;CAE1F,MAAM,eAAA,GAAcC,MAAAA,QAAAA,OAA2B;EAC7C,IAAI,UAAU,KAAA,GACZ,OAAO;GAAE,GAAG;GAAc,GAAG;EAAM;EAErC,OAAO,cAAc;GAAE,GAAG;GAAc,GAAG;EAAU,IAAI;CAC3D,GAAG,CAAC,OAAO,WAAW,CAAC;CAEvB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAa,UAAd;EAAuB,OAAO;EAC5B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,OAAO;GAA+B;EAAc,CAAA;CACpC,CAAA;AAE3B;;AAGA,SAAgB,WAAwB;CACtC,QAAA,GAAOC,MAAAA,WAAAA,CAAW,YAAY;AAChC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createContext, useContext, useMemo, useSyncExternalStore } from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
//#region src/theme/dark-theme.ts
|
|
5
|
+
/**
|
|
6
|
+
* Dark-mode colour overrides, merged over {@link defaultTheme} by
|
|
7
|
+
* `ThemeProvider`. Colours only — spacing/typography/shape/motion are
|
|
8
|
+
* theme-invariant. All pairs verified WCAG 2.2 AA against the dark surface.
|
|
9
|
+
*/
|
|
10
|
+
const darkTheme = {
|
|
11
|
+
"--lk-color-primary": "#fafafa",
|
|
12
|
+
"--lk-color-primary-hover": "#e4e4e7",
|
|
13
|
+
"--lk-color-surface": "#09090b",
|
|
14
|
+
"--lk-color-surface-raised": "#18181b",
|
|
15
|
+
"--lk-color-border": "#27272a",
|
|
16
|
+
"--lk-color-text": "#fafafa",
|
|
17
|
+
"--lk-color-text-muted": "#a1a1aa",
|
|
18
|
+
"--lk-color-success": "#4ade80",
|
|
19
|
+
"--lk-color-error": "#f87171",
|
|
20
|
+
"--lk-color-warning": "#fbbf24",
|
|
21
|
+
"--lk-color-focus-ring": "#fafafa"
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/theme/tokens.ts
|
|
25
|
+
/**
|
|
26
|
+
* Canonical default theme token values. `defaults.css` mirrors these exactly.
|
|
27
|
+
* Palette is a neutral monochrome, deliberately unbranded, so the SDK carries
|
|
28
|
+
* nobody's look out of the box; consumers rebrand via `ThemeProvider`. All
|
|
29
|
+
* colour pairs are verified to meet WCAG 2.2 AA: 4.5:1 for normal text, 3:1 for
|
|
30
|
+
* UI / focus ring (see theme/__tests__/contrast.test.ts).
|
|
31
|
+
*/
|
|
32
|
+
const defaultTheme = {
|
|
33
|
+
"--lk-color-primary": "#18181b",
|
|
34
|
+
"--lk-color-primary-hover": "#27272a",
|
|
35
|
+
"--lk-color-surface": "#ffffff",
|
|
36
|
+
"--lk-color-surface-raised": "#fafafa",
|
|
37
|
+
"--lk-color-border": "#e4e4e7",
|
|
38
|
+
"--lk-color-text": "#18181b",
|
|
39
|
+
"--lk-color-text-muted": "#52525b",
|
|
40
|
+
"--lk-color-success": "#15803d",
|
|
41
|
+
"--lk-color-error": "#b91c1c",
|
|
42
|
+
"--lk-color-warning": "#b45309",
|
|
43
|
+
"--lk-color-focus-ring": "#18181b",
|
|
44
|
+
"--lk-color-media-accent": "#ffffff",
|
|
45
|
+
"--lk-iv-caption-color": "#ffffff",
|
|
46
|
+
"--lk-iv-caption-secondary-color": "#ffe066",
|
|
47
|
+
"--lk-iv-caption-secondary-scale": "0.85",
|
|
48
|
+
"--lk-iv-caption-gap": "0.25em",
|
|
49
|
+
"--lk-spacing-xs": "4px",
|
|
50
|
+
"--lk-spacing-sm": "8px",
|
|
51
|
+
"--lk-spacing-md": "16px",
|
|
52
|
+
"--lk-spacing-lg": "24px",
|
|
53
|
+
"--lk-spacing-xl": "32px",
|
|
54
|
+
"--lk-font-family-base": "system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif",
|
|
55
|
+
"--lk-font-size-sm": "0.875rem",
|
|
56
|
+
"--lk-font-size-base": "1rem",
|
|
57
|
+
"--lk-font-size-lg": "1.125rem",
|
|
58
|
+
"--lk-font-weight-normal": "400",
|
|
59
|
+
"--lk-font-weight-bold": "700",
|
|
60
|
+
"--lk-line-height-base": "1.5",
|
|
61
|
+
"--lk-radius-sm": "0.25rem",
|
|
62
|
+
"--lk-radius-base": "0.5rem",
|
|
63
|
+
"--lk-radius-lg": "0.75rem",
|
|
64
|
+
"--lk-transition-fast": "150ms ease",
|
|
65
|
+
"--lk-transition-base": "250ms ease"
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/theme/tailwind.ts
|
|
69
|
+
/**
|
|
70
|
+
* Token-prefix → Tailwind bucket. `--lk-font-weight-*`, `--lk-line-height-*`
|
|
71
|
+
* and `--lk-transition-*` are intentionally absent: the first two have no
|
|
72
|
+
* matching `theme.extend` group here, and the transition tokens hold a
|
|
73
|
+
* `<duration> <easing>` shorthand that would emit invalid
|
|
74
|
+
* `transition-duration: 150ms ease` if mapped to Tailwind's `transitionDuration`.
|
|
75
|
+
*/
|
|
76
|
+
const BUCKETS = [
|
|
77
|
+
["--lk-color-", "colors"],
|
|
78
|
+
["--lk-spacing-", "spacing"],
|
|
79
|
+
["--lk-radius-", "borderRadius"],
|
|
80
|
+
["--lk-font-family-", "fontFamily"],
|
|
81
|
+
["--lk-font-size-", "fontSize"]
|
|
82
|
+
];
|
|
83
|
+
/**
|
|
84
|
+
* Converts SDK theme tokens into a Tailwind `theme.extend` object so Tailwind
|
|
85
|
+
* projects consume the same `--lk-*` tokens as the components — one shared
|
|
86
|
+
* source of truth rather than a parallel, conflicting palette.
|
|
87
|
+
*/
|
|
88
|
+
function createTailwindTheme(theme) {
|
|
89
|
+
const merged = {
|
|
90
|
+
...defaultTheme,
|
|
91
|
+
...theme
|
|
92
|
+
};
|
|
93
|
+
const extension = {
|
|
94
|
+
colors: {},
|
|
95
|
+
spacing: {},
|
|
96
|
+
borderRadius: {},
|
|
97
|
+
fontFamily: {},
|
|
98
|
+
fontSize: {}
|
|
99
|
+
};
|
|
100
|
+
for (const [tokenName, fallback] of Object.entries(merged)) for (const [prefix, bucket] of BUCKETS) if (tokenName.startsWith(prefix)) {
|
|
101
|
+
extension[bucket][`lk-${tokenName.slice(prefix.length)}`] = `var(${tokenName}, ${fallback})`;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
return extension;
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
107
|
+
//#region src/theme/ThemeProvider.tsx
|
|
108
|
+
const ThemeContext = createContext(defaultTheme);
|
|
109
|
+
const DARK_QUERY = "(prefers-color-scheme: dark)";
|
|
110
|
+
/** Subscribe to OS dark-mode changes; no-op when there is no `window`. */
|
|
111
|
+
function subscribePrefersDark(onChange) {
|
|
112
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return () => {};
|
|
113
|
+
const mql = window.matchMedia(DARK_QUERY);
|
|
114
|
+
mql.addEventListener("change", onChange);
|
|
115
|
+
return () => mql.removeEventListener("change", onChange);
|
|
116
|
+
}
|
|
117
|
+
/** Current OS dark-mode preference; `false` when there is no `window`. */
|
|
118
|
+
function getPrefersDark() {
|
|
119
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return false;
|
|
120
|
+
return window.matchMedia(DARK_QUERY).matches;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Provides theme tokens to descendant activity components as scoped inline CSS
|
|
124
|
+
* custom properties on a wrapper `<div>`, and via {@link useTheme}.
|
|
125
|
+
*
|
|
126
|
+
* Resolution: an explicit `theme` prop merges over {@link defaultTheme} (and
|
|
127
|
+
* suppresses dark auto-detect). With no `theme` prop, the OS
|
|
128
|
+
* `prefers-color-scheme: dark` preference auto-applies {@link darkTheme}.
|
|
129
|
+
* SSR-safe: the server snapshot is always light, so hydration never mismatches.
|
|
130
|
+
*/
|
|
131
|
+
function ThemeProvider({ theme, children }) {
|
|
132
|
+
const prefersDark = useSyncExternalStore(subscribePrefersDark, getPrefersDark, () => false);
|
|
133
|
+
const activeTheme = useMemo(() => {
|
|
134
|
+
if (theme !== void 0) return {
|
|
135
|
+
...defaultTheme,
|
|
136
|
+
...theme
|
|
137
|
+
};
|
|
138
|
+
return prefersDark ? {
|
|
139
|
+
...defaultTheme,
|
|
140
|
+
...darkTheme
|
|
141
|
+
} : defaultTheme;
|
|
142
|
+
}, [theme, prefersDark]);
|
|
143
|
+
return /* @__PURE__ */ jsx(ThemeContext.Provider, {
|
|
144
|
+
value: activeTheme,
|
|
145
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
146
|
+
style: activeTheme,
|
|
147
|
+
children
|
|
148
|
+
})
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/** Returns the currently active theme tokens (defaults when no provider). */
|
|
152
|
+
function useTheme() {
|
|
153
|
+
return useContext(ThemeContext);
|
|
154
|
+
}
|
|
155
|
+
//#endregion
|
|
156
|
+
export { darkTheme as a, defaultTheme as i, useTheme as n, createTailwindTheme as r, ThemeProvider as t };
|
|
157
|
+
|
|
158
|
+
//# sourceMappingURL=ThemeProvider-C7K9iMLX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeProvider-C7K9iMLX.js","names":[],"sources":["../src/theme/dark-theme.ts","../src/theme/tokens.ts","../src/theme/tailwind.ts","../src/theme/ThemeProvider.tsx"],"sourcesContent":["import type { ThemeTokens } from '@intellectif/lk-core';\n\n/**\n * Dark-mode colour overrides, merged over {@link defaultTheme} by\n * `ThemeProvider`. Colours only — spacing/typography/shape/motion are\n * theme-invariant. All pairs verified WCAG 2.2 AA against the dark surface.\n */\nexport const darkTheme: Partial<ThemeTokens> = {\n '--lk-color-primary': '#fafafa',\n '--lk-color-primary-hover': '#e4e4e7',\n '--lk-color-surface': '#09090b',\n '--lk-color-surface-raised': '#18181b',\n '--lk-color-border': '#27272a',\n '--lk-color-text': '#fafafa',\n '--lk-color-text-muted': '#a1a1aa',\n '--lk-color-success': '#4ade80',\n '--lk-color-error': '#f87171',\n '--lk-color-warning': '#fbbf24',\n '--lk-color-focus-ring': '#fafafa',\n};\n","import type { ThemeTokens } from '@intellectif/lk-core';\n\n/**\n * Canonical default theme token values. `defaults.css` mirrors these exactly.\n * Palette is a neutral monochrome, deliberately unbranded, so the SDK carries\n * nobody's look out of the box; consumers rebrand via `ThemeProvider`. All\n * colour pairs are verified to meet WCAG 2.2 AA: 4.5:1 for normal text, 3:1 for\n * UI / focus ring (see theme/__tests__/contrast.test.ts).\n */\nexport const defaultTheme: ThemeTokens = {\n // ── Colours (light) — neutral monochrome; semantic success/error/warning\n // retained for status legibility ────────────────────────────────────────\n '--lk-color-primary': '#18181b',\n '--lk-color-primary-hover': '#27272a',\n '--lk-color-surface': '#ffffff',\n '--lk-color-surface-raised': '#fafafa',\n '--lk-color-border': '#e4e4e7',\n '--lk-color-text': '#18181b',\n '--lk-color-text-muted': '#52525b',\n '--lk-color-success': '#15803d',\n '--lk-color-error': '#b91c1c',\n '--lk-color-warning': '#b45309',\n '--lk-color-focus-ring': '#18181b',\n '--lk-color-media-accent': '#ffffff',\n // An interactive video's two caption lines. The second is warm yellow, the\n // convention for a second subtitle line, and clears 4.5:1 on the caption box\n // whatever the video shows through it (see contrast.test.ts).\n '--lk-iv-caption-color': '#ffffff',\n '--lk-iv-caption-secondary-color': '#ffe066',\n '--lk-iv-caption-secondary-scale': '0.85',\n '--lk-iv-caption-gap': '0.25em',\n\n // ── Spacing ──────────────────────────────────────────────────────────────\n '--lk-spacing-xs': '4px',\n '--lk-spacing-sm': '8px',\n '--lk-spacing-md': '16px',\n '--lk-spacing-lg': '24px',\n '--lk-spacing-xl': '32px',\n\n // ── Typography ───────────────────────────────────────────────────────────\n '--lk-font-family-base':\n 'system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n '--lk-font-size-sm': '0.875rem',\n '--lk-font-size-base': '1rem',\n '--lk-font-size-lg': '1.125rem',\n '--lk-font-weight-normal': '400',\n '--lk-font-weight-bold': '700',\n '--lk-line-height-base': '1.5',\n\n // ── Shape ────────────────────────────────────────────────────────────────\n '--lk-radius-sm': '0.25rem',\n '--lk-radius-base': '0.5rem',\n '--lk-radius-lg': '0.75rem',\n\n // ── Motion ───────────────────────────────────────────────────────────────\n '--lk-transition-fast': '150ms ease',\n '--lk-transition-base': '250ms ease',\n};\n","import type { ThemeTokens } from '@intellectif/lk-core';\nimport { defaultTheme } from './tokens.js';\n\n/**\n * Shape consumed by a Tailwind config's `theme.extend`. Every entry is a\n * `var(--lk-token, <fallback>)` reference: the var keeps utilities live\n * (ThemeProvider / dark-mode override at runtime); the fallback makes them\n * work with zero setup (no provider, no `defaults.css` import).\n */\nexport interface TailwindThemeExtension {\n colors: Record<string, string>;\n spacing: Record<string, string>;\n borderRadius: Record<string, string>;\n fontFamily: Record<string, string>;\n fontSize: Record<string, string>;\n}\n\n/**\n * Token-prefix → Tailwind bucket. `--lk-font-weight-*`, `--lk-line-height-*`\n * and `--lk-transition-*` are intentionally absent: the first two have no\n * matching `theme.extend` group here, and the transition tokens hold a\n * `<duration> <easing>` shorthand that would emit invalid\n * `transition-duration: 150ms ease` if mapped to Tailwind's `transitionDuration`.\n */\nconst BUCKETS = [\n ['--lk-color-', 'colors'],\n ['--lk-spacing-', 'spacing'],\n ['--lk-radius-', 'borderRadius'],\n ['--lk-font-family-', 'fontFamily'],\n ['--lk-font-size-', 'fontSize'],\n] as const;\n\n/**\n * Converts SDK theme tokens into a Tailwind `theme.extend` object so Tailwind\n * projects consume the same `--lk-*` tokens as the components — one shared\n * source of truth rather than a parallel, conflicting palette.\n */\nexport function createTailwindTheme(theme: Partial<ThemeTokens>): TailwindThemeExtension {\n const merged: Record<string, string> = { ...defaultTheme, ...theme };\n const extension: TailwindThemeExtension = {\n colors: {},\n spacing: {},\n borderRadius: {},\n fontFamily: {},\n fontSize: {},\n };\n\n for (const [tokenName, fallback] of Object.entries(merged)) {\n for (const [prefix, bucket] of BUCKETS) {\n if (tokenName.startsWith(prefix)) {\n extension[bucket][`lk-${tokenName.slice(prefix.length)}`] =\n `var(${tokenName}, ${fallback})`;\n break;\n }\n }\n }\n\n return extension;\n}\n","'use client';\n\nimport type { ThemeTokens } from '@intellectif/lk-core';\nimport {\n type CSSProperties,\n createContext,\n type ReactNode,\n useContext,\n useMemo,\n useSyncExternalStore,\n} from 'react';\nimport { darkTheme } from './dark-theme.js';\nimport { defaultTheme } from './tokens.js';\n\nexport { darkTheme } from './dark-theme.js';\nexport { createTailwindTheme, type TailwindThemeExtension } from './tailwind.js';\nexport { defaultTheme } from './tokens.js';\n\nconst ThemeContext = createContext<ThemeTokens>(defaultTheme);\n\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\n\n/** Subscribe to OS dark-mode changes; no-op when there is no `window`. */\nfunction subscribePrefersDark(onChange: () => void): () => void {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return () => {};\n }\n const mql = window.matchMedia(DARK_QUERY);\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n}\n\n/** Current OS dark-mode preference; `false` when there is no `window`. */\nfunction getPrefersDark(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return false;\n }\n return window.matchMedia(DARK_QUERY).matches;\n}\n\nexport interface ThemeProviderProps {\n /** Partial token overrides. When provided, dark auto-detection is disabled. */\n theme?: Partial<ThemeTokens>;\n children: ReactNode;\n}\n\n/**\n * Provides theme tokens to descendant activity components as scoped inline CSS\n * custom properties on a wrapper `<div>`, and via {@link useTheme}.\n *\n * Resolution: an explicit `theme` prop merges over {@link defaultTheme} (and\n * suppresses dark auto-detect). With no `theme` prop, the OS\n * `prefers-color-scheme: dark` preference auto-applies {@link darkTheme}.\n * SSR-safe: the server snapshot is always light, so hydration never mismatches.\n */\nexport function ThemeProvider({ theme, children }: ThemeProviderProps): React.JSX.Element {\n const prefersDark = useSyncExternalStore(subscribePrefersDark, getPrefersDark, () => false);\n\n const activeTheme = useMemo<ThemeTokens>(() => {\n if (theme !== undefined) {\n return { ...defaultTheme, ...theme };\n }\n return prefersDark ? { ...defaultTheme, ...darkTheme } : defaultTheme;\n }, [theme, prefersDark]);\n\n return (\n <ThemeContext.Provider value={activeTheme}>\n <div style={activeTheme as CSSProperties}>{children}</div>\n </ThemeContext.Provider>\n );\n}\n\n/** Returns the currently active theme tokens (defaults when no provider). */\nexport function useTheme(): ThemeTokens {\n return useContext(ThemeContext);\n}\n"],"mappings":";;;;;;;;AAOA,MAAa,YAAkC;CAC7C,sBAAsB;CACtB,4BAA4B;CAC5B,sBAAsB;CACtB,6BAA6B;CAC7B,qBAAqB;CACrB,mBAAmB;CACnB,yBAAyB;CACzB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,yBAAyB;AAC3B;;;;;;;;;;ACVA,MAAa,eAA4B;CAGvC,sBAAsB;CACtB,4BAA4B;CAC5B,sBAAsB;CACtB,6BAA6B;CAC7B,qBAAqB;CACrB,mBAAmB;CACnB,yBAAyB;CACzB,sBAAsB;CACtB,oBAAoB;CACpB,sBAAsB;CACtB,yBAAyB;CACzB,2BAA2B;CAI3B,yBAAyB;CACzB,mCAAmC;CACnC,mCAAmC;CACnC,uBAAuB;CAGvB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CAGnB,yBACE;CACF,qBAAqB;CACrB,uBAAuB;CACvB,qBAAqB;CACrB,2BAA2B;CAC3B,yBAAyB;CACzB,yBAAyB;CAGzB,kBAAkB;CAClB,oBAAoB;CACpB,kBAAkB;CAGlB,wBAAwB;CACxB,wBAAwB;AAC1B;;;;;;;;;;ACjCA,MAAM,UAAU;CACd,CAAC,eAAe,QAAQ;CACxB,CAAC,iBAAiB,SAAS;CAC3B,CAAC,gBAAgB,cAAc;CAC/B,CAAC,qBAAqB,YAAY;CAClC,CAAC,mBAAmB,UAAU;AAChC;;;;;;AAOA,SAAgB,oBAAoB,OAAqD;CACvF,MAAM,SAAiC;EAAE,GAAG;EAAc,GAAG;CAAM;CACnE,MAAM,YAAoC;EACxC,QAAQ,CAAC;EACT,SAAS,CAAC;EACV,cAAc,CAAC;EACf,YAAY,CAAC;EACb,UAAU,CAAC;CACb;CAEA,KAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,MAAM,GACvD,KAAK,MAAM,CAAC,QAAQ,WAAW,SAC7B,IAAI,UAAU,WAAW,MAAM,GAAG;EAChC,UAAU,OAAO,CAAC,MAAM,UAAU,MAAM,OAAO,MAAM,OACnD,OAAO,UAAU,IAAI,SAAS;EAChC;CACF;CAIJ,OAAO;AACT;;;ACxCA,MAAM,eAAe,cAA2B,YAAY;AAE5D,MAAM,aAAa;;AAGnB,SAAS,qBAAqB,UAAkC;CAC9D,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAChE,aAAa,CAAC;CAEhB,MAAM,MAAM,OAAO,WAAW,UAAU;CACxC,IAAI,iBAAiB,UAAU,QAAQ;CACvC,aAAa,IAAI,oBAAoB,UAAU,QAAQ;AACzD;;AAGA,SAAS,iBAA0B;CACjC,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAChE,OAAO;CAET,OAAO,OAAO,WAAW,UAAU,CAAC,CAAC;AACvC;;;;;;;;;;AAiBA,SAAgB,cAAc,EAAE,OAAO,YAAmD;CACxF,MAAM,cAAc,qBAAqB,sBAAsB,sBAAsB,KAAK;CAE1F,MAAM,cAAc,cAA2B;EAC7C,IAAI,UAAU,KAAA,GACZ,OAAO;GAAE,GAAG;GAAc,GAAG;EAAM;EAErC,OAAO,cAAc;GAAE,GAAG;GAAc,GAAG;EAAU,IAAI;CAC3D,GAAG,CAAC,OAAO,WAAW,CAAC;CAEvB,OACE,oBAAC,aAAa,UAAd;EAAuB,OAAO;EAC5B,UAAA,oBAAC,OAAD;GAAK,OAAO;GAA+B;EAAc,CAAA;CACpC,CAAA;AAE3B;;AAGA,SAAgB,WAAwB;CACtC,OAAO,WAAW,YAAY;AAChC"}
|