@namroodinc/liquid-editorial 0.0.0-stage → 0.1.1
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/LICENSE +21 -0
- package/README.md +128 -2
- package/dist/chunks/EntryEditor-BF808OZR.js +181 -0
- package/dist/chunks/EntryEditor-BF808OZR.js.map +1 -0
- package/dist/chunks/EntryEditor-cjDk4vdH.cjs +2 -0
- package/dist/chunks/EntryEditor-cjDk4vdH.cjs.map +1 -0
- package/dist/chunks/Icon-CGY1FNXT.js +77 -0
- package/dist/chunks/Icon-CGY1FNXT.js.map +1 -0
- package/dist/chunks/Icon-CWsA1W83.cjs +2 -0
- package/dist/chunks/Icon-CWsA1W83.cjs.map +1 -0
- package/dist/chunks/RichTextEditor-DRt-kibg.js +248 -0
- package/dist/chunks/RichTextEditor-DRt-kibg.js.map +1 -0
- package/dist/chunks/RichTextEditor-tFkISOvq.cjs +2 -0
- package/dist/chunks/RichTextEditor-tFkISOvq.cjs.map +1 -0
- package/dist/components/AssetGrid/index.cjs +2 -0
- package/dist/components/AssetGrid/index.cjs.map +1 -0
- package/dist/components/AssetGrid/index.d.cts +54 -0
- package/dist/components/AssetGrid/index.d.cts.map +1 -0
- package/dist/components/AssetGrid/index.d.ts +54 -0
- package/dist/components/AssetGrid/index.d.ts.map +1 -0
- package/dist/components/AssetGrid/index.js +137 -0
- package/dist/components/AssetGrid/index.js.map +1 -0
- package/dist/components/AssetGrid/style.css +196 -0
- package/dist/components/Avatar/index.cjs +2 -0
- package/dist/components/Avatar/index.cjs.map +1 -0
- package/dist/components/Avatar/index.d.cts +24 -0
- package/dist/components/Avatar/index.d.cts.map +1 -0
- package/dist/components/Avatar/index.d.ts +24 -0
- package/dist/components/Avatar/index.d.ts.map +1 -0
- package/dist/components/Avatar/index.js +43 -0
- package/dist/components/Avatar/index.js.map +1 -0
- package/dist/components/Avatar/style.css +70 -0
- package/dist/components/Badge/index.cjs +2 -0
- package/dist/components/Badge/index.cjs.map +1 -0
- package/dist/components/Badge/index.d.cts +25 -0
- package/dist/components/Badge/index.d.cts.map +1 -0
- package/dist/components/Badge/index.d.ts +25 -0
- package/dist/components/Badge/index.d.ts.map +1 -0
- package/dist/components/Badge/index.js +28 -0
- package/dist/components/Badge/index.js.map +1 -0
- package/dist/components/Badge/style.css +103 -0
- package/dist/components/Board/index.cjs +2 -0
- package/dist/components/Board/index.cjs.map +1 -0
- package/dist/components/Board/index.d.cts +62 -0
- package/dist/components/Board/index.d.cts.map +1 -0
- package/dist/components/Board/index.d.ts +62 -0
- package/dist/components/Board/index.d.ts.map +1 -0
- package/dist/components/Board/index.js +227 -0
- package/dist/components/Board/index.js.map +1 -0
- package/dist/components/Board/style.css +145 -0
- package/dist/components/Button/index.cjs +2 -0
- package/dist/components/Button/index.cjs.map +1 -0
- package/dist/components/Button/index.d.cts +22 -0
- package/dist/components/Button/index.d.cts.map +1 -0
- package/dist/components/Button/index.d.ts +22 -0
- package/dist/components/Button/index.d.ts.map +1 -0
- package/dist/components/Button/index.js +37 -0
- package/dist/components/Button/index.js.map +1 -0
- package/dist/components/Button/style.css +139 -0
- package/dist/components/ButtonGroup/index.cjs +2 -0
- package/dist/components/ButtonGroup/index.cjs.map +1 -0
- package/dist/components/ButtonGroup/index.d.cts +17 -0
- package/dist/components/ButtonGroup/index.d.cts.map +1 -0
- package/dist/components/ButtonGroup/index.d.ts +17 -0
- package/dist/components/ButtonGroup/index.d.ts.map +1 -0
- package/dist/components/ButtonGroup/index.js +18 -0
- package/dist/components/ButtonGroup/index.js.map +1 -0
- package/dist/components/ButtonGroup/style.css +66 -0
- package/dist/components/Choice/index.cjs +2 -0
- package/dist/components/Choice/index.cjs.map +1 -0
- package/dist/components/Choice/index.d.cts +25 -0
- package/dist/components/Choice/index.d.cts.map +1 -0
- package/dist/components/Choice/index.d.ts +25 -0
- package/dist/components/Choice/index.d.ts.map +1 -0
- package/dist/components/Choice/index.js +58 -0
- package/dist/components/Choice/index.js.map +1 -0
- package/dist/components/Choice/style.css +96 -0
- package/dist/components/Container/index.cjs +2 -0
- package/dist/components/Container/index.cjs.map +1 -0
- package/dist/components/Container/index.d.cts +19 -0
- package/dist/components/Container/index.d.cts.map +1 -0
- package/dist/components/Container/index.d.ts +19 -0
- package/dist/components/Container/index.d.ts.map +1 -0
- package/dist/components/Container/index.js +20 -0
- package/dist/components/Container/index.js.map +1 -0
- package/dist/components/Container/style.css +41 -0
- package/dist/components/DatePicker/index.cjs +2 -0
- package/dist/components/DatePicker/index.cjs.map +1 -0
- package/dist/components/DatePicker/index.d.cts +57 -0
- package/dist/components/DatePicker/index.d.cts.map +1 -0
- package/dist/components/DatePicker/index.d.ts +57 -0
- package/dist/components/DatePicker/index.d.ts.map +1 -0
- package/dist/components/DatePicker/index.js +248 -0
- package/dist/components/DatePicker/index.js.map +1 -0
- package/dist/components/DatePicker/style.css +149 -0
- package/dist/components/Drawer/index.cjs +2 -0
- package/dist/components/Drawer/index.cjs.map +1 -0
- package/dist/components/Drawer/index.d.cts +23 -0
- package/dist/components/Drawer/index.d.cts.map +1 -0
- package/dist/components/Drawer/index.d.ts +23 -0
- package/dist/components/Drawer/index.d.ts.map +1 -0
- package/dist/components/Drawer/index.js +85 -0
- package/dist/components/Drawer/index.js.map +1 -0
- package/dist/components/Drawer/style.css +147 -0
- package/dist/components/EntryEditor/index.cjs +1 -0
- package/dist/components/EntryEditor/index.d.cts +21 -0
- package/dist/components/EntryEditor/index.d.cts.map +1 -0
- package/dist/components/EntryEditor/index.d.ts +21 -0
- package/dist/components/EntryEditor/index.d.ts.map +1 -0
- package/dist/components/EntryEditor/index.js +6 -0
- package/dist/components/EntryEditor/model.d.cts +33 -0
- package/dist/components/EntryEditor/model.d.cts.map +1 -0
- package/dist/components/EntryEditor/model.d.ts +33 -0
- package/dist/components/EntryEditor/model.d.ts.map +1 -0
- package/dist/components/EntryEditor/style.css +8 -0
- package/dist/components/EntryPicker/index.cjs +2 -0
- package/dist/components/EntryPicker/index.cjs.map +1 -0
- package/dist/components/EntryPicker/index.d.cts +36 -0
- package/dist/components/EntryPicker/index.d.cts.map +1 -0
- package/dist/components/EntryPicker/index.d.ts +36 -0
- package/dist/components/EntryPicker/index.d.ts.map +1 -0
- package/dist/components/EntryPicker/index.js +181 -0
- package/dist/components/EntryPicker/index.js.map +1 -0
- package/dist/components/EntryPicker/style.css +162 -0
- package/dist/components/Field/index.cjs +2 -0
- package/dist/components/Field/index.cjs.map +1 -0
- package/dist/components/Field/index.d.cts +22 -0
- package/dist/components/Field/index.d.cts.map +1 -0
- package/dist/components/Field/index.d.ts +22 -0
- package/dist/components/Field/index.d.ts.map +1 -0
- package/dist/components/Field/index.js +47 -0
- package/dist/components/Field/index.js.map +1 -0
- package/dist/components/Field/style.css +112 -0
- package/dist/components/FieldAffix/index.cjs +2 -0
- package/dist/components/FieldAffix/index.cjs.map +1 -0
- package/dist/components/FieldAffix/index.d.cts +19 -0
- package/dist/components/FieldAffix/index.d.cts.map +1 -0
- package/dist/components/FieldAffix/index.d.ts +19 -0
- package/dist/components/FieldAffix/index.d.ts.map +1 -0
- package/dist/components/FieldAffix/index.js +45 -0
- package/dist/components/FieldAffix/index.js.map +1 -0
- package/dist/components/FieldAffix/style.css +54 -0
- package/dist/components/Grid/index.cjs +2 -0
- package/dist/components/Grid/index.cjs.map +1 -0
- package/dist/components/Grid/index.d.cts +44 -0
- package/dist/components/Grid/index.d.cts.map +1 -0
- package/dist/components/Grid/index.d.ts +44 -0
- package/dist/components/Grid/index.d.ts.map +1 -0
- package/dist/components/Grid/index.js +49 -0
- package/dist/components/Grid/index.js.map +1 -0
- package/dist/components/Grid/style.css +226 -0
- package/dist/components/Icon/icons.d.cts +64 -0
- package/dist/components/Icon/icons.d.cts.map +1 -0
- package/dist/components/Icon/icons.d.ts +64 -0
- package/dist/components/Icon/icons.d.ts.map +1 -0
- package/dist/components/Icon/index.cjs +1 -0
- package/dist/components/Icon/index.d.cts +15 -0
- package/dist/components/Icon/index.d.cts.map +1 -0
- package/dist/components/Icon/index.d.ts +15 -0
- package/dist/components/Icon/index.d.ts.map +1 -0
- package/dist/components/Icon/index.js +1 -0
- package/dist/components/Icon/style.css +10 -0
- package/dist/components/ImageCropper/index.cjs +2 -0
- package/dist/components/ImageCropper/index.cjs.map +1 -0
- package/dist/components/ImageCropper/index.d.cts +66 -0
- package/dist/components/ImageCropper/index.d.cts.map +1 -0
- package/dist/components/ImageCropper/index.d.ts +66 -0
- package/dist/components/ImageCropper/index.d.ts.map +1 -0
- package/dist/components/ImageCropper/index.js +263 -0
- package/dist/components/ImageCropper/index.js.map +1 -0
- package/dist/components/ImageCropper/style.css +160 -0
- package/dist/components/Menu/index.cjs +2 -0
- package/dist/components/Menu/index.cjs.map +1 -0
- package/dist/components/Menu/index.d.cts +35 -0
- package/dist/components/Menu/index.d.cts.map +1 -0
- package/dist/components/Menu/index.d.ts +35 -0
- package/dist/components/Menu/index.d.ts.map +1 -0
- package/dist/components/Menu/index.js +110 -0
- package/dist/components/Menu/index.js.map +1 -0
- package/dist/components/Menu/style.css +87 -0
- package/dist/components/Modal/index.cjs +2 -0
- package/dist/components/Modal/index.cjs.map +1 -0
- package/dist/components/Modal/index.d.cts +19 -0
- package/dist/components/Modal/index.d.cts.map +1 -0
- package/dist/components/Modal/index.d.ts +19 -0
- package/dist/components/Modal/index.d.ts.map +1 -0
- package/dist/components/Modal/index.js +84 -0
- package/dist/components/Modal/index.js.map +1 -0
- package/dist/components/Modal/style.css +106 -0
- package/dist/components/NumberField/index.cjs +2 -0
- package/dist/components/NumberField/index.cjs.map +1 -0
- package/dist/components/NumberField/index.d.cts +50 -0
- package/dist/components/NumberField/index.d.cts.map +1 -0
- package/dist/components/NumberField/index.d.ts +50 -0
- package/dist/components/NumberField/index.d.ts.map +1 -0
- package/dist/components/NumberField/index.js +124 -0
- package/dist/components/NumberField/index.js.map +1 -0
- package/dist/components/NumberField/style.css +85 -0
- package/dist/components/Popover/index.cjs +2 -0
- package/dist/components/Popover/index.cjs.map +1 -0
- package/dist/components/Popover/index.d.cts +28 -0
- package/dist/components/Popover/index.d.cts.map +1 -0
- package/dist/components/Popover/index.d.ts +28 -0
- package/dist/components/Popover/index.d.ts.map +1 -0
- package/dist/components/Popover/index.js +52 -0
- package/dist/components/Popover/index.js.map +1 -0
- package/dist/components/Popover/style.css +23 -0
- package/dist/components/RichTextEditor/document.d.cts +10 -0
- package/dist/components/RichTextEditor/document.d.cts.map +1 -0
- package/dist/components/RichTextEditor/document.d.ts +10 -0
- package/dist/components/RichTextEditor/document.d.ts.map +1 -0
- package/dist/components/RichTextEditor/index.cjs +1 -0
- package/dist/components/RichTextEditor/index.d.cts +38 -0
- package/dist/components/RichTextEditor/index.d.cts.map +1 -0
- package/dist/components/RichTextEditor/index.d.ts +38 -0
- package/dist/components/RichTextEditor/index.d.ts.map +1 -0
- package/dist/components/RichTextEditor/index.js +1 -0
- package/dist/components/RichTextEditor/style.css +136 -0
- package/dist/components/SearchField/index.cjs +2 -0
- package/dist/components/SearchField/index.cjs.map +1 -0
- package/dist/components/SearchField/index.d.cts +11 -0
- package/dist/components/SearchField/index.d.cts.map +1 -0
- package/dist/components/SearchField/index.d.ts +11 -0
- package/dist/components/SearchField/index.d.ts.map +1 -0
- package/dist/components/SearchField/index.js +49 -0
- package/dist/components/SearchField/index.js.map +1 -0
- package/dist/components/SearchField/style.css +27 -0
- package/dist/components/Select/index.cjs +2 -0
- package/dist/components/Select/index.cjs.map +1 -0
- package/dist/components/Select/index.d.cts +26 -0
- package/dist/components/Select/index.d.cts.map +1 -0
- package/dist/components/Select/index.d.ts +26 -0
- package/dist/components/Select/index.d.ts.map +1 -0
- package/dist/components/Select/index.js +129 -0
- package/dist/components/Select/index.js.map +1 -0
- package/dist/components/Select/style.css +88 -0
- package/dist/components/SelectionCard/index.cjs +2 -0
- package/dist/components/SelectionCard/index.cjs.map +1 -0
- package/dist/components/SelectionCard/index.d.cts +32 -0
- package/dist/components/SelectionCard/index.d.cts.map +1 -0
- package/dist/components/SelectionCard/index.d.ts +32 -0
- package/dist/components/SelectionCard/index.d.ts.map +1 -0
- package/dist/components/SelectionCard/index.js +71 -0
- package/dist/components/SelectionCard/index.js.map +1 -0
- package/dist/components/SelectionCard/style.css +133 -0
- package/dist/components/SideNav/index.cjs +2 -0
- package/dist/components/SideNav/index.cjs.map +1 -0
- package/dist/components/SideNav/index.d.cts +58 -0
- package/dist/components/SideNav/index.d.cts.map +1 -0
- package/dist/components/SideNav/index.d.ts +58 -0
- package/dist/components/SideNav/index.d.ts.map +1 -0
- package/dist/components/SideNav/index.js +113 -0
- package/dist/components/SideNav/index.js.map +1 -0
- package/dist/components/SideNav/style.css +184 -0
- package/dist/components/Skeleton/index.cjs +2 -0
- package/dist/components/Skeleton/index.cjs.map +1 -0
- package/dist/components/Skeleton/index.d.cts +21 -0
- package/dist/components/Skeleton/index.d.cts.map +1 -0
- package/dist/components/Skeleton/index.d.ts +21 -0
- package/dist/components/Skeleton/index.d.ts.map +1 -0
- package/dist/components/Skeleton/index.js +31 -0
- package/dist/components/Skeleton/index.js.map +1 -0
- package/dist/components/Skeleton/style.css +55 -0
- package/dist/components/Slider/index.cjs +2 -0
- package/dist/components/Slider/index.cjs.map +1 -0
- package/dist/components/Slider/index.d.cts +40 -0
- package/dist/components/Slider/index.d.cts.map +1 -0
- package/dist/components/Slider/index.d.ts +40 -0
- package/dist/components/Slider/index.d.ts.map +1 -0
- package/dist/components/Slider/index.js +117 -0
- package/dist/components/Slider/index.js.map +1 -0
- package/dist/components/Slider/style.css +156 -0
- package/dist/components/SortableList/index.cjs +2 -0
- package/dist/components/SortableList/index.cjs.map +1 -0
- package/dist/components/SortableList/index.d.cts +27 -0
- package/dist/components/SortableList/index.d.cts.map +1 -0
- package/dist/components/SortableList/index.d.ts +27 -0
- package/dist/components/SortableList/index.d.ts.map +1 -0
- package/dist/components/SortableList/index.js +85 -0
- package/dist/components/SortableList/index.js.map +1 -0
- package/dist/components/SortableList/style.css +71 -0
- package/dist/components/Stepper/index.cjs +2 -0
- package/dist/components/Stepper/index.cjs.map +1 -0
- package/dist/components/Stepper/index.d.cts +32 -0
- package/dist/components/Stepper/index.d.cts.map +1 -0
- package/dist/components/Stepper/index.d.ts +32 -0
- package/dist/components/Stepper/index.d.ts.map +1 -0
- package/dist/components/Stepper/index.js +69 -0
- package/dist/components/Stepper/index.js.map +1 -0
- package/dist/components/Stepper/style.css +154 -0
- package/dist/components/SubNav/index.cjs +2 -0
- package/dist/components/SubNav/index.cjs.map +1 -0
- package/dist/components/SubNav/index.d.cts +31 -0
- package/dist/components/SubNav/index.d.cts.map +1 -0
- package/dist/components/SubNav/index.d.ts +31 -0
- package/dist/components/SubNav/index.d.ts.map +1 -0
- package/dist/components/SubNav/index.js +62 -0
- package/dist/components/SubNav/index.js.map +1 -0
- package/dist/components/SubNav/style.css +86 -0
- package/dist/components/Switch/index.cjs +2 -0
- package/dist/components/Switch/index.cjs.map +1 -0
- package/dist/components/Switch/index.d.cts +12 -0
- package/dist/components/Switch/index.d.cts.map +1 -0
- package/dist/components/Switch/index.d.ts +12 -0
- package/dist/components/Switch/index.d.ts.map +1 -0
- package/dist/components/Switch/index.js +37 -0
- package/dist/components/Switch/index.js.map +1 -0
- package/dist/components/Switch/style.css +65 -0
- package/dist/components/Table/index.cjs +2 -0
- package/dist/components/Table/index.cjs.map +1 -0
- package/dist/components/Table/index.d.cts +54 -0
- package/dist/components/Table/index.d.cts.map +1 -0
- package/dist/components/Table/index.d.ts +54 -0
- package/dist/components/Table/index.d.ts.map +1 -0
- package/dist/components/Table/index.js +102 -0
- package/dist/components/Table/index.js.map +1 -0
- package/dist/components/Table/style.css +122 -0
- package/dist/components/TagsInput/index.cjs +2 -0
- package/dist/components/TagsInput/index.cjs.map +1 -0
- package/dist/components/TagsInput/index.d.cts +22 -0
- package/dist/components/TagsInput/index.d.cts.map +1 -0
- package/dist/components/TagsInput/index.d.ts +22 -0
- package/dist/components/TagsInput/index.d.ts.map +1 -0
- package/dist/components/TagsInput/index.js +60 -0
- package/dist/components/TagsInput/index.js.map +1 -0
- package/dist/components/TagsInput/style.css +83 -0
- package/dist/components/TextField/index.cjs +2 -0
- package/dist/components/TextField/index.cjs.map +1 -0
- package/dist/components/TextField/index.d.cts +11 -0
- package/dist/components/TextField/index.d.cts.map +1 -0
- package/dist/components/TextField/index.d.ts +11 -0
- package/dist/components/TextField/index.d.ts.map +1 -0
- package/dist/components/TextField/index.js +29 -0
- package/dist/components/TextField/index.js.map +1 -0
- package/dist/components/TextField/style.css +1 -0
- package/dist/components/Time/index.cjs +2 -0
- package/dist/components/Time/index.cjs.map +1 -0
- package/dist/components/Time/index.d.cts +35 -0
- package/dist/components/Time/index.d.cts.map +1 -0
- package/dist/components/Time/index.d.ts +35 -0
- package/dist/components/Time/index.d.ts.map +1 -0
- package/dist/components/Time/index.js +98 -0
- package/dist/components/Time/index.js.map +1 -0
- package/dist/components/Time/style.css +30 -0
- package/dist/components/Toast/index.cjs +2 -0
- package/dist/components/Toast/index.cjs.map +1 -0
- package/dist/components/Toast/index.d.cts +30 -0
- package/dist/components/Toast/index.d.cts.map +1 -0
- package/dist/components/Toast/index.d.ts +30 -0
- package/dist/components/Toast/index.d.ts.map +1 -0
- package/dist/components/Toast/index.js +96 -0
- package/dist/components/Toast/index.js.map +1 -0
- package/dist/components/Toast/style.css +80 -0
- package/dist/components/TopNav/index.cjs +2 -0
- package/dist/components/TopNav/index.cjs.map +1 -0
- package/dist/components/TopNav/index.d.cts +28 -0
- package/dist/components/TopNav/index.d.cts.map +1 -0
- package/dist/components/TopNav/index.d.ts +28 -0
- package/dist/components/TopNav/index.d.ts.map +1 -0
- package/dist/components/TopNav/index.js +45 -0
- package/dist/components/TopNav/index.js.map +1 -0
- package/dist/components/TopNav/style.css +80 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +79 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/reset.css +15 -0
- package/dist/reset.css.d.ts +2 -0
- package/dist/styles.css +40 -0
- package/dist/styles.css.d.ts +2 -0
- package/dist/tokens.css +457 -0
- package/dist/tokens.css.d.ts +2 -0
- package/package.json +156 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Namrood Inc
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,129 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Liquid Editorial
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Accessible React components for editorial products. The package ships ESM, CommonJS, TypeScript declarations, and explicit CSS entry points. It does not inject styles from JavaScript.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm install @namroodinc/liquid-editorial
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
React and React DOM 18.2 through 19 are supported peer dependencies.
|
|
12
|
+
|
|
13
|
+
## Use
|
|
14
|
+
|
|
15
|
+
Import the complete component stylesheet once near your application entry point:
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import "@namroodinc/liquid-editorial/styles.css";
|
|
19
|
+
import { Field, TextField } from "@namroodinc/liquid-editorial";
|
|
20
|
+
|
|
21
|
+
export function ArticleForm() {
|
|
22
|
+
return (
|
|
23
|
+
<Field label="Headline" hint="Keep it concise." isRequired>
|
|
24
|
+
{(fieldProps) => <TextField {...fieldProps} />}
|
|
25
|
+
</Field>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Every family also has a direct entry point:
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
import { Button } from "@namroodinc/liquid-editorial/components/Button";
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
If an application only needs the design tokens, import `@namroodinc/liquid-editorial/tokens.css`. A small global normalization is available separately at `@namroodinc/liquid-editorial/reset.css`; it is never included automatically.
|
|
37
|
+
|
|
38
|
+
## Content models
|
|
39
|
+
|
|
40
|
+
`EntryEditor` renders editable fields in the order defined by a JSON model:
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
import { useState } from "react";
|
|
44
|
+
import { EntryEditor, validateEntryValues, type ContentModel, type EntryValues } from "@namroodinc/liquid-editorial";
|
|
45
|
+
|
|
46
|
+
const model: ContentModel = {
|
|
47
|
+
fields: [
|
|
48
|
+
{ id: "title", type: "shortText", label: "Title", required: true },
|
|
49
|
+
{ id: "gallery", type: "asset", label: "Gallery", multiple: true },
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export function ContentEditor() {
|
|
54
|
+
const [value, setValue] = useState<EntryValues>({});
|
|
55
|
+
return <EntryEditor model={model} value={value} onValueChange={setValue}
|
|
56
|
+
pickerItems={{ gallery: [{ id: "image-1", title: "Cover.jpg" }] }} />;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Before saving: validateEntryValues(model, value) returns errors keyed by field ID.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Supported types are `shortText`, `longText`, `richText`, `number`, `boolean`, `dateTime`, `asset`, and `reference`. Rich text stores a TipTap JSON document rooted at `doc`, using the editor's existing StarterKit and Link schema. Dates are edited in UTC and emitted as ISO-8601 strings ending in `Z`. Assets store `{ assetId }`; references store `{ entryId }`. Set `multiple: true` for an ordered array of these objects.
|
|
63
|
+
|
|
64
|
+
Use `defaultValue` for an uncontrolled editor, `errors` for app-specific messages, `showAllErrors` after a submit attempt, and `isDisabled` to disable editing. Required errors appear after a field changes; `false` and `0` are populated values. Missing keys render empty controls without emitting changes. Clearing a number, date, or single selection removes its key; empty text, rich-text documents, and lists keep their typed values. Unrelated entry keys are preserved.
|
|
65
|
+
|
|
66
|
+
`RichTextEditor` also supports `format="json"` with `value`/`defaultValue` and an `onChange` callback receiving the document. HTML remains its default format. Unsupported JSON content produces an error and cannot be edited until corrected.
|
|
67
|
+
|
|
68
|
+
## Themes and fonts
|
|
69
|
+
|
|
70
|
+
Set `data-theme` on the document root to `light`, `dark`, `cherry-glaze`, or `black-hawaii`. The default font tokens use system stacks and can be overridden by the consumer without downloading bundled font files:
|
|
71
|
+
|
|
72
|
+
```css
|
|
73
|
+
:root {
|
|
74
|
+
--font-sans: "Your Sans", ui-sans-serif, system-ui, sans-serif;
|
|
75
|
+
--font-mono: "Your Mono", ui-monospace, monospace;
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Development
|
|
80
|
+
|
|
81
|
+
```sh
|
|
82
|
+
npm install
|
|
83
|
+
npm run storybook
|
|
84
|
+
npm test
|
|
85
|
+
npm run test:coverage
|
|
86
|
+
npm run build
|
|
87
|
+
npm run validate
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Storybook is the component catalogue and documentation surface. Stories and tests live beside each component in `src/components/<Family>/`.
|
|
91
|
+
|
|
92
|
+
## Publishing
|
|
93
|
+
|
|
94
|
+
Publishing a GitHub Release runs [the release workflow](.github/workflows/release.yml): it checks the release version, runs `npm run validate`, then publishes `@namroodinc/liquid-editorial` to npm. The release tag must be `v` followed by the exact version in both `package.json` and `package-lock.json`. Stable versions publish to `latest`; versions such as `0.2.0-beta.1` must be marked as GitHub prereleases and publish to `next`. Branch pushes and draft releases run no publishing step.
|
|
95
|
+
|
|
96
|
+
### One-time npm setup
|
|
97
|
+
|
|
98
|
+
After pushing the workflow to GitHub, open [the package settings](https://www.npmjs.com/package/@namroodinc/liquid-editorial/access) and add a GitHub Actions trusted publisher with:
|
|
99
|
+
|
|
100
|
+
- Organization or user: `namroodinc`
|
|
101
|
+
- Repository: `liquid-editorial`
|
|
102
|
+
- Workflow filename: `release.yml`
|
|
103
|
+
- Environment: leave empty
|
|
104
|
+
- Allowed action: enable direct publishing with `npm publish`
|
|
105
|
+
|
|
106
|
+
Alternatively, with npm 11.15 or newer and an authenticated maintainer account, run:
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
npm trust github @namroodinc/liquid-editorial --repo namroodinc/liquid-editorial --file release.yml --allow-publish
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
npm requires two-factor verification for this setup. The workflow subsequently authenticates through OIDC without an `NPM_TOKEN` secret. Complete the first workflow publish within two days of adding the trusted publisher to avoid configuration expiry. See [npm's trusted publishing guide](https://docs.npmjs.com/trusted-publishers/) for the current setup requirements.
|
|
113
|
+
|
|
114
|
+
### Create a release
|
|
115
|
+
|
|
116
|
+
For the next patch release after `0.1.0`:
|
|
117
|
+
|
|
118
|
+
```sh
|
|
119
|
+
npm version patch --no-git-tag-version
|
|
120
|
+
git add package.json package-lock.json
|
|
121
|
+
git commit -m "chore: release v0.1.1"
|
|
122
|
+
git push origin main
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
On GitHub, publish a Release with tag `v0.1.1` targeting that commit. GitHub can create the tag when publishing the release. For later releases, use the version produced by `npm version`; for a prerelease, use a version such as `0.2.0-beta.1` and select **Set as a pre-release**. Publishing an already-published npm version fails, so every release needs a new version.
|
|
126
|
+
|
|
127
|
+
## License
|
|
128
|
+
|
|
129
|
+
MIT © Namrood Inc.
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { n as e, r as t, t as n } from "./RichTextEditor-DRt-kibg.js";
|
|
2
|
+
import { EntryPicker as r } from "../components/EntryPicker/index.js";
|
|
3
|
+
import { Field as i } from "../components/Field/index.js";
|
|
4
|
+
import { NumberField as a } from "../components/NumberField/index.js";
|
|
5
|
+
import { Switch as o } from "../components/Switch/index.js";
|
|
6
|
+
import { TextArea as s, TextField as c } from "../components/TextField/index.js";
|
|
7
|
+
import { useState as l } from "react";
|
|
8
|
+
import { jsx as u } from "react/jsx-runtime";
|
|
9
|
+
//#region src/components/EntryEditor/model.ts
|
|
10
|
+
var d = /* @__PURE__ */ new Set([
|
|
11
|
+
"shortText",
|
|
12
|
+
"longText",
|
|
13
|
+
"richText",
|
|
14
|
+
"number",
|
|
15
|
+
"boolean",
|
|
16
|
+
"dateTime",
|
|
17
|
+
"asset",
|
|
18
|
+
"reference"
|
|
19
|
+
]);
|
|
20
|
+
function f(e) {
|
|
21
|
+
let t = /* @__PURE__ */ new Set();
|
|
22
|
+
for (let n of e.fields) {
|
|
23
|
+
if (!n.id?.trim() || t.has(n.id)) throw Error("Content model field IDs must be nonempty and unique.");
|
|
24
|
+
if (!d.has(n.type)) throw Error(`Unsupported content field type: ${n.type}`);
|
|
25
|
+
t.add(n.id);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function p(e) {
|
|
29
|
+
if (typeof e != "string") return;
|
|
30
|
+
let t = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2})(?::(\d{2})(?:\.(\d{1,3}))?)?(?:Z|\+00:00)$/.exec(e);
|
|
31
|
+
if (!t) return;
|
|
32
|
+
let n = `${t[1]}:${t[2] ?? "00"}.${(t[3] ?? "").padEnd(3, "0")}Z`, r = new Date(n);
|
|
33
|
+
if (Number.isFinite(r.getTime()) && r.toISOString() === n) return n;
|
|
34
|
+
}
|
|
35
|
+
function m(e, t) {
|
|
36
|
+
return !!e && typeof e == "object" && t in e && typeof e[t] == "string" && e[t].trim().length > 0;
|
|
37
|
+
}
|
|
38
|
+
function h(e) {
|
|
39
|
+
return !!e.text?.trim() || e.type === "horizontalRule" || !!e.content?.some(h);
|
|
40
|
+
}
|
|
41
|
+
function g(t, n) {
|
|
42
|
+
return f(t), Object.fromEntries(t.fields.flatMap((t) => {
|
|
43
|
+
let r = Object.hasOwn(n, t.id) ? n[t.id] : void 0, i;
|
|
44
|
+
if (r === void 0) t.required && (i = `${t.label} is required.`);
|
|
45
|
+
else switch (t.type) {
|
|
46
|
+
case "shortText":
|
|
47
|
+
case "longText":
|
|
48
|
+
typeof r == "string" ? t.required && !r.trim() && (i = `${t.label} is required.`) : i = "Enter text.";
|
|
49
|
+
break;
|
|
50
|
+
case "richText":
|
|
51
|
+
i = e(r), !i && t.required && !h(r) && (i = `${t.label} is required.`);
|
|
52
|
+
break;
|
|
53
|
+
case "number":
|
|
54
|
+
(typeof r != "number" || !Number.isFinite(r)) && (i = "Enter a finite number.");
|
|
55
|
+
break;
|
|
56
|
+
case "boolean":
|
|
57
|
+
typeof r != "boolean" && (i = "Choose a boolean value.");
|
|
58
|
+
break;
|
|
59
|
+
case "dateTime":
|
|
60
|
+
p(r) || (i = "Enter a valid UTC date and time.");
|
|
61
|
+
break;
|
|
62
|
+
case "asset":
|
|
63
|
+
case "reference": {
|
|
64
|
+
let e = t.type === "asset" ? "assetId" : "entryId";
|
|
65
|
+
(t.multiple ? !Array.isArray(r) || !r.every((t) => m(t, e)) : !m(r, e)) ? i = t.multiple ? `Choose a list of ${t.type === "asset" ? "assets" : "entries"}.` : `Choose an ${t.type === "asset" ? "asset" : "entry"}.` : t.required && Array.isArray(r) && r.length === 0 && (i = `${t.label} is required.`);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return i ? [[t.id, i]] : [];
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region src/components/EntryEditor/index.tsx
|
|
74
|
+
function _(e, t) {
|
|
75
|
+
let n = e.type === "asset" ? "assetId" : "entryId";
|
|
76
|
+
return (Array.isArray(t) ? t : t === void 0 ? [] : [t]).flatMap((e) => {
|
|
77
|
+
if (!e || typeof e != "object" || !(n in e)) return [];
|
|
78
|
+
let t = e[n];
|
|
79
|
+
return typeof t == "string" ? [t] : [];
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function v({ model: e, value: d, defaultValue: f = {}, onValueChange: m, pickerItems: h = {}, errors: v = {}, isDisabled: y = !1, showAllErrors: b = !1, className: x, ...S }) {
|
|
83
|
+
let [C, w] = l(f), [T, E] = l(() => /* @__PURE__ */ new Set()), D = d ?? C, O = g(e, D), k = (e, t) => {
|
|
84
|
+
if (y) return;
|
|
85
|
+
let n = { ...D };
|
|
86
|
+
t === void 0 ? delete n[e] : n[e] = t, d === void 0 && w(n), E((t) => new Set(t).add(e)), m?.(n);
|
|
87
|
+
};
|
|
88
|
+
return /* @__PURE__ */ u("div", {
|
|
89
|
+
className: ["ds-entry-editor", x].filter(Boolean).join(" "),
|
|
90
|
+
...S,
|
|
91
|
+
children: e.fields.map((e) => {
|
|
92
|
+
let l = Object.hasOwn(D, e.id) ? D[e.id] : void 0, d = e.type === "asset" || e.type === "reference", f = e.type === "dateTime" ? `${e.label} (UTC)` : e.label, m = v[e.id] ?? (b || T.has(e.id) ? O[e.id] : void 0);
|
|
93
|
+
return /* @__PURE__ */ u(i, {
|
|
94
|
+
label: f,
|
|
95
|
+
hint: e.hint,
|
|
96
|
+
error: m,
|
|
97
|
+
isRequired: e.required,
|
|
98
|
+
isGroup: d,
|
|
99
|
+
children: ({ required: i, ...d }) => {
|
|
100
|
+
switch (e.type) {
|
|
101
|
+
case "shortText":
|
|
102
|
+
case "longText": {
|
|
103
|
+
let t = e.type === "shortText" ? c : s;
|
|
104
|
+
return /* @__PURE__ */ u(t, {
|
|
105
|
+
...d,
|
|
106
|
+
required: i,
|
|
107
|
+
disabled: y,
|
|
108
|
+
placeholder: e.placeholder,
|
|
109
|
+
value: typeof l == "string" ? l : "",
|
|
110
|
+
onChange: (t) => k(e.id, t.target.value)
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
case "number": return /* @__PURE__ */ u(a, {
|
|
114
|
+
...d,
|
|
115
|
+
required: i,
|
|
116
|
+
isDisabled: y,
|
|
117
|
+
placeholder: e.placeholder,
|
|
118
|
+
step: "any",
|
|
119
|
+
hasSteppers: !1,
|
|
120
|
+
value: typeof l == "number" && Number.isFinite(l) ? l : "",
|
|
121
|
+
onValueChange: (t) => {
|
|
122
|
+
(t === "" || Number.isFinite(t)) && k(e.id, t === "" ? void 0 : t);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
case "boolean": return /* @__PURE__ */ u(o, {
|
|
126
|
+
...d,
|
|
127
|
+
isDisabled: y,
|
|
128
|
+
isSelected: l === !0,
|
|
129
|
+
onSelectedChange: (t) => k(e.id, t)
|
|
130
|
+
});
|
|
131
|
+
case "dateTime": return /* @__PURE__ */ u(c, {
|
|
132
|
+
...d,
|
|
133
|
+
required: i,
|
|
134
|
+
disabled: y,
|
|
135
|
+
type: "datetime-local",
|
|
136
|
+
step: "0.001",
|
|
137
|
+
value: p(l)?.slice(0, -1) ?? "",
|
|
138
|
+
onChange: (t) => k(e.id, p(`${t.target.value}Z`))
|
|
139
|
+
});
|
|
140
|
+
case "richText": return /* @__PURE__ */ u(n, {
|
|
141
|
+
...d,
|
|
142
|
+
label: e.label,
|
|
143
|
+
isRequired: i,
|
|
144
|
+
isDisabled: y,
|
|
145
|
+
placeholder: e.placeholder,
|
|
146
|
+
format: "json",
|
|
147
|
+
value: l === void 0 ? t : l,
|
|
148
|
+
onChange: (t) => k(e.id, t)
|
|
149
|
+
});
|
|
150
|
+
case "asset":
|
|
151
|
+
case "reference": return /* @__PURE__ */ u("div", {
|
|
152
|
+
...d,
|
|
153
|
+
role: "group",
|
|
154
|
+
children: /* @__PURE__ */ u(r, {
|
|
155
|
+
items: h[e.id] ?? [],
|
|
156
|
+
value: _(e, l),
|
|
157
|
+
label: e.type === "asset" ? "Assets" : "Entries",
|
|
158
|
+
addLabel: `Choose ${e.label}`,
|
|
159
|
+
mode: e.multiple ? "multiple" : "single",
|
|
160
|
+
isDisabled: y,
|
|
161
|
+
onValueChange: (t) => {
|
|
162
|
+
if (e.type === "asset") {
|
|
163
|
+
let n = t.map((e) => ({ assetId: e }));
|
|
164
|
+
k(e.id, e.multiple ? n : n[0]);
|
|
165
|
+
} else {
|
|
166
|
+
let n = t.map((e) => ({ entryId: e }));
|
|
167
|
+
k(e.id, e.multiple ? n : n[0]);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
})
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}, e.id);
|
|
175
|
+
})
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
//#endregion
|
|
179
|
+
export { g as n, v as t };
|
|
180
|
+
|
|
181
|
+
//# sourceMappingURL=EntryEditor-BF808OZR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryEditor-BF808OZR.js","names":["documentError","emptyDocument","RichTextEditor","fieldTypes","assertModel","ids","field","model","parseUtcDateTime","value","match","canonical","date","isLink","key","hasRichText","node","validateEntryValues","values","error","item","selectedIds","link","id","EntryEditor","rest","internal","setInternal","useState","defaultValue","changed","setChanged","current","validation","commit","isDisabled","next","previous","onValueChange","className","stored","isPicker","label","errors","showAllErrors","Field","accessibility","Control","TextField","TextArea","event","NumberField","Switch","required","EntryPicker","pickerItems","links"],"sources":["../../src/components/EntryEditor/model.ts","../../src/components/EntryEditor/index.tsx"],"sourcesContent":["import type { JSONContent } from \"@tiptap/react\";\nimport { documentError } from \"../RichTextEditor/document\";\nimport type { RichTextDocument } from \"../RichTextEditor\";\n\ninterface ContentFieldBase {\n id: string;\n label: string;\n hint?: string;\n placeholder?: string;\n required?: boolean;\n}\n\nexport type ContentField = ContentFieldBase & (\n | { type: \"shortText\" | \"longText\" | \"richText\" | \"number\" | \"boolean\" | \"dateTime\"; multiple?: never }\n | { type: \"asset\" | \"reference\"; multiple?: boolean }\n);\n\nexport interface ContentModel {\n fields: readonly ContentField[];\n}\n\nexport interface AssetValue { assetId: string }\nexport interface ReferenceValue { entryId: string }\nexport type EntryFieldValue = string | number | boolean | RichTextDocument | AssetValue | ReferenceValue | AssetValue[] | ReferenceValue[];\nexport type EntryValues = Record<string, EntryFieldValue | undefined>;\nexport type EntryErrors = Partial<Record<string, string>>;\n\nconst fieldTypes = new Set([\"shortText\", \"longText\", \"richText\", \"number\", \"boolean\", \"dateTime\", \"asset\", \"reference\"]);\n\nfunction assertModel(model: ContentModel) {\n const ids = new Set<string>();\n for (const field of model.fields) {\n if (!field.id?.trim() || ids.has(field.id)) throw new Error(\"Content model field IDs must be nonempty and unique.\");\n if (!fieldTypes.has(field.type)) throw new Error(`Unsupported content field type: ${field.type}`);\n ids.add(field.id);\n }\n}\n\n/** Accept UTC ISO strings without rolling invalid dates into the next month. */\nexport function parseUtcDateTime(value: unknown): string | undefined {\n if (typeof value !== \"string\") return;\n const match = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3}))?)?(?:Z|\\+00:00)$/.exec(value);\n if (!match) return;\n const canonical = `${match[1]}:${match[2] ?? \"00\"}.${(match[3] ?? \"\").padEnd(3, \"0\")}Z`;\n const date = new Date(canonical);\n if (Number.isFinite(date.getTime()) && date.toISOString() === canonical) return canonical;\n}\n\nfunction isLink(value: unknown, key: \"assetId\" | \"entryId\"): boolean {\n return !!value && typeof value === \"object\" && key in value &&\n typeof (value as Record<string, unknown>)[key] === \"string\" &&\n ((value as Record<string, string>)[key]).trim().length > 0;\n}\n\nfunction hasRichText(node: JSONContent): boolean {\n return !!node.text?.trim() || node.type === \"horizontalRule\" || !!node.content?.some(hasRichText);\n}\n\n/** Validate data loaded from JSON as well as values emitted by EntryEditor. */\nexport function validateEntryValues(model: ContentModel, values: Record<string, unknown>): EntryErrors {\n assertModel(model);\n return Object.fromEntries(model.fields.flatMap((field): [string, string][] => {\n const value = Object.hasOwn(values, field.id) ? values[field.id] : undefined;\n let error: string | undefined;\n if (value === undefined) {\n if (field.required) error = `${field.label} is required.`;\n } else {\n switch (field.type) {\n case \"shortText\":\n case \"longText\":\n if (typeof value !== \"string\") error = \"Enter text.\";\n else if (field.required && !value.trim()) error = `${field.label} is required.`;\n break;\n case \"richText\":\n error = documentError(value);\n if (!error && field.required && !hasRichText(value as RichTextDocument)) error = `${field.label} is required.`;\n break;\n case \"number\":\n if (typeof value !== \"number\" || !Number.isFinite(value)) error = \"Enter a finite number.\";\n break;\n case \"boolean\":\n if (typeof value !== \"boolean\") error = \"Choose a boolean value.\";\n break;\n case \"dateTime\":\n if (!parseUtcDateTime(value)) error = \"Enter a valid UTC date and time.\";\n break;\n case \"asset\":\n case \"reference\": {\n const key = field.type === \"asset\" ? \"assetId\" : \"entryId\";\n if (field.multiple ? !Array.isArray(value) || !value.every((item) => isLink(item, key)) : !isLink(value, key)) {\n error = field.multiple\n ? `Choose a list of ${field.type === \"asset\" ? \"assets\" : \"entries\"}.`\n : `Choose an ${field.type === \"asset\" ? \"asset\" : \"entry\"}.`;\n } else if (field.required && Array.isArray(value) && value.length === 0) error = `${field.label} is required.`;\n break;\n }\n }\n }\n return error ? [[field.id, error]] : [];\n }));\n}\n","import { useState, type HTMLAttributes, type ReactNode } from \"react\";\nimport { EntryPicker, type EntryItem } from \"../EntryPicker\";\nimport { Field } from \"../Field\";\nimport { NumberField } from \"../NumberField\";\nimport { RichTextEditor, type RichTextDocument } from \"../RichTextEditor\";\nimport { emptyDocument } from \"../RichTextEditor/document\";\nimport { Switch } from \"../Switch\";\nimport { TextArea, TextField } from \"../TextField\";\nimport { parseUtcDateTime, validateEntryValues, type ContentField, type ContentModel, type EntryErrors, type EntryFieldValue, type EntryValues } from \"./model\";\nimport \"./style.css\";\n\nexport { validateEntryValues } from \"./model\";\nexport type { AssetValue, ContentField, ContentModel, EntryErrors, EntryFieldValue, EntryValues, ReferenceValue } from \"./model\";\n\nexport interface EntryEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\"> {\n model: ContentModel;\n value?: EntryValues;\n defaultValue?: EntryValues;\n onValueChange?: (values: EntryValues) => void;\n /** Available assets or entries, keyed by content field ID. */\n pickerItems?: Record<string, EntryItem[]>;\n /** App-provided messages take precedence over built-in validation. */\n errors?: EntryErrors;\n isDisabled?: boolean;\n /** Reveal validation for untouched fields, for example after a submit attempt. */\n showAllErrors?: boolean;\n}\n\nfunction selectedIds(field: ContentField, value: EntryFieldValue | undefined): string[] {\n const key = field.type === \"asset\" ? \"assetId\" : \"entryId\";\n const links = Array.isArray(value) ? value : value === undefined ? [] : [value];\n return links.flatMap((link) => {\n if (!link || typeof link !== \"object\" || !(key in link)) return [];\n const id = (link as unknown as Record<string, unknown>)[key];\n return typeof id === \"string\" ? [id] : [];\n });\n}\n\n/** An ordered set of content inputs; submission and persistence belong to the app. */\nexport function EntryEditor({\n model,\n value,\n defaultValue = {},\n onValueChange,\n pickerItems = {},\n errors = {},\n isDisabled = false,\n showAllErrors = false,\n className,\n ...rest\n}: EntryEditorProps) {\n const [internal, setInternal] = useState<EntryValues>(defaultValue);\n const [changed, setChanged] = useState<Set<string>>(() => new Set());\n const current = value ?? internal;\n const validation = validateEntryValues(model, current);\n\n const commit = (id: string, next: EntryFieldValue | undefined) => {\n if (isDisabled) return;\n const values = { ...current };\n if (next === undefined) delete values[id];\n else values[id] = next;\n if (value === undefined) setInternal(values);\n setChanged((previous) => new Set(previous).add(id));\n onValueChange?.(values);\n };\n\n return (\n <div className={[\"ds-entry-editor\", className].filter(Boolean).join(\" \")} {...rest}>\n {model.fields.map((field) => {\n const stored = Object.hasOwn(current, field.id) ? current[field.id] : undefined;\n const isPicker = field.type === \"asset\" || field.type === \"reference\";\n const label = field.type === \"dateTime\" ? `${field.label} (UTC)` : field.label;\n const error = errors[field.id] ?? (showAllErrors || changed.has(field.id) ? validation[field.id] : undefined);\n return (\n <Field key={field.id} label={label} hint={field.hint} error={error} isRequired={field.required} isGroup={isPicker}>\n {({ required, ...accessibility }): ReactNode => {\n switch (field.type) {\n case \"shortText\":\n case \"longText\": {\n const Control = field.type === \"shortText\" ? TextField : TextArea;\n return <Control {...accessibility} required={required} disabled={isDisabled} placeholder={field.placeholder}\n value={typeof stored === \"string\" ? stored : \"\"} onChange={(event) => commit(field.id, event.target.value)} />;\n }\n case \"number\":\n return <NumberField {...accessibility} required={required} isDisabled={isDisabled} placeholder={field.placeholder} step=\"any\"\n hasSteppers={false} value={typeof stored === \"number\" && Number.isFinite(stored) ? stored : \"\"}\n onValueChange={(next) => { if (next === \"\" || Number.isFinite(next)) commit(field.id, next === \"\" ? undefined : next); }} />;\n case \"boolean\":\n return <Switch {...accessibility} isDisabled={isDisabled} isSelected={stored === true}\n onSelectedChange={(next) => commit(field.id, next)} />;\n case \"dateTime\":\n return <TextField {...accessibility} required={required} disabled={isDisabled} type=\"datetime-local\" step=\"0.001\"\n value={parseUtcDateTime(stored)?.slice(0, -1) ?? \"\"}\n onChange={(event) => commit(field.id, parseUtcDateTime(`${event.target.value}Z`))} />;\n case \"richText\":\n return <RichTextEditor {...accessibility} label={field.label} isRequired={required} isDisabled={isDisabled}\n placeholder={field.placeholder} format=\"json\" value={stored === undefined ? emptyDocument : stored as RichTextDocument}\n onChange={(next) => commit(field.id, next)} />;\n case \"asset\":\n case \"reference\":\n return <div {...accessibility} role=\"group\">\n <EntryPicker items={pickerItems[field.id] ?? []} value={selectedIds(field, stored)}\n label={field.type === \"asset\" ? \"Assets\" : \"Entries\"} addLabel={`Choose ${field.label}`}\n mode={field.multiple ? \"multiple\" : \"single\"} isDisabled={isDisabled}\n onValueChange={(ids) => {\n if (field.type === \"asset\") {\n const links = ids.map((assetId) => ({ assetId }));\n commit(field.id, field.multiple ? links : links[0]);\n } else {\n const links = ids.map((entryId) => ({ entryId }));\n commit(field.id, field.multiple ? links : links[0]);\n }\n }} />\n </div>;\n }\n }}\n </Field>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./RichTextEditor-tFkISOvq.cjs"),t=require("../components/EntryPicker/index.cjs"),n=require("../components/Field/index.cjs"),r=require("../components/NumberField/index.cjs"),i=require("../components/Switch/index.cjs"),a=require("../components/TextField/index.cjs");let o=require("react"),s=require("react/jsx-runtime");var c=new Set([`shortText`,`longText`,`richText`,`number`,`boolean`,`dateTime`,`asset`,`reference`]);function l(e){let t=new Set;for(let n of e.fields){if(!n.id?.trim()||t.has(n.id))throw Error(`Content model field IDs must be nonempty and unique.`);if(!c.has(n.type))throw Error(`Unsupported content field type: ${n.type}`);t.add(n.id)}}function u(e){if(typeof e!=`string`)return;let t=/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2})(?::(\d{2})(?:\.(\d{1,3}))?)?(?:Z|\+00:00)$/.exec(e);if(!t)return;let n=`${t[1]}:${t[2]??`00`}.${(t[3]??``).padEnd(3,`0`)}Z`,r=new Date(n);if(Number.isFinite(r.getTime())&&r.toISOString()===n)return n}function d(e,t){return!!e&&typeof e==`object`&&t in e&&typeof e[t]==`string`&&e[t].trim().length>0}function f(e){return!!e.text?.trim()||e.type===`horizontalRule`||!!e.content?.some(f)}function p(t,n){return l(t),Object.fromEntries(t.fields.flatMap(t=>{let r=Object.hasOwn(n,t.id)?n[t.id]:void 0,i;if(r===void 0)t.required&&(i=`${t.label} is required.`);else switch(t.type){case`shortText`:case`longText`:typeof r==`string`?t.required&&!r.trim()&&(i=`${t.label} is required.`):i=`Enter text.`;break;case`richText`:i=e.n(r),!i&&t.required&&!f(r)&&(i=`${t.label} is required.`);break;case`number`:(typeof r!=`number`||!Number.isFinite(r))&&(i=`Enter a finite number.`);break;case`boolean`:typeof r!=`boolean`&&(i=`Choose a boolean value.`);break;case`dateTime`:u(r)||(i=`Enter a valid UTC date and time.`);break;case`asset`:case`reference`:{let e=t.type===`asset`?`assetId`:`entryId`;(t.multiple?!Array.isArray(r)||!r.every(t=>d(t,e)):!d(r,e))?i=t.multiple?`Choose a list of ${t.type===`asset`?`assets`:`entries`}.`:`Choose an ${t.type===`asset`?`asset`:`entry`}.`:t.required&&Array.isArray(r)&&r.length===0&&(i=`${t.label} is required.`);break}}return i?[[t.id,i]]:[]}))}function m(e,t){let n=e.type===`asset`?`assetId`:`entryId`;return(Array.isArray(t)?t:t===void 0?[]:[t]).flatMap(e=>{if(!e||typeof e!=`object`||!(n in e))return[];let t=e[n];return typeof t==`string`?[t]:[]})}function h({model:c,value:l,defaultValue:d={},onValueChange:f,pickerItems:h={},errors:g={},isDisabled:_=!1,showAllErrors:v=!1,className:y,...b}){let[x,S]=(0,o.useState)(d),[C,w]=(0,o.useState)(()=>new Set),T=l??x,E=p(c,T),D=(e,t)=>{if(_)return;let n={...T};t===void 0?delete n[e]:n[e]=t,l===void 0&&S(n),w(t=>new Set(t).add(e)),f?.(n)};return(0,s.jsx)(`div`,{className:[`ds-entry-editor`,y].filter(Boolean).join(` `),...b,children:c.fields.map(o=>{let c=Object.hasOwn(T,o.id)?T[o.id]:void 0,l=o.type===`asset`||o.type===`reference`,d=o.type===`dateTime`?`${o.label} (UTC)`:o.label,f=g[o.id]??(v||C.has(o.id)?E[o.id]:void 0);return(0,s.jsx)(n.Field,{label:d,hint:o.hint,error:f,isRequired:o.required,isGroup:l,children:({required:n,...l})=>{switch(o.type){case`shortText`:case`longText`:{let e=o.type===`shortText`?a.TextField:a.TextArea;return(0,s.jsx)(e,{...l,required:n,disabled:_,placeholder:o.placeholder,value:typeof c==`string`?c:``,onChange:e=>D(o.id,e.target.value)})}case`number`:return(0,s.jsx)(r.NumberField,{...l,required:n,isDisabled:_,placeholder:o.placeholder,step:`any`,hasSteppers:!1,value:typeof c==`number`&&Number.isFinite(c)?c:``,onValueChange:e=>{(e===``||Number.isFinite(e))&&D(o.id,e===``?void 0:e)}});case`boolean`:return(0,s.jsx)(i.Switch,{...l,isDisabled:_,isSelected:c===!0,onSelectedChange:e=>D(o.id,e)});case`dateTime`:return(0,s.jsx)(a.TextField,{...l,required:n,disabled:_,type:`datetime-local`,step:`0.001`,value:u(c)?.slice(0,-1)??``,onChange:e=>D(o.id,u(`${e.target.value}Z`))});case`richText`:return(0,s.jsx)(e.t,{...l,label:o.label,isRequired:n,isDisabled:_,placeholder:o.placeholder,format:`json`,value:c===void 0?e.r:c,onChange:e=>D(o.id,e)});case`asset`:case`reference`:return(0,s.jsx)(`div`,{...l,role:`group`,children:(0,s.jsx)(t.EntryPicker,{items:h[o.id]??[],value:m(o,c),label:o.type===`asset`?`Assets`:`Entries`,addLabel:`Choose ${o.label}`,mode:o.multiple?`multiple`:`single`,isDisabled:_,onValueChange:e=>{if(o.type===`asset`){let t=e.map(e=>({assetId:e}));D(o.id,o.multiple?t:t[0])}else{let t=e.map(e=>({entryId:e}));D(o.id,o.multiple?t:t[0])}}})})}}},o.id)})})}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return h}});
|
|
2
|
+
//# sourceMappingURL=EntryEditor-cjDk4vdH.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryEditor-cjDk4vdH.cjs","names":["documentError","useState","Field","TextField","TextArea","NumberField","Switch","RichTextEditor","emptyDocument","EntryPicker","require_RichTextEditor","require_components_EntryPicker_index","require_components_Field_index","require_components_NumberField_index","require_components_Switch_index","require_components_TextField_index","react","react_jsx_runtime","fieldTypes","assertModel","ids","field","model","parseUtcDateTime","value","match","canonical","date","isLink","key","hasRichText","node","validateEntryValues","values","error","item","selectedIds","link","id","EntryEditor","rest","internal","setInternal","defaultValue","changed","setChanged","current","validation","commit","isDisabled","next","previous","onValueChange","className","stored","isPicker","label","errors","showAllErrors","accessibility","Control","event","required","pickerItems","links"],"sources":["../../src/components/EntryEditor/model.ts","../../src/components/EntryEditor/index.tsx"],"sourcesContent":["import type { JSONContent } from \"@tiptap/react\";\nimport { documentError } from \"../RichTextEditor/document\";\nimport type { RichTextDocument } from \"../RichTextEditor\";\n\ninterface ContentFieldBase {\n id: string;\n label: string;\n hint?: string;\n placeholder?: string;\n required?: boolean;\n}\n\nexport type ContentField = ContentFieldBase & (\n | { type: \"shortText\" | \"longText\" | \"richText\" | \"number\" | \"boolean\" | \"dateTime\"; multiple?: never }\n | { type: \"asset\" | \"reference\"; multiple?: boolean }\n);\n\nexport interface ContentModel {\n fields: readonly ContentField[];\n}\n\nexport interface AssetValue { assetId: string }\nexport interface ReferenceValue { entryId: string }\nexport type EntryFieldValue = string | number | boolean | RichTextDocument | AssetValue | ReferenceValue | AssetValue[] | ReferenceValue[];\nexport type EntryValues = Record<string, EntryFieldValue | undefined>;\nexport type EntryErrors = Partial<Record<string, string>>;\n\nconst fieldTypes = new Set([\"shortText\", \"longText\", \"richText\", \"number\", \"boolean\", \"dateTime\", \"asset\", \"reference\"]);\n\nfunction assertModel(model: ContentModel) {\n const ids = new Set<string>();\n for (const field of model.fields) {\n if (!field.id?.trim() || ids.has(field.id)) throw new Error(\"Content model field IDs must be nonempty and unique.\");\n if (!fieldTypes.has(field.type)) throw new Error(`Unsupported content field type: ${field.type}`);\n ids.add(field.id);\n }\n}\n\n/** Accept UTC ISO strings without rolling invalid dates into the next month. */\nexport function parseUtcDateTime(value: unknown): string | undefined {\n if (typeof value !== \"string\") return;\n const match = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3}))?)?(?:Z|\\+00:00)$/.exec(value);\n if (!match) return;\n const canonical = `${match[1]}:${match[2] ?? \"00\"}.${(match[3] ?? \"\").padEnd(3, \"0\")}Z`;\n const date = new Date(canonical);\n if (Number.isFinite(date.getTime()) && date.toISOString() === canonical) return canonical;\n}\n\nfunction isLink(value: unknown, key: \"assetId\" | \"entryId\"): boolean {\n return !!value && typeof value === \"object\" && key in value &&\n typeof (value as Record<string, unknown>)[key] === \"string\" &&\n ((value as Record<string, string>)[key]).trim().length > 0;\n}\n\nfunction hasRichText(node: JSONContent): boolean {\n return !!node.text?.trim() || node.type === \"horizontalRule\" || !!node.content?.some(hasRichText);\n}\n\n/** Validate data loaded from JSON as well as values emitted by EntryEditor. */\nexport function validateEntryValues(model: ContentModel, values: Record<string, unknown>): EntryErrors {\n assertModel(model);\n return Object.fromEntries(model.fields.flatMap((field): [string, string][] => {\n const value = Object.hasOwn(values, field.id) ? values[field.id] : undefined;\n let error: string | undefined;\n if (value === undefined) {\n if (field.required) error = `${field.label} is required.`;\n } else {\n switch (field.type) {\n case \"shortText\":\n case \"longText\":\n if (typeof value !== \"string\") error = \"Enter text.\";\n else if (field.required && !value.trim()) error = `${field.label} is required.`;\n break;\n case \"richText\":\n error = documentError(value);\n if (!error && field.required && !hasRichText(value as RichTextDocument)) error = `${field.label} is required.`;\n break;\n case \"number\":\n if (typeof value !== \"number\" || !Number.isFinite(value)) error = \"Enter a finite number.\";\n break;\n case \"boolean\":\n if (typeof value !== \"boolean\") error = \"Choose a boolean value.\";\n break;\n case \"dateTime\":\n if (!parseUtcDateTime(value)) error = \"Enter a valid UTC date and time.\";\n break;\n case \"asset\":\n case \"reference\": {\n const key = field.type === \"asset\" ? \"assetId\" : \"entryId\";\n if (field.multiple ? !Array.isArray(value) || !value.every((item) => isLink(item, key)) : !isLink(value, key)) {\n error = field.multiple\n ? `Choose a list of ${field.type === \"asset\" ? \"assets\" : \"entries\"}.`\n : `Choose an ${field.type === \"asset\" ? \"asset\" : \"entry\"}.`;\n } else if (field.required && Array.isArray(value) && value.length === 0) error = `${field.label} is required.`;\n break;\n }\n }\n }\n return error ? [[field.id, error]] : [];\n }));\n}\n","import { useState, type HTMLAttributes, type ReactNode } from \"react\";\nimport { EntryPicker, type EntryItem } from \"../EntryPicker\";\nimport { Field } from \"../Field\";\nimport { NumberField } from \"../NumberField\";\nimport { RichTextEditor, type RichTextDocument } from \"../RichTextEditor\";\nimport { emptyDocument } from \"../RichTextEditor/document\";\nimport { Switch } from \"../Switch\";\nimport { TextArea, TextField } from \"../TextField\";\nimport { parseUtcDateTime, validateEntryValues, type ContentField, type ContentModel, type EntryErrors, type EntryFieldValue, type EntryValues } from \"./model\";\nimport \"./style.css\";\n\nexport { validateEntryValues } from \"./model\";\nexport type { AssetValue, ContentField, ContentModel, EntryErrors, EntryFieldValue, EntryValues, ReferenceValue } from \"./model\";\n\nexport interface EntryEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\"> {\n model: ContentModel;\n value?: EntryValues;\n defaultValue?: EntryValues;\n onValueChange?: (values: EntryValues) => void;\n /** Available assets or entries, keyed by content field ID. */\n pickerItems?: Record<string, EntryItem[]>;\n /** App-provided messages take precedence over built-in validation. */\n errors?: EntryErrors;\n isDisabled?: boolean;\n /** Reveal validation for untouched fields, for example after a submit attempt. */\n showAllErrors?: boolean;\n}\n\nfunction selectedIds(field: ContentField, value: EntryFieldValue | undefined): string[] {\n const key = field.type === \"asset\" ? \"assetId\" : \"entryId\";\n const links = Array.isArray(value) ? value : value === undefined ? [] : [value];\n return links.flatMap((link) => {\n if (!link || typeof link !== \"object\" || !(key in link)) return [];\n const id = (link as unknown as Record<string, unknown>)[key];\n return typeof id === \"string\" ? [id] : [];\n });\n}\n\n/** An ordered set of content inputs; submission and persistence belong to the app. */\nexport function EntryEditor({\n model,\n value,\n defaultValue = {},\n onValueChange,\n pickerItems = {},\n errors = {},\n isDisabled = false,\n showAllErrors = false,\n className,\n ...rest\n}: EntryEditorProps) {\n const [internal, setInternal] = useState<EntryValues>(defaultValue);\n const [changed, setChanged] = useState<Set<string>>(() => new Set());\n const current = value ?? internal;\n const validation = validateEntryValues(model, current);\n\n const commit = (id: string, next: EntryFieldValue | undefined) => {\n if (isDisabled) return;\n const values = { ...current };\n if (next === undefined) delete values[id];\n else values[id] = next;\n if (value === undefined) setInternal(values);\n setChanged((previous) => new Set(previous).add(id));\n onValueChange?.(values);\n };\n\n return (\n <div className={[\"ds-entry-editor\", className].filter(Boolean).join(\" \")} {...rest}>\n {model.fields.map((field) => {\n const stored = Object.hasOwn(current, field.id) ? current[field.id] : undefined;\n const isPicker = field.type === \"asset\" || field.type === \"reference\";\n const label = field.type === \"dateTime\" ? `${field.label} (UTC)` : field.label;\n const error = errors[field.id] ?? (showAllErrors || changed.has(field.id) ? validation[field.id] : undefined);\n return (\n <Field key={field.id} label={label} hint={field.hint} error={error} isRequired={field.required} isGroup={isPicker}>\n {({ required, ...accessibility }): ReactNode => {\n switch (field.type) {\n case \"shortText\":\n case \"longText\": {\n const Control = field.type === \"shortText\" ? TextField : TextArea;\n return <Control {...accessibility} required={required} disabled={isDisabled} placeholder={field.placeholder}\n value={typeof stored === \"string\" ? stored : \"\"} onChange={(event) => commit(field.id, event.target.value)} />;\n }\n case \"number\":\n return <NumberField {...accessibility} required={required} isDisabled={isDisabled} placeholder={field.placeholder} step=\"any\"\n hasSteppers={false} value={typeof stored === \"number\" && Number.isFinite(stored) ? stored : \"\"}\n onValueChange={(next) => { if (next === \"\" || Number.isFinite(next)) commit(field.id, next === \"\" ? undefined : next); }} />;\n case \"boolean\":\n return <Switch {...accessibility} isDisabled={isDisabled} isSelected={stored === true}\n onSelectedChange={(next) => commit(field.id, next)} />;\n case \"dateTime\":\n return <TextField {...accessibility} required={required} disabled={isDisabled} type=\"datetime-local\" step=\"0.001\"\n value={parseUtcDateTime(stored)?.slice(0, -1) ?? \"\"}\n onChange={(event) => commit(field.id, parseUtcDateTime(`${event.target.value}Z`))} />;\n case \"richText\":\n return <RichTextEditor {...accessibility} label={field.label} isRequired={required} isDisabled={isDisabled}\n placeholder={field.placeholder} format=\"json\" value={stored === undefined ? emptyDocument : stored as RichTextDocument}\n onChange={(next) => commit(field.id, next)} />;\n case \"asset\":\n case \"reference\":\n return <div {...accessibility} role=\"group\">\n <EntryPicker items={pickerItems[field.id] ?? []} value={selectedIds(field, stored)}\n label={field.type === \"asset\" ? \"Assets\" : \"Entries\"} addLabel={`Choose ${field.label}`}\n mode={field.multiple ? \"multiple\" : \"single\"} isDisabled={isDisabled}\n onValueChange={(ids) => {\n if (field.type === \"asset\") {\n const links = ids.map((assetId) => ({ assetId }));\n commit(field.id, field.multiple ? links : links[0]);\n } else {\n const links = ids.map((entryId) => ({ entryId }));\n commit(field.id, field.multiple ? links : links[0]);\n }\n }} />\n </div>;\n }\n }}\n </Field>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { forwardRef as e } from "react";
|
|
2
|
+
import { AlertTriangle as t, Archive as n, ArrowLeft as r, ArrowRight as i, Bell as a, Bold as o, Calendar as ee, Check as s, ChevronDown as c, ChevronLeft as l, ChevronRight as u, ChevronUp as d, ChevronsLeft as f, ChevronsRight as p, Clock as m, Code as h, Copy as g, Download as _, Eye as v, FileText as y, Filter as b, FolderClosed as x, Globe as S, GripHorizontal as C, GripVertical as w, Heading2 as T, Heading3 as E, Home as D, Image as O, Info as k, Italic as A, LayoutGrid as te, Link as j, Link2Off as M, List as N, ListOrdered as P, Loader2 as F, Menu as I, Minus as L, MoreHorizontal as R, Pencil as z, Plus as B, Quote as V, Redo2 as H, RotateCcw as U, RotateCw as W, Search as G, Settings as K, Strikethrough as q, Trash2 as J, Undo2 as Y, Upload as X, User as Z, Users as Q, X as ne } from "lucide-react";
|
|
3
|
+
import { jsx as re } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/Icon/icons.ts
|
|
5
|
+
var $ = {
|
|
6
|
+
"alert-triangle": t,
|
|
7
|
+
archive: n,
|
|
8
|
+
bold: o,
|
|
9
|
+
code: h,
|
|
10
|
+
"heading-2": T,
|
|
11
|
+
"heading-3": E,
|
|
12
|
+
italic: A,
|
|
13
|
+
"link-off": M,
|
|
14
|
+
list: N,
|
|
15
|
+
"list-ordered": P,
|
|
16
|
+
quote: V,
|
|
17
|
+
redo: H,
|
|
18
|
+
strikethrough: q,
|
|
19
|
+
undo: Y,
|
|
20
|
+
"arrow-left": r,
|
|
21
|
+
"arrow-right": i,
|
|
22
|
+
calendar: ee,
|
|
23
|
+
check: s,
|
|
24
|
+
"chevron-down": c,
|
|
25
|
+
"chevron-left": l,
|
|
26
|
+
"chevron-up": d,
|
|
27
|
+
minus: L,
|
|
28
|
+
"chevron-right": u,
|
|
29
|
+
clock: m,
|
|
30
|
+
copy: g,
|
|
31
|
+
download: _,
|
|
32
|
+
eye: v,
|
|
33
|
+
filter: b,
|
|
34
|
+
bell: a,
|
|
35
|
+
"chevrons-left": f,
|
|
36
|
+
"chevrons-right": p,
|
|
37
|
+
"file-text": y,
|
|
38
|
+
folder: x,
|
|
39
|
+
globe: S,
|
|
40
|
+
home: D,
|
|
41
|
+
"layout-grid": te,
|
|
42
|
+
menu: I,
|
|
43
|
+
users: Q,
|
|
44
|
+
"grip-horizontal": C,
|
|
45
|
+
"grip-vertical": w,
|
|
46
|
+
image: O,
|
|
47
|
+
info: k,
|
|
48
|
+
link: j,
|
|
49
|
+
spinner: F,
|
|
50
|
+
"more-horizontal": R,
|
|
51
|
+
pencil: z,
|
|
52
|
+
plus: B,
|
|
53
|
+
"rotate-ccw": U,
|
|
54
|
+
"rotate-cw": W,
|
|
55
|
+
search: G,
|
|
56
|
+
settings: K,
|
|
57
|
+
trash: J,
|
|
58
|
+
upload: X,
|
|
59
|
+
user: Z,
|
|
60
|
+
x: ne
|
|
61
|
+
}, ie = Object.keys($), ae = e(function({ name: e, size: t = 16, className: n, ...r }, i) {
|
|
62
|
+
let a = $[e];
|
|
63
|
+
return /* @__PURE__ */ re(a, {
|
|
64
|
+
ref: i,
|
|
65
|
+
width: t,
|
|
66
|
+
height: t,
|
|
67
|
+
className: ["ds-icon", n].filter(Boolean).join(" "),
|
|
68
|
+
role: r["aria-label"] ? "img" : void 0,
|
|
69
|
+
"aria-hidden": !r["aria-label"] || void 0,
|
|
70
|
+
focusable: "false",
|
|
71
|
+
...r
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//#endregion
|
|
75
|
+
export { ie as n, $ as r, ae as t };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=Icon-CGY1FNXT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icon-CGY1FNXT.js","names":["icons","AlertTriangle","Archive","Bold","Code","Heading2","Heading3","Italic","Link2Off","List","ListOrdered","Quote","Redo2","Strikethrough","Undo2","ArrowLeft","ArrowRight","Calendar","Check","ChevronDown","ChevronLeft","ChevronUp","Minus","ChevronRight","Clock","Copy","Download","Eye","Filter","Bell","ChevronsLeft","ChevronsRight","FileText","FolderClosed","Globe","Home","LayoutGrid","Menu","Users","GripHorizontal","GripVertical","Image","Info","Link","Loader2","MoreHorizontal","Pencil","Plus","RotateCcw","RotateCw","Search","Settings","Trash2","Upload","User","X","iconNames","Icon","forwardRef","rest","Glyph","name","size","className"],"sources":["../../src/components/Icon/icons.ts","../../src/components/Icon/index.tsx"],"sourcesContent":["import {\n AlertTriangle,\n Bold,\n Code,\n Heading2,\n Heading3,\n Italic,\n Link2Off,\n List,\n ListOrdered,\n Quote,\n Redo2,\n Strikethrough,\n Undo2,\n Archive,\n ArrowLeft,\n ArrowRight,\n Calendar,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronUp,\n Minus,\n ChevronRight,\n Clock,\n Copy,\n Download,\n Eye,\n Filter,\n Bell,\n ChevronsLeft,\n ChevronsRight,\n FileText,\n FolderClosed,\n Globe,\n Home,\n LayoutGrid,\n Menu,\n Users,\n GripHorizontal,\n GripVertical,\n Image,\n Info,\n Link,\n Loader2,\n MoreHorizontal,\n Pencil,\n Plus,\n RotateCcw,\n RotateCw,\n Search,\n Settings,\n Trash2,\n Upload,\n User,\n X,\n} from \"lucide-react\";\n\n/**\n * The finite icon set. Adding a glyph means adding a line here — a visible\n * decision rather than an import someone typed at a call site.\n */\nexport const icons = {\n \"alert-triangle\": AlertTriangle,\n archive: Archive,\n bold: Bold,\n code: Code,\n \"heading-2\": Heading2,\n \"heading-3\": Heading3,\n italic: Italic,\n \"link-off\": Link2Off,\n list: List,\n \"list-ordered\": ListOrdered,\n quote: Quote,\n redo: Redo2,\n strikethrough: Strikethrough,\n undo: Undo2,\n \"arrow-left\": ArrowLeft,\n \"arrow-right\": ArrowRight,\n calendar: Calendar,\n check: Check,\n \"chevron-down\": ChevronDown,\n \"chevron-left\": ChevronLeft,\n \"chevron-up\": ChevronUp,\n minus: Minus,\n \"chevron-right\": ChevronRight,\n clock: Clock,\n copy: Copy,\n download: Download,\n eye: Eye,\n filter: Filter,\n bell: Bell,\n \"chevrons-left\": ChevronsLeft,\n \"chevrons-right\": ChevronsRight,\n \"file-text\": FileText,\n folder: FolderClosed,\n globe: Globe,\n home: Home,\n \"layout-grid\": LayoutGrid,\n menu: Menu,\n users: Users,\n \"grip-horizontal\": GripHorizontal,\n \"grip-vertical\": GripVertical,\n image: Image,\n info: Info,\n link: Link,\n spinner: Loader2,\n \"more-horizontal\": MoreHorizontal,\n pencil: Pencil,\n plus: Plus,\n \"rotate-ccw\": RotateCcw,\n \"rotate-cw\": RotateCw,\n search: Search,\n settings: Settings,\n trash: Trash2,\n upload: Upload,\n user: User,\n x: X,\n} as const;\n\nexport type IconName = keyof typeof icons;\n\nexport const iconNames = Object.keys(icons) as IconName[];\n","import { forwardRef, type SVGProps } from \"react\";\nimport { icons, type IconName } from \"./icons\";\nimport \"./style.css\";\n\nexport type IconSize = 16 | 20 | 24;\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, \"ref\"> {\n /** Glyph name from the curated set in `icons.ts`. */\n name: IconName;\n /** 16 inside controls, 20 standalone, 24 for empty states. No other sizes. */\n size?: IconSize;\n}\n\n/**\n * A glyph that clarifies an action or a status. Inherits `currentColor`, so it\n * takes its colour from the control it sits in — it never carries its own.\n */\nexport const Icon = forwardRef<SVGSVGElement, IconProps>(function Icon(\n { name, size = 16, className, ...rest },\n ref,\n) {\n const Glyph = icons[name];\n return (\n <Glyph\n ref={ref}\n width={size}\n height={size}\n className={[\"ds-icon\", className].filter(Boolean).join(\" \")}\n role={rest[\"aria-label\"] ? \"img\" : undefined}\n aria-hidden={rest[\"aria-label\"] ? undefined : true}\n focusable=\"false\"\n {...rest}\n />\n );\n});\n"],"mappings":";;;;AA8DA,IAAaA,IAAQ;CACnB,kBAAkBC;CAClB,SAASC;CACT,MAAMC;CACN,MAAMC;CACN,aAAaC;CACb,aAAaC;CACb,QAAQC;CACR,YAAYC;CACZ,MAAMC;CACN,gBAAgBC;CAChB,OAAOC;CACP,MAAMC;CACN,eAAeC;CACf,MAAMC;CACN,cAAcC;CACd,eAAeC;CACf,UAAUC;CACV,OAAOC;CACP,gBAAgBC;CAChB,gBAAgBC;CAChB,cAAcC;CACd,OAAOC;CACP,iBAAiBC;CACjB,OAAOC;CACP,MAAMC;CACN,UAAUC;CACV,KAAKC;CACL,QAAQC;CACR,MAAMC;CACN,iBAAiBC;CACjB,kBAAkBC;CAClB,aAAaC;CACb,QAAQC;CACR,OAAOC;CACP,MAAMC;CACN,eAAeC;CACf,MAAMC;CACN,OAAOC;CACP,mBAAmBC;CACnB,iBAAiBC;CACjB,OAAOC;CACP,MAAMC;CACN,MAAMC;CACN,SAASC;CACT,mBAAmBC;CACnB,QAAQC;CACR,MAAMC;CACN,cAAcC;CACd,aAAaC;CACb,QAAQC;CACR,UAAUC;CACV,OAAOC;CACP,QAAQC;CACR,MAAMC;CACN,GAAGC;AACL,GAIaC,KAAY,OAAO,KAAKxD,CAAK,GCzG7ByD,KAAOC,EAAqC,SACvD,EAAE,SAAM,UAAO,IAAI,cAAW,GAAGC,KACjC,GACA;CACA,IAAMC,IAAQ5D,EAAM6D;CACpB,OACE,mBAACD,GAAD;EACO;EACL,OAAOE;EACP,QAAQA;EACR,WAAW,CAAC,WAAWC,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAC1D,MAAMJ,EAAK,gBAAgB,QAAQ,KAAA;EACnC,eAAa,GAAK,iBAAgB,KAAA;EAClC,WAAU;EACV,GAAIA;CACL,CAAA;AAEL,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=require("react"),t=require("lucide-react"),n=require("react/jsx-runtime");var r={"alert-triangle":t.AlertTriangle,archive:t.Archive,bold:t.Bold,code:t.Code,"heading-2":t.Heading2,"heading-3":t.Heading3,italic:t.Italic,"link-off":t.Link2Off,list:t.List,"list-ordered":t.ListOrdered,quote:t.Quote,redo:t.Redo2,strikethrough:t.Strikethrough,undo:t.Undo2,"arrow-left":t.ArrowLeft,"arrow-right":t.ArrowRight,calendar:t.Calendar,check:t.Check,"chevron-down":t.ChevronDown,"chevron-left":t.ChevronLeft,"chevron-up":t.ChevronUp,minus:t.Minus,"chevron-right":t.ChevronRight,clock:t.Clock,copy:t.Copy,download:t.Download,eye:t.Eye,filter:t.Filter,bell:t.Bell,"chevrons-left":t.ChevronsLeft,"chevrons-right":t.ChevronsRight,"file-text":t.FileText,folder:t.FolderClosed,globe:t.Globe,home:t.Home,"layout-grid":t.LayoutGrid,menu:t.Menu,users:t.Users,"grip-horizontal":t.GripHorizontal,"grip-vertical":t.GripVertical,image:t.Image,info:t.Info,link:t.Link,spinner:t.Loader2,"more-horizontal":t.MoreHorizontal,pencil:t.Pencil,plus:t.Plus,"rotate-ccw":t.RotateCcw,"rotate-cw":t.RotateCw,search:t.Search,settings:t.Settings,trash:t.Trash2,upload:t.Upload,user:t.User,x:t.X},i=Object.keys(r),a=(0,e.forwardRef)(function({name:e,size:t=16,className:i,...a},o){let s=r[e];return(0,n.jsx)(s,{ref:o,width:t,height:t,className:[`ds-icon`,i].filter(Boolean).join(` `),role:a[`aria-label`]?`img`:void 0,"aria-hidden":!a[`aria-label`]||void 0,focusable:`false`,...a})});Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return a}});
|
|
2
|
+
//# sourceMappingURL=Icon-CWsA1W83.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icon-CWsA1W83.cjs","names":["AlertTriangle","Archive","Bold","Code","Heading2","Heading3","Italic","Link2Off","List","ListOrdered","Quote","Redo2","Strikethrough","Undo2","ArrowLeft","ArrowRight","Calendar","Check","ChevronDown","ChevronLeft","ChevronUp","Minus","ChevronRight","Clock","Copy","Download","Eye","Filter","Bell","ChevronsLeft","ChevronsRight","FileText","FolderClosed","Globe","Home","LayoutGrid","Menu","Users","GripHorizontal","GripVertical","Image","Info","Link","Loader2","MoreHorizontal","Pencil","Plus","RotateCcw","RotateCw","Search","Settings","Trash2","Upload","User","X","forwardRef","react","lucide_react","react_jsx_runtime","icons","iconNames","Icon","rest","Glyph","name","size","className"],"sources":["../../src/components/Icon/icons.ts","../../src/components/Icon/index.tsx"],"sourcesContent":["import {\n AlertTriangle,\n Bold,\n Code,\n Heading2,\n Heading3,\n Italic,\n Link2Off,\n List,\n ListOrdered,\n Quote,\n Redo2,\n Strikethrough,\n Undo2,\n Archive,\n ArrowLeft,\n ArrowRight,\n Calendar,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronUp,\n Minus,\n ChevronRight,\n Clock,\n Copy,\n Download,\n Eye,\n Filter,\n Bell,\n ChevronsLeft,\n ChevronsRight,\n FileText,\n FolderClosed,\n Globe,\n Home,\n LayoutGrid,\n Menu,\n Users,\n GripHorizontal,\n GripVertical,\n Image,\n Info,\n Link,\n Loader2,\n MoreHorizontal,\n Pencil,\n Plus,\n RotateCcw,\n RotateCw,\n Search,\n Settings,\n Trash2,\n Upload,\n User,\n X,\n} from \"lucide-react\";\n\n/**\n * The finite icon set. Adding a glyph means adding a line here — a visible\n * decision rather than an import someone typed at a call site.\n */\nexport const icons = {\n \"alert-triangle\": AlertTriangle,\n archive: Archive,\n bold: Bold,\n code: Code,\n \"heading-2\": Heading2,\n \"heading-3\": Heading3,\n italic: Italic,\n \"link-off\": Link2Off,\n list: List,\n \"list-ordered\": ListOrdered,\n quote: Quote,\n redo: Redo2,\n strikethrough: Strikethrough,\n undo: Undo2,\n \"arrow-left\": ArrowLeft,\n \"arrow-right\": ArrowRight,\n calendar: Calendar,\n check: Check,\n \"chevron-down\": ChevronDown,\n \"chevron-left\": ChevronLeft,\n \"chevron-up\": ChevronUp,\n minus: Minus,\n \"chevron-right\": ChevronRight,\n clock: Clock,\n copy: Copy,\n download: Download,\n eye: Eye,\n filter: Filter,\n bell: Bell,\n \"chevrons-left\": ChevronsLeft,\n \"chevrons-right\": ChevronsRight,\n \"file-text\": FileText,\n folder: FolderClosed,\n globe: Globe,\n home: Home,\n \"layout-grid\": LayoutGrid,\n menu: Menu,\n users: Users,\n \"grip-horizontal\": GripHorizontal,\n \"grip-vertical\": GripVertical,\n image: Image,\n info: Info,\n link: Link,\n spinner: Loader2,\n \"more-horizontal\": MoreHorizontal,\n pencil: Pencil,\n plus: Plus,\n \"rotate-ccw\": RotateCcw,\n \"rotate-cw\": RotateCw,\n search: Search,\n settings: Settings,\n trash: Trash2,\n upload: Upload,\n user: User,\n x: X,\n} as const;\n\nexport type IconName = keyof typeof icons;\n\nexport const iconNames = Object.keys(icons) as IconName[];\n","import { forwardRef, type SVGProps } from \"react\";\nimport { icons, type IconName } from \"./icons\";\nimport \"./style.css\";\n\nexport type IconSize = 16 | 20 | 24;\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, \"ref\"> {\n /** Glyph name from the curated set in `icons.ts`. */\n name: IconName;\n /** 16 inside controls, 20 standalone, 24 for empty states. No other sizes. */\n size?: IconSize;\n}\n\n/**\n * A glyph that clarifies an action or a status. Inherits `currentColor`, so it\n * takes its colour from the control it sits in — it never carries its own.\n */\nexport const Icon = forwardRef<SVGSVGElement, IconProps>(function Icon(\n { name, size = 16, className, ...rest },\n ref,\n) {\n const Glyph = icons[name];\n return (\n <Glyph\n ref={ref}\n width={size}\n height={size}\n className={[\"ds-icon\", className].filter(Boolean).join(\" \")}\n role={rest[\"aria-label\"] ? \"img\" : undefined}\n aria-hidden={rest[\"aria-label\"] ? undefined : true}\n focusable=\"false\"\n {...rest}\n />\n );\n});\n"],"mappings":"A,gFA8DA,IAAa2D,EAAQ,CACnB,iBAAkB3D,EAAAA,cAClB,QAASC,EAAAA,QACT,KAAMC,EAAAA,KACN,KAAMC,EAAAA,KACN,YAAaC,EAAAA,SACb,YAAaC,EAAAA,SACb,OAAQC,EAAAA,OACR,WAAYC,EAAAA,SACZ,KAAMC,EAAAA,KACN,eAAgBC,EAAAA,YAChB,MAAOC,EAAAA,MACP,KAAMC,EAAAA,MACN,cAAeC,EAAAA,cACf,KAAMC,EAAAA,MACN,aAAcC,EAAAA,UACd,cAAeC,EAAAA,WACf,SAAUC,EAAAA,SACV,MAAOC,EAAAA,MACP,eAAgBC,EAAAA,YAChB,eAAgBC,EAAAA,YAChB,aAAcC,EAAAA,UACd,MAAOC,EAAAA,MACP,gBAAiBC,EAAAA,aACjB,MAAOC,EAAAA,MACP,KAAMC,EAAAA,KACN,SAAUC,EAAAA,SACV,IAAKC,EAAAA,IACL,OAAQC,EAAAA,OACR,KAAMC,EAAAA,KACN,gBAAiBC,EAAAA,aACjB,iBAAkBC,EAAAA,cAClB,YAAaC,EAAAA,SACb,OAAQC,EAAAA,aACR,MAAOC,EAAAA,MACP,KAAMC,EAAAA,KACN,cAAeC,EAAAA,WACf,KAAMC,EAAAA,KACN,MAAOC,EAAAA,MACP,kBAAmBC,EAAAA,eACnB,gBAAiBC,EAAAA,aACjB,MAAOC,EAAAA,MACP,KAAMC,EAAAA,KACN,KAAMC,EAAAA,KACN,QAASC,EAAAA,QACT,kBAAmBC,EAAAA,eACnB,OAAQC,EAAAA,OACR,KAAMC,EAAAA,KACN,aAAcC,EAAAA,UACd,YAAaC,EAAAA,SACb,OAAQC,EAAAA,OACR,SAAUC,EAAAA,SACV,MAAOC,EAAAA,OACP,OAAQC,EAAAA,OACR,KAAMC,EAAAA,KACN,EAAGC,EAAAA,CACL,EAIaM,EAAY,OAAO,KAAKD,CAAK,ECzG7BE,GAAA,EAAON,EAAAA,WAAAA,CAAqC,SACvD,CAAE,OAAM,OAAO,GAAI,YAAW,GAAGO,GACjC,EACA,CACA,IAAMC,EAAQJ,EAAMK,GACpB,OACE,EAAAN,EAAA,IAAA,CAACK,EAAD,CACO,MACL,MAAOE,EACP,OAAQA,EACR,UAAW,CAAC,UAAWC,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,EAC1D,KAAMJ,EAAK,cAAgB,MAAQ,IAAA,GACnC,cAAa,GAAK,eAAgB,IAAA,GAClC,UAAU,QACV,GAAIA,CACL,CAAA,CAEL,CAAC,E"}
|