@solibo/solibo-ui 1.0.27 → 1.1.0
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/assets/index15.css +1 -1
- package/dist/assets/index18.css +1 -1
- package/dist/assets/index39.css +1 -1
- package/dist/assets/index47.css +1 -1
- package/dist/components/aside/index.cjs +1 -1
- package/dist/components/aside/index.cjs.map +1 -1
- package/dist/components/aside/index.js +1 -1
- package/dist/components/aside/index.js.map +1 -1
- package/dist/components/avatar/index.cjs +1 -1
- package/dist/components/avatar/index.cjs.map +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/avatar/index.js.map +1 -1
- package/dist/components/badge/index.cjs +1 -1
- package/dist/components/badge/index.cjs.map +1 -1
- package/dist/components/badge/index.js +9 -9
- package/dist/components/badge/index.js.map +1 -1
- package/dist/components/button/index.cjs +1 -1
- package/dist/components/button/index.cjs.map +1 -1
- package/dist/components/button/index.js +7 -7
- package/dist/components/button/index.js.map +1 -1
- package/dist/components/checkbox/index.cjs +1 -1
- package/dist/components/checkbox/index.cjs.map +1 -1
- package/dist/components/checkbox/index.js +2 -2
- package/dist/components/checkbox/index.js.map +1 -1
- package/dist/components/chip/index.cjs +1 -1
- package/dist/components/chip/index.cjs.map +1 -1
- package/dist/components/chip/index.js +4 -4
- package/dist/components/chip/index.js.map +1 -1
- package/dist/components/collapsible/index.cjs +1 -1
- package/dist/components/collapsible/index.cjs.map +1 -1
- package/dist/components/collapsible/index.js +5 -5
- package/dist/components/collapsible/index.js.map +1 -1
- package/dist/components/controls/index.cjs +1 -1
- package/dist/components/controls/index.js +1 -1
- package/dist/components/croppable/index.cjs +1 -1
- package/dist/components/croppable/index.cjs.map +1 -1
- package/dist/components/croppable/index.js +21 -21
- package/dist/components/croppable/index.js.map +1 -1
- package/dist/components/dialog/index.cjs +1 -1
- package/dist/components/dialog/index.cjs.map +1 -1
- package/dist/components/dialog/index.js +13 -13
- package/dist/components/dialog/index.js.map +1 -1
- package/dist/components/dropdown/index.cjs +1 -1
- package/dist/components/dropdown/index.cjs.map +1 -1
- package/dist/components/dropdown/index.js +43 -43
- package/dist/components/dropdown/index.js.map +1 -1
- package/dist/components/dropzone/index.cjs +1 -1
- package/dist/components/dropzone/index.cjs.map +1 -1
- package/dist/components/dropzone/index.js +16 -16
- package/dist/components/dropzone/index.js.map +1 -1
- package/dist/components/editor/index.cjs +26 -26
- package/dist/components/editor/index.cjs.map +1 -1
- package/dist/components/editor/index.js +3351 -3256
- package/dist/components/editor/index.js.map +1 -1
- package/dist/components/file/index.cjs +1 -1
- package/dist/components/file/index.cjs.map +1 -1
- package/dist/components/file/index.js +34 -34
- package/dist/components/file/index.js.map +1 -1
- package/dist/components/header/index.cjs +1 -1
- package/dist/components/header/index.js +23 -23
- package/dist/components/icon/index.cjs +1 -1
- package/dist/components/icon/index.cjs.map +1 -1
- package/dist/components/icon/index.js +16 -16
- package/dist/components/icon/index.js.map +1 -1
- package/dist/components/input/index.cjs +1 -1
- package/dist/components/input/index.js +2 -2
- package/dist/components/list/index.cjs +1 -1
- package/dist/components/list/index.js +25 -25
- package/dist/components/menu/index.cjs +1 -1
- package/dist/components/menu/index.cjs.map +1 -1
- package/dist/components/menu/index.js +18 -18
- package/dist/components/menu/index.js.map +1 -1
- package/dist/components/message/index.cjs +1 -1
- package/dist/components/message/index.cjs.map +1 -1
- package/dist/components/message/index.js +27 -27
- package/dist/components/message/index.js.map +1 -1
- package/dist/components/messages/index.cjs +1 -1
- package/dist/components/messages/index.cjs.map +1 -1
- package/dist/components/messages/index.js +70 -37
- package/dist/components/messages/index.js.map +1 -1
- package/dist/components/nav/index.cjs +1 -1
- package/dist/components/nav/index.cjs.map +1 -1
- package/dist/components/nav/index.js +2 -2
- package/dist/components/nav/index.js.map +1 -1
- package/dist/components/portal/index.cjs +1 -1
- package/dist/components/portal/index.cjs.map +1 -1
- package/dist/components/portal/index.js +7 -7
- package/dist/components/portal/index.js.map +1 -1
- package/dist/components/search/index.cjs +1 -1
- package/dist/components/search/index.cjs.map +1 -1
- package/dist/components/search/index.js +3 -3
- package/dist/components/search/index.js.map +1 -1
- package/dist/components/select/index.cjs +1 -1
- package/dist/components/select/index.js +2 -2
- package/dist/components/table/index.cjs +1 -1
- package/dist/components/table/index.cjs.map +1 -1
- package/dist/components/table/index.js +11 -11
- package/dist/components/table/index.js.map +1 -1
- package/dist/components/toast/index.cjs +1 -1
- package/dist/components/toast/index.cjs.map +1 -1
- package/dist/components/toast/index.js +6 -6
- package/dist/components/toast/index.js.map +1 -1
- package/dist/components/tooltip/index.cjs +1 -1
- package/dist/components/tooltip/index.cjs.map +1 -1
- package/dist/components/tooltip/index.js +6 -6
- package/dist/components/tooltip/index.js.map +1 -1
- package/dist/icons-B_uIKmIp.cjs +2 -0
- package/dist/icons-B_uIKmIp.cjs.map +1 -0
- package/dist/icons-Dm2kyF0g.js +211 -0
- package/dist/icons-Dm2kyF0g.js.map +1 -0
- package/dist/{index-BAxpgMzb.js → index-DycOZMJl.js} +7 -7
- package/dist/index-DycOZMJl.js.map +1 -0
- package/dist/index-Y3jsTJhs.cjs +2 -0
- package/dist/index-Y3jsTJhs.cjs.map +1 -0
- package/dist/{index-DMGGDV9J.js → index-m3slpD7c.js} +3 -3
- package/dist/index-m3slpD7c.js.map +1 -0
- package/dist/index-rXfEqyt5.cjs +2 -0
- package/dist/index-rXfEqyt5.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +172 -131
- package/dist/index.js +2 -2
- package/dist/{menu-popover-D1ALaiV5.cjs → menu-popover-CM3v5s-5.cjs} +2 -2
- package/dist/menu-popover-CM3v5s-5.cjs.map +1 -0
- package/dist/{menu-popover-DQHDIw-8.js → menu-popover-DOkciab5.js} +19 -19
- package/dist/menu-popover-DOkciab5.js.map +1 -0
- package/dist/tokens.json +1 -1
- package/package.json +3 -1
- package/dist/icons-BkaMeh-J.js +0 -176
- package/dist/icons-BkaMeh-J.js.map +0 -1
- package/dist/icons-Lq3pr85X.cjs +0 -2
- package/dist/icons-Lq3pr85X.cjs.map +0 -1
- package/dist/index-BAxpgMzb.js.map +0 -1
- package/dist/index-BOiGSTKz.cjs +0 -2
- package/dist/index-BOiGSTKz.cjs.map +0 -1
- package/dist/index-BlnG4Rbh.cjs +0 -2
- package/dist/index-BlnG4Rbh.cjs.map +0 -1
- package/dist/index-DMGGDV9J.js.map +0 -1
- package/dist/menu-popover-D1ALaiV5.cjs.map +0 -1
- package/dist/menu-popover-DQHDIw-8.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/message/index.tsx"],"sourcesContent":["import cx from 'classix';\n\nimport { IconName } from '@/components/icon
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/message/index.tsx"],"sourcesContent":["import cx from 'classix';\n\nimport type { IconName } from '@/components/icon';\n\nimport { Avatar, type AvatarColor } from '../avatar';\nimport { Icon } from '../icon';\nimport styles from './styles.module.css';\n\nexport type MessageOptions = {\n appearance?: 'default' | 'document' | 'file';\n attachments?: React.ReactNode;\n author?: string;\n authorColor?: AvatarColor;\n authorImageUrl?: string;\n authorRole?: string;\n content: React.ReactNode;\n iconName?: IconName;\n id: string;\n preview?: boolean;\n timestamp?: Date | string;\n timestampText?: React.ReactNode;\n type?: 'default' | 'minimal' | 'system' | 'user';\n};\n\nexport const Message = ({\n appearance = 'default',\n attachments,\n author,\n authorColor,\n authorImageUrl,\n authorRole,\n content,\n iconName = 'Info',\n id,\n preview,\n timestamp,\n timestampText,\n type = 'default',\n}: MessageOptions) => {\n const date = timestamp ? new Date(timestamp) : undefined;\n const timestampElement = date ? (\n <time\n className={styles.timestamp}\n dateTime={date.toISOString()}\n >\n {timestampText ?? date.toLocaleString()}\n </time>\n ) : null;\n\n return (\n <div\n className={styles['message-group']}\n data-message-type={type}\n >\n {author && (\n <Avatar\n accessibleLabel={author}\n color={authorColor}\n imageUrl={authorImageUrl}\n name={author}\n role={authorRole}\n />\n )}\n {type === 'system' && timestampElement}\n <div\n className={cx(styles.message, preview && styles.preview)}\n data-appearance={appearance}\n data-id={id}\n data-type={type}\n >\n {type == 'system' && (\n <Icon\n gap='right'\n name={iconName}\n />\n )}\n {content}\n </div>\n {attachments && <div className={styles.attachments}>{attachments}</div>}\n {type !== 'system' && timestampElement}\n </div>\n );\n};\n"],"names":["Message","appearance","attachments","author","authorColor","authorImageUrl","authorRole","content","iconName","id","preview","timestamp","timestampText","type","date","Date","undefined","timestampElement","jsx","styles","toISOString","toLocaleString","jsxs","Avatar","cx","message","Icon"],"mappings":"wZAwBaA,EAAUA,CAAC,CACtBC,WAAAA,EAAa,UACbC,YAAAA,EACAC,OAAAA,EACAC,YAAAA,EACAC,eAAAA,EACAC,WAAAA,EACAC,QAAAA,EACAC,SAAAA,EAAW,OACXC,GAAAA,EACAC,QAAAA,EACAC,UAAAA,EACAC,cAAAA,EACAC,KAAAA,EAAO,SACO,IAAM,CACpB,MAAMC,EAAOH,EAAY,IAAII,KAAKJ,CAAS,EAAIK,OACzCC,EAAmBH,EACvBI,EAAAA,IAAC,OAAA,CACC,UAAWC,EAAOR,UAClB,SAAUG,EAAKM,cAEdR,SAAAA,GAAiBE,EAAKO,eAAAA,EACzB,EACE,KAEJ,OACEC,OAAC,OACC,UAAWH,EAAO,eAAe,EACjC,oBAAmBN,EAAK,iBAAA,UAEvBV,SAAAA,CAAAA,GACCe,EAAAA,IAACK,EAAAA,OAAA,CACC,gBAAiBpB,EACjB,MAAOC,EACP,SAAUC,EACV,KAAMF,EACN,KAAMG,CAAAA,CAAW,EAGpBO,IAAS,UAAYI,EACtBK,EAAAA,KAAC,MAAA,CACC,UAAWE,EAAAA,EAAGL,EAAOM,QAASf,GAAWS,EAAOT,OAAO,EACvD,kBAAiBT,EACjB,UAASQ,EACT,YAAWI,EAEVA,SAAAA,CAAAA,GAAQ,UACPK,EAAAA,IAACQ,EAAAA,KAAA,CACC,IAAI,QACJ,KAAMlB,EAAS,EAGlBD,CAAAA,EACH,EACCL,GAAegB,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAOjB,YAAcA,SAAAA,EAAY,EAChEW,IAAS,UAAYI,CAAAA,EACxB,CAEJ"}
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import { jsx as s, jsxs as
|
|
2
|
-
import { t as
|
|
3
|
-
import { Avatar as
|
|
4
|
-
import { Icon as
|
|
5
|
-
import '../../assets/index15.css';const
|
|
6
|
-
attachments:
|
|
7
|
-
"message-group": "_message-
|
|
8
|
-
message:
|
|
9
|
-
timestamp:
|
|
10
|
-
preview:
|
|
1
|
+
import { jsx as s, jsxs as r } from "react/jsx-runtime";
|
|
2
|
+
import { t as y } from "../../classix-DG18itHa.js";
|
|
3
|
+
import { Avatar as h } from "../avatar/index.js";
|
|
4
|
+
import { Icon as u } from "../icon/index.js";
|
|
5
|
+
import '../../assets/index15.css';const w = "_attachments_1yja9_1", N = "_message_1yja9_11", x = "_timestamp_1yja9_142", I = "_preview_1yja9_147", a = {
|
|
6
|
+
attachments: w,
|
|
7
|
+
"message-group": "_message-group_1yja9_11",
|
|
8
|
+
message: N,
|
|
9
|
+
timestamp: x,
|
|
10
|
+
preview: I
|
|
11
11
|
}, D = ({
|
|
12
|
-
appearance:
|
|
12
|
+
appearance: c = "default",
|
|
13
13
|
attachments: o,
|
|
14
|
-
author:
|
|
15
|
-
authorColor:
|
|
16
|
-
authorImageUrl:
|
|
17
|
-
authorRole:
|
|
18
|
-
content:
|
|
19
|
-
iconName: _ = "
|
|
14
|
+
author: t,
|
|
15
|
+
authorColor: l,
|
|
16
|
+
authorImageUrl: d,
|
|
17
|
+
authorRole: g,
|
|
18
|
+
content: p,
|
|
19
|
+
iconName: _ = "Info",
|
|
20
20
|
id: v,
|
|
21
21
|
preview: f,
|
|
22
22
|
timestamp: i,
|
|
23
|
-
timestampText:
|
|
23
|
+
timestampText: j,
|
|
24
24
|
type: e = "default"
|
|
25
25
|
}) => {
|
|
26
|
-
const m = i ? new Date(i) : void 0,
|
|
27
|
-
return /* @__PURE__ */
|
|
28
|
-
|
|
29
|
-
e === "system" &&
|
|
30
|
-
/* @__PURE__ */
|
|
31
|
-
e == "system" && /* @__PURE__ */ s(
|
|
32
|
-
|
|
26
|
+
const m = i ? new Date(i) : void 0, n = m ? /* @__PURE__ */ s("time", { className: a.timestamp, dateTime: m.toISOString(), children: j ?? m.toLocaleString() }) : null;
|
|
27
|
+
return /* @__PURE__ */ r("div", { className: a["message-group"], "data-message-type": e, "data-component": "message", children: [
|
|
28
|
+
t && /* @__PURE__ */ s(h, { accessibleLabel: t, color: l, imageUrl: d, name: t, role: g }),
|
|
29
|
+
e === "system" && n,
|
|
30
|
+
/* @__PURE__ */ r("div", { className: y(a.message, f && a.preview), "data-appearance": c, "data-id": v, "data-type": e, children: [
|
|
31
|
+
e == "system" && /* @__PURE__ */ s(u, { gap: "right", name: _ }),
|
|
32
|
+
p
|
|
33
33
|
] }),
|
|
34
|
-
o && /* @__PURE__ */ s("div", { className:
|
|
35
|
-
e !== "system" &&
|
|
34
|
+
o && /* @__PURE__ */ s("div", { className: a.attachments, children: o }),
|
|
35
|
+
e !== "system" && n
|
|
36
36
|
] });
|
|
37
37
|
};
|
|
38
38
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/message/index.tsx"],"sourcesContent":["import cx from 'classix';\n\nimport { IconName } from '@/components/icon
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/message/index.tsx"],"sourcesContent":["import cx from 'classix';\n\nimport type { IconName } from '@/components/icon';\n\nimport { Avatar, type AvatarColor } from '../avatar';\nimport { Icon } from '../icon';\nimport styles from './styles.module.css';\n\nexport type MessageOptions = {\n appearance?: 'default' | 'document' | 'file';\n attachments?: React.ReactNode;\n author?: string;\n authorColor?: AvatarColor;\n authorImageUrl?: string;\n authorRole?: string;\n content: React.ReactNode;\n iconName?: IconName;\n id: string;\n preview?: boolean;\n timestamp?: Date | string;\n timestampText?: React.ReactNode;\n type?: 'default' | 'minimal' | 'system' | 'user';\n};\n\nexport const Message = ({\n appearance = 'default',\n attachments,\n author,\n authorColor,\n authorImageUrl,\n authorRole,\n content,\n iconName = 'Info',\n id,\n preview,\n timestamp,\n timestampText,\n type = 'default',\n}: MessageOptions) => {\n const date = timestamp ? new Date(timestamp) : undefined;\n const timestampElement = date ? (\n <time\n className={styles.timestamp}\n dateTime={date.toISOString()}\n >\n {timestampText ?? date.toLocaleString()}\n </time>\n ) : null;\n\n return (\n <div\n className={styles['message-group']}\n data-message-type={type}\n >\n {author && (\n <Avatar\n accessibleLabel={author}\n color={authorColor}\n imageUrl={authorImageUrl}\n name={author}\n role={authorRole}\n />\n )}\n {type === 'system' && timestampElement}\n <div\n className={cx(styles.message, preview && styles.preview)}\n data-appearance={appearance}\n data-id={id}\n data-type={type}\n >\n {type == 'system' && (\n <Icon\n gap='right'\n name={iconName}\n />\n )}\n {content}\n </div>\n {attachments && <div className={styles.attachments}>{attachments}</div>}\n {type !== 'system' && timestampElement}\n </div>\n );\n};\n"],"names":["Message","appearance","attachments","author","authorColor","authorImageUrl","authorRole","content","iconName","id","preview","timestamp","timestampText","type","date","Date","undefined","timestampElement","jsx","styles","toISOString","toLocaleString","jsxs","Avatar","cx","message","Icon"],"mappings":";;;;;;;;;;GAwBaA,IAAUA,CAAC;AAAA,EACtBC,YAAAA,IAAa;AAAA,EACbC,aAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,aAAAA;AAAAA,EACAC,gBAAAA;AAAAA,EACAC,YAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,UAAAA,IAAW;AAAA,EACXC,IAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,eAAAA;AAAAA,EACAC,MAAAA,IAAO;AACO,MAAM;AACpB,QAAMC,IAAOH,IAAY,IAAII,KAAKJ,CAAS,IAAIK,QACzCC,IAAmBH,IACvB,gBAAAI,EAAC,QAAA,EACC,WAAWC,EAAOR,WAClB,UAAUG,EAAKM,eAEdR,UAAAA,KAAiBE,EAAKO,eAAAA,GACzB,IACE;AAEJ,SACE,gBAAAC,EAAC,SACC,WAAWH,EAAO,eAAe,GACjC,qBAAmBN,GAAK,kBAAA,WAEvBV,UAAAA;AAAAA,IAAAA,KACC,gBAAAe,EAACK,GAAA,EACC,iBAAiBpB,GACjB,OAAOC,GACP,UAAUC,GACV,MAAMF,GACN,MAAMG,EAAAA,CAAW;AAAA,IAGpBO,MAAS,YAAYI;AAAAA,IACtB,gBAAAK,EAAC,OAAA,EACC,WAAWE,EAAGL,EAAOM,SAASf,KAAWS,EAAOT,OAAO,GACvD,mBAAiBT,GACjB,WAASQ,GACT,aAAWI,GAEVA,UAAAA;AAAAA,MAAAA,KAAQ,YACP,gBAAAK,EAACQ,GAAA,EACC,KAAI,SACJ,MAAMlB,GAAS;AAAA,MAGlBD;AAAAA,IAAAA,GACH;AAAA,IACCL,KAAe,gBAAAgB,EAAC,OAAA,EAAI,WAAWC,EAAOjB,aAAcA,UAAAA,GAAY;AAAA,IAChEW,MAAS,YAAYI;AAAAA,EAAAA,GACxB;AAEJ;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index13.css');const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index13.css');const r=require("react/jsx-runtime"),A=require("../../classix-5H4IWnMA.cjs"),n=require("react"),D=require("../editor/index.cjs"),G=require("../list/index.cjs"),I=require("../tooltip/index.cjs"),J=require("../message/index.cjs"),K="_messages_pqp89_1",Q="_fill_pqp89_20",j={messages:K,fill:Q},V=({fill:M=!1,files:u,handleUpload:S,inlineImages:c,maxEditorRows:y=5,message:d="",messages:l,minEditorRows:b=1,onChange:Y,onFilesChange:a,onInlineImagesChange:H,onSubmit:B,placeholder:N,sending:O,tooltipLabel:m})=>{var g;const f=n.useRef(null),o=n.useRef(!0),v=n.useRef(!1),[P,U]=n.useState([]),h=u??P,p=(g=l[l.length-1])==null?void 0:g.id,W=d.replace(/<[^>]*>/g,"").replace(/ /g," ").trim()==="";return n.useLayoutEffect(()=>{var w;const e=(w=f.current)==null?void 0:w.querySelector("[data-message-list]");if(!e||p===void 0)return;const k=e.scrollHeight-e.scrollTop-e.clientHeight<450,L=!v.current||k;o.current=L,v.current=!0;const z=window.setTimeout(()=>{o.current=!1},5e3),_=()=>{e.scrollTop=e.scrollHeight};L&&_();const E=t=>{o.current&&t.target instanceof HTMLImageElement&&_()},T=t=>{t.deltaY<0&&(o.current=!1)};let i;const q=t=>{var s;i=(s=t.touches[0])==null?void 0:s.clientY},x=t=>{var R;const s=(R=t.touches[0])==null?void 0:R.clientY;s!==void 0&&i!==void 0&&s>i&&(o.current=!1),i=s};return e.addEventListener("load",E,!0),e.addEventListener("wheel",T,{passive:!0}),e.addEventListener("touchstart",q,{passive:!0}),e.addEventListener("touchmove",x,{passive:!0}),()=>{window.clearTimeout(z),e.removeEventListener("load",E,!0),e.removeEventListener("wheel",T),e.removeEventListener("touchstart",q),e.removeEventListener("touchmove",x)}},[p]),r.jsxs("div",{className:A.t(j.messages,M&&j.fill),"data-component":"messages",ref:f,children:[r.jsx(G.List,{"data-message-list":!0,children:l.map(e=>r.jsx(J.Message,{...e},e.id))}),m&&r.jsx(I.Tooltip,{variant:"static",children:m}),r.jsx(D.Editor,{autofocus:!0,content:d,disabled:O||W&&h.length===0&&!(c!=null&&c.length),files:h,inlineImages:c,maxRows:y,minRows:b,onChange:Y,onFilesChange:e=>{u===void 0&&U(e),a==null||a(e)},onInlineImagesChange:H,onSubmit:B,onUpload:S,placeholder:N,submitLabel:"Send message"})]})};exports.Messages=V;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/messages/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport { useLayoutEffect, useRef, useState } from 'react';\n\nimport { Editor } from '@/components/editor';\nimport { List } from '@/components/list';\nimport { Tooltip } from '@/components/tooltip';\n\nimport { Message, type MessageOptions } from '../message';\nimport styles from './styles.module.css';\n\nexport type MessageItem = MessageOptions;\n\nexport type MessagesProps = {\n fill?: boolean;\n files?: readonly File[];\n handleUpload: (files: FileList) => Promise<void> | void;\n maxEditorRows?: number;\n message: string;\n messages: MessageItem[];\n minEditorRows?: number;\n onChange: (content: string) => void;\n onFilesChange?: (files: File[]) => void;\n onSubmit: () => Promise<void> | void;\n placeholder?: string;\n sending: boolean;\n tooltipLabel?: string;\n};\n\nexport const Messages = ({\n fill = false,\n files,\n handleUpload,\n maxEditorRows = 5,\n message = '',\n messages,\n minEditorRows = 1,\n onChange,\n onFilesChange,\n onSubmit,\n placeholder,\n sending,\n tooltipLabel,\n}: MessagesProps) => {\n const messagesRef = useRef<HTMLDivElement>(null);\n const [internalFiles, setInternalFiles] = useState<File[]>([]);\n const queuedFiles = files ?? internalFiles;\n const newestMessageId = messages[messages.length - 1]?.id;\n const messageIsEmpty =\n message\n .replace(/<[^>]*>/g, '')\n .replace(/ /g, ' ')\n .trim() === '';\n\n useLayoutEffect(() => {\n const messageList = messagesRef.current?.querySelector<HTMLElement>('[data-message-list]');\n if (!messageList || newestMessageId === undefined) return;\n\n messageList.scrollTop = messageList.scrollHeight;\n }, [newestMessageId]);\n\n return (\n <div\n className={cx(styles.messages, fill && styles.fill)}\n data-component='messages'\n ref={messagesRef}\n >\n <List data-message-list>\n {messages.map((message) => (\n <Message\n key={message.id}\n {...message}\n />\n ))}\n </List>\n {tooltipLabel && <Tooltip variant='static'>{tooltipLabel}</Tooltip>}\n <Editor\n autofocus\n content={message}\n disabled={sending || (messageIsEmpty && queuedFiles.length === 0)}\n files={queuedFiles}\n maxRows={maxEditorRows}\n minRows={minEditorRows}\n onChange={onChange}\n onFilesChange={(nextFiles) => {\n if (files === undefined) setInternalFiles(nextFiles);\n onFilesChange?.(nextFiles);\n }}\n onSubmit={onSubmit}\n onUpload={handleUpload}\n placeholder={placeholder}\n submitLabel='Send message'\n />\n </div>\n );\n};\n"],"names":["Messages","fill","files","handleUpload","maxEditorRows","message","messages","minEditorRows","onChange","onFilesChange","onSubmit","placeholder","sending","tooltipLabel","messagesRef","useRef","internalFiles","setInternalFiles","useState","queuedFiles","newestMessageId","length","id","messageIsEmpty","replace","trim","useLayoutEffect","messageList","current","querySelector","undefined","
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/messages/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport { useLayoutEffect, useRef, useState } from 'react';\n\nimport { Editor, type PendingInlineImage } from '@/components/editor';\nimport { List } from '@/components/list';\nimport { Tooltip } from '@/components/tooltip';\n\nimport { Message, type MessageOptions } from '../message';\nimport styles from './styles.module.css';\n\nexport type MessageItem = MessageOptions;\n\nexport type MessagesProps = {\n fill?: boolean;\n files?: readonly File[];\n handleUpload: (files: FileList) => Promise<void> | void;\n inlineImages?: readonly PendingInlineImage[];\n maxEditorRows?: number;\n message: string;\n messages: MessageItem[];\n minEditorRows?: number;\n onChange: (content: string) => void;\n onFilesChange?: (files: File[]) => void;\n onInlineImagesChange?: (images: PendingInlineImage[]) => void;\n onSubmit: () => Promise<void> | void;\n placeholder?: string;\n sending: boolean;\n tooltipLabel?: string;\n};\n\nexport const Messages = ({\n fill = false,\n files,\n handleUpload,\n inlineImages,\n maxEditorRows = 5,\n message = '',\n messages,\n minEditorRows = 1,\n onChange,\n onFilesChange,\n onInlineImagesChange,\n onSubmit,\n placeholder,\n sending,\n tooltipLabel,\n}: MessagesProps) => {\n const messagesRef = useRef<HTMLDivElement>(null);\n const followImageLoadsRef = useRef(true);\n const hasLoadedRef = useRef(false);\n const [internalFiles, setInternalFiles] = useState<File[]>([]);\n const queuedFiles = files ?? internalFiles;\n const newestMessageId = messages[messages.length - 1]?.id;\n const messageIsEmpty =\n message\n .replace(/<[^>]*>/g, '')\n .replace(/ /g, ' ')\n .trim() === '';\n\n useLayoutEffect(() => {\n const messageList = messagesRef.current?.querySelector<HTMLElement>('[data-message-list]');\n if (!messageList || newestMessageId === undefined) return;\n\n const isNearBottom =\n messageList.scrollHeight - messageList.scrollTop - messageList.clientHeight <\n 450; /* 🌝 preview image max height plus allowance */\n const shouldScrollToBottom = !hasLoadedRef.current || isNearBottom;\n\n followImageLoadsRef.current = shouldScrollToBottom;\n hasLoadedRef.current = true;\n\n const timeout = window.setTimeout(() => {\n followImageLoadsRef.current = false;\n }, 5000);\n\n const scrollToBottom = () => {\n messageList.scrollTop = messageList.scrollHeight;\n };\n\n if (shouldScrollToBottom) scrollToBottom();\n\n const handleLoad = (event: Event) => {\n if (followImageLoadsRef.current && event.target instanceof HTMLImageElement) {\n scrollToBottom();\n }\n };\n\n const handleWheel = (event: WheelEvent) => {\n if (event.deltaY < 0) {\n followImageLoadsRef.current = false;\n }\n };\n\n let previousTouchY: number | undefined;\n\n const handleTouchStart = (event: TouchEvent) => {\n previousTouchY = event.touches[0]?.clientY;\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n const touchY = event.touches[0]?.clientY;\n if (touchY !== undefined && previousTouchY !== undefined && touchY > previousTouchY) {\n followImageLoadsRef.current = false;\n }\n previousTouchY = touchY;\n };\n\n messageList.addEventListener('load', handleLoad, true);\n messageList.addEventListener('wheel', handleWheel, { passive: true });\n messageList.addEventListener('touchstart', handleTouchStart, { passive: true });\n messageList.addEventListener('touchmove', handleTouchMove, { passive: true });\n\n return () => {\n window.clearTimeout(timeout);\n messageList.removeEventListener('load', handleLoad, true);\n messageList.removeEventListener('wheel', handleWheel);\n messageList.removeEventListener('touchstart', handleTouchStart);\n messageList.removeEventListener('touchmove', handleTouchMove);\n };\n }, [newestMessageId]);\n\n return (\n <div\n className={cx(styles.messages, fill && styles.fill)}\n data-component='messages'\n ref={messagesRef}\n >\n <List data-message-list>\n {messages.map((message) => (\n <Message\n key={message.id}\n {...message}\n />\n ))}\n </List>\n {tooltipLabel && <Tooltip variant='static'>{tooltipLabel}</Tooltip>}\n <Editor\n autofocus\n content={message}\n disabled={sending || (messageIsEmpty && queuedFiles.length === 0 && !inlineImages?.length)}\n files={queuedFiles}\n inlineImages={inlineImages}\n maxRows={maxEditorRows}\n minRows={minEditorRows}\n onChange={onChange}\n onFilesChange={(nextFiles) => {\n if (files === undefined) setInternalFiles(nextFiles);\n onFilesChange?.(nextFiles);\n }}\n onInlineImagesChange={onInlineImagesChange}\n onSubmit={onSubmit}\n onUpload={handleUpload}\n placeholder={placeholder}\n submitLabel='Send message'\n />\n </div>\n );\n};\n"],"names":["Messages","fill","files","handleUpload","inlineImages","maxEditorRows","message","messages","minEditorRows","onChange","onFilesChange","onInlineImagesChange","onSubmit","placeholder","sending","tooltipLabel","messagesRef","useRef","followImageLoadsRef","hasLoadedRef","internalFiles","setInternalFiles","useState","queuedFiles","newestMessageId","length","id","messageIsEmpty","replace","trim","useLayoutEffect","messageList","current","querySelector","undefined","isNearBottom","scrollHeight","scrollTop","clientHeight","shouldScrollToBottom","timeout","window","setTimeout","scrollToBottom","handleLoad","event","target","HTMLImageElement","handleWheel","deltaY","previousTouchY","handleTouchStart","touches","clientY","handleTouchMove","touchY","addEventListener","passive","clearTimeout","removeEventListener","jsxs","cx","styles","jsx","List","map","Message","Tooltip","Editor","nextFiles"],"mappings":"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"}
|
|
@@ -1,43 +1,76 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { t as
|
|
3
|
-
import { useRef as
|
|
4
|
-
import { Editor as
|
|
5
|
-
import { List as
|
|
6
|
-
import { Tooltip as
|
|
7
|
-
import { Message as
|
|
8
|
-
import '../../assets/index13.css';const
|
|
9
|
-
messages:
|
|
10
|
-
fill:
|
|
11
|
-
},
|
|
12
|
-
fill:
|
|
13
|
-
files:
|
|
14
|
-
handleUpload:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
import { jsxs as G, jsx as c } from "react/jsx-runtime";
|
|
2
|
+
import { t as I } from "../../classix-DG18itHa.js";
|
|
3
|
+
import { useRef as i, useState as J, useLayoutEffect as K } from "react";
|
|
4
|
+
import { Editor as O } from "../editor/index.js";
|
|
5
|
+
import { List as P } from "../list/index.js";
|
|
6
|
+
import { Tooltip as Q } from "../tooltip/index.js";
|
|
7
|
+
import { Message as V } from "../message/index.js";
|
|
8
|
+
import '../../assets/index13.css';const X = "_messages_pqp89_1", Z = "_fill_pqp89_20", Y = {
|
|
9
|
+
messages: X,
|
|
10
|
+
fill: Z
|
|
11
|
+
}, re = ({
|
|
12
|
+
fill: q = !1,
|
|
13
|
+
files: u,
|
|
14
|
+
handleUpload: y,
|
|
15
|
+
inlineImages: r,
|
|
16
|
+
maxEditorRows: H = 5,
|
|
17
|
+
message: d = "",
|
|
18
|
+
messages: l,
|
|
19
|
+
minEditorRows: b = 1,
|
|
20
|
+
onChange: x,
|
|
21
|
+
onFilesChange: a,
|
|
22
|
+
onInlineImagesChange: B,
|
|
23
|
+
onSubmit: j,
|
|
24
|
+
placeholder: N,
|
|
25
|
+
sending: U,
|
|
26
|
+
tooltipLabel: m
|
|
25
27
|
}) => {
|
|
26
|
-
var
|
|
27
|
-
const
|
|
28
|
-
return
|
|
29
|
-
var
|
|
30
|
-
const
|
|
31
|
-
!
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
28
|
+
var L;
|
|
29
|
+
const f = i(null), o = i(!0), h = i(!1), [W, k] = J([]), p = u ?? W, v = (L = l[l.length - 1]) == null ? void 0 : L.id, z = d.replace(/<[^>]*>/g, "").replace(/ /g, " ").trim() === "";
|
|
30
|
+
return K(() => {
|
|
31
|
+
var M;
|
|
32
|
+
const e = (M = f.current) == null ? void 0 : M.querySelector("[data-message-list]");
|
|
33
|
+
if (!e || v === void 0) return;
|
|
34
|
+
const A = e.scrollHeight - e.scrollTop - e.clientHeight < 450, g = !h.current || A;
|
|
35
|
+
o.current = g, h.current = !0;
|
|
36
|
+
const D = window.setTimeout(() => {
|
|
37
|
+
o.current = !1;
|
|
38
|
+
}, 5e3), E = () => {
|
|
39
|
+
e.scrollTop = e.scrollHeight;
|
|
40
|
+
};
|
|
41
|
+
g && E();
|
|
42
|
+
const T = (t) => {
|
|
43
|
+
o.current && t.target instanceof HTMLImageElement && E();
|
|
44
|
+
}, w = (t) => {
|
|
45
|
+
t.deltaY < 0 && (o.current = !1);
|
|
46
|
+
};
|
|
47
|
+
let n;
|
|
48
|
+
const R = (t) => {
|
|
49
|
+
var s;
|
|
50
|
+
n = (s = t.touches[0]) == null ? void 0 : s.clientY;
|
|
51
|
+
}, _ = (t) => {
|
|
52
|
+
var S;
|
|
53
|
+
const s = (S = t.touches[0]) == null ? void 0 : S.clientY;
|
|
54
|
+
s !== void 0 && n !== void 0 && s > n && (o.current = !1), n = s;
|
|
55
|
+
};
|
|
56
|
+
return e.addEventListener("load", T, !0), e.addEventListener("wheel", w, {
|
|
57
|
+
passive: !0
|
|
58
|
+
}), e.addEventListener("touchstart", R, {
|
|
59
|
+
passive: !0
|
|
60
|
+
}), e.addEventListener("touchmove", _, {
|
|
61
|
+
passive: !0
|
|
62
|
+
}), () => {
|
|
63
|
+
window.clearTimeout(D), e.removeEventListener("load", T, !0), e.removeEventListener("wheel", w), e.removeEventListener("touchstart", R), e.removeEventListener("touchmove", _);
|
|
64
|
+
};
|
|
65
|
+
}, [v]), /* @__PURE__ */ G("div", { className: I(Y.messages, q && Y.fill), "data-component": "messages", ref: f, children: [
|
|
66
|
+
/* @__PURE__ */ c(P, { "data-message-list": !0, children: l.map((e) => /* @__PURE__ */ c(V, { ...e }, e.id)) }),
|
|
67
|
+
m && /* @__PURE__ */ c(Q, { variant: "static", children: m }),
|
|
68
|
+
/* @__PURE__ */ c(O, { autofocus: !0, content: d, disabled: U || z && p.length === 0 && !(r != null && r.length), files: p, inlineImages: r, maxRows: H, minRows: b, onChange: x, onFilesChange: (e) => {
|
|
69
|
+
u === void 0 && k(e), a == null || a(e);
|
|
70
|
+
}, onInlineImagesChange: B, onSubmit: j, onUpload: y, placeholder: N, submitLabel: "Send message" })
|
|
38
71
|
] });
|
|
39
72
|
};
|
|
40
73
|
export {
|
|
41
|
-
|
|
74
|
+
re as Messages
|
|
42
75
|
};
|
|
43
76
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/messages/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport { useLayoutEffect, useRef, useState } from 'react';\n\nimport { Editor } from '@/components/editor';\nimport { List } from '@/components/list';\nimport { Tooltip } from '@/components/tooltip';\n\nimport { Message, type MessageOptions } from '../message';\nimport styles from './styles.module.css';\n\nexport type MessageItem = MessageOptions;\n\nexport type MessagesProps = {\n fill?: boolean;\n files?: readonly File[];\n handleUpload: (files: FileList) => Promise<void> | void;\n maxEditorRows?: number;\n message: string;\n messages: MessageItem[];\n minEditorRows?: number;\n onChange: (content: string) => void;\n onFilesChange?: (files: File[]) => void;\n onSubmit: () => Promise<void> | void;\n placeholder?: string;\n sending: boolean;\n tooltipLabel?: string;\n};\n\nexport const Messages = ({\n fill = false,\n files,\n handleUpload,\n maxEditorRows = 5,\n message = '',\n messages,\n minEditorRows = 1,\n onChange,\n onFilesChange,\n onSubmit,\n placeholder,\n sending,\n tooltipLabel,\n}: MessagesProps) => {\n const messagesRef = useRef<HTMLDivElement>(null);\n const [internalFiles, setInternalFiles] = useState<File[]>([]);\n const queuedFiles = files ?? internalFiles;\n const newestMessageId = messages[messages.length - 1]?.id;\n const messageIsEmpty =\n message\n .replace(/<[^>]*>/g, '')\n .replace(/ /g, ' ')\n .trim() === '';\n\n useLayoutEffect(() => {\n const messageList = messagesRef.current?.querySelector<HTMLElement>('[data-message-list]');\n if (!messageList || newestMessageId === undefined) return;\n\n messageList.scrollTop = messageList.scrollHeight;\n }, [newestMessageId]);\n\n return (\n <div\n className={cx(styles.messages, fill && styles.fill)}\n data-component='messages'\n ref={messagesRef}\n >\n <List data-message-list>\n {messages.map((message) => (\n <Message\n key={message.id}\n {...message}\n />\n ))}\n </List>\n {tooltipLabel && <Tooltip variant='static'>{tooltipLabel}</Tooltip>}\n <Editor\n autofocus\n content={message}\n disabled={sending || (messageIsEmpty && queuedFiles.length === 0)}\n files={queuedFiles}\n maxRows={maxEditorRows}\n minRows={minEditorRows}\n onChange={onChange}\n onFilesChange={(nextFiles) => {\n if (files === undefined) setInternalFiles(nextFiles);\n onFilesChange?.(nextFiles);\n }}\n onSubmit={onSubmit}\n onUpload={handleUpload}\n placeholder={placeholder}\n submitLabel='Send message'\n />\n </div>\n );\n};\n"],"names":["Messages","fill","files","handleUpload","maxEditorRows","message","messages","minEditorRows","onChange","onFilesChange","onSubmit","placeholder","sending","tooltipLabel","messagesRef","useRef","internalFiles","setInternalFiles","useState","queuedFiles","newestMessageId","length","id","messageIsEmpty","replace","trim","useLayoutEffect","messageList","current","querySelector","undefined","
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/messages/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport { useLayoutEffect, useRef, useState } from 'react';\n\nimport { Editor, type PendingInlineImage } from '@/components/editor';\nimport { List } from '@/components/list';\nimport { Tooltip } from '@/components/tooltip';\n\nimport { Message, type MessageOptions } from '../message';\nimport styles from './styles.module.css';\n\nexport type MessageItem = MessageOptions;\n\nexport type MessagesProps = {\n fill?: boolean;\n files?: readonly File[];\n handleUpload: (files: FileList) => Promise<void> | void;\n inlineImages?: readonly PendingInlineImage[];\n maxEditorRows?: number;\n message: string;\n messages: MessageItem[];\n minEditorRows?: number;\n onChange: (content: string) => void;\n onFilesChange?: (files: File[]) => void;\n onInlineImagesChange?: (images: PendingInlineImage[]) => void;\n onSubmit: () => Promise<void> | void;\n placeholder?: string;\n sending: boolean;\n tooltipLabel?: string;\n};\n\nexport const Messages = ({\n fill = false,\n files,\n handleUpload,\n inlineImages,\n maxEditorRows = 5,\n message = '',\n messages,\n minEditorRows = 1,\n onChange,\n onFilesChange,\n onInlineImagesChange,\n onSubmit,\n placeholder,\n sending,\n tooltipLabel,\n}: MessagesProps) => {\n const messagesRef = useRef<HTMLDivElement>(null);\n const followImageLoadsRef = useRef(true);\n const hasLoadedRef = useRef(false);\n const [internalFiles, setInternalFiles] = useState<File[]>([]);\n const queuedFiles = files ?? internalFiles;\n const newestMessageId = messages[messages.length - 1]?.id;\n const messageIsEmpty =\n message\n .replace(/<[^>]*>/g, '')\n .replace(/ /g, ' ')\n .trim() === '';\n\n useLayoutEffect(() => {\n const messageList = messagesRef.current?.querySelector<HTMLElement>('[data-message-list]');\n if (!messageList || newestMessageId === undefined) return;\n\n const isNearBottom =\n messageList.scrollHeight - messageList.scrollTop - messageList.clientHeight <\n 450; /* 🌝 preview image max height plus allowance */\n const shouldScrollToBottom = !hasLoadedRef.current || isNearBottom;\n\n followImageLoadsRef.current = shouldScrollToBottom;\n hasLoadedRef.current = true;\n\n const timeout = window.setTimeout(() => {\n followImageLoadsRef.current = false;\n }, 5000);\n\n const scrollToBottom = () => {\n messageList.scrollTop = messageList.scrollHeight;\n };\n\n if (shouldScrollToBottom) scrollToBottom();\n\n const handleLoad = (event: Event) => {\n if (followImageLoadsRef.current && event.target instanceof HTMLImageElement) {\n scrollToBottom();\n }\n };\n\n const handleWheel = (event: WheelEvent) => {\n if (event.deltaY < 0) {\n followImageLoadsRef.current = false;\n }\n };\n\n let previousTouchY: number | undefined;\n\n const handleTouchStart = (event: TouchEvent) => {\n previousTouchY = event.touches[0]?.clientY;\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n const touchY = event.touches[0]?.clientY;\n if (touchY !== undefined && previousTouchY !== undefined && touchY > previousTouchY) {\n followImageLoadsRef.current = false;\n }\n previousTouchY = touchY;\n };\n\n messageList.addEventListener('load', handleLoad, true);\n messageList.addEventListener('wheel', handleWheel, { passive: true });\n messageList.addEventListener('touchstart', handleTouchStart, { passive: true });\n messageList.addEventListener('touchmove', handleTouchMove, { passive: true });\n\n return () => {\n window.clearTimeout(timeout);\n messageList.removeEventListener('load', handleLoad, true);\n messageList.removeEventListener('wheel', handleWheel);\n messageList.removeEventListener('touchstart', handleTouchStart);\n messageList.removeEventListener('touchmove', handleTouchMove);\n };\n }, [newestMessageId]);\n\n return (\n <div\n className={cx(styles.messages, fill && styles.fill)}\n data-component='messages'\n ref={messagesRef}\n >\n <List data-message-list>\n {messages.map((message) => (\n <Message\n key={message.id}\n {...message}\n />\n ))}\n </List>\n {tooltipLabel && <Tooltip variant='static'>{tooltipLabel}</Tooltip>}\n <Editor\n autofocus\n content={message}\n disabled={sending || (messageIsEmpty && queuedFiles.length === 0 && !inlineImages?.length)}\n files={queuedFiles}\n inlineImages={inlineImages}\n maxRows={maxEditorRows}\n minRows={minEditorRows}\n onChange={onChange}\n onFilesChange={(nextFiles) => {\n if (files === undefined) setInternalFiles(nextFiles);\n onFilesChange?.(nextFiles);\n }}\n onInlineImagesChange={onInlineImagesChange}\n onSubmit={onSubmit}\n onUpload={handleUpload}\n placeholder={placeholder}\n submitLabel='Send message'\n />\n </div>\n );\n};\n"],"names":["Messages","fill","files","handleUpload","inlineImages","maxEditorRows","message","messages","minEditorRows","onChange","onFilesChange","onInlineImagesChange","onSubmit","placeholder","sending","tooltipLabel","messagesRef","useRef","followImageLoadsRef","hasLoadedRef","internalFiles","setInternalFiles","useState","queuedFiles","newestMessageId","length","id","messageIsEmpty","replace","trim","useLayoutEffect","messageList","current","querySelector","undefined","isNearBottom","scrollHeight","scrollTop","clientHeight","shouldScrollToBottom","timeout","window","setTimeout","scrollToBottom","handleLoad","event","target","HTMLImageElement","handleWheel","deltaY","previousTouchY","handleTouchStart","touches","clientY","handleTouchMove","touchY","addEventListener","passive","clearTimeout","removeEventListener","jsxs","cx","styles","jsx","List","map","Message","Tooltip","Editor","nextFiles"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index12.css');const o=require("react/jsx-runtime"),r=require("../../classix-5H4IWnMA.cjs"),p=require("react"),h=require("../../icons-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index12.css');const o=require("react/jsx-runtime"),r=require("../../classix-5H4IWnMA.cjs"),p=require("react"),h=require("../../icons-B_uIKmIp.cjs"),v="_nav_1hgi7_3",f="_label_1hgi7_9",g="_horizontal_1hgi7_17",m="_sidebar_1hgi7_27",w="_tabs_1hgi7_66",N="_pills_1hgi7_86",t={nav:v,label:f,horizontal:g,sidebar:m,tabs:w,pills:N},x={default:t.default,pills:t.pills,sidebar:t.sidebar,tabs:t.tabs},j=({className:e,...n})=>o.jsx("span",{className:r.t(e,t.label),...n,"data-component":"navlabel"}),q=({animation:e,children:n,className:c,horizontal:i=!1,variant:s="default",...d})=>{const[b,l]=p.useState(!1),u={"--icon-svg":h.iconSVG("CaretDown")};return o.jsx("nav",{className:r.t(c,i&&t.horizontal,t.nav,x[s]),"data-animation":e,"data-open":b?"true":"false","data-orientation":i?"horizontal":"vertical",onBlurCapture:a=>{if(s!=="pills"||window.innerWidth>960)return;const _=a.relatedTarget;a.currentTarget.contains(_)||l(!1)},onClick:()=>{s!=="pills"||window.innerWidth>960||l(a=>!a)},style:u,...d,"data-component":"nav",children:n})};exports.Nav=q;exports.NavLabel=j;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/nav/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport { useState } from 'react';\n\nimport { iconSVG } from '@/components/icon/icons.ts';\n\nimport styles from './styles.module.css';\n\nconst variants = {\n default: styles.default,\n pills: styles.pills,\n sidebar: styles.sidebar,\n tabs: styles.tabs,\n};\n\nexport type NavProps = React.HTMLAttributes<HTMLElement> & {\n animation?: string;\n children?: React.ReactNode;\n className?: string;\n horizontal?: boolean;\n variant?: keyof typeof variants;\n};\n\nexport type NavLabelProps = React.HTMLAttributes<HTMLSpanElement>;\n\nexport const NavLabel = ({ className, ...props }: NavLabelProps) => (\n <span\n className={cx(className, styles.label)}\n {...props}\n />\n);\n\nexport const Nav = ({\n animation,\n children,\n className,\n horizontal = false,\n variant = 'default',\n ...props\n}: NavProps) => {\n const [open, setOpen] = useState(false);\n\n type withVars = React.CSSProperties & {\n '--icon-svg'?: string;\n };\n const withVars: withVars = {\n '--icon-svg': iconSVG('
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/nav/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport { useState } from 'react';\n\nimport { iconSVG } from '@/components/icon/icons.ts';\n\nimport styles from './styles.module.css';\n\nconst variants = {\n default: styles.default,\n pills: styles.pills,\n sidebar: styles.sidebar,\n tabs: styles.tabs,\n};\n\nexport type NavProps = React.HTMLAttributes<HTMLElement> & {\n animation?: string;\n children?: React.ReactNode;\n className?: string;\n horizontal?: boolean;\n variant?: keyof typeof variants;\n};\n\nexport type NavLabelProps = React.HTMLAttributes<HTMLSpanElement>;\n\nexport const NavLabel = ({ className, ...props }: NavLabelProps) => (\n <span\n className={cx(className, styles.label)}\n {...props}\n />\n);\n\nexport const Nav = ({\n animation,\n children,\n className,\n horizontal = false,\n variant = 'default',\n ...props\n}: NavProps) => {\n const [open, setOpen] = useState(false);\n\n type withVars = React.CSSProperties & {\n '--icon-svg'?: string;\n };\n const withVars: withVars = {\n '--icon-svg': iconSVG('CaretDown'),\n };\n\n return (\n <nav\n className={cx(className, horizontal && styles.horizontal, styles.nav, variants[variant])}\n data-animation={animation}\n data-open={open ? 'true' : 'false'}\n data-orientation={horizontal ? 'horizontal' : 'vertical'}\n onBlurCapture={(e) => {\n if (variant !== 'pills' || window.innerWidth > 960) return;\n\n const next = e.relatedTarget as Node | null;\n if (!e.currentTarget.contains(next)) {\n setOpen(false);\n }\n }}\n onClick={() => {\n if (variant !== 'pills' || window.innerWidth > 960) return;\n\n setOpen((v) => !v);\n }}\n style={withVars}\n {...props}\n >\n {children}\n </nav>\n );\n};\n"],"names":["variants","default","styles","pills","sidebar","tabs","NavLabel","className","props","jsx","cx","label","Nav","animation","children","horizontal","variant","open","setOpen","useState","withVars","iconSVG","nav","e","window","innerWidth","next","relatedTarget","currentTarget","contains","v"],"mappings":"wYAOMA,EAAW,CACfC,QAASC,EAAOD,QAChBE,MAAOD,EAAOC,MACdC,QAASF,EAAOE,QAChBC,KAAMH,EAAOG,IACf,EAYaC,EAAWA,CAAC,CAAEC,UAAAA,EAAW,GAAGC,CAAqB,IAC5DC,MAAC,OAAA,CACC,UAAWC,EAAAA,EAAGH,EAAWL,EAAOS,KAAK,EACrC,GAAIH,EAAM,iBAAA,UAAA,CAAA,EAIDI,EAAMA,CAAC,CAClBC,UAAAA,EACAC,SAAAA,EACAP,UAAAA,EACAQ,WAAAA,EAAa,GACbC,QAAAA,EAAU,UACV,GAAGR,CACK,IAAM,CACd,KAAM,CAACS,EAAMC,CAAO,EAAIC,EAAAA,SAAS,EAAK,EAKhCC,EAAqB,CACzB,aAAcC,EAAAA,QAAQ,WAAW,CAAA,EAGnC,OACEZ,EAAAA,IAAC,MAAA,CACC,UAAWC,EAAAA,EAAGH,EAAWQ,GAAcb,EAAOa,WAAYb,EAAOoB,IAAKtB,EAASgB,CAAO,CAAC,EACvF,iBAAgBH,EAChB,YAAWI,EAAO,OAAS,QAC3B,mBAAkBF,EAAa,aAAe,WAC9C,cAAgBQ,GAAM,CACpB,GAAIP,IAAY,SAAWQ,OAAOC,WAAa,IAAK,OAEpD,MAAMC,EAAOH,EAAEI,cACVJ,EAAEK,cAAcC,SAASH,CAAI,GAChCR,EAAQ,EAAK,CAEjB,EACA,QAAS,IAAM,CACTF,IAAY,SAAWQ,OAAOC,WAAa,KAE/CP,EAASY,GAAM,CAACA,CAAC,CACnB,EACA,MAAOV,EACP,GAAIZ,EAAM,iBAAA,MAETM,SAAAA,EACH,CAEJ"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as l } from "react/jsx-runtime";
|
|
2
2
|
import { t as r } from "../../classix-DG18itHa.js";
|
|
3
3
|
import { useState as f } from "react";
|
|
4
|
-
import { i as h } from "../../icons-
|
|
4
|
+
import { i as h } from "../../icons-Dm2kyF0g.js";
|
|
5
5
|
import '../../assets/index12.css';const m = "_nav_1hgi7_3", u = "_label_1hgi7_9", v = "_horizontal_1hgi7_17", g = "_sidebar_1hgi7_27", w = "_tabs_1hgi7_66", z = "_pills_1hgi7_86", a = {
|
|
6
6
|
nav: m,
|
|
7
7
|
label: u,
|
|
@@ -26,7 +26,7 @@ import '../../assets/index12.css';const m = "_nav_1hgi7_3", u = "_label_1hgi7_9"
|
|
|
26
26
|
...p
|
|
27
27
|
}) => {
|
|
28
28
|
const [d, i] = f(!1), _ = {
|
|
29
|
-
"--icon-svg": h("
|
|
29
|
+
"--icon-svg": h("CaretDown")
|
|
30
30
|
};
|
|
31
31
|
return /* @__PURE__ */ l("nav", { className: r(c, e && a.horizontal, a.nav, N[o]), "data-animation": n, "data-open": d ? "true" : "false", "data-orientation": e ? "horizontal" : "vertical", onBlurCapture: (t) => {
|
|
32
32
|
if (o !== "pills" || window.innerWidth > 960) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/nav/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport { useState } from 'react';\n\nimport { iconSVG } from '@/components/icon/icons.ts';\n\nimport styles from './styles.module.css';\n\nconst variants = {\n default: styles.default,\n pills: styles.pills,\n sidebar: styles.sidebar,\n tabs: styles.tabs,\n};\n\nexport type NavProps = React.HTMLAttributes<HTMLElement> & {\n animation?: string;\n children?: React.ReactNode;\n className?: string;\n horizontal?: boolean;\n variant?: keyof typeof variants;\n};\n\nexport type NavLabelProps = React.HTMLAttributes<HTMLSpanElement>;\n\nexport const NavLabel = ({ className, ...props }: NavLabelProps) => (\n <span\n className={cx(className, styles.label)}\n {...props}\n />\n);\n\nexport const Nav = ({\n animation,\n children,\n className,\n horizontal = false,\n variant = 'default',\n ...props\n}: NavProps) => {\n const [open, setOpen] = useState(false);\n\n type withVars = React.CSSProperties & {\n '--icon-svg'?: string;\n };\n const withVars: withVars = {\n '--icon-svg': iconSVG('
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/nav/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport { useState } from 'react';\n\nimport { iconSVG } from '@/components/icon/icons.ts';\n\nimport styles from './styles.module.css';\n\nconst variants = {\n default: styles.default,\n pills: styles.pills,\n sidebar: styles.sidebar,\n tabs: styles.tabs,\n};\n\nexport type NavProps = React.HTMLAttributes<HTMLElement> & {\n animation?: string;\n children?: React.ReactNode;\n className?: string;\n horizontal?: boolean;\n variant?: keyof typeof variants;\n};\n\nexport type NavLabelProps = React.HTMLAttributes<HTMLSpanElement>;\n\nexport const NavLabel = ({ className, ...props }: NavLabelProps) => (\n <span\n className={cx(className, styles.label)}\n {...props}\n />\n);\n\nexport const Nav = ({\n animation,\n children,\n className,\n horizontal = false,\n variant = 'default',\n ...props\n}: NavProps) => {\n const [open, setOpen] = useState(false);\n\n type withVars = React.CSSProperties & {\n '--icon-svg'?: string;\n };\n const withVars: withVars = {\n '--icon-svg': iconSVG('CaretDown'),\n };\n\n return (\n <nav\n className={cx(className, horizontal && styles.horizontal, styles.nav, variants[variant])}\n data-animation={animation}\n data-open={open ? 'true' : 'false'}\n data-orientation={horizontal ? 'horizontal' : 'vertical'}\n onBlurCapture={(e) => {\n if (variant !== 'pills' || window.innerWidth > 960) return;\n\n const next = e.relatedTarget as Node | null;\n if (!e.currentTarget.contains(next)) {\n setOpen(false);\n }\n }}\n onClick={() => {\n if (variant !== 'pills' || window.innerWidth > 960) return;\n\n setOpen((v) => !v);\n }}\n style={withVars}\n {...props}\n >\n {children}\n </nav>\n );\n};\n"],"names":["variants","default","styles","pills","sidebar","tabs","NavLabel","className","props","jsx","cx","label","Nav","animation","children","horizontal","variant","open","setOpen","useState","withVars","iconSVG","nav","e","window","innerWidth","next","relatedTarget","currentTarget","contains","v"],"mappings":";;;;;;;;;;;GAOMA,IAAW;AAAA,EACfC,SAASC,EAAOD;AAAAA,EAChBE,OAAOD,EAAOC;AAAAA,EACdC,SAASF,EAAOE;AAAAA,EAChBC,MAAMH,EAAOG;AACf,GAYaC,IAAWA,CAAC;AAAA,EAAEC,WAAAA;AAAAA,EAAW,GAAGC;AAAqB,MAC5D,gBAAAC,EAAC,QAAA,EACC,WAAWC,EAAGH,GAAWL,EAAOS,KAAK,GACrC,GAAIH,GAAM,kBAAA,WAAA,CAAA,GAIDI,IAAMA,CAAC;AAAA,EAClBC,WAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAP,WAAAA;AAAAA,EACAQ,YAAAA,IAAa;AAAA,EACbC,SAAAA,IAAU;AAAA,EACV,GAAGR;AACK,MAAM;AACd,QAAM,CAACS,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAKhCC,IAAqB;AAAA,IACzB,cAAcC,EAAQ,WAAW;AAAA,EAAA;AAGnC,SACE,gBAAAZ,EAAC,OAAA,EACC,WAAWC,EAAGH,GAAWQ,KAAcb,EAAOa,YAAYb,EAAOoB,KAAKtB,EAASgB,CAAO,CAAC,GACvF,kBAAgBH,GAChB,aAAWI,IAAO,SAAS,SAC3B,oBAAkBF,IAAa,eAAe,YAC9C,eAAgBQ,CAAAA,MAAM;AACpB,QAAIP,MAAY,WAAWQ,OAAOC,aAAa,IAAK;AAEpD,UAAMC,IAAOH,EAAEI;AACf,IAAKJ,EAAEK,cAAcC,SAASH,CAAI,KAChCR,EAAQ,EAAK;AAAA,EAEjB,GACA,SAAS,MAAM;AACb,IAAIF,MAAY,WAAWQ,OAAOC,aAAa,OAE/CP,EAASY,CAAAA,MAAM,CAACA,CAAC;AAAA,EACnB,GACA,OAAOV,GACP,GAAIZ,GAAM,kBAAA,OAETM,UAAAA,GACH;AAEJ;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index10.css');const e=require("react/jsx-runtime"),r=require("../../classix-5H4IWnMA.cjs"),i=require("../button/index.cjs"),a=require("../icon/index.cjs"),l=require("../aside/index.cjs"),_=require("../branding/index.cjs"),d=require("../figure/index.cjs"),u=require("../nav/index.cjs"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index10.css');const e=require("react/jsx-runtime"),r=require("../../classix-5H4IWnMA.cjs"),i=require("../button/index.cjs"),a=require("../icon/index.cjs"),l=require("../aside/index.cjs"),_=require("../branding/index.cjs"),d=require("../figure/index.cjs"),u=require("../nav/index.cjs"),p="_portal_1co65_41",g="_content_1co65_254",m="_toggle_1co65_261",x="_open_1co65_314",n={portal:p,content:g,toggle:m,open:x},j=({children:o,portals:t,open:s,setOpen:c})=>e.jsxs(l.Aside,{className:r.t(n.portal,s&&n.open),sticky:!0,"data-component":"portal",children:[e.jsx(i.Button,{className:n.toggle,onClick:()=>c(!s),variant:"tertiary",children:e.jsx(a.Icon,{name:"SidebarSimple"})}),e.jsx(d.Figure,{children:e.jsx(_.Branding,{name:"logo",size:48,variant:"white"})}),e.jsxs("div",{className:n.content,children:[t&&e.jsx(u.Nav,{horizontal:!0,children:t}),o&&o]})]});exports.Portal=j;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/portal/index.tsx"],"sourcesContent":["import cx from 'classix';\n\nimport { Button } from '@/components/button';\nimport { Icon } from '@/components/icon';\n\nimport { Aside } from '../aside';\nimport { Branding } from '../branding';\nimport { Figure } from '../figure';\nimport { Nav } from '../nav';\nimport styles from './styles.module.css';\n\nexport type PortalProps = {\n accessibleLabel?: string;\n children?: React.ReactNode;\n portals?: React.ReactNode;\n open: boolean;\n setOpen: (open: boolean) => void;\n};\n\nexport const Portal = ({ children, portals, open, setOpen }: PortalProps) => (\n <Aside\n className={cx(styles.portal, open && styles.open)}\n sticky\n >\n <Button\n className={styles.toggle}\n onClick={() => setOpen(!open)}\n variant={'tertiary'}\n >\n <Icon name=
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/portal/index.tsx"],"sourcesContent":["import cx from 'classix';\n\nimport { Button } from '@/components/button';\nimport { Icon } from '@/components/icon';\n\nimport { Aside } from '../aside';\nimport { Branding } from '../branding';\nimport { Figure } from '../figure';\nimport { Nav } from '../nav';\nimport styles from './styles.module.css';\n\nexport type PortalProps = {\n accessibleLabel?: string;\n children?: React.ReactNode;\n portals?: React.ReactNode;\n open: boolean;\n setOpen: (open: boolean) => void;\n};\n\nexport const Portal = ({ children, portals, open, setOpen }: PortalProps) => (\n <Aside\n className={cx(styles.portal, open && styles.open)}\n sticky\n >\n <Button\n className={styles.toggle}\n onClick={() => setOpen(!open)}\n variant={'tertiary'}\n >\n <Icon name='SidebarSimple' />\n </Button>\n <Figure>\n <Branding\n name='logo'\n size={48}\n variant='white'\n />\n </Figure>\n <div className={styles.content}>\n {portals && <Nav horizontal>{portals}</Nav>}\n {children && children}\n </div>\n </Aside>\n);\n"],"names":["Portal","children","portals","open","setOpen","jsxs","Aside","cx","styles","portal","jsx","Button","toggle","Icon","Figure","Branding","content","Nav"],"mappings":"4dAmBaA,EAASA,CAAC,CAAEC,SAAAA,EAAUC,QAAAA,EAASC,KAAAA,EAAMC,QAAAA,CAAqB,IACrEC,EAAAA,KAACC,EAAAA,MAAA,CACC,UAAWC,EAAAA,EAAGC,EAAOC,OAAQN,GAAQK,EAAOL,IAAI,EAChD,OAAM,GAAA,iBAAA,SAEN,SAAA,CAAAO,MAACC,EAAAA,QACC,UAAWH,EAAOI,OAClB,QAAS,IAAMR,EAAQ,CAACD,CAAI,EAC5B,QAAS,WAET,SAAAO,EAAAA,IAACG,EAAAA,KAAA,CAAK,KAAK,gBAAe,EAC5B,EACAH,EAAAA,IAACI,EAAAA,OAAA,CACC,SAAAJ,EAAAA,IAACK,EAAAA,SAAA,CACC,KAAK,OACL,KAAM,GACN,QAAQ,OAAA,CAAO,CAAA,CAEnB,EACAV,EAAAA,KAAC,MAAA,CAAI,UAAWG,EAAOQ,QACpBd,SAAAA,CAAAA,GAAWQ,EAAAA,IAACO,MAAA,CAAI,WAAU,GAAEf,SAAAA,EAAQ,EACpCD,GAAYA,CAAAA,CAAAA,CACf,CAAA,CAAA,CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsxs as
|
|
1
|
+
import { jsxs as i, jsx as o } from "react/jsx-runtime";
|
|
2
2
|
import { t as a } from "../../classix-DG18itHa.js";
|
|
3
3
|
import { Button as m } from "../button/index.js";
|
|
4
4
|
import { Icon as l } from "../icon/index.js";
|
|
@@ -11,20 +11,20 @@ import '../../assets/index10.css';const d = "_portal_1co65_41", f = "_content_1c
|
|
|
11
11
|
content: f,
|
|
12
12
|
toggle: h,
|
|
13
13
|
open: u
|
|
14
|
-
},
|
|
14
|
+
}, S = ({
|
|
15
15
|
children: r,
|
|
16
16
|
portals: n,
|
|
17
17
|
open: e,
|
|
18
|
-
setOpen:
|
|
19
|
-
}) => /* @__PURE__ */
|
|
20
|
-
/* @__PURE__ */ o(m, { className: t.toggle, onClick: () =>
|
|
18
|
+
setOpen: c
|
|
19
|
+
}) => /* @__PURE__ */ i(s, { className: a(t.portal, e && t.open), sticky: !0, "data-component": "portal", children: [
|
|
20
|
+
/* @__PURE__ */ o(m, { className: t.toggle, onClick: () => c(!e), variant: "tertiary", children: /* @__PURE__ */ o(l, { name: "SidebarSimple" }) }),
|
|
21
21
|
/* @__PURE__ */ o(_, { children: /* @__PURE__ */ o(p, { name: "logo", size: 48, variant: "white" }) }),
|
|
22
|
-
/* @__PURE__ */
|
|
22
|
+
/* @__PURE__ */ i("div", { className: t.content, children: [
|
|
23
23
|
n && /* @__PURE__ */ o(g, { horizontal: !0, children: n }),
|
|
24
24
|
r && r
|
|
25
25
|
] })
|
|
26
26
|
] });
|
|
27
27
|
export {
|
|
28
|
-
|
|
28
|
+
S as Portal
|
|
29
29
|
};
|
|
30
30
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/portal/index.tsx"],"sourcesContent":["import cx from 'classix';\n\nimport { Button } from '@/components/button';\nimport { Icon } from '@/components/icon';\n\nimport { Aside } from '../aside';\nimport { Branding } from '../branding';\nimport { Figure } from '../figure';\nimport { Nav } from '../nav';\nimport styles from './styles.module.css';\n\nexport type PortalProps = {\n accessibleLabel?: string;\n children?: React.ReactNode;\n portals?: React.ReactNode;\n open: boolean;\n setOpen: (open: boolean) => void;\n};\n\nexport const Portal = ({ children, portals, open, setOpen }: PortalProps) => (\n <Aside\n className={cx(styles.portal, open && styles.open)}\n sticky\n >\n <Button\n className={styles.toggle}\n onClick={() => setOpen(!open)}\n variant={'tertiary'}\n >\n <Icon name=
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/portal/index.tsx"],"sourcesContent":["import cx from 'classix';\n\nimport { Button } from '@/components/button';\nimport { Icon } from '@/components/icon';\n\nimport { Aside } from '../aside';\nimport { Branding } from '../branding';\nimport { Figure } from '../figure';\nimport { Nav } from '../nav';\nimport styles from './styles.module.css';\n\nexport type PortalProps = {\n accessibleLabel?: string;\n children?: React.ReactNode;\n portals?: React.ReactNode;\n open: boolean;\n setOpen: (open: boolean) => void;\n};\n\nexport const Portal = ({ children, portals, open, setOpen }: PortalProps) => (\n <Aside\n className={cx(styles.portal, open && styles.open)}\n sticky\n >\n <Button\n className={styles.toggle}\n onClick={() => setOpen(!open)}\n variant={'tertiary'}\n >\n <Icon name='SidebarSimple' />\n </Button>\n <Figure>\n <Branding\n name='logo'\n size={48}\n variant='white'\n />\n </Figure>\n <div className={styles.content}>\n {portals && <Nav horizontal>{portals}</Nav>}\n {children && children}\n </div>\n </Aside>\n);\n"],"names":["Portal","children","portals","open","setOpen","jsxs","Aside","cx","styles","portal","jsx","Button","toggle","Icon","Figure","Branding","content","Nav"],"mappings":";;;;;;;;;;;;;GAmBaA,IAASA,CAAC;AAAA,EAAEC,UAAAA;AAAAA,EAAUC,SAAAA;AAAAA,EAASC,MAAAA;AAAAA,EAAMC,SAAAA;AAAqB,MACrE,gBAAAC,EAACC,GAAA,EACC,WAAWC,EAAGC,EAAOC,QAAQN,KAAQK,EAAOL,IAAI,GAChD,QAAM,IAAA,kBAAA,UAEN,UAAA;AAAA,EAAA,gBAAAO,EAACC,KACC,WAAWH,EAAOI,QAClB,SAAS,MAAMR,EAAQ,CAACD,CAAI,GAC5B,SAAS,YAET,UAAA,gBAAAO,EAACG,GAAA,EAAK,MAAK,iBAAe,GAC5B;AAAA,EACA,gBAAAH,EAACI,GAAA,EACC,UAAA,gBAAAJ,EAACK,GAAA,EACC,MAAK,QACL,MAAM,IACN,SAAQ,QAAA,CAAO,EAAA,CAEnB;AAAA,EACA,gBAAAV,EAAC,OAAA,EAAI,WAAWG,EAAOQ,SACpBd,UAAAA;AAAAA,IAAAA,KAAW,gBAAAQ,EAACO,GAAA,EAAI,YAAU,IAAEf,UAAAA,GAAQ;AAAA,IACpCD,KAAYA;AAAAA,EAAAA,EAAAA,CACf;AAAA,EAAA,CACF;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index9.css');const a=require("react/jsx-runtime"),b=require("react"),m=require("../button/index.cjs"),w=require("../checkbox/index.cjs"),B=require("../chip/index.cjs"),I=require("../collapsible/index.cjs"),T=require("../controls/index.cjs"),H=require("../dialog/index.cjs"),P=require("../header/index.cjs"),z=require("../../index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index9.css');const a=require("react/jsx-runtime"),b=require("react"),m=require("../button/index.cjs"),w=require("../checkbox/index.cjs"),B=require("../chip/index.cjs"),I=require("../collapsible/index.cjs"),T=require("../controls/index.cjs"),H=require("../dialog/index.cjs"),P=require("../header/index.cjs"),z=require("../../index-rXfEqyt5.cjs"),A="_search_1rde5_3",E="_controls_1rde5_15",J="_chips_1rde5_35",K="_radio_1rde5_101",n={search:A,controls:E,chips:J,"filter-dialog":"_filter-dialog_1rde5_42","filter-groups":"_filter-groups_1rde5_47","filter-group":"_filter-group_1rde5_47","filter-option":"_filter-option_1rde5_83","option-copy":"_option-copy_1rde5_89",radio:K,"collapsible-options":"_collapsible-options_1rde5_128"},L=({closeLabel:q="Close",filterButtonLabel:x="Filters",filterDialogColumns:f=1,filterDialogTitle:k="Filters",filterGroups:d=[],onChange:M,onSelectedFiltersChange:o,removeFilterLabel:$=i=>`Remove ${i.label} filter`,resetLabel:O="Reset",searchLabel:C="Search",searchPlaceholder:D="Search",selectedFilters:t=[],value:R=""})=>{const i=b.useId(),[j,r]=b.useState(!1),S=b.useMemo(()=>new Map(d.flatMap(e=>{var l;return[...e.options,...((l=e.collapsible)==null?void 0:l.options)??[]]}).map(e=>[e.value,e])),[d]),h=t.flatMap(e=>{const l=S.get(e);return l?[l]:[]}),_=(e,l,s)=>{var N;if(!o)return;const p=new Set([...(s==null?void 0:s.options.map(c=>c.value))??[],...((N=s==null?void 0:s.collapsible)==null?void 0:N.options.map(c=>c.value))??[]]),y=t.filter(c=>!p.has(c));if(l&&(s==null?void 0:s.defaultValue)===e){o(y);return}o(l?(s==null?void 0:s.control)==="radio"||(s==null?void 0:s.selectionMode)==="single"?[...y,e]:[...new Set([...t,e])]:t.filter(c=>c!==e))},v=(e,l)=>{var s;return t.includes(e)||l.defaultValue===e&&![...l.options,...((s=l.collapsible)==null?void 0:s.options)??[]].some(p=>t.includes(p.value))},u=(e,l)=>a.jsx("div",{className:n["filter-option"],"data-component":"renderfilter",children:l.control==="radio"?a.jsxs("label",{className:n.radio,children:[a.jsx("input",{checked:v(e.value,l),name:`${i}-filter-${l.label??"group"}`,onChange:s=>_(e.value,s.target.checked,l),type:"radio"}),a.jsxs("span",{className:n["option-copy"],children:[e.label,e.description&&a.jsx("sub",{children:e.description})]})]}):a.jsx(w.Checkbox,{checked:v(e.value,l),label:a.jsxs("span",{className:n["option-copy"],children:[e.label,e.description&&a.jsx("sub",{children:e.description})]}),onChange:s=>_(e.value,s.target.checked,l)})},e.value);return a.jsxs("div",{className:n.search,"data-component":"search",children:[a.jsxs("div",{className:n.controls,children:[a.jsx(z.Input,{"aria-label":C,icon:"MagnifyingGlass",onChange:e=>M(e.target.value),placeholder:D,type:"search",value:R}),d.length>0&&a.jsx(m.Button,{"aria-expanded":j,"aria-haspopup":"dialog",badge:h.length,icon:"Funnel",onClick:()=>r(!0),variant:"tertiary",children:x})]}),h.length>0&&a.jsxs("div",{"aria-label":x,className:n.chips,children:[h.map(e=>a.jsx(B.Chip,{accessibleLabel:$(e),label:e.label,onDelete:()=>_(e.value,!1)},e.value)),a.jsx(m.Button,{onClick:()=>o==null?void 0:o([]),variant:"tertiary",children:O})]}),j&&a.jsx(H.Dialog,{"aria-labelledby":i,className:n["filter-dialog"],controls:a.jsx(T.Controls,{children:a.jsx(m.Button,{onClick:()=>r(!1),children:q})}),header:a.jsx(P.Header,{children:a.jsx("h2",{id:i,children:k})}),open:!0,setOpen:r,children:a.jsx("div",{className:n["filter-groups"],"data-columns":f,children:d.map((e,l)=>a.jsxs("section",{"aria-labelledby":e.label?`${i}-${l}`:void 0,className:n["filter-group"],"data-column-span":e.columnSpan??1,role:e.control==="radio"?"radiogroup":"group",children:[e.label&&a.jsx("h3",{id:`${i}-${l}`,children:e.label}),e.options.map(s=>u(s,e)),e.collapsible&&a.jsx(I.Collapsible,{summary:e.collapsible.label,children:a.jsx("div",{className:n["collapsible-options"],children:e.collapsible.options.map(s=>u(s,e))})})]},e.label??l))})})]})};exports.Search=L;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/search/index.tsx"],"sourcesContent":["import { useId, useMemo, useState } from 'react';\n\nimport { Button } from '../button';\nimport { Checkbox } from '../checkbox';\nimport { Chip } from '../chip';\nimport { Collapsible } from '../collapsible';\nimport { Controls } from '../controls';\nimport { Dialog } from '../dialog';\nimport { Header } from '../header';\nimport { Input } from '../input';\nimport styles from './styles.module.css';\n\nexport type SearchFilter = {\n description?: string;\n label: string;\n value: string;\n};\n\nexport type SearchFilterGroup = {\n collapsible?: {\n label: string;\n options: readonly SearchFilter[];\n };\n columnSpan?: 1 | 2;\n control?: 'checkbox' | 'radio';\n defaultValue?: string;\n label?: string;\n options: readonly SearchFilter[];\n selectionMode?: 'multiple' | 'single';\n};\n\nexport type SearchProps = {\n closeLabel?: string;\n filterButtonLabel?: string;\n filterDialogColumns?: 1 | 2;\n filterDialogTitle?: string;\n filterGroups?: readonly SearchFilterGroup[];\n onChange: (value: string) => void;\n onSelectedFiltersChange?: (selectedFilters: string[]) => void;\n removeFilterLabel?: (filter: SearchFilter) => string;\n resetLabel?: string;\n searchLabel?: string;\n searchPlaceholder?: string;\n selectedFilters?: readonly string[];\n value?: string;\n};\n\nexport const Search = ({\n closeLabel = 'Close',\n filterButtonLabel = 'Filters',\n filterDialogColumns = 1,\n filterDialogTitle = 'Filters',\n filterGroups = [],\n onChange,\n onSelectedFiltersChange,\n removeFilterLabel = (filter) => `Remove ${filter.label} filter`,\n resetLabel = 'Reset',\n searchLabel = 'Search',\n searchPlaceholder = 'Search',\n selectedFilters = [],\n value = '',\n}: SearchProps) => {\n const dialogTitleId = useId();\n const [isFilterDialogOpen, setIsFilterDialogOpen] = useState(false);\n const filtersByValue = useMemo(\n () =>\n new Map(\n filterGroups\n .flatMap((group) => [...group.options, ...(group.collapsible?.options ?? [])])\n .map((filter) => [filter.value, filter])\n ),\n [filterGroups]\n );\n const activeFilters = selectedFilters.flatMap((selectedFilter) => {\n const filter = filtersByValue.get(selectedFilter);\n\n return filter ? [filter] : [];\n });\n\n const setFilterSelected = (\n filterValue: string,\n isSelected: boolean,\n group?: SearchFilterGroup\n ) => {\n if (!onSelectedFiltersChange) return;\n\n const groupValues = new Set([\n ...(group?.options.map((filter) => filter.value) ?? []),\n ...(group?.collapsible?.options.map((filter) => filter.value) ?? []),\n ]);\n const filtersOutsideGroup = selectedFilters.filter(\n (selectedFilter) => !groupValues.has(selectedFilter)\n );\n\n if (isSelected && group?.defaultValue === filterValue) {\n onSelectedFiltersChange(filtersOutsideGroup);\n return;\n }\n\n onSelectedFiltersChange(\n isSelected\n ? group?.control === 'radio' || group?.selectionMode === 'single'\n ? [...filtersOutsideGroup, filterValue]\n : [...new Set([...selectedFilters, filterValue])]\n : selectedFilters.filter((selectedFilter) => selectedFilter !== filterValue)\n );\n };\n\n const isFilterSelected = (filterValue: string, group: SearchFilterGroup) =>\n selectedFilters.includes(filterValue) ||\n (group.defaultValue === filterValue &&\n ![...group.options, ...(group.collapsible?.options ?? [])].some((filter) =>\n selectedFilters.includes(filter.value)\n ));\n\n const renderFilter = (filter: SearchFilter, group: SearchFilterGroup) => (\n <div\n className={styles['filter-option']}\n key={filter.value}\n >\n {group.control === 'radio' ? (\n <label className={styles.radio}>\n <input\n checked={isFilterSelected(filter.value, group)}\n name={`${dialogTitleId}-filter-${group.label ?? 'group'}`}\n onChange={(event) => setFilterSelected(filter.value, event.target.checked, group)}\n type='radio'\n />\n <span className={styles['option-copy']}>\n {filter.label}\n {filter.description && <sub>{filter.description}</sub>}\n </span>\n </label>\n ) : (\n <Checkbox\n checked={isFilterSelected(filter.value, group)}\n label={\n <span className={styles['option-copy']}>\n {filter.label}\n {filter.description && <sub>{filter.description}</sub>}\n </span>\n }\n onChange={(event) => setFilterSelected(filter.value, event.target.checked, group)}\n />\n )}\n </div>\n );\n\n return (\n <div\n className={styles.search}\n data-component='search'\n >\n <div className={styles.controls}>\n <Input\n aria-label={searchLabel}\n icon='search'\n onChange={(event) => onChange(event.target.value)}\n placeholder={searchPlaceholder}\n type='search'\n value={value}\n />\n {filterGroups.length > 0 && (\n <Button\n aria-expanded={isFilterDialogOpen}\n aria-haspopup='dialog'\n badge={activeFilters.length}\n icon='funnel'\n onClick={() => setIsFilterDialogOpen(true)}\n variant='tertiary'\n >\n {filterButtonLabel}\n </Button>\n )}\n </div>\n {activeFilters.length > 0 && (\n <div\n aria-label={filterButtonLabel}\n className={styles.chips}\n >\n {activeFilters.map((filter) => (\n <Chip\n accessibleLabel={removeFilterLabel(filter)}\n key={filter.value}\n label={filter.label}\n onDelete={() => setFilterSelected(filter.value, false)}\n />\n ))}\n <Button\n onClick={() => onSelectedFiltersChange?.([])}\n variant='tertiary'\n >\n {resetLabel}\n </Button>\n </div>\n )}\n {isFilterDialogOpen && (\n <Dialog\n aria-labelledby={dialogTitleId}\n className={styles['filter-dialog']}\n controls={\n <Controls>\n <Button onClick={() => setIsFilterDialogOpen(false)}>{closeLabel}</Button>\n </Controls>\n }\n header={\n <Header>\n <h2 id={dialogTitleId}>{filterDialogTitle}</h2>\n </Header>\n }\n open\n setOpen={setIsFilterDialogOpen}\n >\n <div\n className={styles['filter-groups']}\n data-columns={filterDialogColumns}\n >\n {filterGroups.map((group, groupIndex) => (\n <section\n aria-labelledby={group.label ? `${dialogTitleId}-${groupIndex}` : undefined}\n className={styles['filter-group']}\n data-column-span={group.columnSpan ?? 1}\n key={group.label ?? groupIndex}\n role={group.control === 'radio' ? 'radiogroup' : 'group'}\n >\n {group.label && <h3 id={`${dialogTitleId}-${groupIndex}`}>{group.label}</h3>}\n {group.options.map((filter) => renderFilter(filter, group))}\n {group.collapsible && (\n <Collapsible summary={group.collapsible.label}>\n <div className={styles['collapsible-options']}>\n {group.collapsible.options.map((filter) => renderFilter(filter, group))}\n </div>\n </Collapsible>\n )}\n </section>\n ))}\n </div>\n </Dialog>\n )}\n </div>\n );\n};\n"],"names":["Search","closeLabel","filterButtonLabel","filterDialogColumns","filterDialogTitle","filterGroups","onChange","onSelectedFiltersChange","removeFilterLabel","filter","label","resetLabel","searchLabel","searchPlaceholder","selectedFilters","value","dialogTitleId","useId","isFilterDialogOpen","setIsFilterDialogOpen","useState","filtersByValue","useMemo","Map","flatMap","group","options","collapsible","map","activeFilters","selectedFilter","get","setFilterSelected","filterValue","isSelected","groupValues","Set","filtersOutsideGroup","has","defaultValue","control","selectionMode","isFilterSelected","includes","some","renderFilter","jsx","styles","radio","event","target","checked","jsxs","description","Checkbox","search","controls","Input","length","Button","chips","Chip","Dialog","Controls","Header","groupIndex","undefined","columnSpan","Collapsible"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/search/index.tsx"],"sourcesContent":["import { useId, useMemo, useState } from 'react';\n\nimport { Button } from '../button';\nimport { Checkbox } from '../checkbox';\nimport { Chip } from '../chip';\nimport { Collapsible } from '../collapsible';\nimport { Controls } from '../controls';\nimport { Dialog } from '../dialog';\nimport { Header } from '../header';\nimport { Input } from '../input';\nimport styles from './styles.module.css';\n\nexport type SearchFilter = {\n description?: string;\n label: string;\n value: string;\n};\n\nexport type SearchFilterGroup = {\n collapsible?: {\n label: string;\n options: readonly SearchFilter[];\n };\n columnSpan?: 1 | 2;\n control?: 'checkbox' | 'radio';\n defaultValue?: string;\n label?: string;\n options: readonly SearchFilter[];\n selectionMode?: 'multiple' | 'single';\n};\n\nexport type SearchProps = {\n closeLabel?: string;\n filterButtonLabel?: string;\n filterDialogColumns?: 1 | 2;\n filterDialogTitle?: string;\n filterGroups?: readonly SearchFilterGroup[];\n onChange: (value: string) => void;\n onSelectedFiltersChange?: (selectedFilters: string[]) => void;\n removeFilterLabel?: (filter: SearchFilter) => string;\n resetLabel?: string;\n searchLabel?: string;\n searchPlaceholder?: string;\n selectedFilters?: readonly string[];\n value?: string;\n};\n\nexport const Search = ({\n closeLabel = 'Close',\n filterButtonLabel = 'Filters',\n filterDialogColumns = 1,\n filterDialogTitle = 'Filters',\n filterGroups = [],\n onChange,\n onSelectedFiltersChange,\n removeFilterLabel = (filter) => `Remove ${filter.label} filter`,\n resetLabel = 'Reset',\n searchLabel = 'Search',\n searchPlaceholder = 'Search',\n selectedFilters = [],\n value = '',\n}: SearchProps) => {\n const dialogTitleId = useId();\n const [isFilterDialogOpen, setIsFilterDialogOpen] = useState(false);\n const filtersByValue = useMemo(\n () =>\n new Map(\n filterGroups\n .flatMap((group) => [...group.options, ...(group.collapsible?.options ?? [])])\n .map((filter) => [filter.value, filter])\n ),\n [filterGroups]\n );\n const activeFilters = selectedFilters.flatMap((selectedFilter) => {\n const filter = filtersByValue.get(selectedFilter);\n\n return filter ? [filter] : [];\n });\n\n const setFilterSelected = (\n filterValue: string,\n isSelected: boolean,\n group?: SearchFilterGroup\n ) => {\n if (!onSelectedFiltersChange) return;\n\n const groupValues = new Set([\n ...(group?.options.map((filter) => filter.value) ?? []),\n ...(group?.collapsible?.options.map((filter) => filter.value) ?? []),\n ]);\n const filtersOutsideGroup = selectedFilters.filter(\n (selectedFilter) => !groupValues.has(selectedFilter)\n );\n\n if (isSelected && group?.defaultValue === filterValue) {\n onSelectedFiltersChange(filtersOutsideGroup);\n return;\n }\n\n onSelectedFiltersChange(\n isSelected\n ? group?.control === 'radio' || group?.selectionMode === 'single'\n ? [...filtersOutsideGroup, filterValue]\n : [...new Set([...selectedFilters, filterValue])]\n : selectedFilters.filter((selectedFilter) => selectedFilter !== filterValue)\n );\n };\n\n const isFilterSelected = (filterValue: string, group: SearchFilterGroup) =>\n selectedFilters.includes(filterValue) ||\n (group.defaultValue === filterValue &&\n ![...group.options, ...(group.collapsible?.options ?? [])].some((filter) =>\n selectedFilters.includes(filter.value)\n ));\n\n const renderFilter = (filter: SearchFilter, group: SearchFilterGroup) => (\n <div\n className={styles['filter-option']}\n key={filter.value}\n >\n {group.control === 'radio' ? (\n <label className={styles.radio}>\n <input\n checked={isFilterSelected(filter.value, group)}\n name={`${dialogTitleId}-filter-${group.label ?? 'group'}`}\n onChange={(event) => setFilterSelected(filter.value, event.target.checked, group)}\n type='radio'\n />\n <span className={styles['option-copy']}>\n {filter.label}\n {filter.description && <sub>{filter.description}</sub>}\n </span>\n </label>\n ) : (\n <Checkbox\n checked={isFilterSelected(filter.value, group)}\n label={\n <span className={styles['option-copy']}>\n {filter.label}\n {filter.description && <sub>{filter.description}</sub>}\n </span>\n }\n onChange={(event) => setFilterSelected(filter.value, event.target.checked, group)}\n />\n )}\n </div>\n );\n\n return (\n <div\n className={styles.search}\n data-component='search'\n >\n <div className={styles.controls}>\n <Input\n aria-label={searchLabel}\n icon='MagnifyingGlass'\n onChange={(event) => onChange(event.target.value)}\n placeholder={searchPlaceholder}\n type='search'\n value={value}\n />\n {filterGroups.length > 0 && (\n <Button\n aria-expanded={isFilterDialogOpen}\n aria-haspopup='dialog'\n badge={activeFilters.length}\n icon='Funnel'\n onClick={() => setIsFilterDialogOpen(true)}\n variant='tertiary'\n >\n {filterButtonLabel}\n </Button>\n )}\n </div>\n {activeFilters.length > 0 && (\n <div\n aria-label={filterButtonLabel}\n className={styles.chips}\n >\n {activeFilters.map((filter) => (\n <Chip\n accessibleLabel={removeFilterLabel(filter)}\n key={filter.value}\n label={filter.label}\n onDelete={() => setFilterSelected(filter.value, false)}\n />\n ))}\n <Button\n onClick={() => onSelectedFiltersChange?.([])}\n variant='tertiary'\n >\n {resetLabel}\n </Button>\n </div>\n )}\n {isFilterDialogOpen && (\n <Dialog\n aria-labelledby={dialogTitleId}\n className={styles['filter-dialog']}\n controls={\n <Controls>\n <Button onClick={() => setIsFilterDialogOpen(false)}>{closeLabel}</Button>\n </Controls>\n }\n header={\n <Header>\n <h2 id={dialogTitleId}>{filterDialogTitle}</h2>\n </Header>\n }\n open\n setOpen={setIsFilterDialogOpen}\n >\n <div\n className={styles['filter-groups']}\n data-columns={filterDialogColumns}\n >\n {filterGroups.map((group, groupIndex) => (\n <section\n aria-labelledby={group.label ? `${dialogTitleId}-${groupIndex}` : undefined}\n className={styles['filter-group']}\n data-column-span={group.columnSpan ?? 1}\n key={group.label ?? groupIndex}\n role={group.control === 'radio' ? 'radiogroup' : 'group'}\n >\n {group.label && <h3 id={`${dialogTitleId}-${groupIndex}`}>{group.label}</h3>}\n {group.options.map((filter) => renderFilter(filter, group))}\n {group.collapsible && (\n <Collapsible summary={group.collapsible.label}>\n <div className={styles['collapsible-options']}>\n {group.collapsible.options.map((filter) => renderFilter(filter, group))}\n </div>\n </Collapsible>\n )}\n </section>\n ))}\n </div>\n </Dialog>\n )}\n </div>\n );\n};\n"],"names":["Search","closeLabel","filterButtonLabel","filterDialogColumns","filterDialogTitle","filterGroups","onChange","onSelectedFiltersChange","removeFilterLabel","filter","label","resetLabel","searchLabel","searchPlaceholder","selectedFilters","value","dialogTitleId","useId","isFilterDialogOpen","setIsFilterDialogOpen","useState","filtersByValue","useMemo","Map","flatMap","group","options","collapsible","map","activeFilters","selectedFilter","get","setFilterSelected","filterValue","isSelected","groupValues","Set","filtersOutsideGroup","has","defaultValue","control","selectionMode","isFilterSelected","includes","some","renderFilter","jsx","styles","radio","event","target","checked","jsxs","description","Checkbox","search","controls","Input","length","Button","chips","Chip","Dialog","Controls","Header","groupIndex","undefined","columnSpan","Collapsible"],"mappings":"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"}
|