@haklex/rich-renderer-image 0.0.33 → 0.0.35

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @haklex/rich-renderer-image
2
2
 
3
- 图片渲染器,支持 Thumbhash 模糊占位和灯箱。
3
+ 图片渲染器,支持 Thumbhash 模糊占位、灯箱预览和编辑器内图片管理。
4
4
 
5
5
  ## 安装
6
6
 
@@ -17,10 +17,25 @@ export { ImageEditRenderer } from './ImageEditRenderer'
17
17
 
18
18
  ## 功能
19
19
 
20
- - Thumbhash 模糊占位
20
+ - Thumbhash 模糊占位 + 渐显加载动画
21
21
  - 图片灯箱(react-photo-view)
22
- - 图片说明
23
- - 加载状态
22
+ - 图片说明(caption)
23
+ - 加载 / 错误状态
24
+ - 编辑模式:替换、元信息编辑、复制、删除、下载
25
+
26
+ ## 架构
27
+
28
+ ```
29
+ ImageRenderer — 静态渲染(灯箱 + thumbhash)
30
+ ImageEditRenderer — 编辑模式入口,mode !== 'editor' 时回退到 ImageRenderer
31
+ ├── ImageEditContext — Jotai Provider,管理编辑状态 atoms
32
+ ├── ImageEditToolbar — 悬浮工具栏(元信息 / 替换 / 打开 / 复制 / 下载 / 删除)
33
+ ├── EditMetaPopover — 编辑 src / alt / caption
34
+ ├── ReplacePopover — 替换图片(上传 / URL)
35
+ ├── ReplacePanel — Upload / URL 切换面板
36
+ ├── useImageActions — 所有编辑操作 hooks
37
+ └── atoms — Jotai atoms(src, loadState, hovering, replace 状态等)
38
+ ```
24
39
 
25
40
  ## 使用
26
41
 
@@ -28,21 +43,36 @@ export { ImageEditRenderer } from './ImageEditRenderer'
28
43
  import { ImageRenderer } from '@haklex/rich-renderer-image'
29
44
  import type { RendererConfig } from '@haklex/rich-editor'
30
45
 
46
+ // 静态渲染
31
47
  const config: RendererConfig = {
32
48
  Image: ImageRenderer,
33
49
  }
