@intlayer/design-system 7.0.1 → 7.0.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/esm/components/Accordion/Accordion.mjs +7 -12
- package/dist/esm/components/Accordion/Accordion.mjs.map +1 -1
- package/dist/esm/components/Browser/Browser.content.mjs +94 -0
- package/dist/esm/components/Browser/Browser.content.mjs.map +1 -0
- package/dist/esm/components/Browser/Browser.mjs +202 -0
- package/dist/esm/components/Browser/Browser.mjs.map +1 -0
- package/dist/esm/components/Browser/index.mjs +3 -0
- package/dist/esm/components/DictionaryEditor/DictionaryEditor.mjs +4 -4
- package/dist/esm/components/DictionaryEditor/DictionaryEditor.mjs.map +1 -1
- package/dist/esm/components/DictionaryEditor/NodeWrapper/NestedObjectWrapper.mjs +8 -5
- package/dist/esm/components/DictionaryEditor/NodeWrapper/NestedObjectWrapper.mjs.map +1 -1
- package/dist/esm/components/DictionaryEditor/NodeWrapper/StringWrapper.mjs +3 -1
- package/dist/esm/components/DictionaryEditor/NodeWrapper/StringWrapper.mjs.map +1 -1
- package/dist/esm/components/DictionaryEditor/NodeWrapper/index.mjs +13 -4
- package/dist/esm/components/DictionaryEditor/NodeWrapper/index.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs +4 -3
- package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs +6 -6
- package/dist/esm/components/DictionaryFieldEditor/ContentEditorView/TextEditor.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs +2 -2
- package/dist/esm/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs +3 -3
- package/dist/esm/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +3 -3
- package/dist/esm/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs +3 -3
- package/dist/esm/components/DictionaryFieldEditor/StructureView/StructureView.mjs.map +1 -1
- package/dist/esm/components/Flags/Flag.mjs +17 -5
- package/dist/esm/components/Flags/Flag.mjs.map +1 -1
- package/dist/esm/components/Flags/ae.mjs +2 -0
- package/dist/esm/components/Flags/ae.mjs.map +1 -1
- package/dist/esm/components/Flags/af.mjs +2 -0
- package/dist/esm/components/Flags/af.mjs.map +1 -1
- package/dist/esm/components/Flags/al.mjs +2 -0
- package/dist/esm/components/Flags/al.mjs.map +1 -1
- package/dist/esm/components/Flags/am.mjs +2 -0
- package/dist/esm/components/Flags/am.mjs.map +1 -1
- package/dist/esm/components/Flags/ar.mjs +2 -0
- package/dist/esm/components/Flags/ar.mjs.map +1 -1
- package/dist/esm/components/Flags/at.mjs +2 -0
- package/dist/esm/components/Flags/at.mjs.map +1 -1
- package/dist/esm/components/Flags/au.mjs +2 -0
- package/dist/esm/components/Flags/au.mjs.map +1 -1
- package/dist/esm/components/Flags/az.mjs +2 -0
- package/dist/esm/components/Flags/az.mjs.map +1 -1
- package/dist/esm/components/Flags/ba.mjs +2 -0
- package/dist/esm/components/Flags/ba.mjs.map +1 -1
- package/dist/esm/components/Flags/bd.mjs +2 -0
- package/dist/esm/components/Flags/bd.mjs.map +1 -1
- package/dist/esm/components/Flags/be.mjs +2 -0
- package/dist/esm/components/Flags/be.mjs.map +1 -1
- package/dist/esm/components/Flags/bg.mjs +2 -0
- package/dist/esm/components/Flags/bg.mjs.map +1 -1
- package/dist/esm/components/Flags/bh.mjs +2 -0
- package/dist/esm/components/Flags/bh.mjs.map +1 -1
- package/dist/esm/components/Flags/bn.mjs +2 -0
- package/dist/esm/components/Flags/bn.mjs.map +1 -1
- package/dist/esm/components/Flags/bo.mjs +2 -0
- package/dist/esm/components/Flags/bo.mjs.map +1 -1
- package/dist/esm/components/Flags/br.mjs +2 -0
- package/dist/esm/components/Flags/br.mjs.map +1 -1
- package/dist/esm/components/Flags/by.mjs +2 -0
- package/dist/esm/components/Flags/by.mjs.map +1 -1
- package/dist/esm/components/Flags/bz.mjs +2 -0
- package/dist/esm/components/Flags/bz.mjs.map +1 -1
- package/dist/esm/components/Flags/ca.mjs +2 -0
- package/dist/esm/components/Flags/ca.mjs.map +1 -1
- package/dist/esm/components/Flags/ch.mjs +2 -0
- package/dist/esm/components/Flags/ch.mjs.map +1 -1
- package/dist/esm/components/Flags/cl.mjs +2 -0
- package/dist/esm/components/Flags/cl.mjs.map +1 -1
- package/dist/esm/components/Flags/cn.mjs +2 -0
- package/dist/esm/components/Flags/cn.mjs.map +1 -1
- package/dist/esm/components/Flags/co.mjs +2 -0
- package/dist/esm/components/Flags/co.mjs.map +1 -1
- package/dist/esm/components/Flags/cr.mjs +2 -0
- package/dist/esm/components/Flags/cr.mjs.map +1 -1
- package/dist/esm/components/Flags/cz.mjs +2 -0
- package/dist/esm/components/Flags/cz.mjs.map +1 -1
- package/dist/esm/components/Flags/de.mjs +2 -0
- package/dist/esm/components/Flags/de.mjs.map +1 -1
- package/dist/esm/components/Flags/dk.mjs +2 -0
- package/dist/esm/components/Flags/dk.mjs.map +1 -1
- package/dist/esm/components/Flags/do.mjs +2 -0
- package/dist/esm/components/Flags/do.mjs.map +1 -1
- package/dist/esm/components/Flags/dz.mjs +2 -0
- package/dist/esm/components/Flags/dz.mjs.map +1 -1
- package/dist/esm/components/Flags/ec.mjs +2 -0
- package/dist/esm/components/Flags/ec.mjs.map +1 -1
- package/dist/esm/components/Flags/ee.mjs +2 -0
- package/dist/esm/components/Flags/ee.mjs.map +1 -1
- package/dist/esm/components/Flags/eg.mjs +2 -0
- package/dist/esm/components/Flags/eg.mjs.map +1 -1
- package/dist/esm/components/Flags/es-ct.mjs +2 -0
- package/dist/esm/components/Flags/es-ct.mjs.map +1 -1
- package/dist/esm/components/Flags/es-ga.mjs +2 -0
- package/dist/esm/components/Flags/es-ga.mjs.map +1 -1
- package/dist/esm/components/Flags/es-pv.mjs +2 -0
- package/dist/esm/components/Flags/es-pv.mjs.map +1 -1
- package/dist/esm/components/Flags/es.mjs +2 -0
- package/dist/esm/components/Flags/es.mjs.map +1 -1
- package/dist/esm/components/Flags/et.mjs +2 -0
- package/dist/esm/components/Flags/et.mjs.map +1 -1
- package/dist/esm/components/Flags/fi.mjs +2 -0
- package/dist/esm/components/Flags/fi.mjs.map +1 -1
- package/dist/esm/components/Flags/fo.mjs +2 -0
- package/dist/esm/components/Flags/fo.mjs.map +1 -1
- package/dist/esm/components/Flags/fr.mjs +2 -0
- package/dist/esm/components/Flags/fr.mjs.map +1 -1
- package/dist/esm/components/Flags/gb-wls.mjs +2 -0
- package/dist/esm/components/Flags/gb-wls.mjs.map +1 -1
- package/dist/esm/components/Flags/gb.mjs +2 -0
- package/dist/esm/components/Flags/gb.mjs.map +1 -1
- package/dist/esm/components/Flags/ge.mjs +2 -0
- package/dist/esm/components/Flags/ge.mjs.map +1 -1
- package/dist/esm/components/Flags/gr.mjs +2 -0
- package/dist/esm/components/Flags/gr.mjs.map +1 -1
- package/dist/esm/components/Flags/gt.mjs +2 -0
- package/dist/esm/components/Flags/gt.mjs.map +1 -1
- package/dist/esm/components/Flags/hk.mjs +2 -0
- package/dist/esm/components/Flags/hk.mjs.map +1 -1
- package/dist/esm/components/Flags/hn.mjs +2 -0
- package/dist/esm/components/Flags/hn.mjs.map +1 -1
- package/dist/esm/components/Flags/hr.mjs +2 -0
- package/dist/esm/components/Flags/hr.mjs.map +1 -1
- package/dist/esm/components/Flags/hu.mjs +2 -0
- package/dist/esm/components/Flags/hu.mjs.map +1 -1
- package/dist/esm/components/Flags/id.mjs +2 -0
- package/dist/esm/components/Flags/id.mjs.map +1 -1
- package/dist/esm/components/Flags/ie.mjs +2 -0
- package/dist/esm/components/Flags/ie.mjs.map +1 -1
- package/dist/esm/components/Flags/il.mjs +2 -0
- package/dist/esm/components/Flags/il.mjs.map +1 -1
- package/dist/esm/components/Flags/in.mjs +2 -0
- package/dist/esm/components/Flags/in.mjs.map +1 -1
- package/dist/esm/components/Flags/iq.mjs +2 -0
- package/dist/esm/components/Flags/iq.mjs.map +1 -1
- package/dist/esm/components/Flags/ir.mjs +2 -0
- package/dist/esm/components/Flags/ir.mjs.map +1 -1
- package/dist/esm/components/Flags/is.mjs +2 -0
- package/dist/esm/components/Flags/is.mjs.map +1 -1
- package/dist/esm/components/Flags/it.mjs +2 -0
- package/dist/esm/components/Flags/it.mjs.map +1 -1
- package/dist/esm/components/Flags/jm.mjs +2 -0
- package/dist/esm/components/Flags/jm.mjs.map +1 -1
- package/dist/esm/components/Flags/jo.mjs +2 -0
- package/dist/esm/components/Flags/jo.mjs.map +1 -1
- package/dist/esm/components/Flags/jp.mjs +2 -0
- package/dist/esm/components/Flags/jp.mjs.map +1 -1
- package/dist/esm/components/Flags/ke.mjs +2 -0
- package/dist/esm/components/Flags/ke.mjs.map +1 -1
- package/dist/esm/components/Flags/kg.mjs +2 -0
- package/dist/esm/components/Flags/kg.mjs.map +1 -1
- package/dist/esm/components/Flags/kh.mjs +2 -0
- package/dist/esm/components/Flags/kh.mjs.map +1 -1
- package/dist/esm/components/Flags/kr.mjs +2 -0
- package/dist/esm/components/Flags/kr.mjs.map +1 -1
- package/dist/esm/components/Flags/kw.mjs +2 -0
- package/dist/esm/components/Flags/kw.mjs.map +1 -1
- package/dist/esm/components/Flags/kz.mjs +2 -0
- package/dist/esm/components/Flags/kz.mjs.map +1 -1
- package/dist/esm/components/Flags/la.mjs +2 -0
- package/dist/esm/components/Flags/la.mjs.map +1 -1
- package/dist/esm/components/Flags/lb.mjs +2 -0
- package/dist/esm/components/Flags/lb.mjs.map +1 -1
- package/dist/esm/components/Flags/li.mjs +2 -0
- package/dist/esm/components/Flags/li.mjs.map +1 -1
- package/dist/esm/components/Flags/lt.mjs +2 -0
- package/dist/esm/components/Flags/lt.mjs.map +1 -1
- package/dist/esm/components/Flags/lu.mjs +2 -0
- package/dist/esm/components/Flags/lu.mjs.map +1 -1
- package/dist/esm/components/Flags/lv.mjs +2 -0
- package/dist/esm/components/Flags/lv.mjs.map +1 -1
- package/dist/esm/components/Flags/ly.mjs +2 -0
- package/dist/esm/components/Flags/ly.mjs.map +1 -1
- package/dist/esm/components/Flags/ma.mjs +2 -0
- package/dist/esm/components/Flags/ma.mjs.map +1 -1
- package/dist/esm/components/Flags/mc.mjs +2 -0
- package/dist/esm/components/Flags/mc.mjs.map +1 -1
- package/dist/esm/components/Flags/mk.mjs +2 -0
- package/dist/esm/components/Flags/mk.mjs.map +1 -1
- package/dist/esm/components/Flags/mm.mjs +2 -0
- package/dist/esm/components/Flags/mm.mjs.map +1 -1
- package/dist/esm/components/Flags/mn.mjs +2 -0
- package/dist/esm/components/Flags/mn.mjs.map +1 -1
- package/dist/esm/components/Flags/mo.mjs +2 -0
- package/dist/esm/components/Flags/mo.mjs.map +1 -1
- package/dist/esm/components/Flags/mt.mjs +2 -0
- package/dist/esm/components/Flags/mt.mjs.map +1 -1
- package/dist/esm/components/Flags/mv.mjs +2 -0
- package/dist/esm/components/Flags/mv.mjs.map +1 -1
- package/dist/esm/components/Flags/mx.mjs +2 -0
- package/dist/esm/components/Flags/mx.mjs.map +1 -1
- package/dist/esm/components/Flags/my.mjs +2 -0
- package/dist/esm/components/Flags/my.mjs.map +1 -1
- package/dist/esm/components/Flags/ng.mjs +2 -0
- package/dist/esm/components/Flags/ng.mjs.map +1 -1
- package/dist/esm/components/Flags/ni.mjs +2 -0
- package/dist/esm/components/Flags/ni.mjs.map +1 -1
- package/dist/esm/components/Flags/nl.mjs +2 -0
- package/dist/esm/components/Flags/nl.mjs.map +1 -1
- package/dist/esm/components/Flags/no.mjs +2 -0
- package/dist/esm/components/Flags/no.mjs.map +1 -1
- package/dist/esm/components/Flags/np.mjs +2 -0
- package/dist/esm/components/Flags/np.mjs.map +1 -1
- package/dist/esm/components/Flags/nz.mjs +2 -0
- package/dist/esm/components/Flags/nz.mjs.map +1 -1
- package/dist/esm/components/Flags/om.mjs +2 -0
- package/dist/esm/components/Flags/om.mjs.map +1 -1
- package/dist/esm/components/Flags/pa.mjs +2 -0
- package/dist/esm/components/Flags/pa.mjs.map +1 -1
- package/dist/esm/components/Flags/pe.mjs +2 -0
- package/dist/esm/components/Flags/pe.mjs.map +1 -1
- package/dist/esm/components/Flags/ph.mjs +2 -0
- package/dist/esm/components/Flags/ph.mjs.map +1 -1
- package/dist/esm/components/Flags/pk.mjs +2 -0
- package/dist/esm/components/Flags/pk.mjs.map +1 -1
- package/dist/esm/components/Flags/pl.mjs +2 -0
- package/dist/esm/components/Flags/pl.mjs.map +1 -1
- package/dist/esm/components/Flags/pr.mjs +2 -0
- package/dist/esm/components/Flags/pr.mjs.map +1 -1
- package/dist/esm/components/Flags/pt.mjs +2 -0
- package/dist/esm/components/Flags/pt.mjs.map +1 -1
- package/dist/esm/components/Flags/py.mjs +2 -0
- package/dist/esm/components/Flags/py.mjs.map +1 -1
- package/dist/esm/components/Flags/qa.mjs +2 -0
- package/dist/esm/components/Flags/qa.mjs.map +1 -1
- package/dist/esm/components/Flags/ro.mjs +2 -0
- package/dist/esm/components/Flags/ro.mjs.map +1 -1
- package/dist/esm/components/Flags/rs.mjs +2 -0
- package/dist/esm/components/Flags/rs.mjs.map +1 -1
- package/dist/esm/components/Flags/ru.mjs +2 -0
- package/dist/esm/components/Flags/ru.mjs.map +1 -1
- package/dist/esm/components/Flags/sa.mjs +2 -0
- package/dist/esm/components/Flags/sa.mjs.map +1 -1
- package/dist/esm/components/Flags/se.mjs +2 -0
- package/dist/esm/components/Flags/se.mjs.map +1 -1
- package/dist/esm/components/Flags/sg.mjs +2 -0
- package/dist/esm/components/Flags/sg.mjs.map +1 -1
- package/dist/esm/components/Flags/si.mjs +2 -0
- package/dist/esm/components/Flags/si.mjs.map +1 -1
- package/dist/esm/components/Flags/sk.mjs +2 -0
- package/dist/esm/components/Flags/sk.mjs.map +1 -1
- package/dist/esm/components/Flags/sv.mjs +2 -0
- package/dist/esm/components/Flags/sv.mjs.map +1 -1
- package/dist/esm/components/Flags/sy.mjs +2 -0
- package/dist/esm/components/Flags/sy.mjs.map +1 -1
- package/dist/esm/components/Flags/th.mjs +2 -0
- package/dist/esm/components/Flags/th.mjs.map +1 -1
- package/dist/esm/components/Flags/tn.mjs +2 -0
- package/dist/esm/components/Flags/tn.mjs.map +1 -1
- package/dist/esm/components/Flags/tr.mjs +2 -0
- package/dist/esm/components/Flags/tr.mjs.map +1 -1
- package/dist/esm/components/Flags/tt.mjs +2 -0
- package/dist/esm/components/Flags/tt.mjs.map +1 -1
- package/dist/esm/components/Flags/tw.mjs +2 -0
- package/dist/esm/components/Flags/tw.mjs.map +1 -1
- package/dist/esm/components/Flags/ua.mjs +2 -0
- package/dist/esm/components/Flags/ua.mjs.map +1 -1
- package/dist/esm/components/Flags/us.mjs +2 -0
- package/dist/esm/components/Flags/us.mjs.map +1 -1
- package/dist/esm/components/Flags/uy.mjs +2 -0
- package/dist/esm/components/Flags/uy.mjs.map +1 -1
- package/dist/esm/components/Flags/uz.mjs +2 -0
- package/dist/esm/components/Flags/uz.mjs.map +1 -1
- package/dist/esm/components/Flags/ve.mjs +2 -0
- package/dist/esm/components/Flags/ve.mjs.map +1 -1
- package/dist/esm/components/Flags/vn.mjs +2 -0
- package/dist/esm/components/Flags/vn.mjs.map +1 -1
- package/dist/esm/components/Flags/xx.mjs +2 -0
- package/dist/esm/components/Flags/xx.mjs.map +1 -1
- package/dist/esm/components/Flags/ye.mjs +2 -0
- package/dist/esm/components/Flags/ye.mjs.map +1 -1
- package/dist/esm/components/Flags/za.mjs +2 -0
- package/dist/esm/components/Flags/za.mjs.map +1 -1
- package/dist/esm/components/Flags/zw.mjs +2 -0
- package/dist/esm/components/Flags/zw.mjs.map +1 -1
- package/dist/esm/components/Headers/index.mjs +1 -1
- package/dist/esm/components/Headers/index.mjs.map +1 -1
- package/dist/esm/components/Link/Link.mjs +10 -5
- package/dist/esm/components/Link/Link.mjs.map +1 -1
- package/dist/esm/components/MarkDownRender/processor.mjs +32 -31
- package/dist/esm/components/MarkDownRender/processor.mjs.map +1 -1
- package/dist/esm/components/RightDrawer/RightDrawer.mjs +26 -18
- package/dist/esm/components/RightDrawer/RightDrawer.mjs.map +1 -1
- package/dist/esm/components/Tag/index.mjs +23 -1
- package/dist/esm/components/Tag/index.mjs.map +1 -1
- package/dist/esm/components/index.mjs +2 -1
- package/dist/esm/hooks/reactQuery.mjs +2 -2
- package/dist/esm/hooks/reactQuery.mjs.map +1 -1
- package/dist/esm/hooks/useScrollY.mjs +20 -3
- package/dist/esm/hooks/useScrollY.mjs.map +1 -1
- package/dist/types/components/Accordion/Accordion.d.ts.map +1 -1
- package/dist/types/components/Badge/index.d.ts +2 -2
- package/dist/types/components/Breadcrumb/breadcrumb.content.d.ts +3 -3
- package/dist/types/components/Breadcrumb/breadcrumb.content.d.ts.map +1 -1
- package/dist/types/components/Breadcrumb/index.d.ts +2 -2
- package/dist/types/components/Browser/Browser.content.d.ts +187 -0
- package/dist/types/components/Browser/Browser.content.d.ts.map +1 -0
- package/dist/types/components/Browser/Browser.d.ts +72 -0
- package/dist/types/components/Browser/Browser.d.ts.map +1 -0
- package/dist/types/components/Browser/index.d.ts +2 -0
- package/dist/types/components/Button/Button.d.ts +5 -5
- package/dist/types/components/CollapsibleTable/CollapsibleTable.d.ts +3 -3
- package/dist/types/components/CollapsibleTable/CollapsibleTable.d.ts.map +1 -1
- package/dist/types/components/Command/index.d.ts +17 -17
- package/dist/types/components/Command/index.d.ts.map +1 -1
- package/dist/types/components/Container/index.d.ts +6 -6
- package/dist/types/components/Container/index.d.ts.map +1 -1
- package/dist/types/components/CopyButton/CopyButton.content.d.ts +3 -3
- package/dist/types/components/CopyButton/CopyButton.content.d.ts.map +1 -1
- package/dist/types/components/DictionaryEditor/DictionaryEditor.d.ts.map +1 -1
- package/dist/types/components/DictionaryEditor/NodeWrapper/StringWrapper.d.ts.map +1 -1
- package/dist/types/components/DictionaryEditor/NodeWrapper/index.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/ContentEditor.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/ContentEditorView/TextEditor.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.d.ts +25 -25
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.content.d.ts +9 -9
- package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.d.ts +33 -33
- package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/useDictionaryDetailsSchema.content.d.ts +25 -25
- package/dist/types/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/NavigationView/navigationViewNode.content.d.ts +25 -25
- package/dist/types/components/DictionaryFieldEditor/SaveForm/saveForm.content.d.ts +33 -33
- package/dist/types/components/DictionaryFieldEditor/StructureView/StructureView.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/StructureView/structureView.content.d.ts +9 -9
- package/dist/types/components/DictionaryFieldEditor/VersionSwitcherDropDown/versionSwitcherDropDown.content.d.ts +7 -7
- package/dist/types/components/DictionaryFieldEditor/dictionaryFieldEditor.content.d.ts +5 -5
- package/dist/types/components/DictionaryFieldEditor/nodeTypeSelector.content.d.ts +31 -31
- package/dist/types/components/DictionaryFieldEditor/nodeTypeSelector.content.d.ts.map +1 -1
- package/dist/types/components/ExpandCollapse/expandCollapse.content.d.ts +3 -3
- package/dist/types/components/Flags/Flag.d.ts.map +1 -1
- package/dist/types/components/Form/FormBase.d.ts +2 -2
- package/dist/types/components/Form/FormField.d.ts +2 -2
- package/dist/types/components/Form/FormField.d.ts.map +1 -1
- package/dist/types/components/Form/FormItem.d.ts +2 -2
- package/dist/types/components/Form/FormItem.d.ts.map +1 -1
- package/dist/types/components/Form/elements/EditableFieldInputElement.d.ts +2 -2
- package/dist/types/components/Form/elements/EditableFieldTextAreaElement.d.ts +2 -2
- package/dist/types/components/Form/elements/FormElement.d.ts +2 -2
- package/dist/types/components/Form/elements/MultiselectElement.d.ts +2 -2
- package/dist/types/components/Form/elements/SelectElement.d.ts +2 -2
- package/dist/types/components/Form/elements/SwitchSelectorElement.d.ts +2 -2
- package/dist/types/components/IDE/CodeContext.d.ts +2 -2
- package/dist/types/components/IDE/CodeContext.d.ts.map +1 -1
- package/dist/types/components/IDE/code.content.d.ts +5 -5
- package/dist/types/components/IDE/code.content.d.ts.map +1 -1
- package/dist/types/components/IDE/copyCode.content.d.ts +5 -5
- package/dist/types/components/IDE/copyCode.content.d.ts.map +1 -1
- package/dist/types/components/Input/Checkbox.d.ts +3 -3
- package/dist/types/components/Input/Checkbox.d.ts.map +1 -1
- package/dist/types/components/Input/Input.d.ts +2 -2
- package/dist/types/components/Input/Input.d.ts.map +1 -1
- package/dist/types/components/Input/SearchInput.d.ts +2 -2
- package/dist/types/components/Input/SearchInput.d.ts.map +1 -1
- package/dist/types/components/Link/Link.d.ts +9 -4
- package/dist/types/components/Link/Link.d.ts.map +1 -1
- package/dist/types/components/Loader/index.content.d.ts +3 -3
- package/dist/types/components/Loader/index.content.d.ts.map +1 -1
- package/dist/types/components/Loader/spinner.d.ts +2 -2
- package/dist/types/components/Loader/spinner.d.ts.map +1 -1
- package/dist/types/components/LocaleSwitcherContentDropDown/localeSwitcher.content.d.ts +17 -17
- package/dist/types/components/LocaleSwitcherContentDropDown/localeSwitcher.content.d.ts.map +1 -1
- package/dist/types/components/LocaleSwitcherDropDown/localeSwitcher.content.d.ts +13 -13
- package/dist/types/components/MarkDownRender/processor.d.ts.map +1 -1
- package/dist/types/components/MaxWidthSmoother/index.d.ts +2 -2
- package/dist/types/components/Navbar/Burger.d.ts +2 -2
- package/dist/types/components/Navbar/Burger.d.ts.map +1 -1
- package/dist/types/components/Navbar/DesktopNavbar.d.ts +2 -2
- package/dist/types/components/Navbar/DesktopNavbar.d.ts.map +1 -1
- package/dist/types/components/Navbar/MobileNavbar.d.ts +2 -2
- package/dist/types/components/Navbar/index.d.ts +2 -2
- package/dist/types/components/Pagination/Pagination.d.ts +3 -3
- package/dist/types/components/Pagination/Pagination.d.ts.map +1 -1
- package/dist/types/components/Pagination/pagination.content.d.ts +11 -11
- package/dist/types/components/RightDrawer/RightDrawer.d.ts.map +1 -1
- package/dist/types/components/RightDrawer/useRightDrawerStore.d.ts +2 -2
- package/dist/types/components/Select/Select.d.ts +3 -3
- package/dist/types/components/Select/Select.d.ts.map +1 -1
- package/dist/types/components/SocialNetworks/index.d.ts +2 -2
- package/dist/types/components/SwitchSelector/index.d.ts +5 -5
- package/dist/types/components/SwitchSelector/index.d.ts.map +1 -1
- package/dist/types/components/Tab/Tab.d.ts +6 -6
- package/dist/types/components/Tab/Tab.d.ts.map +1 -1
- package/dist/types/components/Tab/TabContext.d.ts +2 -2
- package/dist/types/components/Tab/TabContext.d.ts.map +1 -1
- package/dist/types/components/TabSelector/TabSelector.d.ts +4 -4
- package/dist/types/components/TabSelector/TabSelector.d.ts.map +1 -1
- package/dist/types/components/Table/table.content.d.ts +3 -3
- package/dist/types/components/Tag/index.d.ts +15 -4
- package/dist/types/components/Tag/index.d.ts.map +1 -1
- package/dist/types/components/Toaster/Toast.d.ts +2 -2
- package/dist/types/components/Toaster/Toaster.d.ts +2 -2
- package/dist/types/components/index.d.ts +2 -1
- package/dist/types/hooks/useScrollBlockage/useScrollBlockageStore.d.ts +2 -2
- package/dist/types/hooks/useScrollY.d.ts +6 -1
- package/dist/types/hooks/useScrollY.d.ts.map +1 -1
- package/package.json +22 -22
|
@@ -5,7 +5,7 @@ import { cn } from "../../utils/cn.mjs";
|
|
|
5
5
|
import { Button, ButtonColor, ButtonVariant } from "../Button/Button.mjs";
|
|
6
6
|
import { MaxHeightSmoother } from "../MaxHeightSmoother/index.mjs";
|
|
7
7
|
import { ChevronDown } from "lucide-react";
|
|
8
|
-
import {
|
|
8
|
+
import { useId, useState } from "react";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
|
|
11
11
|
//#region src/components/Accordion/Accordion.tsx
|
|
@@ -49,28 +49,23 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
49
49
|
const Accordion = ({ children, header, isOpen, defaultIsOpen = false, onToggle, onClick, disabled = false, contentClassName, headerClassName, contentId, "aria-label": ariaLabel,...props }) => {
|
|
50
50
|
const isControlled = isOpen !== void 0;
|
|
51
51
|
const [internalIsOpen, setInternalIsOpen] = useState(defaultIsOpen);
|
|
52
|
+
const id = useId();
|
|
52
53
|
const isExpandedState = isControlled ? isOpen : internalIsOpen;
|
|
53
54
|
const isHidden = !isExpandedState;
|
|
54
|
-
const generatedContentId = contentId
|
|
55
|
-
const handleToggle =
|
|
55
|
+
const generatedContentId = contentId ?? `${id}-accordion-content`;
|
|
56
|
+
const handleToggle = (e) => {
|
|
56
57
|
if (disabled) return;
|
|
57
58
|
const newIsOpen = !isExpandedState;
|
|
58
59
|
if (!isControlled) setInternalIsOpen(newIsOpen);
|
|
59
60
|
onToggle?.(newIsOpen);
|
|
60
61
|
onClick?.(e);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
isExpandedState,
|
|
64
|
-
isControlled,
|
|
65
|
-
onToggle,
|
|
66
|
-
onClick
|
|
67
|
-
]);
|
|
68
|
-
const handleKeyDown = useCallback((e) => {
|
|
62
|
+
};
|
|
63
|
+
const handleKeyDown = (e) => {
|
|
69
64
|
if (e.key === "Enter" || e.key === " ") {
|
|
70
65
|
e.preventDefault();
|
|
71
66
|
handleToggle(e);
|
|
72
67
|
}
|
|
73
|
-
}
|
|
68
|
+
};
|
|
74
69
|
return /* @__PURE__ */ jsxs("div", {
|
|
75
70
|
className: "w-full",
|
|
76
71
|
children: [/* @__PURE__ */ jsx(Button, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Accordion.mjs","names":["Accordion: FC<AccordionProps>"],"sources":["../../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["'use client';\n\nimport { ChevronDown } from 'lucide-react';\nimport {\n type FC,\n type KeyboardEvent,\n type ReactNode,\n
|
|
1
|
+
{"version":3,"file":"Accordion.mjs","names":["Accordion: FC<AccordionProps>"],"sources":["../../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["'use client';\n\nimport { ChevronDown } from 'lucide-react';\nimport {\n type FC,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useId,\n useState,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport {\n Button,\n ButtonColor,\n type ButtonProps,\n ButtonVariant,\n} from '../Button';\nimport { MaxHeightSmoother } from '../MaxHeightSmoother';\n\nexport interface AccordionProps\n extends Omit<ButtonProps, 'children' | 'onToggle'> {\n /** The content displayed in the accordion header */\n header: ReactNode;\n /** The collapsible content inside the accordion */\n children: ReactNode;\n /** Controls whether the accordion is open (controlled mode) */\n isOpen?: boolean;\n /** Default open state (uncontrolled mode) */\n defaultIsOpen?: boolean;\n /** Called when the accordion state changes */\n onToggle?: (isOpen: boolean) => void;\n /** Disable the accordion interaction */\n disabled?: boolean;\n /** Custom class for the content container */\n contentClassName?: string;\n /** Custom class for the header container */\n headerClassName?: string;\n /** Accessible label for screen readers */\n 'aria-label'?: string;\n /** ID for the accordion content (for aria-controls) */\n contentId?: string;\n}\n\n/**\n * Accordion component that allows the user to expand and collapse content.\n * It provides a header with a chevron icon that controls the visibility of the content.\n *\n * Features:\n * - Supports both controlled and uncontrolled modes\n * - Accessible with proper ARIA attributes\n * - Keyboard navigation support\n * - Smooth animations for expand/collapse\n * - Customizable styling\n *\n * @param header - The content of the header.\n * @param children - The content to be expanded and collapsed.\n * @param isOpen - Controlled state for whether the content is expanded.\n * @param defaultIsOpen - Default open state for uncontrolled mode.\n * @param onToggle - Callback when the accordion state changes.\n * @param disabled - Whether the accordion is disabled.\n * @param contentClassName - Custom class for the content container.\n * @param headerClassName - Custom class for the header.\n * @param contentId - ID for the content (used for aria-controls).\n *\n * @example\n * // Uncontrolled mode\n * <Accordion header=\"Accordion Header\" defaultIsOpen={true}>\n * <p>Accordion content</p>\n * </Accordion>\n *\n * @example\n * // Controlled mode\n * <Accordion\n * header=\"Controlled Accordion\"\n * isOpen={isOpen}\n * onToggle={setIsOpen}\n * >\n * <p>Controlled content</p>\n * </Accordion>\n */\nexport const Accordion: FC<AccordionProps> = ({\n children,\n header,\n isOpen,\n defaultIsOpen = false,\n onToggle,\n onClick,\n disabled = false,\n contentClassName,\n headerClassName,\n contentId,\n 'aria-label': ariaLabel,\n ...props\n}) => {\n // Determine if we're in controlled or uncontrolled mode\n const isControlled = isOpen !== undefined;\n const [internalIsOpen, setInternalIsOpen] = useState(defaultIsOpen);\n const id = useId();\n\n // Use controlled value if provided, otherwise use internal state\n const isExpandedState = isControlled ? isOpen : internalIsOpen;\n const isHidden = !isExpandedState;\n\n // Generate unique ID for content if not provided\n const generatedContentId = contentId ?? `${id}-accordion-content`;\n\n const handleToggle = (e: MouseEvent<HTMLButtonElement>) => {\n if (disabled) return;\n\n const newIsOpen = !isExpandedState;\n\n // Update internal state if uncontrolled\n if (!isControlled) {\n setInternalIsOpen(newIsOpen);\n }\n\n // Call external handlers\n onToggle?.(newIsOpen);\n onClick?.(e);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {\n // Enter and Space should toggle the accordion\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle(e as any);\n }\n };\n\n return (\n <div className=\"w-full\">\n <Button\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n isFullWidth\n className={cn(\n 'flex items-center justify-between gap-2',\n headerClassName\n )}\n IconRight={ChevronDown}\n iconClassName={cn(\n 'transform transition-transform duration-500 ease-in-out',\n isExpandedState ? 'rotate-0' : '-rotate-180'\n )}\n aria-expanded={isExpandedState}\n aria-controls={generatedContentId}\n aria-label={ariaLabel}\n role=\"button\"\n {...props}\n >\n {header}\n </Button>\n\n <MaxHeightSmoother\n id={generatedContentId}\n tabIndex={isHidden ? -1 : undefined}\n isHidden={isHidden}\n className={contentClassName}\n role=\"region\"\n aria-labelledby={generatedContentId}\n >\n {children}\n </MaxHeightSmoother>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiFA,MAAaA,aAAiC,EAC5C,UACA,QACA,QACA,gBAAgB,OAChB,UACA,SACA,WAAW,OACX,kBACA,iBACA,WACA,cAAc,UACd,GAAG,YACC;CAEJ,MAAM,eAAe,WAAW;CAChC,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,cAAc;CACnE,MAAM,KAAK,OAAO;CAGlB,MAAM,kBAAkB,eAAe,SAAS;CAChD,MAAM,WAAW,CAAC;CAGlB,MAAM,qBAAqB,aAAa,GAAG,GAAG;CAE9C,MAAM,gBAAgB,MAAqC;AACzD,MAAI,SAAU;EAEd,MAAM,YAAY,CAAC;AAGnB,MAAI,CAAC,aACH,mBAAkB,UAAU;AAI9B,aAAW,UAAU;AACrB,YAAU,EAAE;;CAGd,MAAM,iBAAiB,MAAwC;AAE7D,MAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,KAAE,gBAAgB;AAClB,gBAAa,EAAS;;;AAI1B,QACE,qBAAC;EAAI,WAAU;aACb,oBAAC;GACC,SAAS,cAAc;GACvB,OAAO,YAAY;GACnB,SAAS;GACT,WAAW;GACD;GACV;GACA,WAAW,GACT,2CACA,gBACD;GACD,WAAW;GACX,eAAe,GACb,2DACA,kBAAkB,aAAa,cAChC;GACD,iBAAe;GACf,iBAAe;GACf,cAAY;GACZ,MAAK;GACL,GAAI;aAEH;IACM,EAET,oBAAC;GACC,IAAI;GACJ,UAAU,WAAW,KAAK;GAChB;GACV,WAAW;GACX,MAAK;GACL,mBAAiB;GAEhB;IACiB;GAChB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { t } from "intlayer";
|
|
2
|
+
|
|
3
|
+
//#region src/components/Browser/Browser.content.ts
|
|
4
|
+
const browserContent = {
|
|
5
|
+
key: "browser",
|
|
6
|
+
content: {
|
|
7
|
+
ariaLabel: t({
|
|
8
|
+
en: "Embedded browser",
|
|
9
|
+
"en-GB": "Embedded browser",
|
|
10
|
+
fr: "Navigateur intégré",
|
|
11
|
+
es: "Navegador integrado",
|
|
12
|
+
de: "Eingebetteter Browser",
|
|
13
|
+
ja: "埋め込みブラウザ",
|
|
14
|
+
ko: "임베디드 브라우저",
|
|
15
|
+
zh: "嵌入式浏览器",
|
|
16
|
+
it: "Browser incorporato",
|
|
17
|
+
pt: "Navegador incorporado",
|
|
18
|
+
hi: "एम्बेडेड ब्राउज़र",
|
|
19
|
+
ar: "متصفح مدمج",
|
|
20
|
+
ru: "Встроенный браузер",
|
|
21
|
+
tr: "Gömülü tarayıcı"
|
|
22
|
+
}),
|
|
23
|
+
urlLabel: t({
|
|
24
|
+
en: "URL address bar",
|
|
25
|
+
"en-GB": "URL address bar",
|
|
26
|
+
fr: "Barre d'adresse URL",
|
|
27
|
+
es: "Barra de direcciones URL",
|
|
28
|
+
de: "URL-Adressleiste",
|
|
29
|
+
ja: "URLアドレスバー",
|
|
30
|
+
ko: "URL 주소 표시줄",
|
|
31
|
+
zh: "URL地址栏",
|
|
32
|
+
it: "Barra degli indirizzi URL",
|
|
33
|
+
pt: "Barra de endereços URL",
|
|
34
|
+
hi: "URL पता बार",
|
|
35
|
+
ar: "شريط عنوان URL",
|
|
36
|
+
ru: "Адресная строка URL",
|
|
37
|
+
tr: "URL adres çubuğu"
|
|
38
|
+
}),
|
|
39
|
+
urlPlaceholder: "https://example.com",
|
|
40
|
+
errorMessage: t({
|
|
41
|
+
en: "Invalid URL. Try something like \"https://example.com\".",
|
|
42
|
+
"en-GB": "Invalid URL. Try something like \"https://example.com\".",
|
|
43
|
+
fr: "URL invalide. Essayez quelque chose comme \"https://example.com\".",
|
|
44
|
+
es: "URL no válida. Intente algo como \"https://example.com\".",
|
|
45
|
+
de: "Ungültige URL. Versuchen Sie etwas wie \"https://example.com\".",
|
|
46
|
+
ja: "無効なURL。\"https://example.com\"のようなものを試してください。",
|
|
47
|
+
ko: "잘못된 URL입니다. \"https://example.com\"과 같은 것을 시도하십시오.",
|
|
48
|
+
zh: "无效的URL。尝试类似\"https://example.com\"的内容。",
|
|
49
|
+
it: "URL non valido. Prova qualcosa come \"https://example.com\".",
|
|
50
|
+
pt: "URL inválido. Tente algo como \"https://example.com\".",
|
|
51
|
+
hi: "अमान्य URL। \"https://example.com\" जैसा कुछ प्रयास करें।",
|
|
52
|
+
ar: "رابط غير صالح. جرب شيئًا مثل \"https://example.com\".",
|
|
53
|
+
ru: "Неверный URL. Попробуйте что-то вроде \"https://example.com\".",
|
|
54
|
+
tr: "Geçersiz URL. \"https://example.com\" gibi bir şey deneyin."
|
|
55
|
+
}),
|
|
56
|
+
reloadButtonTitle: t({
|
|
57
|
+
en: "Reload page",
|
|
58
|
+
"en-GB": "Reload page",
|
|
59
|
+
fr: "Recharger la page",
|
|
60
|
+
es: "Recargar página",
|
|
61
|
+
de: "Seite neu laden",
|
|
62
|
+
ja: "ページを再読み込み",
|
|
63
|
+
ko: "페이지 새로고침",
|
|
64
|
+
zh: "重新加载页面",
|
|
65
|
+
it: "Ricarica pagina",
|
|
66
|
+
pt: "Recarregar página",
|
|
67
|
+
hi: "पृष्ठ को फिर से लोड करें",
|
|
68
|
+
ar: "إعادة تحميل الصفحة",
|
|
69
|
+
ru: "Перезагрузить страницу",
|
|
70
|
+
tr: "Sayfayı yenile"
|
|
71
|
+
}),
|
|
72
|
+
iframeTitle: t({
|
|
73
|
+
en: "Embedded web page",
|
|
74
|
+
"en-GB": "Embedded web page",
|
|
75
|
+
fr: "Page web intégrée",
|
|
76
|
+
es: "Página web integrada",
|
|
77
|
+
de: "Eingebettete Webseite",
|
|
78
|
+
ja: "埋め込みウェブページ",
|
|
79
|
+
ko: "임베디드 웹페이지",
|
|
80
|
+
zh: "嵌入式网页",
|
|
81
|
+
it: "Pagina web incorporata",
|
|
82
|
+
pt: "Página web incorporada",
|
|
83
|
+
hi: "एम्बेडेड वेब पेज",
|
|
84
|
+
ar: "صفحة ويب مدمجة",
|
|
85
|
+
ru: "Встроенная веб-страница",
|
|
86
|
+
tr: "Gömülü web sayfası"
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
var Browser_content_default = browserContent;
|
|
91
|
+
|
|
92
|
+
//#endregion
|
|
93
|
+
export { browserContent, Browser_content_default as default };
|
|
94
|
+
//# sourceMappingURL=Browser.content.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Browser.content.mjs","names":[],"sources":["../../../../src/components/Browser/Browser.content.ts"],"sourcesContent":["import { type Dictionary, t } from 'intlayer';\n\nexport const browserContent = {\n key: 'browser',\n content: {\n ariaLabel: t({\n en: 'Embedded browser',\n 'en-GB': 'Embedded browser',\n fr: 'Navigateur intégré',\n es: 'Navegador integrado',\n de: 'Eingebetteter Browser',\n ja: '埋め込みブラウザ',\n ko: '임베디드 브라우저',\n zh: '嵌入式浏览器',\n it: 'Browser incorporato',\n pt: 'Navegador incorporado',\n hi: 'एम्बेडेड ब्राउज़र',\n ar: 'متصفح مدمج',\n ru: 'Встроенный браузер',\n tr: 'Gömülü tarayıcı',\n }),\n urlLabel: t({\n en: 'URL address bar',\n 'en-GB': 'URL address bar',\n fr: \"Barre d'adresse URL\",\n es: 'Barra de direcciones URL',\n de: 'URL-Adressleiste',\n ja: 'URLアドレスバー',\n ko: 'URL 주소 표시줄',\n zh: 'URL地址栏',\n it: 'Barra degli indirizzi URL',\n pt: 'Barra de endereços URL',\n hi: 'URL पता बार',\n ar: 'شريط عنوان URL',\n ru: 'Адресная строка URL',\n tr: 'URL adres çubuğu',\n }),\n urlPlaceholder: 'https://example.com',\n errorMessage: t({\n en: 'Invalid URL. Try something like \"https://example.com\".',\n 'en-GB': 'Invalid URL. Try something like \"https://example.com\".',\n fr: 'URL invalide. Essayez quelque chose comme \"https://example.com\".',\n es: 'URL no válida. Intente algo como \"https://example.com\".',\n de: 'Ungültige URL. Versuchen Sie etwas wie \"https://example.com\".',\n ja: '無効なURL。\"https://example.com\"のようなものを試してください。',\n ko: '잘못된 URL입니다. \"https://example.com\"과 같은 것을 시도하십시오.',\n zh: '无效的URL。尝试类似\"https://example.com\"的内容。',\n it: 'URL non valido. Prova qualcosa come \"https://example.com\".',\n pt: 'URL inválido. Tente algo como \"https://example.com\".',\n hi: 'अमान्य URL। \"https://example.com\" जैसा कुछ प्रयास करें।',\n ar: 'رابط غير صالح. جرب شيئًا مثل \"https://example.com\".',\n ru: 'Неверный URL. Попробуйте что-то вроде \"https://example.com\".',\n tr: 'Geçersiz URL. \"https://example.com\" gibi bir şey deneyin.',\n }),\n reloadButtonTitle: t({\n en: 'Reload page',\n 'en-GB': 'Reload page',\n fr: 'Recharger la page',\n es: 'Recargar página',\n de: 'Seite neu laden',\n ja: 'ページを再読み込み',\n ko: '페이지 새로고침',\n zh: '重新加载页面',\n it: 'Ricarica pagina',\n pt: 'Recarregar página',\n hi: 'पृष्ठ को फिर से लोड करें',\n ar: 'إعادة تحميل الصفحة',\n ru: 'Перезагрузить страницу',\n tr: 'Sayfayı yenile',\n }),\n iframeTitle: t({\n en: 'Embedded web page',\n 'en-GB': 'Embedded web page',\n fr: 'Page web intégrée',\n es: 'Página web integrada',\n de: 'Eingebettete Webseite',\n ja: '埋め込みウェブページ',\n ko: '임베디드 웹페이지',\n zh: '嵌入式网页',\n it: 'Pagina web incorporata',\n pt: 'Página web incorporada',\n hi: 'एम्बेडेड वेब पेज',\n ar: 'صفحة ويب مدمجة',\n ru: 'Встроенная веб-страница',\n tr: 'Gömülü web sayfası',\n }),\n },\n} satisfies Dictionary;\n\nexport default browserContent;\n"],"mappings":";;;AAEA,MAAa,iBAAiB;CAC5B,KAAK;CACL,SAAS;EACP,WAAW,EAAE;GACX,IAAI;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC;EACF,UAAU,EAAE;GACV,IAAI;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC;EACF,gBAAgB;EAChB,cAAc,EAAE;GACd,IAAI;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC;EACF,mBAAmB,EAAE;GACnB,IAAI;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC;EACF,aAAa,EAAE;GACb,IAAI;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC;EACH;CACF;AAED,8BAAe"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import { cn } from "../../utils/cn.mjs";
|
|
5
|
+
import { RotateCw } from "lucide-react";
|
|
6
|
+
import { useEffect, useRef, useState } from "react";
|
|
7
|
+
import { cva } from "class-variance-authority";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { useIntlayer } from "react-intlayer";
|
|
10
|
+
|
|
11
|
+
//#region src/components/Browser/Browser.tsx
|
|
12
|
+
const browserVariants = cva("flex w-full flex-col overflow-hidden rounded-xl bg-background shadow-[0_4px_12px_rgba(0,0,0,0.4),0_0_1px_rgba(0,0,0,0.2)]", {
|
|
13
|
+
variants: { size: {
|
|
14
|
+
xs: "h-[400px]",
|
|
15
|
+
sm: "h-[500px]",
|
|
16
|
+
md: "h-[600px]",
|
|
17
|
+
lg: "h-[800px]",
|
|
18
|
+
xl: "h-[1000px]"
|
|
19
|
+
} },
|
|
20
|
+
defaultVariants: { size: "md" }
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Browser component that renders an iframe with a visible, editable URL bar.
|
|
24
|
+
* Allows users to view, edit, and navigate to different URLs within an embedded browser interface.
|
|
25
|
+
*
|
|
26
|
+
* Features:
|
|
27
|
+
* - Editable URL bar with strict validation (before navigation)
|
|
28
|
+
* - Automatic protocol addition (adds https:// if missing)
|
|
29
|
+
* - Integrated reload button inside the URL input
|
|
30
|
+
* - Error handling with visual feedback for invalid URLs
|
|
31
|
+
* - Responsive iframe with standardized sizes
|
|
32
|
+
* - Full accessibility support with ARIA attributes
|
|
33
|
+
* - Sandbox security for iframe content
|
|
34
|
+
* - Dark-themed UI matching modern browser aesthetics
|
|
35
|
+
* - Cross-browser compatibility (Chrome, Firefox, Safari)
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* // Basic usage
|
|
39
|
+
* <Browser initialUrl="https://example.com" size="md" />
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // With custom size and styling
|
|
43
|
+
* <Browser
|
|
44
|
+
* initialUrl="https://example.com"
|
|
45
|
+
* size="lg"
|
|
46
|
+
* className="shadow-2xl"
|
|
47
|
+
* aria-label="Documentation viewer"
|
|
48
|
+
* />
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* // For content preview
|
|
52
|
+
* <Browser
|
|
53
|
+
* initialUrl="https://youtube.com/embed/VIDEO_ID"
|
|
54
|
+
* size="xl"
|
|
55
|
+
* aria-label="Video content browser"
|
|
56
|
+
* />
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* // With custom sandbox restrictions
|
|
60
|
+
* <Browser
|
|
61
|
+
* initialUrl="https://example.com"
|
|
62
|
+
* sandbox="allow-scripts allow-same-origin"
|
|
63
|
+
* aria-label="Restricted content browser"
|
|
64
|
+
* />
|
|
65
|
+
*
|
|
66
|
+
* @param initialUrl - The initial URL to load in the iframe (default: 'https://example.com')
|
|
67
|
+
* @param className - Additional CSS classes for the main container element
|
|
68
|
+
* @param style - Inline CSS styles for the main container element
|
|
69
|
+
* @param size - Size of the browser window: 'xs' (400px), 'sm' (500px), 'md' (600px), 'lg' (800px), 'xl' (1000px). Defaults to 'md'
|
|
70
|
+
* @param aria-label - Accessible label for screen readers describing the browser's purpose (default: 'Embedded browser')
|
|
71
|
+
* @param sandbox - Sandbox attribute for the iframe to control security restrictions (default: 'allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads')
|
|
72
|
+
*/
|
|
73
|
+
const Browser = ({ initialUrl = "https://example.com", className, style, size = "md", "aria-label": ariaLabel, sandbox = "allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads" }) => {
|
|
74
|
+
const [inputUrl, setInputUrl] = useState(initialUrl);
|
|
75
|
+
const [currentUrl, setCurrentUrl] = useState(initialUrl);
|
|
76
|
+
const [error, setError] = useState(null);
|
|
77
|
+
const [submitted, setSubmitted] = useState(false);
|
|
78
|
+
const iframeRef = useRef(null);
|
|
79
|
+
const content = useIntlayer("browser");
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
setInputUrl(initialUrl);
|
|
82
|
+
setCurrentUrl(initialUrl);
|
|
83
|
+
setError(null);
|
|
84
|
+
setSubmitted(false);
|
|
85
|
+
}, [initialUrl]);
|
|
86
|
+
const isValidHostname = (host) => {
|
|
87
|
+
if (!/^[a-z0-9.-]+$/i.test(host)) return false;
|
|
88
|
+
if (/^[-.]/.test(host) || /[-.]$/.test(host)) return false;
|
|
89
|
+
if (host.includes("..")) return false;
|
|
90
|
+
if (!host.includes(".")) return false;
|
|
91
|
+
return true;
|
|
92
|
+
};
|
|
93
|
+
const normalizeUrl = (raw) => {
|
|
94
|
+
const trimmed = raw.trim();
|
|
95
|
+
if (!trimmed || /\s/.test(trimmed)) throw new Error("Invalid");
|
|
96
|
+
const candidate = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed) ? trimmed : `https://${trimmed}`;
|
|
97
|
+
const url = new URL(candidate);
|
|
98
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") throw new Error("Only http(s) is allowed");
|
|
99
|
+
if (!isValidHostname(url.hostname)) throw new Error("Invalid host");
|
|
100
|
+
return url.toString();
|
|
101
|
+
};
|
|
102
|
+
const validateAndNavigate = (url) => {
|
|
103
|
+
try {
|
|
104
|
+
const validated = normalizeUrl(url);
|
|
105
|
+
setCurrentUrl(validated);
|
|
106
|
+
setInputUrl(validated);
|
|
107
|
+
setError(null);
|
|
108
|
+
} catch {
|
|
109
|
+
setError(content.errorMessage.value);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
const handleSubmit = (e) => {
|
|
113
|
+
e.preventDefault();
|
|
114
|
+
setSubmitted(true);
|
|
115
|
+
validateAndNavigate(inputUrl);
|
|
116
|
+
};
|
|
117
|
+
const handleReload = () => {
|
|
118
|
+
if (iframeRef.current) {
|
|
119
|
+
const url = iframeRef.current.src;
|
|
120
|
+
iframeRef.current.src = "";
|
|
121
|
+
iframeRef.current.src = url;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const showError = submitted && !!error;
|
|
125
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
126
|
+
className: cn(browserVariants({ size }), className),
|
|
127
|
+
style,
|
|
128
|
+
"aria-label": ariaLabel ?? content.ariaLabel.value,
|
|
129
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
130
|
+
className: "relative z-10 flex shrink-0 flex-col gap-1 rounded-t-xl bg-neutral-900 px-4 py-2.5 shadow-[0_3px_4px_0_rgba(0,0,0,0.25)]",
|
|
131
|
+
children: [/* @__PURE__ */ jsxs("form", {
|
|
132
|
+
onSubmit: handleSubmit,
|
|
133
|
+
className: "relative flex-1",
|
|
134
|
+
noValidate: true,
|
|
135
|
+
children: [
|
|
136
|
+
/* @__PURE__ */ jsx("label", {
|
|
137
|
+
htmlFor: "browser-url",
|
|
138
|
+
className: "sr-only",
|
|
139
|
+
children: content.urlLabel.value
|
|
140
|
+
}),
|
|
141
|
+
/* @__PURE__ */ jsx("input", {
|
|
142
|
+
id: "browser-url",
|
|
143
|
+
type: "text",
|
|
144
|
+
inputMode: "url",
|
|
145
|
+
spellCheck: false,
|
|
146
|
+
autoCapitalize: "off",
|
|
147
|
+
autoCorrect: "off",
|
|
148
|
+
value: inputUrl,
|
|
149
|
+
onChange: (e) => {
|
|
150
|
+
setInputUrl(e.target.value);
|
|
151
|
+
if (showError) setError(null);
|
|
152
|
+
},
|
|
153
|
+
placeholder: content.urlPlaceholder.value,
|
|
154
|
+
className: cn("w-full rounded-lg px-4 py-2 pr-11 text-sm leading-[1.4]", "bg-neutral-950 text-neutral-300", "placeholder:text-neutral-400", "transition-all focus:outline-none focus:ring-1 focus:ring-neutral-400/30", showError ? "border border-red-500" : "border border-transparent"),
|
|
155
|
+
"aria-label": content.urlLabel.value,
|
|
156
|
+
"aria-invalid": showError,
|
|
157
|
+
"aria-describedby": showError ? "browser-url-error" : void 0
|
|
158
|
+
}),
|
|
159
|
+
/* @__PURE__ */ jsx("button", {
|
|
160
|
+
type: "button",
|
|
161
|
+
onClick: handleReload,
|
|
162
|
+
className: cn("-translate-y-1/2 absolute top-1/2 right-2", "flex h-8 w-8 items-center justify-center rounded-md", "transition-colors hover:bg-neutral-800", "focus:outline-none focus:ring-1 focus:ring-neutral-400/30"),
|
|
163
|
+
title: content.reloadButtonTitle.value,
|
|
164
|
+
"aria-label": content.reloadButtonTitle.value,
|
|
165
|
+
tabIndex: 0,
|
|
166
|
+
children: /* @__PURE__ */ jsx(RotateCw, {
|
|
167
|
+
size: 18,
|
|
168
|
+
className: "text-neutral-400",
|
|
169
|
+
strokeWidth: 2
|
|
170
|
+
})
|
|
171
|
+
}),
|
|
172
|
+
/* @__PURE__ */ jsx("button", {
|
|
173
|
+
type: "submit",
|
|
174
|
+
className: "sr-only absolute",
|
|
175
|
+
tabIndex: -1
|
|
176
|
+
})
|
|
177
|
+
]
|
|
178
|
+
}), showError && /* @__PURE__ */ jsx("p", {
|
|
179
|
+
id: "browser-url-error",
|
|
180
|
+
role: "alert",
|
|
181
|
+
"aria-live": "assertive",
|
|
182
|
+
className: "px-1 text-red-400 text-xs",
|
|
183
|
+
children: error
|
|
184
|
+
})]
|
|
185
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
186
|
+
className: "relative z-0 min-h-0 w-full flex-1 overflow-hidden rounded-b-xl bg-background",
|
|
187
|
+
children: /* @__PURE__ */ jsx("iframe", {
|
|
188
|
+
ref: iframeRef,
|
|
189
|
+
src: currentUrl,
|
|
190
|
+
title: content.iframeTitle.value,
|
|
191
|
+
className: "h-full w-full rounded-b-xl border-0",
|
|
192
|
+
sandbox,
|
|
193
|
+
loading: "lazy",
|
|
194
|
+
"aria-live": "polite"
|
|
195
|
+
})
|
|
196
|
+
})]
|
|
197
|
+
});
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
//#endregion
|
|
201
|
+
export { Browser };
|
|
202
|
+
//# sourceMappingURL=Browser.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Browser.mjs","names":["Browser: FC<BrowserProps>"],"sources":["../../../../src/components/Browser/Browser.tsx"],"sourcesContent":["'use client';\n\nimport { cva } from 'class-variance-authority';\nimport { RotateCw } from 'lucide-react';\nimport {\n type CSSProperties,\n type FC,\n type FormEvent,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport { cn } from '../../utils/cn';\n\nconst browserVariants = cva(\n 'flex w-full flex-col overflow-hidden rounded-xl bg-background shadow-[0_4px_12px_rgba(0,0,0,0.4),0_0_1px_rgba(0,0,0,0.2)]',\n {\n variants: {\n size: {\n xs: 'h-[400px]',\n sm: 'h-[500px]',\n md: 'h-[600px]',\n lg: 'h-[800px]',\n xl: 'h-[1000px]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport type BrowserProps = {\n /** Initial URL to load in the iframe */\n initialUrl?: string;\n /** Additional CSS classes for the container */\n className?: string;\n /** Inline styles for the container */\n style?: CSSProperties;\n /** Size of the browser window */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Accessible label for screen readers describing the browser purpose */\n 'aria-label'?: string;\n /** Sandbox attribute for the iframe to control security restrictions */\n sandbox?: string;\n};\n\n/**\n * Browser component that renders an iframe with a visible, editable URL bar.\n * Allows users to view, edit, and navigate to different URLs within an embedded browser interface.\n *\n * Features:\n * - Editable URL bar with strict validation (before navigation)\n * - Automatic protocol addition (adds https:// if missing)\n * - Integrated reload button inside the URL input\n * - Error handling with visual feedback for invalid URLs\n * - Responsive iframe with standardized sizes\n * - Full accessibility support with ARIA attributes\n * - Sandbox security for iframe content\n * - Dark-themed UI matching modern browser aesthetics\n * - Cross-browser compatibility (Chrome, Firefox, Safari)\n *\n * @example\n * // Basic usage\n * <Browser initialUrl=\"https://example.com\" size=\"md\" />\n *\n * @example\n * // With custom size and styling\n * <Browser\n * initialUrl=\"https://example.com\"\n * size=\"lg\"\n * className=\"shadow-2xl\"\n * aria-label=\"Documentation viewer\"\n * />\n *\n * @example\n * // For content preview\n * <Browser\n * initialUrl=\"https://youtube.com/embed/VIDEO_ID\"\n * size=\"xl\"\n * aria-label=\"Video content browser\"\n * />\n *\n * @example\n * // With custom sandbox restrictions\n * <Browser\n * initialUrl=\"https://example.com\"\n * sandbox=\"allow-scripts allow-same-origin\"\n * aria-label=\"Restricted content browser\"\n * />\n *\n * @param initialUrl - The initial URL to load in the iframe (default: 'https://example.com')\n * @param className - Additional CSS classes for the main container element\n * @param style - Inline CSS styles for the main container element\n * @param size - Size of the browser window: 'xs' (400px), 'sm' (500px), 'md' (600px), 'lg' (800px), 'xl' (1000px). Defaults to 'md'\n * @param aria-label - Accessible label for screen readers describing the browser's purpose (default: 'Embedded browser')\n * @param sandbox - Sandbox attribute for the iframe to control security restrictions (default: 'allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads')\n */\nexport const Browser: FC<BrowserProps> = ({\n initialUrl = 'https://example.com',\n className,\n style,\n size = 'md',\n 'aria-label': ariaLabel,\n sandbox = 'allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads',\n}) => {\n const [inputUrl, setInputUrl] = useState(initialUrl);\n const [currentUrl, setCurrentUrl] = useState(initialUrl);\n const [error, setError] = useState<string | null>(null);\n const [submitted, setSubmitted] = useState(false); // show errors only after attempt\n const iframeRef = useRef<HTMLIFrameElement>(null);\n\n // Load internationalized content\n const content = useIntlayer('browser');\n\n useEffect(() => {\n setInputUrl(initialUrl);\n setCurrentUrl(initialUrl);\n setError(null);\n setSubmitted(false);\n }, [initialUrl]);\n\n // --- Validation helpers ----------------------------------------------------\n const isValidHostname = (host: string) => {\n // allowed chars\n if (!/^[a-z0-9.-]+$/i.test(host)) return false;\n // no leading/trailing dot or hyphen\n if (/^[-.]/.test(host) || /[-.]$/.test(host)) return false;\n // no double dots\n if (host.includes('..')) return false;\n // must have at least one dot\n if (!host.includes('.')) return false;\n\n return true;\n };\n\n const normalizeUrl = (raw: string) => {\n const trimmed = raw.trim();\n if (!trimmed || /\\s/.test(trimmed)) throw new Error('Invalid');\n\n // Add https:// if protocol is missing\n const candidate = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)\n ? trimmed\n : `https://${trimmed}`;\n\n const url = new URL(candidate);\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error('Only http(s) is allowed');\n }\n\n if (!isValidHostname(url.hostname)) {\n throw new Error('Invalid host');\n }\n\n return url.toString();\n };\n\n const validateAndNavigate = (url: string) => {\n try {\n const validated = normalizeUrl(url);\n setCurrentUrl(validated);\n setInputUrl(validated);\n setError(null);\n } catch {\n setError(content.errorMessage.value);\n }\n };\n // --------------------------------------------------------------------------\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setSubmitted(true);\n validateAndNavigate(inputUrl);\n };\n\n const handleReload = () => {\n if (iframeRef.current) {\n const url = iframeRef.current.src;\n iframeRef.current.src = '';\n iframeRef.current.src = url;\n }\n };\n\n const showError = submitted && !!error;\n\n return (\n <section\n className={cn(browserVariants({ size }), className)}\n style={style}\n aria-label={ariaLabel ?? content.ariaLabel.value}\n >\n {/* Top bar */}\n <div className=\"relative z-10 flex shrink-0 flex-col gap-1 rounded-t-xl bg-neutral-900 px-4 py-2.5 shadow-[0_3px_4px_0_rgba(0,0,0,0.25)]\">\n <form onSubmit={handleSubmit} className=\"relative flex-1\" noValidate>\n <label htmlFor=\"browser-url\" className=\"sr-only\">\n {content.urlLabel.value}\n </label>\n <input\n id=\"browser-url\"\n type=\"text\"\n inputMode=\"url\"\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n value={inputUrl}\n onChange={(e) => {\n setInputUrl(e.target.value);\n if (showError) setError(null);\n }}\n placeholder={content.urlPlaceholder.value}\n className={cn(\n 'w-full rounded-lg px-4 py-2 pr-11 text-sm leading-[1.4]',\n 'bg-neutral-950 text-neutral-300',\n 'placeholder:text-neutral-400',\n 'transition-all focus:outline-none focus:ring-1 focus:ring-neutral-400/30',\n showError ? 'border border-red-500' : 'border border-transparent'\n )}\n aria-label={content.urlLabel.value}\n aria-invalid={showError}\n aria-describedby={showError ? 'browser-url-error' : undefined}\n />\n\n {/* Absolutely positioned button inside the input */}\n <button\n type=\"button\"\n onClick={handleReload}\n className={cn(\n '-translate-y-1/2 absolute top-1/2 right-2',\n 'flex h-8 w-8 items-center justify-center rounded-md',\n 'transition-colors hover:bg-neutral-800',\n 'focus:outline-none focus:ring-1 focus:ring-neutral-400/30'\n )}\n title={content.reloadButtonTitle.value}\n aria-label={content.reloadButtonTitle.value}\n tabIndex={0}\n >\n <RotateCw size={18} className=\"text-neutral-400\" strokeWidth={2} />\n </button>\n\n {/* invisible submit to allow Enter to work semantically */}\n <button type=\"submit\" className=\"sr-only absolute\" tabIndex={-1} />\n </form>\n\n {/* subtle inline error text */}\n {showError && (\n <p\n id=\"browser-url-error\"\n role=\"alert\"\n aria-live=\"assertive\"\n className=\"px-1 text-red-400 text-xs\"\n >\n {error}\n </p>\n )}\n </div>\n\n {/* Iframe */}\n <div className=\"relative z-0 min-h-0 w-full flex-1 overflow-hidden rounded-b-xl bg-background\">\n <iframe\n ref={iframeRef}\n src={currentUrl}\n title={content.iframeTitle.value}\n className=\"h-full w-full rounded-b-xl border-0\"\n sandbox={sandbox}\n loading=\"lazy\"\n aria-live=\"polite\"\n />\n </div>\n </section>\n );\n};\n"],"mappings":";;;;;;;;;;;AAeA,MAAM,kBAAkB,IACtB,6HACA;CACE,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EACF;CACD,iBAAiB,EACf,MAAM,MACP;CACF,CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoED,MAAaA,WAA6B,EACxC,aAAa,uBACb,WACA,OACA,OAAO,MACP,cAAc,WACd,UAAU,gHACN;CACJ,MAAM,CAAC,UAAU,eAAe,SAAS,WAAW;CACpD,MAAM,CAAC,YAAY,iBAAiB,SAAS,WAAW;CACxD,MAAM,CAAC,OAAO,YAAY,SAAwB,KAAK;CACvD,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CACjD,MAAM,YAAY,OAA0B,KAAK;CAGjD,MAAM,UAAU,YAAY,UAAU;AAEtC,iBAAgB;AACd,cAAY,WAAW;AACvB,gBAAc,WAAW;AACzB,WAAS,KAAK;AACd,eAAa,MAAM;IAClB,CAAC,WAAW,CAAC;CAGhB,MAAM,mBAAmB,SAAiB;AAExC,MAAI,CAAC,iBAAiB,KAAK,KAAK,CAAE,QAAO;AAEzC,MAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAE,QAAO;AAErD,MAAI,KAAK,SAAS,KAAK,CAAE,QAAO;AAEhC,MAAI,CAAC,KAAK,SAAS,IAAI,CAAE,QAAO;AAEhC,SAAO;;CAGT,MAAM,gBAAgB,QAAgB;EACpC,MAAM,UAAU,IAAI,MAAM;AAC1B,MAAI,CAAC,WAAW,KAAK,KAAK,QAAQ,CAAE,OAAM,IAAI,MAAM,UAAU;EAG9D,MAAM,YAAY,4BAA4B,KAAK,QAAQ,GACvD,UACA,WAAW;EAEf,MAAM,MAAM,IAAI,IAAI,UAAU;AAE9B,MAAI,IAAI,aAAa,WAAW,IAAI,aAAa,SAC/C,OAAM,IAAI,MAAM,0BAA0B;AAG5C,MAAI,CAAC,gBAAgB,IAAI,SAAS,CAChC,OAAM,IAAI,MAAM,eAAe;AAGjC,SAAO,IAAI,UAAU;;CAGvB,MAAM,uBAAuB,QAAgB;AAC3C,MAAI;GACF,MAAM,YAAY,aAAa,IAAI;AACnC,iBAAc,UAAU;AACxB,eAAY,UAAU;AACtB,YAAS,KAAK;UACR;AACN,YAAS,QAAQ,aAAa,MAAM;;;CAKxC,MAAM,gBAAgB,MAAkC;AACtD,IAAE,gBAAgB;AAClB,eAAa,KAAK;AAClB,sBAAoB,SAAS;;CAG/B,MAAM,qBAAqB;AACzB,MAAI,UAAU,SAAS;GACrB,MAAM,MAAM,UAAU,QAAQ;AAC9B,aAAU,QAAQ,MAAM;AACxB,aAAU,QAAQ,MAAM;;;CAI5B,MAAM,YAAY,aAAa,CAAC,CAAC;AAEjC,QACE,qBAAC;EACC,WAAW,GAAG,gBAAgB,EAAE,MAAM,CAAC,EAAE,UAAU;EAC5C;EACP,cAAY,aAAa,QAAQ,UAAU;aAG3C,qBAAC;GAAI,WAAU;cACb,qBAAC;IAAK,UAAU;IAAc,WAAU;IAAkB;;KACxD,oBAAC;MAAM,SAAQ;MAAc,WAAU;gBACpC,QAAQ,SAAS;OACZ;KACR,oBAAC;MACC,IAAG;MACH,MAAK;MACL,WAAU;MACV,YAAY;MACZ,gBAAe;MACf,aAAY;MACZ,OAAO;MACP,WAAW,MAAM;AACf,mBAAY,EAAE,OAAO,MAAM;AAC3B,WAAI,UAAW,UAAS,KAAK;;MAE/B,aAAa,QAAQ,eAAe;MACpC,WAAW,GACT,2DACA,mCACA,gCACA,4EACA,YAAY,0BAA0B,4BACvC;MACD,cAAY,QAAQ,SAAS;MAC7B,gBAAc;MACd,oBAAkB,YAAY,sBAAsB;OACpD;KAGF,oBAAC;MACC,MAAK;MACL,SAAS;MACT,WAAW,GACT,6CACA,uDACA,0CACA,4DACD;MACD,OAAO,QAAQ,kBAAkB;MACjC,cAAY,QAAQ,kBAAkB;MACtC,UAAU;gBAEV,oBAAC;OAAS,MAAM;OAAI,WAAU;OAAmB,aAAa;QAAK;OAC5D;KAGT,oBAAC;MAAO,MAAK;MAAS,WAAU;MAAmB,UAAU;OAAM;;KAC9D,EAGN,aACC,oBAAC;IACC,IAAG;IACH,MAAK;IACL,aAAU;IACV,WAAU;cAET;KACC;IAEF,EAGN,oBAAC;GAAI,WAAU;aACb,oBAAC;IACC,KAAK;IACL,KAAK;IACL,OAAO,QAAQ,YAAY;IAC3B,WAAU;IACD;IACT,SAAQ;IACR,aAAU;KACV;IACE;GACE"}
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
|
|
4
4
|
import { SaveForm } from "../DictionaryFieldEditor/SaveForm/SaveForm.mjs";
|
|
5
5
|
import { NodeWrapper } from "./NodeWrapper/index.mjs";
|
|
6
|
-
import { createElement } from "react";
|
|
6
|
+
import { createElement, useMemo } from "react";
|
|
7
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
-
import { useEditedContent,
|
|
8
|
+
import { useEditedContent, useFocusUnmergedDictionary } from "@intlayer/editor-react";
|
|
9
9
|
|
|
10
10
|
//#region src/components/DictionaryEditor/DictionaryEditor.tsx
|
|
11
11
|
const DictionaryEditor = ({ dictionary, mode, onDelete,...props }) => {
|
|
12
12
|
const { editedContent, addEditedContent } = useEditedContent();
|
|
13
|
-
const { focusedContent, setFocusedContentKeyPath, setFocusedContent } =
|
|
14
|
-
const focusedKeyPath = focusedContent?.keyPath;
|
|
13
|
+
const { focusedContent, setFocusedContentKeyPath, setFocusedContent } = useFocusUnmergedDictionary();
|
|
14
|
+
const focusedKeyPath = useMemo(() => focusedContent?.keyPath, [focusedContent?.keyPath]);
|
|
15
15
|
return /* @__PURE__ */ jsxs("div", {
|
|
16
16
|
className: "flex flex-1 flex-col justify-between gap-2",
|
|
17
17
|
children: [/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ createElement(NodeWrapper, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DictionaryEditor.mjs","names":["DictionaryEditor: FC<DictionaryEditorProps>"],"sources":["../../../../src/components/DictionaryEditor/DictionaryEditor.tsx"],"sourcesContent":["'use client';\n\nimport {
|
|
1
|
+
{"version":3,"file":"DictionaryEditor.mjs","names":["DictionaryEditor: FC<DictionaryEditorProps>"],"sources":["../../../../src/components/DictionaryEditor/DictionaryEditor.tsx"],"sourcesContent":["'use client';\n\nimport {\n useEditedContent,\n useFocusUnmergedDictionary,\n} from '@intlayer/editor-react';\nimport type { Dictionary, Locale } from '@intlayer/types';\nimport { type FC, useMemo } from 'react';\nimport { SaveForm } from '../DictionaryFieldEditor/SaveForm/SaveForm';\nimport { NodeWrapper } from './NodeWrapper';\n\ntype DictionaryEditorProps = {\n dictionary: Dictionary;\n locale: Locale;\n mode: ('local' | 'remote')[];\n onDelete?: () => void;\n};\n\nexport const DictionaryEditor: FC<DictionaryEditorProps> = ({\n dictionary,\n mode,\n onDelete,\n ...props\n}) => {\n const { editedContent, addEditedContent } = useEditedContent();\n const { focusedContent, setFocusedContentKeyPath, setFocusedContent } =\n useFocusUnmergedDictionary();\n\n const focusedKeyPath = useMemo(\n () => focusedContent?.keyPath,\n [focusedContent?.keyPath]\n );\n\n return (\n <div className=\"flex flex-1 flex-col justify-between gap-2\">\n <div>\n <NodeWrapper\n {...props}\n keyPath={[]}\n dictionary={dictionary}\n key={JSON.stringify(\n (editedContent?.[dictionary.localId!] ?? dictionary).content\n )}\n editedContent={editedContent?.[dictionary.localId!]?.content}\n focusedKeyPath={focusedKeyPath}\n section={dictionary.content}\n onContentChange={(content) => {\n addEditedContent(\n dictionary.localId!,\n content.newValue,\n content.keyPath\n );\n }}\n onFocusKeyPath={setFocusedContentKeyPath}\n />\n </div>\n <SaveForm\n dictionary={dictionary}\n mode={mode}\n className=\"mb-4 flex-col\"\n onDelete={() => {\n setFocusedContent(null);\n onDelete?.();\n }}\n />\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;AAkBA,MAAaA,oBAA+C,EAC1D,YACA,MACA,SACA,GAAG,YACC;CACJ,MAAM,EAAE,eAAe,qBAAqB,kBAAkB;CAC9D,MAAM,EAAE,gBAAgB,0BAA0B,sBAChD,4BAA4B;CAE9B,MAAM,iBAAiB,cACf,gBAAgB,SACtB,CAAC,gBAAgB,QAAQ,CAC1B;AAED,QACE,qBAAC;EAAI,WAAU;aACb,oBAAC,mBACC,8BAAC;GACC,GAAI;GACJ,SAAS,EAAE;GACC;GACZ,KAAK,KAAK,WACP,gBAAgB,WAAW,YAAa,YAAY,QACtD;GACD,eAAe,gBAAgB,WAAW,UAAW;GACrC;GAChB,SAAS,WAAW;GACpB,kBAAkB,YAAY;AAC5B,qBACE,WAAW,SACX,QAAQ,UACR,QAAQ,QACT;;GAEH,gBAAgB;IAChB,GACE,EACN,oBAAC;GACa;GACN;GACN,WAAU;GACV,gBAAgB;AACd,sBAAkB,KAAK;AACvB,gBAAY;;IAEd;GACE"}
|
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
import { ItemLayout } from "../ItemLayout.mjs";
|
|
2
2
|
import { NodeWrapper, traceKeys } from "./index.mjs";
|
|
3
|
+
import { memo, useMemo } from "react";
|
|
3
4
|
import { jsx } from "react/jsx-runtime";
|
|
4
5
|
import { isSameKeyPath } from "@intlayer/core";
|
|
5
6
|
import { NodeType } from "@intlayer/types";
|
|
6
7
|
|
|
7
8
|
//#region src/components/DictionaryEditor/NodeWrapper/NestedObjectWrapper.tsx
|
|
8
|
-
const NestedObjectWrapper = (props) => {
|
|
9
|
+
const NestedObjectWrapper = memo((props) => {
|
|
9
10
|
const { keyPath, section, focusedKeyPath = [], onFocusKeyPath } = props;
|
|
10
|
-
return Object.keys(section).filter((key) => !traceKeys.includes(key)).map((key) => {
|
|
11
|
+
return useMemo(() => Object.keys(section ?? {}).filter((key) => !traceKeys.includes(key)), [section]).map((key) => {
|
|
11
12
|
const newKeyPathEl = {
|
|
12
13
|
key,
|
|
13
14
|
type: NodeType.Object
|
|
14
15
|
};
|
|
15
16
|
const newKeyPath = [...keyPath, newKeyPathEl];
|
|
17
|
+
const isSelected = isSameKeyPath(newKeyPath, focusedKeyPath);
|
|
16
18
|
return /* @__PURE__ */ jsx(ItemLayout, {
|
|
17
19
|
level: keyPath.length,
|
|
18
20
|
title: key,
|
|
19
21
|
description: "",
|
|
20
|
-
isSelected
|
|
22
|
+
isSelected,
|
|
21
23
|
onClick: (e) => {
|
|
22
24
|
e.stopPropagation();
|
|
23
|
-
onFocusKeyPath(
|
|
25
|
+
if (isSelected) onFocusKeyPath([]);
|
|
26
|
+
else onFocusKeyPath(newKeyPath);
|
|
24
27
|
},
|
|
25
28
|
children: /* @__PURE__ */ jsx(NodeWrapper, {
|
|
26
29
|
...props,
|
|
@@ -29,7 +32,7 @@ const NestedObjectWrapper = (props) => {
|
|
|
29
32
|
})
|
|
30
33
|
}, key);
|
|
31
34
|
});
|
|
32
|
-
};
|
|
35
|
+
});
|
|
33
36
|
|
|
34
37
|
//#endregion
|
|
35
38
|
export { NestedObjectWrapper };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NestedObjectWrapper.mjs","names":["NestedObjectWrapper: FC<NestedObjectWrapperProps>","newKeyPathEl: KeyPath","newKeyPath: KeyPath[]"],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/NestedObjectWrapper.tsx"],"sourcesContent":["import { isSameKeyPath } from '@intlayer/core';\nimport { type ContentNode, type KeyPath, NodeType } from '@intlayer/types';\nimport type
|
|
1
|
+
{"version":3,"file":"NestedObjectWrapper.mjs","names":["NestedObjectWrapper: FC<NestedObjectWrapperProps>","newKeyPathEl: KeyPath","newKeyPath: KeyPath[]"],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/NestedObjectWrapper.tsx"],"sourcesContent":["import { isSameKeyPath } from '@intlayer/core';\nimport { type ContentNode, type KeyPath, NodeType } from '@intlayer/types';\nimport { type FC, memo, useMemo } from 'react';\nimport { ItemLayout } from '../ItemLayout';\nimport { NodeWrapper, type NodeWrapperProps, traceKeys } from './index';\n\ntype NestedObjectWrapperProps = Omit<NodeWrapperProps, 'section'> & {\n section: Record<string, ContentNode>;\n};\n\nexport const NestedObjectWrapper: FC<NestedObjectWrapperProps> = memo(\n (props) => {\n const { keyPath, section, focusedKeyPath = [], onFocusKeyPath } = props;\n\n const sectionKeys = useMemo(\n () =>\n Object.keys(section ?? {}).filter((key) => !traceKeys.includes(key)),\n [section]\n );\n\n return sectionKeys.map((key) => {\n const newKeyPathEl: KeyPath = { key, type: NodeType.Object };\n const newKeyPath: KeyPath[] = [...keyPath, newKeyPathEl];\n\n const isSelected = isSameKeyPath(newKeyPath, focusedKeyPath);\n\n return (\n <ItemLayout\n level={keyPath.length}\n key={key}\n title={key}\n description=\"\"\n isSelected={isSelected}\n onClick={(e) => {\n e.stopPropagation();\n\n if (isSelected) {\n onFocusKeyPath([]);\n } else {\n onFocusKeyPath(newKeyPath);\n }\n }}\n >\n <NodeWrapper {...props} keyPath={newKeyPath} section={section[key]} />\n </ItemLayout>\n );\n });\n }\n);\n"],"mappings":";;;;;;;;AAUA,MAAaA,sBAAoD,MAC9D,UAAU;CACT,MAAM,EAAE,SAAS,SAAS,iBAAiB,EAAE,EAAE,mBAAmB;AAQlE,QANoB,cAEhB,OAAO,KAAK,WAAW,EAAE,CAAC,CAAC,QAAQ,QAAQ,CAAC,UAAU,SAAS,IAAI,CAAC,EACtE,CAAC,QAAQ,CACV,CAEkB,KAAK,QAAQ;EAC9B,MAAMC,eAAwB;GAAE;GAAK,MAAM,SAAS;GAAQ;EAC5D,MAAMC,aAAwB,CAAC,GAAG,SAAS,aAAa;EAExD,MAAM,aAAa,cAAc,YAAY,eAAe;AAE5D,SACE,oBAAC;GACC,OAAO,QAAQ;GAEf,OAAO;GACP,aAAY;GACA;GACZ,UAAU,MAAM;AACd,MAAE,iBAAiB;AAEnB,QAAI,WACF,gBAAe,EAAE,CAAC;QAElB,gBAAe,WAAW;;aAI9B,oBAAC;IAAY,GAAI;IAAO,SAAS;IAAY,SAAS,QAAQ;KAAQ;KAdjE,IAeM;GAEf;EAEL"}
|
|
@@ -2,10 +2,12 @@ import { cn } from "../../../utils/cn.mjs";
|
|
|
2
2
|
import { EditableFieldTextArea } from "../../EditableField/EditableFieldTextArea.mjs";
|
|
3
3
|
import { Fragment, jsx } from "react/jsx-runtime";
|
|
4
4
|
import { getContentNodeByKeyPath } from "@intlayer/core";
|
|
5
|
+
import { useEditorLocale } from "@intlayer/editor-react";
|
|
5
6
|
|
|
6
7
|
//#region src/components/DictionaryEditor/NodeWrapper/StringWrapper.tsx
|
|
7
8
|
const StringWrapper = ({ keyPath, section, editedContent, editedContentValue: editedContentValueProp, onContentChange, onFocusKeyPath, renderSection }) => {
|
|
8
|
-
const
|
|
9
|
+
const currentLocale = useEditorLocale();
|
|
10
|
+
const editedContentValue = editedContentValueProp ?? getContentNodeByKeyPath(editedContent, keyPath, currentLocale);
|
|
9
11
|
if (editedContentValue && typeof editedContentValue !== "string") return /* @__PURE__ */ jsx(Fragment, { children: "Error loading section - Edited content Incoherence with the original content format" });
|
|
10
12
|
const level = keyPath.length;
|
|
11
13
|
const content = String(editedContentValue ?? section);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StringWrapper.mjs","names":["StringWrapper: FC<StringWrapperProps>"],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/StringWrapper.tsx"],"sourcesContent":["import { getContentNodeByKeyPath } from '@intlayer/core';\nimport type { FC } from 'react';\nimport { cn } from '../../../utils/cn';\nimport { EditableFieldTextArea } from '../../EditableField';\nimport type { NodeWrapperProps } from './index';\n\nexport type StringWrapperProps = Omit<NodeWrapperProps, 'section'> & {\n section: string;\n editedContentValue?: string;\n};\n\nexport const StringWrapper: FC<StringWrapperProps> = ({\n keyPath,\n section,\n editedContent,\n editedContentValue: editedContentValueProp,\n onContentChange,\n onFocusKeyPath,\n renderSection,\n}) => {\n const editedContentValue =\n editedContentValueProp
|
|
1
|
+
{"version":3,"file":"StringWrapper.mjs","names":["StringWrapper: FC<StringWrapperProps>"],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/StringWrapper.tsx"],"sourcesContent":["import { getContentNodeByKeyPath } from '@intlayer/core';\nimport { useEditorLocale } from '@intlayer/editor-react';\nimport type { FC } from 'react';\nimport { cn } from '../../../utils/cn';\nimport { EditableFieldTextArea } from '../../EditableField';\nimport type { NodeWrapperProps } from './index';\n\nexport type StringWrapperProps = Omit<NodeWrapperProps, 'section'> & {\n section: string;\n editedContentValue?: string;\n};\n\nexport const StringWrapper: FC<StringWrapperProps> = ({\n keyPath,\n section,\n editedContent,\n editedContentValue: editedContentValueProp,\n onContentChange,\n onFocusKeyPath,\n renderSection,\n}) => {\n const currentLocale = useEditorLocale();\n const editedContentValue =\n editedContentValueProp ??\n getContentNodeByKeyPath(editedContent, keyPath, currentLocale);\n\n if (editedContentValue && typeof editedContentValue !== 'string') {\n return (\n <>\n Error loading section - Edited content Incoherence with the original\n content format\n </>\n );\n }\n\n const level = keyPath.length;\n\n const content = String(editedContentValue ?? section);\n\n return (\n <span\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'w-full rounded-md p-2 text-left transition',\n 'hover:bg-card/30 [&:has(.section:hover)]:bg-transparent',\n level === 2 && 'hover:bg-card/30',\n level >= 3 && ''\n )}\n onClick={(e) => {\n e.stopPropagation();\n onFocusKeyPath(keyPath);\n }}\n >\n {typeof renderSection === 'function' ? (\n renderSection(content)\n ) : (\n <EditableFieldTextArea\n aria-label=\"Editable field\"\n defaultValue={content}\n onSave={(newValue) => onContentChange({ keyPath, newValue })}\n onCancel={() => null}\n />\n )}\n </span>\n );\n};\n"],"mappings":";;;;;;;AAYA,MAAaA,iBAAyC,EACpD,SACA,SACA,eACA,oBAAoB,wBACpB,iBACA,gBACA,oBACI;CACJ,MAAM,gBAAgB,iBAAiB;CACvC,MAAM,qBACJ,0BACA,wBAAwB,eAAe,SAAS,cAAc;AAEhE,KAAI,sBAAsB,OAAO,uBAAuB,SACtD,QACE,0CAAE,wFAGC;CAIP,MAAM,QAAQ,QAAQ;CAEtB,MAAM,UAAU,OAAO,sBAAsB,QAAQ;AAErD,QACE,oBAAC;EACC,MAAK;EACL,UAAU;EACV,WAAW,GACT,8CACA,2DACA,UAAU,KAAK,oBACf,SAAS,KAAK,GACf;EACD,UAAU,MAAM;AACd,KAAE,iBAAiB;AACnB,kBAAe,QAAQ;;YAGxB,OAAO,kBAAkB,aACxB,cAAc,QAAQ,GAEtB,oBAAC;GACC,cAAW;GACX,cAAc;GACd,SAAS,aAAa,gBAAgB;IAAE;IAAS;IAAU,CAAC;GAC5D,gBAAgB;IAChB;GAEC"}
|
|
@@ -10,8 +10,10 @@ import { InsertionWrapper } from "./InsertionWrapper.mjs";
|
|
|
10
10
|
import { MarkdownWrapper } from "./MarkdownWrapper.mjs";
|
|
11
11
|
import { NestedObjectWrapper } from "./NestedObjectWrapper.mjs";
|
|
12
12
|
import { TranslationWrapper } from "./TranslationWrapper.mjs";
|
|
13
|
+
import { memo, useMemo } from "react";
|
|
13
14
|
import { jsx } from "react/jsx-runtime";
|
|
14
15
|
import { getContentNodeByKeyPath, getNodeType } from "@intlayer/core";
|
|
16
|
+
import { useEditorLocale } from "@intlayer/editor-react";
|
|
15
17
|
import { NodeType } from "@intlayer/types";
|
|
16
18
|
|
|
17
19
|
//#region src/components/DictionaryEditor/NodeWrapper/index.tsx
|
|
@@ -20,9 +22,16 @@ const traceKeys = [
|
|
|
20
22
|
"id",
|
|
21
23
|
"nodeType"
|
|
22
24
|
];
|
|
23
|
-
const NodeWrapper = (props) => {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
25
|
+
const NodeWrapper = memo((props) => {
|
|
26
|
+
const currentLocale = useEditorLocale();
|
|
27
|
+
const section = useMemo(() => {
|
|
28
|
+
return getContentNodeByKeyPath(props.editedContent, props.keyPath, currentLocale) ?? props.section;
|
|
29
|
+
}, [
|
|
30
|
+
props.editedContent,
|
|
31
|
+
props.keyPath,
|
|
32
|
+
props.section
|
|
33
|
+
]);
|
|
34
|
+
const nodeType = useMemo(() => getNodeType(section), [section]);
|
|
26
35
|
if (typeof section === "object") {
|
|
27
36
|
if (nodeType === NodeType.ReactNode) return /* @__PURE__ */ jsx("span", {
|
|
28
37
|
className: "text-neutral text-xs",
|
|
@@ -69,7 +78,7 @@ const NodeWrapper = (props) => {
|
|
|
69
78
|
...props,
|
|
70
79
|
section
|
|
71
80
|
});
|
|
72
|
-
};
|
|
81
|
+
});
|
|
73
82
|
|
|
74
83
|
//#endregion
|
|
75
84
|
export { NodeWrapper, traceKeys };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["traceKeys: string[]","NodeWrapper: FC<NodeWrapperProps>"],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ConditionContent,\n type EnumerationContent,\n type FileContent,\n getContentNodeByKeyPath,\n getNodeType,\n type InsertionContent,\n type MarkdownContent,\n type TranslationContent,\n} from '@intlayer/core';\nimport {\n type ContentNode,\n type Dictionary,\n type KeyPath,\n type Locale,\n NodeType,\n} from '@intlayer/types';\nimport type
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["traceKeys: string[]","NodeWrapper: FC<NodeWrapperProps>"],"sources":["../../../../../src/components/DictionaryEditor/NodeWrapper/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ConditionContent,\n type EnumerationContent,\n type FileContent,\n getContentNodeByKeyPath,\n getNodeType,\n type InsertionContent,\n type MarkdownContent,\n type TranslationContent,\n} from '@intlayer/core';\nimport { useEditorLocale } from '@intlayer/editor-react';\nimport {\n type ContentNode,\n type Dictionary,\n type KeyPath,\n type Locale,\n NodeType,\n} from '@intlayer/types';\nimport { type FC, memo, type ReactNode, useMemo } from 'react';\nimport { ArrayWrapper } from './ArrayWrapper';\nimport { ConditionWrapper } from './ConditionWrapper';\nimport { EnumerationWrapper } from './EnumerationWrapper';\nimport { FileWrapper } from './FileWrapper';\nimport { InsertionWrapper } from './InsertionWrapper';\nimport { MarkdownWrapper } from './MarkdownWrapper';\nimport { NestedObjectWrapper } from './NestedObjectWrapper';\nimport { StringWrapper } from './StringWrapper';\nimport { TranslationWrapper } from './TranslationWrapper';\n\nexport const traceKeys: string[] = ['filePath', 'id', 'nodeType'];\n\nexport type NodeWrapperProps = {\n keyPath: KeyPath[];\n dictionary: Dictionary;\n section: ContentNode;\n onContentChange: (content: { keyPath: KeyPath[]; newValue: string }) => void;\n locale: Locale;\n editedContent: ContentNode;\n focusedKeyPath: KeyPath[] | undefined;\n onFocusKeyPath: (keyPath: KeyPath[]) => void;\n onClickEdit?: (keyPath: KeyPath[]) => void;\n renderSection?: (content: string) => ReactNode;\n};\n\nexport const NodeWrapper: FC<NodeWrapperProps> = memo((props) => {\n const currentLocale = useEditorLocale();\n const section = useMemo(() => {\n const editedContentValue = getContentNodeByKeyPath(\n props.editedContent,\n props.keyPath,\n currentLocale\n );\n return editedContentValue ?? props.section;\n }, [props.editedContent, props.keyPath, props.section]);\n\n const nodeType = useMemo(() => getNodeType(section), [section]);\n\n if (typeof section === 'object') {\n if (nodeType === NodeType.ReactNode) {\n return (\n <span className=\"text-neutral text-xs\">React node not editable</span>\n );\n }\n\n if (nodeType === NodeType.Nested) {\n return (\n <div className=\"ml-2 grid grid-cols-[auto,1fr] gap-2\">\n [Nested] Dictionary\n </div>\n );\n }\n\n if (nodeType === NodeType.Markdown) {\n return (\n <MarkdownWrapper\n {...props}\n section={section as MarkdownContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeType.Translation) {\n return (\n <TranslationWrapper\n {...props}\n section={section as TranslationContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeType.Enumeration) {\n return (\n <EnumerationWrapper\n {...props}\n section={section as EnumerationContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeType.Condition) {\n return (\n <ConditionWrapper\n {...props}\n section={section as ConditionContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeType.Insertion) {\n return (\n <InsertionWrapper\n {...props}\n section={section as InsertionContent<ContentNode>}\n />\n );\n }\n\n if (nodeType === NodeType.Array) {\n return (\n <ArrayWrapper\n {...props}\n section={section as unknown as ContentNode[]}\n />\n );\n }\n\n if (nodeType === NodeType.File) {\n return <FileWrapper {...props} section={section as FileContent} />;\n }\n\n return (\n <NestedObjectWrapper\n {...props}\n section={section as unknown as Record<string, ContentNode>}\n />\n );\n }\n\n if (typeof section === 'string') {\n return <StringWrapper {...props} section={section} />;\n }\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA+BA,MAAaA,YAAsB;CAAC;CAAY;CAAM;CAAW;AAejE,MAAaC,cAAoC,MAAM,UAAU;CAC/D,MAAM,gBAAgB,iBAAiB;CACvC,MAAM,UAAU,cAAc;AAM5B,SAL2B,wBACzB,MAAM,eACN,MAAM,SACN,cACD,IAC4B,MAAM;IAClC;EAAC,MAAM;EAAe,MAAM;EAAS,MAAM;EAAQ,CAAC;CAEvD,MAAM,WAAW,cAAc,YAAY,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAE/D,KAAI,OAAO,YAAY,UAAU;AAC/B,MAAI,aAAa,SAAS,UACxB,QACE,oBAAC;GAAK,WAAU;aAAuB;IAA8B;AAIzE,MAAI,aAAa,SAAS,OACxB,QACE,oBAAC;GAAI,WAAU;aAAuC;IAEhD;AAIV,MAAI,aAAa,SAAS,SACxB,QACE,oBAAC;GACC,GAAI;GACK;IACT;AAIN,MAAI,aAAa,SAAS,YACxB,QACE,oBAAC;GACC,GAAI;GACK;IACT;AAIN,MAAI,aAAa,SAAS,YACxB,QACE,oBAAC;GACC,GAAI;GACK;IACT;AAIN,MAAI,aAAa,SAAS,UACxB,QACE,oBAAC;GACC,GAAI;GACK;IACT;AAIN,MAAI,aAAa,SAAS,UACxB,QACE,oBAAC;GACC,GAAI;GACK;IACT;AAIN,MAAI,aAAa,SAAS,MACxB,QACE,oBAAC;GACC,GAAI;GACK;IACT;AAIN,MAAI,aAAa,SAAS,KACxB,QAAO,oBAAC;GAAY,GAAI;GAAgB;IAA0B;AAGpE,SACE,oBAAC;GACC,GAAI;GACK;IACT;;AAIN,KAAI,OAAO,YAAY,SACrB,QAAO,oBAAC;EAAc,GAAI;EAAgB;GAAW;EAEvD"}
|