@pibit.ai/cure-design-system 0.6.50 → 0.6.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/rich-text/index.d.ts +1 -0
- package/dist/rich-text/index.d.ts.map +1 -1
- package/dist/rich-text/index.js +34 -26
- package/dist/rich-text/token-input/index.d.ts +5 -0
- package/dist/rich-text/token-input/index.d.ts.map +1 -0
- package/dist/rich-text/token-input/segments.d.ts +27 -0
- package/dist/rich-text/token-input/segments.d.ts.map +1 -0
- package/dist/rich-text/token-input/segments.js +48 -0
- package/dist/rich-text/token-input/token-input.d.ts +96 -0
- package/dist/rich-text/token-input/token-input.d.ts.map +1 -0
- package/dist/rich-text/token-input/token-input.js +286 -0
- package/dist/rich-text/token-input/token-node.d.ts +30 -0
- package/dist/rich-text/token-input/token-node.d.ts.map +1 -0
- package/dist/rich-text/token-input/token-node.js +89 -0
- package/dist/rich-text/token-input/token-suggestion.d.ts +37 -0
- package/dist/rich-text/token-input/token-suggestion.d.ts.map +1 -0
- package/dist/rich-text/token-input/token-suggestion.js +110 -0
- package/dist/styles/components.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsx as l } from "react/jsx-runtime";
|
|
2
|
+
import { Node as p, mergeAttributes as m } from "@tiptap/core";
|
|
3
|
+
import { ReactNodeViewRenderer as c, NodeViewWrapper as f } from "@tiptap/react";
|
|
4
|
+
import { TOKEN_NODE_NAME as a } from "./segments.js";
|
|
5
|
+
function T({
|
|
6
|
+
node: e,
|
|
7
|
+
editor: t,
|
|
8
|
+
getPos: n,
|
|
9
|
+
selected: o,
|
|
10
|
+
extension: r
|
|
11
|
+
}) {
|
|
12
|
+
const s = r.options, u = String(e.attrs.value ?? ""), d = () => {
|
|
13
|
+
if (!t.isEditable) return;
|
|
14
|
+
const i = typeof n == "function" ? n() : null;
|
|
15
|
+
i != null && t.chain().focus().deleteRange({ from: i, to: i + e.nodeSize }).run();
|
|
16
|
+
};
|
|
17
|
+
return /* @__PURE__ */ l(
|
|
18
|
+
f,
|
|
19
|
+
{
|
|
20
|
+
as: "span",
|
|
21
|
+
className: "inline-flex align-middle",
|
|
22
|
+
"data-type": a,
|
|
23
|
+
children: s.getRenderToken()({
|
|
24
|
+
value: u,
|
|
25
|
+
readOnly: !t.isEditable,
|
|
26
|
+
selected: o,
|
|
27
|
+
remove: d
|
|
28
|
+
})
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
const k = p.create({
|
|
33
|
+
name: a,
|
|
34
|
+
group: "inline",
|
|
35
|
+
inline: !0,
|
|
36
|
+
atom: !0,
|
|
37
|
+
selectable: !0,
|
|
38
|
+
addOptions() {
|
|
39
|
+
return {
|
|
40
|
+
getRenderToken: () => () => null,
|
|
41
|
+
getTokenText: () => (e) => e
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
addAttributes() {
|
|
45
|
+
return {
|
|
46
|
+
value: {
|
|
47
|
+
default: null,
|
|
48
|
+
parseHTML: (e) => e.getAttribute("data-value"),
|
|
49
|
+
renderHTML: (e) => e.value ? { "data-value": e.value } : {}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
parseHTML() {
|
|
54
|
+
return [{ tag: `span[data-type="${a}"]` }];
|
|
55
|
+
},
|
|
56
|
+
renderHTML({ node: e, HTMLAttributes: t }) {
|
|
57
|
+
return [
|
|
58
|
+
"span",
|
|
59
|
+
m({ "data-type": a }, t),
|
|
60
|
+
String(e.attrs.value ?? "")
|
|
61
|
+
];
|
|
62
|
+
},
|
|
63
|
+
renderText({ node: e }) {
|
|
64
|
+
const t = e.attrs.value;
|
|
65
|
+
return t ? this.options.getTokenText()(t) : "";
|
|
66
|
+
},
|
|
67
|
+
addNodeView() {
|
|
68
|
+
return c(T);
|
|
69
|
+
},
|
|
70
|
+
addCommands() {
|
|
71
|
+
return {
|
|
72
|
+
insertToken: (e) => ({ commands: t }) => t.insertContent({ type: this.name, attrs: { value: e } })
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
addKeyboardShortcuts() {
|
|
76
|
+
return {
|
|
77
|
+
// Without this, the first Backspace only selects the atom.
|
|
78
|
+
Backspace: () => this.editor.commands.command(({ state: e, dispatch: t }) => {
|
|
79
|
+
const { $from: n, empty: o } = e.selection;
|
|
80
|
+
if (!o) return !1;
|
|
81
|
+
const r = n.nodeBefore;
|
|
82
|
+
return !r || r.type.name !== this.name ? !1 : (t && t(e.tr.delete(n.pos - r.nodeSize, n.pos)), !0);
|
|
83
|
+
})
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
export {
|
|
88
|
+
k as TokenNode
|
|
89
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Extension } from '@tiptap/core';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
export interface TokenSuggestionItem {
|
|
4
|
+
/** Inserted as the token's value. */
|
|
5
|
+
value: string;
|
|
6
|
+
label: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
icon?: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export interface TokenSuggestionTrigger {
|
|
11
|
+
/** Character(s) that open the menu, e.g. "/", "{{" or "@". */
|
|
12
|
+
char: string;
|
|
13
|
+
/** Items for the text typed after the trigger; filter as you see fit. */
|
|
14
|
+
items: (query: string) => TokenSuggestionItem[] | Promise<TokenSuggestionItem[]>;
|
|
15
|
+
/** Let the query contain spaces. @default false */
|
|
16
|
+
allowSpaces?: boolean;
|
|
17
|
+
/** Characters allowed right before the trigger. @default [" "] plus line start */
|
|
18
|
+
allowedPrefixes?: string[] | null;
|
|
19
|
+
/** Message when nothing matches. @default "No matches" */
|
|
20
|
+
emptyMessage?: string;
|
|
21
|
+
}
|
|
22
|
+
interface ListProps {
|
|
23
|
+
items: TokenSuggestionItem[];
|
|
24
|
+
emptyMessage: string;
|
|
25
|
+
onSelect: (item: TokenSuggestionItem) => void;
|
|
26
|
+
}
|
|
27
|
+
export interface TokenSuggestionListHandle {
|
|
28
|
+
onKeyDown: (event: KeyboardEvent) => boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare const TokenSuggestionList: import('react').ForwardRefExoticComponent<ListProps & import('react').RefAttributes<TokenSuggestionListHandle>>;
|
|
31
|
+
/**
|
|
32
|
+
* One Suggestion plugin per trigger. `onOpenChange` reports whether any menu is
|
|
33
|
+
* showing, so TokenInput lets Enter through to the menu in single-line fields.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createTokenSuggestionExtension(triggers: TokenSuggestionTrigger[], onOpenChange: (open: boolean) => void): Extension<any, any>;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=token-suggestion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-suggestion.d.ts","sourceRoot":"","sources":["../../../src/rich-text/token-input/token-suggestion.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,KAAK,EAAE,CACL,KAAK,EAAE,MAAM,KACV,mBAAmB,EAAE,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC5D,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;CAC9C;AAED,eAAO,MAAM,mBAAmB,iHAqE9B,CAAC;AAGH;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,sBAAsB,EAAE,EAClC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,uBAmFtC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { jsx as i, jsxs as u } from "react/jsx-runtime";
|
|
2
|
+
import { Extension as d } from "@tiptap/core";
|
|
3
|
+
import { PluginKey as f } from "@tiptap/pm/state";
|
|
4
|
+
import { ReactRenderer as y } from "@tiptap/react";
|
|
5
|
+
import g from "@tiptap/suggestion";
|
|
6
|
+
import { forwardRef as h, useState as w, useEffect as x, useImperativeHandle as k } from "react";
|
|
7
|
+
import R from "tippy.js";
|
|
8
|
+
import { cx as b } from "../../utils/cn.js";
|
|
9
|
+
const m = h(({ items: o, emptyMessage: s, onSelect: l }, c) => {
|
|
10
|
+
const [t, r] = w(0);
|
|
11
|
+
return x(() => r(0), [o]), k(c, () => ({
|
|
12
|
+
onKeyDown: (n) => o.length ? n.key === "ArrowDown" ? (r((e) => (e + 1) % o.length), !0) : n.key === "ArrowUp" ? (r((e) => (e + o.length - 1) % o.length), !0) : n.key === "Enter" || n.key === "Tab" ? (l(o[t]), !0) : !1 : !1
|
|
13
|
+
})), /* @__PURE__ */ i(
|
|
14
|
+
"div",
|
|
15
|
+
{
|
|
16
|
+
role: "listbox",
|
|
17
|
+
"aria-label": "Suggestions",
|
|
18
|
+
className: "max-h-64 min-w-56 overflow-y-auto rounded-lg bg-primary p-1 shadow-lg ring-1 ring-secondary",
|
|
19
|
+
onMouseDown: (n) => n.preventDefault(),
|
|
20
|
+
children: o.length === 0 ? /* @__PURE__ */ i("div", { className: "px-2.5 py-2 text-sm text-tertiary", children: s }) : o.map((n, e) => /* @__PURE__ */ u(
|
|
21
|
+
"div",
|
|
22
|
+
{
|
|
23
|
+
role: "option",
|
|
24
|
+
"aria-selected": e === t,
|
|
25
|
+
onMouseEnter: () => r(e),
|
|
26
|
+
onClick: () => l(n),
|
|
27
|
+
className: b(
|
|
28
|
+
"flex cursor-pointer items-center gap-2 rounded-md px-2.5 py-2 text-sm",
|
|
29
|
+
e === t ? "bg-primary_hover" : ""
|
|
30
|
+
),
|
|
31
|
+
children: [
|
|
32
|
+
n.icon && /* @__PURE__ */ i("span", { className: "flex size-4 shrink-0 items-center text-fg-quaternary", children: n.icon }),
|
|
33
|
+
/* @__PURE__ */ u("span", { className: "min-w-0 flex-1", children: [
|
|
34
|
+
/* @__PURE__ */ i("span", { className: "block truncate font-medium text-secondary", children: n.label }),
|
|
35
|
+
n.description && /* @__PURE__ */ i("span", { className: "block truncate text-xs text-tertiary", children: n.description })
|
|
36
|
+
] })
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
`${n.value}-${e}`
|
|
40
|
+
))
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
m.displayName = "TokenSuggestionList";
|
|
45
|
+
function T(o, s) {
|
|
46
|
+
return d.create({
|
|
47
|
+
name: "tokenSuggestion",
|
|
48
|
+
addProseMirrorPlugins() {
|
|
49
|
+
return o.map(
|
|
50
|
+
(l, c) => g({
|
|
51
|
+
editor: this.editor,
|
|
52
|
+
char: l.char,
|
|
53
|
+
pluginKey: new f(`tokenSuggestion${c}`),
|
|
54
|
+
allowSpaces: l.allowSpaces ?? !1,
|
|
55
|
+
allowedPrefixes: l.allowedPrefixes === void 0 ? [" "] : l.allowedPrefixes,
|
|
56
|
+
items: ({ query: t }) => l.items(t),
|
|
57
|
+
command: ({ editor: t, range: r, props: n }) => {
|
|
58
|
+
t.chain().focus().deleteRange(r).insertToken(n.value).run();
|
|
59
|
+
},
|
|
60
|
+
render: () => {
|
|
61
|
+
let t = null, r = null;
|
|
62
|
+
const n = (e) => ({
|
|
63
|
+
items: e.items,
|
|
64
|
+
emptyMessage: l.emptyMessage ?? "No matches",
|
|
65
|
+
onSelect: (a) => e.command(a)
|
|
66
|
+
});
|
|
67
|
+
return {
|
|
68
|
+
onStart: (e) => {
|
|
69
|
+
s(!0), t = new y(m, {
|
|
70
|
+
props: n(e),
|
|
71
|
+
editor: e.editor
|
|
72
|
+
}), e.clientRect && (r = R(document.body, {
|
|
73
|
+
getReferenceClientRect: () => {
|
|
74
|
+
var a;
|
|
75
|
+
return ((a = e.clientRect) == null ? void 0 : a.call(e)) ?? new DOMRect();
|
|
76
|
+
},
|
|
77
|
+
appendTo: () => document.body,
|
|
78
|
+
content: t.element,
|
|
79
|
+
showOnCreate: !0,
|
|
80
|
+
interactive: !0,
|
|
81
|
+
trigger: "manual",
|
|
82
|
+
placement: "bottom-start"
|
|
83
|
+
}));
|
|
84
|
+
},
|
|
85
|
+
onUpdate: (e) => {
|
|
86
|
+
t == null || t.updateProps(n(e)), r == null || r.setProps({
|
|
87
|
+
getReferenceClientRect: () => {
|
|
88
|
+
var a;
|
|
89
|
+
return ((a = e.clientRect) == null ? void 0 : a.call(e)) ?? new DOMRect();
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
onKeyDown: ({ event: e }) => {
|
|
94
|
+
var a;
|
|
95
|
+
return e.key === "Escape" ? (r == null || r.hide(), !0) : ((a = t == null ? void 0 : t.ref) == null ? void 0 : a.onKeyDown(e)) ?? !1;
|
|
96
|
+
},
|
|
97
|
+
onExit: () => {
|
|
98
|
+
s(!1), r == null || r.destroy(), t == null || t.destroy(), r = null, t = null;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
m as TokenSuggestionList,
|
|
109
|
+
T as createTokenSuggestionExtension
|
|
110
|
+
};
|