34
- ```
35
50
 
36
- ## 依赖
51
+ // 编辑模式
52
+ import { ImageEditRenderer } from '@haklex/rich-renderer-image'
37
53
 
38
- ```json
39
- {
40
- "@haklex/rich-editor": "workspace:*",
41
- "react-photo-view": "^1.2.0",
42
- "thumbhash": "^0.1.0"
54
+ const editConfig: RendererConfig = {
55
+ Image: ImageEditRenderer,
43
56
  }
44
57
  ```
45
58
 
59
+ ## 样式
60
+
61
+ Vanilla Extract CSS-in-TS。所有样式类通过 `semanticClassNames` 导出语义化 class 名,便于外部覆盖。
62
+
63
+ 加载动画:img 初始 `opacity: 0`,加载完成后通过 `imageVisible` class 施加 `opacity: 1` + mask 渐显动画。
64
+
65
+ ## 依赖
66
+
67
+ | 包 | 用途 |
68
+ |---|------|
69
+ | `@haklex/rich-editor` | 核心类型、节点操作、上传上下文 |
70
+ | `@haklex/rich-editor-ui` | Popover、SegmentedControl |
71
+ | `jotai` | 编辑状态管理 |
72
+ | `lucide-react` | 工具栏图标 |
73
+ | `react-photo-view` | 灯箱 |
74
+ | `thumbhash` | 模糊占位图解码 |
75
+
46
76
  ## License
47
77
 
48
78
  MIT
@@ -0,0 +1,2 @@
1
+ export declare function EditMetaPopover(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=EditMetaPopover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditMetaPopover.d.ts","sourceRoot":"","sources":["../src/EditMetaPopover.tsx"],"names":[],"mappings":"AAYA,wBAAgB,eAAe,4CA6E9B"}
@@ -0,0 +1,7 @@
1
+ import { ImageRendererProps } from '@haklex/rich-editor';
2
+ import { ReactNode } from 'react';
3
+ export declare function ImageEditProvider({ props, children, }: {
4
+ props: ImageRendererProps;
5
+ children: ReactNode;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=ImageEditContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageEditContext.d.ts","sourceRoot":"","sources":["../src/ImageEditContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAoBtC,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,kBAAkB,CAAA;IACzB,QAAQ,EAAE,SAAS,CAAA;CACpB,2CAsDA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ImageEditRenderer.d.ts","sourceRoot":"","sources":["../src/ImageEditRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,qBAAqB,CAAA;AA4B5B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,2CAQ1D"}
1
+ {"version":3,"file":"ImageEditRenderer.d.ts","sourceRoot":"","sources":["../src/ImageEditRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAmB,MAAM,qBAAqB,CAAA;AA2B9E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,2CAQ1D"}
@@ -0,0 +1,2 @@
1
+ export declare function ImageEditToolbar(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ImageEditToolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageEditToolbar.d.ts","sourceRoot":"","sources":["../src/ImageEditToolbar.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,gBAAgB,4CA0G/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"ImageRenderer.d.ts","sourceRoot":"","sources":["../src/ImageRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,4CAA4C,CAAA;AAEnD,OAAO,EAAmB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,OAAO,CAAA;AAuBzD,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,kBAAkB,CAwF3D,CAAA"}
1
+ {"version":3,"file":"ImageRenderer.d.ts","sourceRoot":"","sources":["../src/ImageRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,4CAA4C,CAAA;AAEnD,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,OAAO,CAAA;AAuBzD,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,kBAAkB,CA2F3D,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function ReplacePanel(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ReplacePanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReplacePanel.d.ts","sourceRoot":"","sources":["../src/ReplacePanel.tsx"],"names":[],"mappings":"AAqBA,wBAAgB,YAAY,4CAmH3B"}
@@ -0,0 +1,2 @@
1
+ export declare function ReplacePopover(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ReplacePopover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReplacePopover.d.ts","sourceRoot":"","sources":["../src/ReplacePopover.tsx"],"names":[],"mappings":"AASA,wBAAgB,cAAc,4CAiB7B"}
@@ -0,0 +1,80 @@
1
+ import { CSSProperties, RefObject } from 'react';
2
+ export type ImageLoadState = 'loading' | 'loaded' | 'error';
3
+ export type ReplaceMode = 'upload' | 'url';
4
+ export declare const srcAtom: import('jotai').PrimitiveAtom<string> & {
5
+ init: string;
6
+ };
7
+ export declare const altTextAtom: import('jotai').PrimitiveAtom<string> & {
8
+ init: string;
9
+ };
10
+ export declare const widthAtom: import('jotai').PrimitiveAtom<number | undefined> & {
11
+ init: number | undefined;
12
+ };
13
+ export declare const heightAtom: import('jotai').PrimitiveAtom<number | undefined> & {
14
+ init: number | undefined;
15
+ };
16
+ export declare const captionAtom: import('jotai').PrimitiveAtom<string | undefined> & {
17
+ init: string | undefined;
18
+ };
19
+ export declare const thumbhashAtom: import('jotai').PrimitiveAtom<string | undefined> & {
20
+ init: string | undefined;
21
+ };
22
+ export declare const accentAtom: import('jotai').PrimitiveAtom<string | undefined> & {
23
+ init: string | undefined;
24
+ };
25
+ export declare const loadStateAtom: import('jotai').PrimitiveAtom<ImageLoadState> & {
26
+ init: ImageLoadState;
27
+ };
28
+ export declare const hoveringAtom: import('jotai').PrimitiveAtom<boolean> & {
29
+ init: boolean;
30
+ };
31
+ export declare const metaOpenAtom: import('jotai').PrimitiveAtom<boolean> & {
32
+ init: boolean;
33
+ };
34
+ export declare const replaceOpenAtom: import('jotai').PrimitiveAtom<boolean> & {
35
+ init: boolean;
36
+ };
37
+ export declare const toolbarVisibleAtom: import('jotai').Atom<boolean>;
38
+ export declare const editSrcAtom: import('jotai').PrimitiveAtom<string> & {
39
+ init: string;
40
+ };
41
+ export declare const editAltTextAtom: import('jotai').PrimitiveAtom<string> & {
42
+ init: string;
43
+ };
44
+ export declare const editCaptionAtom: import('jotai').PrimitiveAtom<string> & {
45
+ init: string;
46
+ };
47
+ export declare const replaceModeAtom: import('jotai').PrimitiveAtom<ReplaceMode> & {
48
+ init: ReplaceMode;
49
+ };
50
+ export declare const replaceUrlAtom: import('jotai').PrimitiveAtom<string> & {
51
+ init: string;
52
+ };
53
+ export declare const replacePreviewAtom: import('jotai').PrimitiveAtom<string | null> & {
54
+ init: string | null;
55
+ };
56
+ export declare const replaceMetaAtom: import('jotai').PrimitiveAtom<{
57
+ width: number;
58
+ height: number;
59
+ } | null> & {
60
+ init: {
61
+ width: number;
62
+ height: number;
63
+ } | null;
64
+ };
65
+ export declare const replaceLoadingAtom: import('jotai').PrimitiveAtom<boolean> & {
66
+ init: boolean;
67
+ };
68
+ export declare const replaceErrorAtom: import('jotai').PrimitiveAtom<string | null> & {
69
+ init: string | null;
70
+ };
71
+ export declare const wrapperRefAtom: import('jotai').PrimitiveAtom<RefObject<HTMLDivElement | null>> & {
72
+ init: RefObject<HTMLDivElement | null>;
73
+ };
74
+ export declare const fileInputRefAtom: import('jotai').PrimitiveAtom<RefObject<HTMLInputElement | null>> & {
75
+ init: RefObject<HTMLInputElement | null>;
76
+ };
77
+ export declare const placeholderUrlAtom: import('jotai').Atom<string | undefined>;
78
+ export declare const captionTextAtom: import('jotai').Atom<string | undefined>;
79
+ export declare const frameStyleAtom: import('jotai').Atom<CSSProperties>;
80
+ //# sourceMappingURL=atoms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atoms.d.ts","sourceRoot":"","sources":["../src/atoms.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAErD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AAC3D,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,KAAK,CAAA;AAY1C,eAAO,MAAM,OAAO;;CAAW,CAAA;AAC/B,eAAO,MAAM,WAAW;;CAAW,CAAA;AACnC,eAAO,MAAM,SAAS;;CAA6B,CAAA;AACnD,eAAO,MAAM,UAAU;;CAA6B,CAAA;AACpD,eAAO,MAAM,WAAW;;CAA6B,CAAA;AACrD,eAAO,MAAM,aAAa;;CAA6B,CAAA;AACvD,eAAO,MAAM,UAAU;;CAA6B,CAAA;AAGpD,eAAO,MAAM,aAAa;;CAAkC,CAAA;AAC5D,eAAO,MAAM,YAAY;;CAAc,CAAA;AACvC,eAAO,MAAM,YAAY;;CAAc,CAAA;AACvC,eAAO,MAAM,eAAe;;CAAc,CAAA;AAC1C,eAAO,MAAM,kBAAkB,+BAE9B,CAAA;AAGD,eAAO,MAAM,WAAW;;CAAW,CAAA;AACnC,eAAO,MAAM,eAAe;;CAAW,CAAA;AACvC,eAAO,MAAM,eAAe;;CAAW,CAAA;AAGvC,eAAO,MAAM,eAAe;;CAA8B,CAAA;AAC1D,eAAO,MAAM,cAAc;;CAAW,CAAA;AACtC,eAAO,MAAM,kBAAkB;;CAA4B,CAAA;AAC3D,eAAO,MAAM,eAAe;WACnB,MAAM;YACL,MAAM;;;eADP,MAAM;gBACL,MAAM;;CACD,CAAA;AACf,eAAO,MAAM,kBAAkB;;CAAc,CAAA;AAC7C,eAAO,MAAM,gBAAgB;;CAA4B,CAAA;AAGzD,eAAO,MAAM,cAAc;;CAEzB,CAAA;AACF,eAAO,MAAM,gBAAgB;;CAE3B,CAAA;AAGF,eAAO,MAAM,kBAAkB,0CAG7B,CAAA;AAEF,eAAO,MAAM,eAAe,0CAE3B,CAAA;AAED,eAAO,MAAM,cAAc,qCAiBzB,CAAA"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  export { ImageEditRenderer } from './ImageEditRenderer';
2
2
  export { ImageRenderer } from './ImageRenderer';
3
- export { ImageRenderer as default } from './ImageRenderer';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA"}