@startdownnotez404/ui 1.0.0 → 1.3.5
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/README.md +110 -0
- package/dist/AutocompleteField-ZKNU2IRR.mjs +181 -0
- package/dist/AutocompleteField-ZKNU2IRR.mjs.map +1 -0
- package/dist/AvatarField-SAODT3CZ.mjs +275 -0
- package/dist/AvatarField-SAODT3CZ.mjs.map +1 -0
- package/dist/CodeEditor-JF55ZNVD.mjs +34 -0
- package/dist/CodeEditor-JF55ZNVD.mjs.map +1 -0
- package/dist/DateField-ZYMZFHL4.mjs +82 -0
- package/dist/DateField-ZYMZFHL4.mjs.map +1 -0
- package/dist/DateTimeField-TPTJ7YIZ.mjs +65 -0
- package/dist/DateTimeField-TPTJ7YIZ.mjs.map +1 -0
- package/dist/FileUploadField-NTMWBJER.mjs +78 -0
- package/dist/FileUploadField-NTMWBJER.mjs.map +1 -0
- package/dist/JSONEditorField-TMRWGXVR.mjs +64 -0
- package/dist/JSONEditorField-TMRWGXVR.mjs.map +1 -0
- package/dist/PopperMenu-LJ36RPBW.mjs +416 -0
- package/dist/PopperMenu-LJ36RPBW.mjs.map +1 -0
- package/dist/TelField-LOGRVZ4I.mjs +88 -0
- package/dist/TelField-LOGRVZ4I.mjs.map +1 -0
- package/dist/alert.d.mts +202 -0
- package/dist/alert.d.ts +202 -0
- package/dist/alert.js +784 -0
- package/dist/alert.js.map +1 -0
- package/dist/alert.mjs +47 -0
- package/dist/alert.mjs.map +1 -0
- package/dist/appBar.d.mts +21 -0
- package/dist/appBar.d.ts +21 -0
- package/dist/appBar.js +64 -0
- package/dist/appBar.js.map +1 -0
- package/dist/appBar.mjs +12 -0
- package/dist/appBar.mjs.map +1 -0
- package/dist/autocomplete.d.mts +121 -0
- package/dist/autocomplete.d.ts +121 -0
- package/dist/autocomplete.js +2052 -0
- package/dist/autocomplete.js.map +1 -0
- package/dist/autocomplete.mjs +21 -0
- package/dist/autocomplete.mjs.map +1 -0
- package/dist/avatar.d.mts +253 -0
- package/dist/avatar.d.ts +253 -0
- package/dist/avatar.js +992 -0
- package/dist/avatar.js.map +1 -0
- package/dist/avatar.mjs +41 -0
- package/dist/avatar.mjs.map +1 -0
- package/dist/badge.d.mts +123 -0
- package/dist/badge.d.ts +123 -0
- package/dist/badge.js +151 -0
- package/dist/badge.js.map +1 -0
- package/dist/badge.mjs +10 -0
- package/dist/badge.mjs.map +1 -0
- package/dist/box.d.mts +36 -0
- package/dist/box.d.ts +36 -0
- package/dist/box.js +199 -0
- package/dist/box.js.map +1 -0
- package/dist/box.mjs +14 -0
- package/dist/box.mjs.map +1 -0
- package/dist/button.d.mts +230 -52
- package/dist/button.d.ts +230 -52
- package/dist/button.js +392 -60
- package/dist/button.js.map +1 -1
- package/dist/button.mjs +14 -8
- package/dist/card.d.mts +47 -0
- package/dist/card.d.ts +47 -0
- package/dist/card.js +135 -0
- package/dist/card.js.map +1 -0
- package/dist/card.mjs +24 -0
- package/dist/card.mjs.map +1 -0
- package/dist/chart.d.mts +40 -0
- package/dist/chart.d.ts +40 -0
- package/dist/chart.js +1234 -0
- package/dist/chart.js.map +1 -0
- package/dist/chart.mjs +10 -0
- package/dist/chart.mjs.map +1 -0
- package/dist/checkbox.d.mts +62 -0
- package/dist/checkbox.d.ts +62 -0
- package/dist/checkbox.js +299 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/checkbox.mjs +14 -0
- package/dist/checkbox.mjs.map +1 -0
- package/dist/chip.d.mts +96 -0
- package/dist/chip.d.ts +96 -0
- package/dist/chip.js +112 -0
- package/dist/chip.js.map +1 -0
- package/dist/chip.mjs +10 -0
- package/dist/chip.mjs.map +1 -0
- package/dist/chunk-24XDGNJ6.mjs +1450 -0
- package/dist/chunk-24XDGNJ6.mjs.map +1 -0
- package/dist/chunk-27KYFU7R.mjs +30 -0
- package/dist/chunk-27KYFU7R.mjs.map +1 -0
- package/dist/chunk-2FFLT5VP.mjs +7 -0
- package/dist/chunk-2FFLT5VP.mjs.map +1 -0
- package/dist/chunk-2ZZJTBTE.mjs +148 -0
- package/dist/chunk-2ZZJTBTE.mjs.map +1 -0
- package/dist/chunk-3DQINB57.mjs +15 -0
- package/dist/chunk-3DQINB57.mjs.map +1 -0
- package/dist/chunk-3VUAM2GY.mjs +52 -0
- package/dist/chunk-3VUAM2GY.mjs.map +1 -0
- package/dist/chunk-4Q54P737.mjs +19 -0
- package/dist/chunk-4Q54P737.mjs.map +1 -0
- package/dist/chunk-4RPFRNXG.mjs +62 -0
- package/dist/chunk-4RPFRNXG.mjs.map +1 -0
- package/dist/chunk-56TI2ZBT.mjs +114 -0
- package/dist/chunk-56TI2ZBT.mjs.map +1 -0
- package/dist/chunk-6REEQBJI.mjs +62 -0
- package/dist/chunk-6REEQBJI.mjs.map +1 -0
- package/dist/chunk-AAH2O24U.mjs +325 -0
- package/dist/chunk-AAH2O24U.mjs.map +1 -0
- package/dist/chunk-B7DAB22K.mjs +16 -0
- package/dist/chunk-B7DAB22K.mjs.map +1 -0
- package/dist/chunk-BGB7JHIU.mjs +222 -0
- package/dist/chunk-BGB7JHIU.mjs.map +1 -0
- package/dist/chunk-CRYIEYZZ.mjs +756 -0
- package/dist/chunk-CRYIEYZZ.mjs.map +1 -0
- package/dist/chunk-CWFWRZWU.mjs +23 -0
- package/dist/chunk-CWFWRZWU.mjs.map +1 -0
- package/dist/chunk-DELCADNF.mjs +1926 -0
- package/dist/chunk-DELCADNF.mjs.map +1 -0
- package/dist/chunk-E3I2VDHZ.mjs +292 -0
- package/dist/chunk-E3I2VDHZ.mjs.map +1 -0
- package/dist/chunk-EEH7HACG.mjs +249 -0
- package/dist/chunk-EEH7HACG.mjs.map +1 -0
- package/dist/chunk-EKPULYPU.mjs +497 -0
- package/dist/chunk-EKPULYPU.mjs.map +1 -0
- package/dist/chunk-EW4DTFH3.mjs +69 -0
- package/dist/chunk-EW4DTFH3.mjs.map +1 -0
- package/dist/chunk-FJ6ZGZIA.mjs +43 -0
- package/dist/chunk-FJ6ZGZIA.mjs.map +1 -0
- package/dist/chunk-HE7MY3RT.mjs +23 -0
- package/dist/chunk-HE7MY3RT.mjs.map +1 -0
- package/dist/chunk-HR3A4H4E.mjs +1289 -0
- package/dist/chunk-HR3A4H4E.mjs.map +1 -0
- package/dist/chunk-I5JWS4Z7.mjs +91 -0
- package/dist/chunk-I5JWS4Z7.mjs.map +1 -0
- package/dist/chunk-IN3O4R7Q.mjs +932 -0
- package/dist/chunk-IN3O4R7Q.mjs.map +1 -0
- package/dist/chunk-JIU5GVM7.mjs +414 -0
- package/dist/chunk-JIU5GVM7.mjs.map +1 -0
- package/dist/chunk-JWANK42G.mjs +170 -0
- package/dist/chunk-JWANK42G.mjs.map +1 -0
- package/dist/chunk-MDAUF7IL.mjs +9 -0
- package/dist/chunk-MDAUF7IL.mjs.map +1 -0
- package/dist/chunk-MI64T62E.mjs +26 -0
- package/dist/chunk-MI64T62E.mjs.map +1 -0
- package/dist/chunk-NJYNJLT7.mjs +172 -0
- package/dist/chunk-NJYNJLT7.mjs.map +1 -0
- package/dist/chunk-NLBDBJ3R.mjs +97 -0
- package/dist/chunk-NLBDBJ3R.mjs.map +1 -0
- package/dist/chunk-OGNGPI3M.mjs +333 -0
- package/dist/chunk-OGNGPI3M.mjs.map +1 -0
- package/dist/chunk-OJV6V7YZ.mjs +552 -0
- package/dist/chunk-OJV6V7YZ.mjs.map +1 -0
- package/dist/chunk-ONQMRE2G.mjs +26 -0
- package/dist/chunk-ONQMRE2G.mjs.map +1 -0
- package/dist/chunk-OP6LKXPA.mjs +75 -0
- package/dist/chunk-OP6LKXPA.mjs.map +1 -0
- package/dist/chunk-QFF3HTHL.mjs +14 -0
- package/dist/chunk-QFF3HTHL.mjs.map +1 -0
- package/dist/chunk-QKGCW37O.mjs +1175 -0
- package/dist/chunk-QKGCW37O.mjs.map +1 -0
- package/dist/chunk-R5MKQN6D.mjs +227 -0
- package/dist/chunk-R5MKQN6D.mjs.map +1 -0
- package/dist/chunk-RXBQ7KXF.mjs +652 -0
- package/dist/chunk-RXBQ7KXF.mjs.map +1 -0
- package/dist/chunk-S6EZVRZC.mjs +161 -0
- package/dist/chunk-S6EZVRZC.mjs.map +1 -0
- package/dist/chunk-SGCUDWO3.mjs +396 -0
- package/dist/chunk-SGCUDWO3.mjs.map +1 -0
- package/dist/chunk-SRWPHN2N.mjs +188 -0
- package/dist/chunk-SRWPHN2N.mjs.map +1 -0
- package/dist/chunk-T34IULP5.mjs +242 -0
- package/dist/chunk-T34IULP5.mjs.map +1 -0
- package/dist/chunk-T4X375IG.mjs +100 -0
- package/dist/chunk-T4X375IG.mjs.map +1 -0
- package/dist/chunk-T6AMRENK.mjs +376 -0
- package/dist/chunk-T6AMRENK.mjs.map +1 -0
- package/dist/chunk-TDRA5EZI.mjs +325 -0
- package/dist/chunk-TDRA5EZI.mjs.map +1 -0
- package/dist/chunk-UDREPVEY.mjs +356 -0
- package/dist/chunk-UDREPVEY.mjs.map +1 -0
- package/dist/chunk-UGMRJMFZ.mjs +172 -0
- package/dist/chunk-UGMRJMFZ.mjs.map +1 -0
- package/dist/chunk-UMJ5SCIQ.mjs +438 -0
- package/dist/chunk-UMJ5SCIQ.mjs.map +1 -0
- package/dist/chunk-UTVSYS6S.mjs +270 -0
- package/dist/chunk-UTVSYS6S.mjs.map +1 -0
- package/dist/chunk-V26V2S3W.mjs +197 -0
- package/dist/chunk-V26V2S3W.mjs.map +1 -0
- package/dist/chunk-VYD3PDBB.mjs +38 -0
- package/dist/chunk-VYD3PDBB.mjs.map +1 -0
- package/dist/chunk-WYYP3Y34.mjs +55 -0
- package/dist/chunk-WYYP3Y34.mjs.map +1 -0
- package/dist/chunk-XIMFP6RB.mjs +161 -0
- package/dist/chunk-XIMFP6RB.mjs.map +1 -0
- package/dist/chunk-XJ2SXC2Q.mjs +558 -0
- package/dist/chunk-XJ2SXC2Q.mjs.map +1 -0
- package/dist/chunk-Y74ALKBL.mjs +565 -0
- package/dist/chunk-Y74ALKBL.mjs.map +1 -0
- package/dist/chunk-ZG3NQI77.mjs +353 -0
- package/dist/chunk-ZG3NQI77.mjs.map +1 -0
- package/dist/chunk-ZVFYOXDE.mjs +297 -0
- package/dist/chunk-ZVFYOXDE.mjs.map +1 -0
- package/dist/collapse.d.mts +10 -0
- package/dist/collapse.d.ts +10 -0
- package/dist/collapse.js +53 -0
- package/dist/collapse.js.map +1 -0
- package/dist/collapse.mjs +10 -0
- package/dist/collapse.mjs.map +1 -0
- package/dist/datePicker.d.mts +133 -0
- package/dist/datePicker.d.ts +133 -0
- package/dist/datePicker.js +482 -0
- package/dist/datePicker.js.map +1 -0
- package/dist/datePicker.mjs +29 -0
- package/dist/datePicker.mjs.map +1 -0
- package/dist/displayFile.d.mts +95 -0
- package/dist/displayFile.d.ts +95 -0
- package/dist/displayFile.js +357 -0
- package/dist/displayFile.js.map +1 -0
- package/dist/displayFile.mjs +19 -0
- package/dist/displayFile.mjs.map +1 -0
- package/dist/divider.d.mts +9 -0
- package/dist/divider.d.ts +9 -0
- package/dist/divider.js +52 -0
- package/dist/divider.js.map +1 -0
- package/dist/divider.mjs +10 -0
- package/dist/divider.mjs.map +1 -0
- package/dist/fileUploader.d.mts +86 -0
- package/dist/fileUploader.d.ts +86 -0
- package/dist/fileUploader.js +722 -0
- package/dist/fileUploader.js.map +1 -0
- package/dist/fileUploader.mjs +16 -0
- package/dist/fileUploader.mjs.map +1 -0
- package/dist/flowMap.d.mts +353 -0
- package/dist/flowMap.d.ts +353 -0
- package/dist/flowMap.js +94806 -0
- package/dist/flowMap.js.map +1 -0
- package/dist/flowMap.mjs +94585 -0
- package/dist/flowMap.mjs.map +1 -0
- package/dist/form.d.mts +84 -0
- package/dist/form.d.ts +84 -0
- package/dist/form.js +144 -0
- package/dist/form.js.map +1 -0
- package/dist/form.mjs +24 -0
- package/dist/form.mjs.map +1 -0
- package/dist/icons.d.mts +160 -0
- package/dist/icons.d.ts +160 -0
- package/dist/icons.js +540 -0
- package/dist/icons.js.map +1 -0
- package/dist/icons.mjs +306 -0
- package/dist/icons.mjs.map +1 -0
- package/dist/image.d.mts +49 -0
- package/dist/image.d.ts +49 -0
- package/dist/image.js +1348 -0
- package/dist/image.js.map +1 -0
- package/dist/image.mjs +19 -0
- package/dist/image.mjs.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.js +20198 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +912 -0
- package/dist/index.mjs.map +1 -0
- package/dist/input.d.mts +195 -0
- package/dist/input.d.ts +195 -0
- package/dist/input.js +1101 -0
- package/dist/input.js.map +1 -0
- package/dist/input.mjs +32 -0
- package/dist/input.mjs.map +1 -0
- package/dist/jsonEditor.d.mts +13 -0
- package/dist/jsonEditor.d.ts +13 -0
- package/dist/jsonEditor.js +247 -0
- package/dist/jsonEditor.js.map +1 -0
- package/dist/jsonEditor.mjs +9 -0
- package/dist/jsonEditor.mjs.map +1 -0
- package/dist/list.d.mts +83 -0
- package/dist/list.d.ts +83 -0
- package/dist/list.js +564 -0
- package/dist/list.js.map +1 -0
- package/dist/list.mjs +39 -0
- package/dist/list.mjs.map +1 -0
- package/dist/loading.d.mts +48 -0
- package/dist/loading.d.ts +48 -0
- package/dist/loading.js +383 -0
- package/dist/loading.js.map +1 -0
- package/dist/loading.mjs +23 -0
- package/dist/loading.mjs.map +1 -0
- package/dist/markdown.d.mts +14 -0
- package/dist/markdown.d.ts +14 -0
- package/dist/markdown.js +25927 -0
- package/dist/markdown.js.map +1 -0
- package/dist/markdown.mjs +25623 -0
- package/dist/markdown.mjs.map +1 -0
- package/dist/menu.d.mts +368 -0
- package/dist/menu.d.ts +368 -0
- package/dist/menu.js +1571 -0
- package/dist/menu.js.map +1 -0
- package/dist/menu.mjs +43 -0
- package/dist/menu.mjs.map +1 -0
- package/dist/modal.d.mts +90 -0
- package/dist/modal.d.ts +90 -0
- package/dist/modal.js +883 -0
- package/dist/modal.js.map +1 -0
- package/dist/modal.mjs +25 -0
- package/dist/modal.mjs.map +1 -0
- package/dist/overlay.d.mts +2 -0
- package/dist/overlay.d.ts +2 -0
- package/dist/overlay.js +46 -0
- package/dist/overlay.js.map +1 -0
- package/dist/overlay.mjs +10 -0
- package/dist/overlay.mjs.map +1 -0
- package/dist/paper.d.mts +38 -0
- package/dist/paper.d.ts +38 -0
- package/dist/paper.js +90 -0
- package/dist/paper.js.map +1 -0
- package/dist/paper.mjs +12 -0
- package/dist/paper.mjs.map +1 -0
- package/dist/patterns.d.mts +133 -0
- package/dist/patterns.d.ts +133 -0
- package/dist/patterns.js +483 -0
- package/dist/patterns.js.map +1 -0
- package/dist/patterns.mjs +46 -0
- package/dist/patterns.mjs.map +1 -0
- package/dist/process.d.mts +125 -0
- package/dist/process.d.ts +125 -0
- package/dist/process.js +1471 -0
- package/dist/process.js.map +1 -0
- package/dist/process.mjs +30 -0
- package/dist/process.mjs.map +1 -0
- package/dist/progress.d.mts +44 -0
- package/dist/progress.d.ts +44 -0
- package/dist/progress.js +94 -0
- package/dist/progress.js.map +1 -0
- package/dist/progress.mjs +14 -0
- package/dist/progress.mjs.map +1 -0
- package/dist/resizablePanel.d.mts +297 -0
- package/dist/resizablePanel.d.ts +297 -0
- package/dist/resizablePanel.js +122 -0
- package/dist/resizablePanel.js.map +1 -0
- package/dist/resizablePanel.mjs +22 -0
- package/dist/resizablePanel.mjs.map +1 -0
- package/dist/scrollToLoad.d.mts +41 -0
- package/dist/scrollToLoad.d.ts +41 -0
- package/dist/scrollToLoad.js +256 -0
- package/dist/scrollToLoad.js.map +1 -0
- package/dist/scrollToLoad.mjs +16 -0
- package/dist/scrollToLoad.mjs.map +1 -0
- package/dist/select.d.mts +50 -0
- package/dist/select.d.ts +50 -0
- package/dist/select.js +426 -0
- package/dist/select.js.map +1 -0
- package/dist/select.mjs +24 -0
- package/dist/select.mjs.map +1 -0
- package/dist/skeleton.d.mts +13 -0
- package/dist/skeleton.d.ts +13 -0
- package/dist/skeleton.js +68 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/skeleton.mjs +11 -0
- package/dist/skeleton.mjs.map +1 -0
- package/dist/slider.d.mts +65 -0
- package/dist/slider.d.ts +65 -0
- package/dist/slider.js +106 -0
- package/dist/slider.js.map +1 -0
- package/dist/slider.mjs +10 -0
- package/dist/slider.mjs.map +1 -0
- package/dist/stepper.d.mts +98 -0
- package/dist/stepper.d.ts +98 -0
- package/dist/stepper.js +313 -0
- package/dist/stepper.js.map +1 -0
- package/dist/stepper.mjs +38 -0
- package/dist/stepper.mjs.map +1 -0
- package/dist/switch.d.mts +151 -0
- package/dist/switch.d.ts +151 -0
- package/dist/switch.js +289 -0
- package/dist/switch.js.map +1 -0
- package/dist/switch.mjs +17 -0
- package/dist/switch.mjs.map +1 -0
- package/dist/tab.d.mts +182 -0
- package/dist/tab.d.ts +182 -0
- package/dist/tab.js +1418 -0
- package/dist/tab.js.map +1 -0
- package/dist/tab.mjs +34 -0
- package/dist/tab.mjs.map +1 -0
- package/dist/table.d.mts +720 -0
- package/dist/table.d.ts +720 -0
- package/dist/table.js +10882 -0
- package/dist/table.js.map +1 -0
- package/dist/table.mjs +63 -0
- package/dist/table.mjs.map +1 -0
- package/dist/theme.d.mts +30 -4
- package/dist/theme.d.ts +30 -4
- package/dist/theme.js +3210 -170
- package/dist/theme.js.map +1 -1
- package/dist/theme.mjs +52 -230
- package/dist/theme.mjs.map +1 -1
- package/dist/timeline.d.mts +30 -0
- package/dist/timeline.d.ts +30 -0
- package/dist/timeline.js +273 -0
- package/dist/timeline.js.map +1 -0
- package/dist/timeline.mjs +14 -0
- package/dist/timeline.mjs.map +1 -0
- package/dist/toggleButtonGroup.d.mts +125 -0
- package/dist/toggleButtonGroup.d.ts +125 -0
- package/dist/toggleButtonGroup.js +190 -0
- package/dist/toggleButtonGroup.js.map +1 -0
- package/dist/toggleButtonGroup.mjs +15 -0
- package/dist/toggleButtonGroup.mjs.map +1 -0
- package/dist/tooltip.d.mts +13 -0
- package/dist/tooltip.d.ts +13 -0
- package/dist/tooltip.js +56 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/tooltip.mjs +10 -0
- package/dist/tooltip.mjs.map +1 -0
- package/dist/typography.d.mts +21 -23
- package/dist/typography.d.ts +21 -23
- package/dist/typography.js +37 -63
- package/dist/typography.js.map +1 -1
- package/dist/typography.mjs +2 -1
- package/dist/useForm.d.mts +588 -0
- package/dist/useForm.d.ts +588 -0
- package/dist/useForm.js +8743 -0
- package/dist/useForm.js.map +1 -0
- package/dist/useForm.mjs +45 -0
- package/dist/useForm.mjs.map +1 -0
- package/dist/useSearch.d.mts +126 -0
- package/dist/useSearch.d.ts +126 -0
- package/dist/useSearch.js +1125 -0
- package/dist/useSearch.js.map +1 -0
- package/dist/useSearch.mjs +42 -0
- package/dist/useSearch.mjs.map +1 -0
- package/dist/variablesRenderer.d.mts +45 -0
- package/dist/variablesRenderer.d.ts +45 -0
- package/dist/variablesRenderer.js +511 -0
- package/dist/variablesRenderer.js.map +1 -0
- package/dist/variablesRenderer.mjs +21 -0
- package/dist/variablesRenderer.mjs.map +1 -0
- package/package.json +109 -15
- package/dist/chunk-PKADXEAD.mjs +0 -116
- package/dist/chunk-PKADXEAD.mjs.map +0 -1
- package/dist/chunk-YGBJCPUS.mjs +0 -88
- package/dist/chunk-YGBJCPUS.mjs.map +0 -1
- package/dist/theme.css +0 -44
- package/dist/theme.css.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# @startdownnotez404/ui
|
|
2
|
+
|
|
3
|
+
React + TypeScript component library for Startdown apps. Built on **MUI v7**, documented in Storybook, published to GitHub Packages.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
The package is on GitHub Packages, not the public npm registry. Point `@startdownnotez404` at `https://npm.pkg.github.com` (`.npmrc` or `publishConfig`) and install a published semver:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@startdownnotez404/ui": "^1.3.1"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Do not consume unpublished builds via local `npm pack`, `file:../…tgz`, or `npm link`.
|
|
18
|
+
|
|
19
|
+
### GitHub Release `.tgz` (WebContainer hosts)
|
|
20
|
+
|
|
21
|
+
A push to `main` that bumps `package.json` `version` (or `workflow_dispatch` when Release `v$version` is missing) builds the package, creates GitHub Release **`v$version`**, uploads `startdownnotez404-ui-$version.tgz`, and publishes the same tarball to GitHub Packages. WebContainer cannot reliably fetch `npm.pkg.github.com` or Release URLs; the **host** should download that Release asset and rewrite the dependency to `file:./startdownnotez404-ui-$version.tgz`.
|
|
22
|
+
|
|
23
|
+
### Peer dependencies
|
|
24
|
+
|
|
25
|
+
Keep these in the host app (they are also listed in this package's `dependencies` for 1.x so existing installs keep working):
|
|
26
|
+
|
|
27
|
+
- `react` / `react-dom`
|
|
28
|
+
- `@mui/material` / `@mui/icons-material` / `@mui/lab`
|
|
29
|
+
- `@emotion/react` / `@emotion/styled`
|
|
30
|
+
- `react-hook-form`
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
Wrap the tree with `ThemeProvider` and import CSS if the host does not already load MUI baseline styles:
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
import { ThemeProvider, Button, UseForm, FIELD_TYPEs } from '@startdownnotez404/ui';
|
|
38
|
+
import type { StrictFormConfig } from '@startdownnotez404/ui';
|
|
39
|
+
|
|
40
|
+
export function App() {
|
|
41
|
+
return (
|
|
42
|
+
<ThemeProvider>
|
|
43
|
+
<Button>Hello</Button>
|
|
44
|
+
</ThemeProvider>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Subpath imports exist for tree-shaking heavy modules, for example `@startdownnotez404/ui/button`, `@startdownnotez404/ui/useForm`, `@startdownnotez404/ui/chart`. `@startdownnotez404/ui/table` is the compound data table (TanStack grid — not MUI table primitives). Overlay helpers are `@startdownnotez404/ui/overlay` (`Popper`, `ClickAwayListener`).
|
|
50
|
+
|
|
51
|
+
Highlighter and layout widgets are **subpath-only**. They are not re-exported from `@startdownnotez404/ui` so Author / WebContainer apps that only need `Button` / `MuiModal` do not evaluate `highlight.js`, `html-react-parser`, `elkjs`, or CodeMirror:
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
import { Markdown } from '@startdownnotez404/ui/markdown';
|
|
55
|
+
import { FlowMap } from '@startdownnotez404/ui/flowMap';
|
|
56
|
+
import { JsonEditor } from '@startdownnotez404/ui/jsonEditor';
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Table: compound grid vs MUI markup
|
|
60
|
+
|
|
61
|
+
Import `Table` from `@startdownnotez404/ui` or `@startdownnotez404/ui/table` for the interactive data grid (filters, grouping, forms, `TableEmptyState`).
|
|
62
|
+
|
|
63
|
+
Do **not** expect MUI `TableHead` / `TableRow` / `TableCell` on the public root barrel. Those primitives live at the internal `@/ele/Table` alias and are kept off the published `Table` export so the names do not collide. Simple journal tables in a host app should import from `@mui/material/Table` (and friends) until they need the compound grid.
|
|
64
|
+
|
|
65
|
+
### Chart
|
|
66
|
+
|
|
67
|
+
Stacked-area (default), line, bar, and pie charts with hover tooltips. The host owns domain math (cumulative totals, currency, “today” markers). Colors are `--chart-*` tokens (series defaults are `color-mix` of hue tokens with scheme chrome); `sx` merges after the defaults:
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
import { Chart } from '@startdownnotez404/ui';
|
|
71
|
+
|
|
72
|
+
<Chart
|
|
73
|
+
type="bar"
|
|
74
|
+
labels={['Mon', 'Tue', 'Wed']}
|
|
75
|
+
series={[{ id: 'a', label: 'Alpha', values: [1, 3, 2] }]}
|
|
76
|
+
formatY={(value) => String(value)}
|
|
77
|
+
sx={{ '--chart-series-0': 'color-mix(in lab, var(--mui-palette-warning-main) 60%, var(--mui-palette-primary-main))' }}
|
|
78
|
+
/>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`type="area"` (default) draws a stacked area with a dotted top stroke. `type="pie"` uses each series as a slice (`hole={0.58}` for a donut). `stacked` groups bars into a stack.
|
|
82
|
+
|
|
83
|
+
Forms use `useConfiguredForm` (deprecated alias: `useForm2`):
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
import { useConfiguredForm, UseForm, FIELD_TYPEs } from '@startdownnotez404/ui';
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
JSON form fields still work through `UseForm`; the CodeMirror editor is loaded only when a json field renders. Direct `JsonEditor` usage must import `@startdownnotez404/ui/jsonEditor`.
|
|
90
|
+
|
|
91
|
+
## Develop
|
|
92
|
+
|
|
93
|
+
```sh
|
|
94
|
+
npm ci
|
|
95
|
+
npm run storybook # http://localhost:6006
|
|
96
|
+
npm run lint
|
|
97
|
+
npm test
|
|
98
|
+
npm run build
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Storybook is the visual catalog. Vitest covers hook/state contracts for UseForm, UseSearch, ScrollToLoad, and Table.
|
|
102
|
+
|
|
103
|
+
## Releases
|
|
104
|
+
|
|
105
|
+
Bump `package.json` `version` on `main` (semver patch or minor). CI then:
|
|
106
|
+
|
|
107
|
+
1. Detects the version change versus the previous `main` commit (or a missing `v$version` Release, including `workflow_dispatch`).
|
|
108
|
+
2. Runs `npm ci`, `npm run build`, and `npm pack`.
|
|
109
|
+
3. Creates GitHub Release `v$version` and uploads `startdownnotez404-ui-$version.tgz`.
|
|
110
|
+
4. Publishes that tarball to GitHub Packages (`publishConfig` → `npm.pkg.github.com`). There is no npmjs publish.
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GitHubPicker
|
|
3
|
+
} from "./chunk-SGCUDWO3.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Option
|
|
6
|
+
} from "./chunk-OJV6V7YZ.mjs";
|
|
7
|
+
import {
|
|
8
|
+
FieldHelperText
|
|
9
|
+
} from "./chunk-MI64T62E.mjs";
|
|
10
|
+
import {
|
|
11
|
+
Explanation_default,
|
|
12
|
+
getFieldExplanation,
|
|
13
|
+
mergeFieldSx
|
|
14
|
+
} from "./chunk-UTVSYS6S.mjs";
|
|
15
|
+
import {
|
|
16
|
+
MuiFormLabel,
|
|
17
|
+
default as default3
|
|
18
|
+
} from "./chunk-T4X375IG.mjs";
|
|
19
|
+
import "./chunk-56TI2ZBT.mjs";
|
|
20
|
+
import "./chunk-MDAUF7IL.mjs";
|
|
21
|
+
import "./chunk-QFF3HTHL.mjs";
|
|
22
|
+
import "./chunk-JIU5GVM7.mjs";
|
|
23
|
+
import "./chunk-4Q54P737.mjs";
|
|
24
|
+
import "./chunk-OP6LKXPA.mjs";
|
|
25
|
+
import "./chunk-ZVFYOXDE.mjs";
|
|
26
|
+
import "./chunk-4RPFRNXG.mjs";
|
|
27
|
+
import {
|
|
28
|
+
default as default2
|
|
29
|
+
} from "./chunk-S6EZVRZC.mjs";
|
|
30
|
+
import "./chunk-FJ6ZGZIA.mjs";
|
|
31
|
+
|
|
32
|
+
// src/components/compound/UseForm/src/Fields/AutocompleteField.tsx
|
|
33
|
+
import React from "react";
|
|
34
|
+
import { Controller, useFormContext } from "react-hook-form";
|
|
35
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
36
|
+
var EMPTY_OPTIONS = [];
|
|
37
|
+
function toOptionClass(option) {
|
|
38
|
+
return option instanceof Option ? option : new Option(option);
|
|
39
|
+
}
|
|
40
|
+
var AutocompleteField = ({ field }) => {
|
|
41
|
+
const acSlot = field.slotProps;
|
|
42
|
+
if (acSlot?.useOptions) {
|
|
43
|
+
return /* @__PURE__ */ jsx(AutocompleteFieldWithOptions, { field, useOptions: acSlot.useOptions });
|
|
44
|
+
}
|
|
45
|
+
return /* @__PURE__ */ jsx(AutocompleteFieldView, { field, options: acSlot?.options ?? EMPTY_OPTIONS });
|
|
46
|
+
};
|
|
47
|
+
var AutocompleteFieldWithOptions = ({
|
|
48
|
+
field,
|
|
49
|
+
useOptions
|
|
50
|
+
}) => {
|
|
51
|
+
const { options = EMPTY_OPTIONS } = useOptions();
|
|
52
|
+
return /* @__PURE__ */ jsx(AutocompleteFieldView, { field, options });
|
|
53
|
+
};
|
|
54
|
+
var AutocompleteFieldView = ({
|
|
55
|
+
field,
|
|
56
|
+
options
|
|
57
|
+
}) => {
|
|
58
|
+
const { control, getValues } = useFormContext();
|
|
59
|
+
const {
|
|
60
|
+
name,
|
|
61
|
+
label,
|
|
62
|
+
required,
|
|
63
|
+
disabled,
|
|
64
|
+
sx,
|
|
65
|
+
size,
|
|
66
|
+
slotProps,
|
|
67
|
+
errorMsg,
|
|
68
|
+
defaultValue
|
|
69
|
+
} = field;
|
|
70
|
+
const acSlot = slotProps;
|
|
71
|
+
const mergedOptions = React.useMemo(
|
|
72
|
+
() => options.map(toOptionClass),
|
|
73
|
+
[options]
|
|
74
|
+
);
|
|
75
|
+
return /* @__PURE__ */ jsx(
|
|
76
|
+
Controller,
|
|
77
|
+
{
|
|
78
|
+
control,
|
|
79
|
+
name,
|
|
80
|
+
defaultValue,
|
|
81
|
+
render: ({ field: { onChange: controllerOnChange, value }, fieldState: { error } }) => /* @__PURE__ */ jsx(
|
|
82
|
+
AutocompletePicker,
|
|
83
|
+
{
|
|
84
|
+
value,
|
|
85
|
+
controllerOnChange,
|
|
86
|
+
mergedOptions,
|
|
87
|
+
acSlot,
|
|
88
|
+
disabled,
|
|
89
|
+
required,
|
|
90
|
+
error,
|
|
91
|
+
errorMsg,
|
|
92
|
+
helperText: field.helperText,
|
|
93
|
+
label,
|
|
94
|
+
size,
|
|
95
|
+
sx,
|
|
96
|
+
explanation: getFieldExplanation(field),
|
|
97
|
+
onFieldChange: (next) => {
|
|
98
|
+
field.onChange?.(next, getValues());
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
};
|
|
105
|
+
function AutocompletePicker({
|
|
106
|
+
value,
|
|
107
|
+
controllerOnChange,
|
|
108
|
+
mergedOptions,
|
|
109
|
+
acSlot,
|
|
110
|
+
disabled,
|
|
111
|
+
required,
|
|
112
|
+
error,
|
|
113
|
+
errorMsg,
|
|
114
|
+
helperText,
|
|
115
|
+
label,
|
|
116
|
+
size,
|
|
117
|
+
sx,
|
|
118
|
+
explanation,
|
|
119
|
+
onFieldChange
|
|
120
|
+
}) {
|
|
121
|
+
const [selectedIds, setSelectedIds] = React.useState(
|
|
122
|
+
Array.isArray(value) ? value : value ? [value] : []
|
|
123
|
+
);
|
|
124
|
+
React.useEffect(() => {
|
|
125
|
+
const next = Array.isArray(value) ? value : value ? [value] : [];
|
|
126
|
+
setSelectedIds(next);
|
|
127
|
+
}, [value]);
|
|
128
|
+
return /* @__PURE__ */ jsxs(
|
|
129
|
+
default3,
|
|
130
|
+
{
|
|
131
|
+
disabled,
|
|
132
|
+
required,
|
|
133
|
+
error: !!error,
|
|
134
|
+
fullWidth: true,
|
|
135
|
+
size: "small",
|
|
136
|
+
sx: mergeFieldSx(size, sx),
|
|
137
|
+
children: [
|
|
138
|
+
/* @__PURE__ */ jsxs(default2, { sx: { display: "flex", alignItems: "center", justifyContent: "flex-start" }, children: [
|
|
139
|
+
/* @__PURE__ */ jsx(MuiFormLabel, { component: "legend", children: label }),
|
|
140
|
+
/* @__PURE__ */ jsx(Explanation_default, { explanation })
|
|
141
|
+
] }),
|
|
142
|
+
/* @__PURE__ */ jsx(default2, { sx: { py: 1 }, children: /* @__PURE__ */ jsx(
|
|
143
|
+
GitHubPicker,
|
|
144
|
+
{
|
|
145
|
+
options: mergedOptions,
|
|
146
|
+
variant: acSlot?.variant,
|
|
147
|
+
color: acSlot?.color,
|
|
148
|
+
multiple: acSlot?.multiple ?? true,
|
|
149
|
+
selectedIdProps: [selectedIds, setSelectedIds],
|
|
150
|
+
onChange: (ids) => {
|
|
151
|
+
if (acSlot?.multiple) {
|
|
152
|
+
controllerOnChange(ids);
|
|
153
|
+
onFieldChange(ids);
|
|
154
|
+
} else {
|
|
155
|
+
const single = Array.isArray(ids) ? ids[0] ?? "" : ids ?? "";
|
|
156
|
+
controllerOnChange(single);
|
|
157
|
+
onFieldChange(single);
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
onDelete: (id) => {
|
|
161
|
+
const next = (selectedIds || []).filter((s) => s !== id);
|
|
162
|
+
if (acSlot?.multiple ?? true) {
|
|
163
|
+
controllerOnChange(next);
|
|
164
|
+
onFieldChange(next);
|
|
165
|
+
} else {
|
|
166
|
+
controllerOnChange("");
|
|
167
|
+
onFieldChange("");
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
error: !!error
|
|
171
|
+
}
|
|
172
|
+
) }),
|
|
173
|
+
/* @__PURE__ */ jsx(FieldHelperText, { error, errorMsg, helpers: [helperText] })
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
export {
|
|
179
|
+
AutocompleteField
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=AutocompleteField-ZKNU2IRR.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/compound/UseForm/src/Fields/AutocompleteField.tsx"],"sourcesContent":["import React from 'react';\nimport { Controller, useFormContext, type FieldError } from 'react-hook-form';\nimport { Box } from '@/ele/Box';\nimport { FormLabel, FormControl } from '@/ele/Form';\nimport { FieldHelperText } from '../_utils/helperText';\nimport { GitHubPicker, OptionClass, type OptionParams } from '@/ele/Autocomplete';\nimport { FieldConfig, FormTypeMap, InferFormDataType } from '../_utils';\nimport { getFieldExplanation, mergeFieldSx } from '../_utils/helpers';\nimport Explanation from './Explanation';\nimport { FIELD_TYPEs } from '../_utils/constants';\nimport type { AutocompleteSlotProps } from '../_utils/slotProps';\n\ninterface AutocompleteFieldProps<T extends FormTypeMap = FormTypeMap> {\n field: Extract<FieldConfig<T>, { type: typeof FIELD_TYPEs.autocomplete }>;\n}\n\ntype AutocompleteUseOptions = NonNullable<AutocompleteSlotProps['useOptions']>;\n\nconst EMPTY_OPTIONS: OptionParams[] = [];\n\nfunction toOptionClass(option: OptionParams | OptionClass): OptionClass {\n return option instanceof OptionClass ? option : new OptionClass(option as OptionParams);\n}\n\nexport const AutocompleteField = <T extends FormTypeMap = FormTypeMap>({ field }: AutocompleteFieldProps<T>) => {\n const acSlot = field.slotProps as AutocompleteSlotProps | undefined;\n if (acSlot?.useOptions) {\n return <AutocompleteFieldWithOptions field={field} useOptions={acSlot.useOptions} />;\n }\n return <AutocompleteFieldView field={field} options={acSlot?.options ?? EMPTY_OPTIONS} />;\n};\n\nconst AutocompleteFieldWithOptions = <T extends FormTypeMap>({\n field,\n useOptions,\n}: AutocompleteFieldProps<T> & { useOptions: AutocompleteUseOptions }) => {\n const { options = EMPTY_OPTIONS } = useOptions();\n return <AutocompleteFieldView field={field} options={options} />;\n};\n\nconst AutocompleteFieldView = <T extends FormTypeMap>({\n field,\n options,\n}: AutocompleteFieldProps<T> & { options: OptionParams[] }) => {\n const { control, getValues } = useFormContext();\n const {\n name,\n label,\n required,\n disabled,\n sx,\n size,\n slotProps,\n errorMsg,\n defaultValue,\n } = field;\n\n const acSlot = slotProps as AutocompleteSlotProps | undefined;\n const mergedOptions = React.useMemo(\n () => options.map(toOptionClass),\n [options],\n );\n\n return (\n <Controller\n control={control}\n name={name}\n defaultValue={defaultValue}\n render={({ field: { onChange: controllerOnChange, value }, fieldState: { error } }) => (\n <AutocompletePicker\n value={value}\n controllerOnChange={controllerOnChange}\n mergedOptions={mergedOptions}\n acSlot={acSlot}\n disabled={disabled}\n required={required}\n error={error}\n errorMsg={errorMsg}\n helperText={field.helperText}\n label={label}\n size={size}\n sx={sx}\n explanation={getFieldExplanation(field)}\n onFieldChange={(next) => {\n field.onChange?.(next, getValues() as InferFormDataType<T>);\n }}\n />\n )}\n />\n );\n};\n\ntype AutocompletePickerProps = {\n value: unknown;\n controllerOnChange: (value: unknown) => void;\n mergedOptions: OptionClass[];\n acSlot: AutocompleteSlotProps | undefined;\n disabled?: boolean;\n required?: boolean;\n error: FieldError | undefined;\n errorMsg?: string;\n helperText?: string;\n label?: string;\n size?: { width?: number | string; height?: number | string };\n sx?: Record<string, unknown>;\n explanation?: React.ComponentProps<typeof Explanation>['explanation'];\n onFieldChange: (next: unknown) => void;\n};\n\nfunction AutocompletePicker({\n value,\n controllerOnChange,\n mergedOptions,\n acSlot,\n disabled,\n required,\n error,\n errorMsg,\n helperText,\n label,\n size,\n sx,\n explanation,\n onFieldChange,\n}: AutocompletePickerProps) {\n const [selectedIds, setSelectedIds] = React.useState<string[]>(\n Array.isArray(value) ? value : (value ? [value as string] : []),\n );\n\n React.useEffect(() => {\n const next = Array.isArray(value) ? value : (value ? [value as string] : []);\n setSelectedIds(next as string[]);\n }, [value]);\n\n return (\n <FormControl\n disabled={disabled}\n required={required}\n error={!!error}\n fullWidth\n size=\"small\"\n sx={mergeFieldSx(size, sx)}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'flex-start' }}>\n <FormLabel component=\"legend\">{label}</FormLabel>\n <Explanation explanation={explanation} />\n </Box>\n <Box sx={{ py: 1 }}>\n <GitHubPicker\n options={mergedOptions}\n variant={acSlot?.variant}\n color={acSlot?.color}\n multiple={acSlot?.multiple ?? true}\n selectedIdProps={[selectedIds, setSelectedIds]}\n onChange={(ids) => {\n if (acSlot?.multiple) {\n controllerOnChange(ids);\n onFieldChange(ids);\n } else {\n const single = Array.isArray(ids) ? ids[0] ?? '' : ids ?? '';\n controllerOnChange(single);\n onFieldChange(single);\n }\n }}\n onDelete={(id: string) => {\n const next = (selectedIds || []).filter((s) => s !== id);\n if (acSlot?.multiple ?? true) {\n controllerOnChange(next);\n onFieldChange(next);\n } else {\n controllerOnChange('');\n onFieldChange('');\n }\n }}\n error={!!error}\n />\n </Box>\n <FieldHelperText error={error} errorMsg={errorMsg} helpers={[helperText]} />\n </FormControl>\n );\n}\n"],"mappings":"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","names":["default"]}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Cropper_default
|
|
3
|
+
} from "./chunk-RXBQ7KXF.mjs";
|
|
4
|
+
import {
|
|
5
|
+
AvatarButton
|
|
6
|
+
} from "./chunk-Y74ALKBL.mjs";
|
|
7
|
+
import "./chunk-27KYFU7R.mjs";
|
|
8
|
+
import {
|
|
9
|
+
FieldHelperText
|
|
10
|
+
} from "./chunk-MI64T62E.mjs";
|
|
11
|
+
import {
|
|
12
|
+
Explanation_default,
|
|
13
|
+
getFieldExplanation,
|
|
14
|
+
mergeFieldSx
|
|
15
|
+
} from "./chunk-UTVSYS6S.mjs";
|
|
16
|
+
import "./chunk-EW4DTFH3.mjs";
|
|
17
|
+
import {
|
|
18
|
+
MuiModal
|
|
19
|
+
} from "./chunk-UDREPVEY.mjs";
|
|
20
|
+
import {
|
|
21
|
+
CLASSNAMEs
|
|
22
|
+
} from "./chunk-CWFWRZWU.mjs";
|
|
23
|
+
import "./chunk-HR3A4H4E.mjs";
|
|
24
|
+
import "./chunk-TDRA5EZI.mjs";
|
|
25
|
+
import "./chunk-3DQINB57.mjs";
|
|
26
|
+
import "./chunk-BGB7JHIU.mjs";
|
|
27
|
+
import {
|
|
28
|
+
MuiFormLabel,
|
|
29
|
+
default as default5
|
|
30
|
+
} from "./chunk-T4X375IG.mjs";
|
|
31
|
+
import "./chunk-3VUAM2GY.mjs";
|
|
32
|
+
import "./chunk-56TI2ZBT.mjs";
|
|
33
|
+
import "./chunk-MDAUF7IL.mjs";
|
|
34
|
+
import "./chunk-UMJ5SCIQ.mjs";
|
|
35
|
+
import "./chunk-I5JWS4Z7.mjs";
|
|
36
|
+
import "./chunk-XIMFP6RB.mjs";
|
|
37
|
+
import {
|
|
38
|
+
PreviewableFile
|
|
39
|
+
} from "./chunk-AAH2O24U.mjs";
|
|
40
|
+
import "./chunk-JIU5GVM7.mjs";
|
|
41
|
+
import "./chunk-4Q54P737.mjs";
|
|
42
|
+
import "./chunk-OP6LKXPA.mjs";
|
|
43
|
+
import {
|
|
44
|
+
default79 as default4
|
|
45
|
+
} from "./chunk-ZVFYOXDE.mjs";
|
|
46
|
+
import "./chunk-4RPFRNXG.mjs";
|
|
47
|
+
import {
|
|
48
|
+
default as default2,
|
|
49
|
+
default2 as default3
|
|
50
|
+
} from "./chunk-S6EZVRZC.mjs";
|
|
51
|
+
import "./chunk-FJ6ZGZIA.mjs";
|
|
52
|
+
|
|
53
|
+
// src/components/compound/UseForm/src/Fields/AvatarField.tsx
|
|
54
|
+
import React from "react";
|
|
55
|
+
import { Controller, useFormContext, useWatch } from "react-hook-form";
|
|
56
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
57
|
+
var AVATAR_CROP_CONFIG = { width: 200, unit: "px" };
|
|
58
|
+
var AvatarCropPreview = React.forwardRef((_, ref) => {
|
|
59
|
+
return /* @__PURE__ */ jsx(
|
|
60
|
+
"canvas",
|
|
61
|
+
{
|
|
62
|
+
ref,
|
|
63
|
+
width: 200,
|
|
64
|
+
height: 200,
|
|
65
|
+
style: {
|
|
66
|
+
width: 200,
|
|
67
|
+
height: 200,
|
|
68
|
+
maxWidth: "100%",
|
|
69
|
+
maxHeight: "100%",
|
|
70
|
+
border: "1px dashed grey",
|
|
71
|
+
borderRadius: "50%",
|
|
72
|
+
objectFit: "contain",
|
|
73
|
+
backgroundColor: "transparent"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
AvatarCropPreview.displayName = "AvatarCropPreview";
|
|
79
|
+
function acceptToInputAccept(accept) {
|
|
80
|
+
if (!accept) return "image/*";
|
|
81
|
+
if (typeof accept === "string") return accept;
|
|
82
|
+
const parts = [];
|
|
83
|
+
Object.entries(accept).forEach(([mime, exts]) => {
|
|
84
|
+
parts.push(mime);
|
|
85
|
+
if (Array.isArray(exts)) parts.push(...exts);
|
|
86
|
+
});
|
|
87
|
+
return parts.length ? parts.join(",") : "image/*";
|
|
88
|
+
}
|
|
89
|
+
var AvatarField = ({ field }) => {
|
|
90
|
+
const watchKey = field.slotProps?.watchAvatarNameKey;
|
|
91
|
+
if (watchKey) {
|
|
92
|
+
return /* @__PURE__ */ jsx(AvatarFieldWithNameWatch, { field, watchKey });
|
|
93
|
+
}
|
|
94
|
+
return /* @__PURE__ */ jsx(AvatarFieldView, { field, watchedName: void 0 });
|
|
95
|
+
};
|
|
96
|
+
var AvatarFieldWithNameWatch = ({
|
|
97
|
+
field,
|
|
98
|
+
watchKey
|
|
99
|
+
}) => {
|
|
100
|
+
const { control } = useFormContext();
|
|
101
|
+
const watchedName = useWatch({
|
|
102
|
+
control,
|
|
103
|
+
name: watchKey
|
|
104
|
+
});
|
|
105
|
+
return /* @__PURE__ */ jsx(AvatarFieldView, { field, watchedName });
|
|
106
|
+
};
|
|
107
|
+
var AvatarFieldView = ({
|
|
108
|
+
field,
|
|
109
|
+
watchedName
|
|
110
|
+
}) => {
|
|
111
|
+
const { control, getValues, setValue } = useFormContext();
|
|
112
|
+
const {
|
|
113
|
+
name,
|
|
114
|
+
label,
|
|
115
|
+
required,
|
|
116
|
+
disabled,
|
|
117
|
+
sx,
|
|
118
|
+
size,
|
|
119
|
+
slotProps,
|
|
120
|
+
errorMsg,
|
|
121
|
+
defaultValue
|
|
122
|
+
} = field;
|
|
123
|
+
const avatarSlot = slotProps;
|
|
124
|
+
const [editorOpen, setEditorOpen] = React.useState(false);
|
|
125
|
+
const [editorFiles, setEditorFiles] = React.useState([]);
|
|
126
|
+
const initialFileRef = React.useRef(null);
|
|
127
|
+
const transientBlobUrlsRef = React.useRef([]);
|
|
128
|
+
const inputAccept = acceptToInputAccept(avatarSlot?.accept);
|
|
129
|
+
const backgroundIcon = (typeof avatarSlot?.useBackgroundIcon === "function" ? avatarSlot?.useBackgroundIcon() : null) || avatarSlot?.backgroundIcon;
|
|
130
|
+
const displayNameRaw = (avatarSlot?.watchAvatarNameKey ? watchedName : void 0) ?? avatarSlot?.avatarName ?? avatarSlot?.name ?? "";
|
|
131
|
+
const displayName = String(displayNameRaw ?? "").trim() || void 0;
|
|
132
|
+
return /* @__PURE__ */ jsx(
|
|
133
|
+
Controller,
|
|
134
|
+
{
|
|
135
|
+
control,
|
|
136
|
+
name,
|
|
137
|
+
defaultValue: defaultValue ?? null,
|
|
138
|
+
render: ({ field: { onChange, value }, fieldState: { error } }) => {
|
|
139
|
+
const fileValue = value ?? null;
|
|
140
|
+
const src = fileValue?.url || fileValue?.blobUrl || "";
|
|
141
|
+
const openEditor = () => {
|
|
142
|
+
initialFileRef.current = fileValue;
|
|
143
|
+
setEditorFiles(fileValue ? [fileValue] : []);
|
|
144
|
+
setEditorOpen(true);
|
|
145
|
+
};
|
|
146
|
+
const closeEditor = () => {
|
|
147
|
+
setEditorOpen(false);
|
|
148
|
+
const init = initialFileRef.current;
|
|
149
|
+
setEditorFiles(init ? [init] : []);
|
|
150
|
+
transientBlobUrlsRef.current.forEach((u) => {
|
|
151
|
+
try {
|
|
152
|
+
URL.revokeObjectURL(u);
|
|
153
|
+
} catch {
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
transientBlobUrlsRef.current = [];
|
|
157
|
+
};
|
|
158
|
+
const handleSave = async (url) => {
|
|
159
|
+
const next = url ? await new PreviewableFile({ url }).downloadFile() : null;
|
|
160
|
+
if (url) {
|
|
161
|
+
try {
|
|
162
|
+
URL.revokeObjectURL(url);
|
|
163
|
+
} catch {
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
onChange(next);
|
|
167
|
+
try {
|
|
168
|
+
setValue(String(name), next, { shouldDirty: true, shouldTouch: true });
|
|
169
|
+
} catch {
|
|
170
|
+
}
|
|
171
|
+
;
|
|
172
|
+
field.onChange?.(next, getValues());
|
|
173
|
+
initialFileRef.current = next;
|
|
174
|
+
setEditorFiles(next ? [next] : []);
|
|
175
|
+
setEditorOpen(false);
|
|
176
|
+
};
|
|
177
|
+
const onFileSelectFromSelector = (file) => {
|
|
178
|
+
if (!file) {
|
|
179
|
+
setEditorFiles([]);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const blobUrl = URL.createObjectURL(file);
|
|
183
|
+
transientBlobUrlsRef.current.push(blobUrl);
|
|
184
|
+
const next = new PreviewableFile({
|
|
185
|
+
path: file.name,
|
|
186
|
+
blobUrl,
|
|
187
|
+
filename: file.name,
|
|
188
|
+
mimeType: file.type,
|
|
189
|
+
size: file.size,
|
|
190
|
+
fileType: file.type.startsWith("image/") ? "image" : "other"
|
|
191
|
+
});
|
|
192
|
+
setEditorFiles([next]);
|
|
193
|
+
};
|
|
194
|
+
return /* @__PURE__ */ jsxs(
|
|
195
|
+
default5,
|
|
196
|
+
{
|
|
197
|
+
className: CLASSNAMEs.compound.useForm.avatarField,
|
|
198
|
+
disabled,
|
|
199
|
+
required,
|
|
200
|
+
error: !!error,
|
|
201
|
+
fullWidth: true,
|
|
202
|
+
size: "small",
|
|
203
|
+
sx: mergeFieldSx(size, sx),
|
|
204
|
+
children: [
|
|
205
|
+
/* @__PURE__ */ jsxs(default3, { direction: "column", alignItems: "center", justifyContent: "center", gap: 0.5, children: [
|
|
206
|
+
/* @__PURE__ */ jsxs(default2, { sx: { display: "flex", alignItems: "center", gap: 1, mb: 1 }, children: [
|
|
207
|
+
/* @__PURE__ */ jsx(MuiFormLabel, { component: "legend", children: label }),
|
|
208
|
+
/* @__PURE__ */ jsx(Explanation_default, { explanation: getFieldExplanation(field) })
|
|
209
|
+
] }),
|
|
210
|
+
/* @__PURE__ */ jsx(default2, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: /* @__PURE__ */ jsx(default2, { sx: { cursor: disabled ? "not-allowed" : "pointer" }, children: /* @__PURE__ */ jsx(
|
|
211
|
+
AvatarButton,
|
|
212
|
+
{
|
|
213
|
+
onClick: disabled ? void 0 : openEditor,
|
|
214
|
+
size: avatarSlot?.size,
|
|
215
|
+
dim: avatarSlot?.dim,
|
|
216
|
+
name: displayName,
|
|
217
|
+
src,
|
|
218
|
+
backgroundIcon: src ? void 0 : backgroundIcon,
|
|
219
|
+
icon: /* @__PURE__ */ jsx(default4, { fontSize: "small" }),
|
|
220
|
+
"aria-label": label || "Avatar"
|
|
221
|
+
}
|
|
222
|
+
) }) }),
|
|
223
|
+
/* @__PURE__ */ jsx(FieldHelperText, { error, errorMsg, helpers: [field.helperText] })
|
|
224
|
+
] }),
|
|
225
|
+
editorOpen ? /* @__PURE__ */ jsx(
|
|
226
|
+
MuiModal,
|
|
227
|
+
{
|
|
228
|
+
className: CLASSNAMEs.elemental.modal,
|
|
229
|
+
openProps: [editorOpen, setEditorOpen],
|
|
230
|
+
onClose: closeEditor,
|
|
231
|
+
title: label || "Avatar",
|
|
232
|
+
size: { w: "70vw", h: "80vh" },
|
|
233
|
+
children: /* @__PURE__ */ jsx(
|
|
234
|
+
default2,
|
|
235
|
+
{
|
|
236
|
+
sx: {
|
|
237
|
+
display: "flex",
|
|
238
|
+
flexDirection: "column",
|
|
239
|
+
height: "100%",
|
|
240
|
+
gap: 2,
|
|
241
|
+
overflow: "hidden"
|
|
242
|
+
},
|
|
243
|
+
children: /* @__PURE__ */ jsx(default2, { sx: { flex: "1 1 auto", minHeight: 0 }, children: /* @__PURE__ */ jsx(
|
|
244
|
+
Cropper_default,
|
|
245
|
+
{
|
|
246
|
+
setImgNull: () => setEditorFiles([]),
|
|
247
|
+
blobUrl: editorFiles?.[0]?.blobUrl || "",
|
|
248
|
+
onSave: handleSave,
|
|
249
|
+
onClear: () => handleSave(""),
|
|
250
|
+
circularCrop: true,
|
|
251
|
+
defaultRatio: 1,
|
|
252
|
+
resizeCropEnabled: true,
|
|
253
|
+
cropConfig: AVATAR_CROP_CONFIG,
|
|
254
|
+
PreviewRenderer: AvatarCropPreview,
|
|
255
|
+
showFileSelector: true,
|
|
256
|
+
fileSelectorAccept: inputAccept,
|
|
257
|
+
fileSelectorButtonLabel: "Select Image",
|
|
258
|
+
onFileSelect: onFileSelectFromSelector
|
|
259
|
+
}
|
|
260
|
+
) })
|
|
261
|
+
}
|
|
262
|
+
)
|
|
263
|
+
}
|
|
264
|
+
) : null
|
|
265
|
+
]
|
|
266
|
+
}
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
);
|
|
271
|
+
};
|
|
272
|
+
export {
|
|
273
|
+
AvatarField
|
|
274
|
+
};
|
|
275
|
+
//# sourceMappingURL=AvatarField-SAODT3CZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/compound/UseForm/src/Fields/AvatarField.tsx"],"sourcesContent":["import React from 'react';\nimport { Controller, useFormContext, useWatch } from 'react-hook-form';\nimport { Box, Stack } from '@/ele/Box';\nimport { FormControl, FormLabel } from '@/ele/Form';\nimport { EditIcon } from '@/icons/MuiIcon';\n\nimport { FieldHelperText } from '../_utils/helperText';\nimport { AvatarButton } from '@/ele/Avatar';\nimport { MuiModal } from '@/ele/Modal';\nimport { Cropper } from '@/ele/Image';\n\nimport PreviewableFile from '@/_utils/classes/PreviewableFile';\nimport { FieldConfig, FormTypeMap, InferFormDataType } from '../_utils';\nimport { FIELD_TYPEs } from '../_utils/constants';\nimport type { AvatarSlotProps } from '../_utils/slotProps';\nimport Explanation from './Explanation';\nimport { CLASSNAMEs } from '@/_utils/_const/classNames';\nimport { getFieldExplanation, mergeFieldSx } from '../_utils/helpers';\n\ninterface AvatarFieldProps<T extends FormTypeMap = FormTypeMap> {\n field: Extract<FieldConfig<T>, { type: typeof FIELD_TYPEs.avatar }>;\n}\n\nconst AVATAR_CROP_CONFIG = { width: 200, unit: 'px' } as const;\n\nconst AvatarCropPreview = React.forwardRef<HTMLCanvasElement>((_, ref) => {\n return (\n <canvas\n ref={ref}\n width={200}\n height={200}\n style={{\n width: 200,\n height: 200,\n maxWidth: '100%',\n maxHeight: '100%',\n border: '1px dashed grey',\n borderRadius: '50%',\n objectFit: 'contain',\n backgroundColor: 'transparent',\n }}\n />\n );\n});\n\nAvatarCropPreview.displayName = 'AvatarCropPreview';\n\nfunction acceptToInputAccept(accept: AvatarSlotProps['accept']): string {\n if (!accept) return 'image/*';\n if (typeof accept === 'string') return accept;\n\n const parts: string[] = [];\n Object.entries(accept).forEach(([mime, exts]) => {\n parts.push(mime);\n if (Array.isArray(exts)) parts.push(...exts);\n });\n return parts.length ? parts.join(',') : 'image/*';\n}\n\nexport const AvatarField = <T extends FormTypeMap = FormTypeMap>({ field }: AvatarFieldProps<T>) => {\n const watchKey = (field.slotProps as AvatarSlotProps | undefined)?.watchAvatarNameKey;\n if (watchKey) {\n return <AvatarFieldWithNameWatch field={field} watchKey={watchKey} />;\n }\n return <AvatarFieldView field={field} watchedName={undefined} />;\n};\n\nconst AvatarFieldWithNameWatch = <T extends FormTypeMap>({\n field,\n watchKey,\n}: AvatarFieldProps<T> & { watchKey: string }) => {\n const { control } = useFormContext();\n const watchedName = useWatch({\n control,\n name: watchKey as never,\n });\n return <AvatarFieldView field={field} watchedName={watchedName} />;\n};\n\nconst AvatarFieldView = <T extends FormTypeMap>({\n field,\n watchedName,\n}: AvatarFieldProps<T> & { watchedName: unknown }) => {\n const { control, getValues, setValue } = useFormContext();\n\n const {\n name,\n label,\n required,\n disabled,\n sx,\n size,\n slotProps,\n errorMsg,\n defaultValue,\n } = field;\n\n const avatarSlot = slotProps as AvatarSlotProps | undefined;\n const [editorOpen, setEditorOpen] = React.useState(false);\n const [editorFiles, setEditorFiles] = React.useState<PreviewableFile[]>([]);\n const initialFileRef = React.useRef<PreviewableFile | null>(null);\n const transientBlobUrlsRef = React.useRef<string[]>([]);\n\n const inputAccept = acceptToInputAccept(avatarSlot?.accept);\n const backgroundIcon = (typeof avatarSlot?.useBackgroundIcon === 'function'\n ? avatarSlot?.useBackgroundIcon()\n : null) || avatarSlot?.backgroundIcon;\n\n const displayNameRaw =\n (avatarSlot?.watchAvatarNameKey ? watchedName : undefined) ??\n avatarSlot?.avatarName ??\n avatarSlot?.name ??\n '';\n const displayName = String(displayNameRaw ?? '').trim() || undefined;\n\n return (\n <Controller\n control={control}\n name={name}\n defaultValue={(defaultValue ?? null) as PreviewableFile | null}\n render={({ field: { onChange, value }, fieldState: { error } }) => {\n const fileValue = (value ?? null) as PreviewableFile | null;\n const src = fileValue?.url || fileValue?.blobUrl || '';\n\n // unified helper text component\n // use FieldHelperText to render slot or validation messages consistently\n\n const openEditor = () => {\n initialFileRef.current = fileValue;\n setEditorFiles(fileValue ? [fileValue] : []);\n setEditorOpen(true);\n };\n\n const closeEditor = () => {\n setEditorOpen(false);\n const init = initialFileRef.current;\n setEditorFiles(init ? [init] : []);\n\t\t\t// revoke any blob urls created during this editor session\n\t\t\ttransientBlobUrlsRef.current.forEach((u) => {\n\t\t\t\ttry { URL.revokeObjectURL(u); } catch { /* ignore */ }\n\t\t\t});\n\t\t\ttransientBlobUrlsRef.current = [];\n };\n\n const handleSave = async (url: string) => {\n const next = url\n ? await new PreviewableFile({ url }).downloadFile()\n : null;\n\t\t\t// url from Cropper is a blob URL we no longer need once downloaded\n\t\t\tif (url) {\n\t\t\t\ttry { URL.revokeObjectURL(url); } catch { /* ignore */ }\n\t\t\t}\n\n onChange(next);\n // ensure react-hook-form value is set directly as well\n try { setValue(String(name), next, { shouldDirty: true, shouldTouch: true }); } catch { /* ignore */ };\n field.onChange?.(next, getValues() as InferFormDataType<T>);\n\n initialFileRef.current = next;\n setEditorFiles(next ? [next] : []);\n setEditorOpen(false);\n };\n\n // onFileSelect handler used by Cropper's built-in selector\n const onFileSelectFromSelector = (file: File | null) => {\n if (!file) {\n setEditorFiles([]);\n return;\n }\n\n const blobUrl = URL.createObjectURL(file);\n transientBlobUrlsRef.current.push(blobUrl);\n\n const next = new PreviewableFile({\n path: file.name,\n blobUrl,\n filename: file.name,\n mimeType: file.type,\n size: file.size,\n fileType: file.type.startsWith('image/') ? 'image' : 'other',\n });\n\n setEditorFiles([next]);\n };\n\n return (\n <FormControl\n className={CLASSNAMEs.compound.useForm.avatarField}\n disabled={disabled}\n required={required}\n error={!!error}\n fullWidth\n size=\"small\"\n sx={mergeFieldSx(size, sx)}\n >\n <Stack direction=\"column\" alignItems=\"center\" justifyContent=\"center\" gap={0.5}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <FormLabel component=\"legend\">{label}</FormLabel>\n <Explanation explanation={getFieldExplanation(field)} />\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, }}>\n <Box sx={{ cursor: disabled ? 'not-allowed' : 'pointer' }}>\n <AvatarButton\n onClick={disabled ? undefined : openEditor}\n size={avatarSlot?.size}\n dim={avatarSlot?.dim}\n name={displayName}\n src={src}\n backgroundIcon={src ? undefined : backgroundIcon}\n icon={<EditIcon fontSize=\"small\" />}\n aria-label={label || 'Avatar'}\n />\n </Box>\n </Box>\n\n <FieldHelperText error={error} errorMsg={errorMsg} helpers={[field.helperText]} />\n </Stack>\n\n {editorOpen ? (\n <MuiModal\n className={CLASSNAMEs.elemental.modal}\n openProps={[editorOpen, setEditorOpen]}\n onClose={closeEditor}\n title={label || 'Avatar'}\n size={{ w: '70vw', h: '80vh' }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n gap: 2,\n overflow: 'hidden',\n }}>\n <Box sx={{ flex: '1 1 auto', minHeight: 0 }}>\n <Cropper\n setImgNull={() => setEditorFiles([])}\n blobUrl={editorFiles?.[0]?.blobUrl || ''}\n onSave={handleSave}\n onClear={() => handleSave('')}\n circularCrop\n defaultRatio={1}\n resizeCropEnabled\n cropConfig={AVATAR_CROP_CONFIG}\n PreviewRenderer={AvatarCropPreview}\n showFileSelector\n fileSelectorAccept={inputAccept}\n fileSelectorButtonLabel=\"Select Image\"\n onFileSelect={onFileSelectFromSelector}\n />\n </Box>\n </Box>\n </MuiModal>\n ) : null}\n\n \n </FormControl>\n );\n }}\n />\n );\n};\n"],"mappings":"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","names":["default"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import "./chunk-FJ6ZGZIA.mjs";
|
|
3
|
+
|
|
4
|
+
// src/components/elemental/JsonEditor/src/JsonEditor/CodeEditor.tsx
|
|
5
|
+
import CodeMirror from "@uiw/react-codemirror";
|
|
6
|
+
import { json } from "@codemirror/lang-json";
|
|
7
|
+
import { githubLight, githubDark } from "@uiw/codemirror-theme-github";
|
|
8
|
+
import { useColorScheme } from "@mui/material/styles";
|
|
9
|
+
import { jsx } from "react/jsx-runtime";
|
|
10
|
+
var jsonExtensions = [json()];
|
|
11
|
+
var CodeEditor = ({
|
|
12
|
+
value,
|
|
13
|
+
onChange,
|
|
14
|
+
onKeyDown
|
|
15
|
+
}) => {
|
|
16
|
+
const { mode } = useColorScheme();
|
|
17
|
+
const theme = mode === "light" ? githubLight : githubDark;
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
CodeMirror,
|
|
20
|
+
{
|
|
21
|
+
theme,
|
|
22
|
+
value,
|
|
23
|
+
width: "100%",
|
|
24
|
+
extensions: jsonExtensions,
|
|
25
|
+
onChange,
|
|
26
|
+
onKeyDown
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
var CodeEditor_default = CodeEditor;
|
|
31
|
+
export {
|
|
32
|
+
CodeEditor_default as default
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=CodeEditor-JF55ZNVD.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/elemental/JsonEditor/src/JsonEditor/CodeEditor.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\nimport CodeMirror from '@uiw/react-codemirror'\nimport { json } from '@codemirror/lang-json'\nimport { type TextEditorProps, } from 'json-edit-react'\nimport { githubLight, githubDark } from '@uiw/codemirror-theme-github'\nimport { useColorScheme } from '@mui/material/styles'\n\nconst jsonExtensions = [json()]\n\nconst CodeEditor: React.FC<TextEditorProps> = ({\n value,\n onChange,\n onKeyDown,\n}) => {\n const { mode } = useColorScheme()\n const theme = mode===\"light\"?githubLight:githubDark\n\n return (\n <CodeMirror\n theme={theme}\n value={value}\n width=\"100%\"\n extensions={jsonExtensions}\n onChange={onChange}\n onKeyDown={onKeyDown}\n />\n )\n}\n\nexport default CodeEditor\n"],"mappings":";;;;AAEA,OAAO,gBAAgB;AACvB,SAAS,YAAY;AAErB,SAAS,aAAa,kBAAkB;AACxC,SAAS,sBAAsB;AAa3B;AAXJ,IAAM,iBAAiB,CAAC,KAAK,CAAC;AAE9B,IAAM,aAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,KAAK,IAAI,eAAe;AAChC,QAAM,QAAQ,SAAO,UAAQ,cAAY;AAEzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAM;AAAA,MACN,YAAY;AAAA,MACZ;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,qBAAQ;","names":[]}
|