@namroodinc/liquid-editorial 0.1.2 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/AGENTS.md +11 -0
  2. package/README.md +13 -10
  3. package/UPGRADING.md +77 -0
  4. package/dist/chunks/{EntryEditor-cjDk4vdH.cjs → EntryEditor-C32lKKnV.cjs} +2 -2
  5. package/dist/chunks/{EntryEditor-cjDk4vdH.cjs.map → EntryEditor-C32lKKnV.cjs.map} +1 -1
  6. package/dist/chunks/EntryEditor-xVuiqtFo.js +181 -0
  7. package/dist/chunks/{EntryEditor-BF808OZR.js.map → EntryEditor-xVuiqtFo.js.map} +1 -1
  8. package/dist/chunks/RichTextEditor-CSpjsL1z.js +357 -0
  9. package/dist/chunks/RichTextEditor-CSpjsL1z.js.map +1 -0
  10. package/dist/chunks/RichTextEditor-DC_0oN1s.cjs +2 -0
  11. package/dist/chunks/RichTextEditor-DC_0oN1s.cjs.map +1 -0
  12. package/dist/components/AssetGrid/index.js.map +1 -1
  13. package/dist/components/EntryEditor/index.cjs +1 -1
  14. package/dist/components/EntryEditor/index.js +3 -3
  15. package/dist/components/EntryPicker/index.cjs +1 -1
  16. package/dist/components/EntryPicker/index.cjs.map +1 -1
  17. package/dist/components/EntryPicker/index.js +4 -4
  18. package/dist/components/EntryPicker/index.js.map +1 -1
  19. package/dist/components/Field/index.js.map +1 -1
  20. package/dist/components/ImageCropper/index.js.map +1 -1
  21. package/dist/components/Modal/index.cjs +1 -1
  22. package/dist/components/Modal/index.cjs.map +1 -1
  23. package/dist/components/Modal/index.js +2 -2
  24. package/dist/components/Modal/index.js.map +1 -1
  25. package/dist/components/RichTextEditor/index.cjs +1 -1
  26. package/dist/components/RichTextEditor/index.d.cts.map +1 -1
  27. package/dist/components/RichTextEditor/index.d.ts.map +1 -1
  28. package/dist/components/RichTextEditor/index.js +3 -1
  29. package/dist/components/Table/index.cjs +1 -1
  30. package/dist/components/Table/index.cjs.map +1 -1
  31. package/dist/components/Table/index.d.cts +5 -1
  32. package/dist/components/Table/index.d.cts.map +1 -1
  33. package/dist/components/Table/index.d.ts +5 -1
  34. package/dist/components/Table/index.d.ts.map +1 -1
  35. package/dist/components/Table/index.js +74 -55
  36. package/dist/components/Table/index.js.map +1 -1
  37. package/dist/components/Table/style.css +4 -0
  38. package/dist/components/Time/index.js.map +1 -1
  39. package/dist/index.cjs +1 -1
  40. package/dist/index.js +13 -13
  41. package/package.json +3 -1
  42. package/dist/chunks/EntryEditor-BF808OZR.js +0 -181
  43. package/dist/chunks/RichTextEditor-DRt-kibg.js +0 -248
  44. package/dist/chunks/RichTextEditor-DRt-kibg.js.map +0 -1
  45. package/dist/chunks/RichTextEditor-tFkISOvq.cjs +0 -2
  46. package/dist/chunks/RichTextEditor-tFkISOvq.cjs.map +0 -1
@@ -1,102 +1,121 @@
1
1
  import { t as e } from "../../chunks/Icon-CGY1FNXT.js";
2
- import { forwardRef as t } from "react";
3
- import { jsx as n, jsxs as r } from "react/jsx-runtime";
2
+ import { Children as t, Fragment as n, createContext as r, forwardRef as i, isValidElement as a, useContext as o } from "react";
3
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
4
4
  //#region src/components/Table/index.tsx
5
- function i(...e) {
5
+ function l(...e) {
6
6
  return e.filter(Boolean).join(" ");
7
7
  }
8
- var a = t(function({ className: e, children: t, ...r }, a) {
9
- return /* @__PURE__ */ n("div", {
10
- ref: a,
11
- className: i("ds-table-frame", e),
12
- ...r,
8
+ var u = i(function({ className: e, children: t, ...n }, r) {
9
+ return /* @__PURE__ */ s("div", {
10
+ ref: r,
11
+ className: l("ds-table-frame", e),
12
+ ...n,
13
13
  children: t
14
14
  });
15
- }), o = t(function({ start: e, end: t, className: a, ...o }, s) {
16
- return /* @__PURE__ */ r("div", {
17
- ref: s,
18
- className: i("ds-table-toolbar", a),
19
- ...o,
20
- children: [/* @__PURE__ */ n("div", {
15
+ }), d = i(function({ start: e, end: t, className: n, ...r }, i) {
16
+ return /* @__PURE__ */ c("div", {
17
+ ref: i,
18
+ className: l("ds-table-toolbar", n),
19
+ ...r,
20
+ children: [/* @__PURE__ */ s("div", {
21
21
  className: "ds-table-toolbar__group",
22
22
  children: e
23
- }), /* @__PURE__ */ n("div", {
23
+ }), /* @__PURE__ */ s("div", {
24
24
  className: "ds-table-toolbar__group",
25
25
  children: t
26
26
  })]
27
27
  });
28
- }), s = t(function({ className: e, children: t, ...r }, a) {
29
- return /* @__PURE__ */ n("div", {
30
- className: "ds-table-frame__scroll",
31
- children: /* @__PURE__ */ n("table", {
32
- ref: a,
33
- className: i("ds-table", e),
34
- ...r,
35
- children: t
28
+ });
29
+ function f(e) {
30
+ return t.toArray(e).some((e) => a(e) && (e.type !== n || f(e.props.children)));
31
+ }
32
+ var p = r({ emptyMessage: "No data found." }), m = i(function({ emptyMessage: e = "No data found.", isEmpty: t, className: n, children: r, ...i }, a) {
33
+ return /* @__PURE__ */ s(p.Provider, {
34
+ value: {
35
+ emptyMessage: e,
36
+ isEmpty: t
37
+ },
38
+ children: /* @__PURE__ */ s("div", {
39
+ className: "ds-table-frame__scroll",
40
+ children: /* @__PURE__ */ s("table", {
41
+ ...i,
42
+ ref: a,
43
+ className: l("ds-table", n),
44
+ children: r
45
+ })
36
46
  })
37
47
  });
38
- }), c = t(function({ className: e, ...t }, r) {
39
- return /* @__PURE__ */ n("thead", {
40
- ref: r,
48
+ }), h = i(function({ className: e, ...t }, n) {
49
+ return /* @__PURE__ */ s("thead", {
50
+ ref: n,
41
51
  className: e,
42
52
  ...t
43
53
  });
44
- }), l = t(function({ className: e, ...t }, r) {
45
- return /* @__PURE__ */ n("tbody", {
54
+ }), g = i(function({ className: e, children: t, ...n }, r) {
55
+ let { emptyMessage: i, isEmpty: a } = o(p);
56
+ return /* @__PURE__ */ s("tbody", {
46
57
  ref: r,
47
58
  className: e,
48
- ...t
59
+ ...n,
60
+ children: a ?? !f(t) ? /* @__PURE__ */ s(_, { children: /* @__PURE__ */ s(y, {
61
+ colSpan: 1e3,
62
+ className: "ds-table__empty-cell",
63
+ children: /* @__PURE__ */ s(b, {
64
+ title: i,
65
+ role: "status"
66
+ })
67
+ }) }) : t
49
68
  });
50
- }), u = t(function({ isSelected: e = !1, isInteractive: t = !1, className: r, ...i }, a) {
51
- return /* @__PURE__ */ n("tr", {
52
- ref: a,
69
+ }), _ = i(function({ isSelected: e = !1, isInteractive: t = !1, className: n, ...r }, i) {
70
+ return /* @__PURE__ */ s("tr", {
71
+ ref: i,
53
72
  "data-selected": e || void 0,
54
73
  "data-interactive": t || void 0,
55
74
  tabIndex: t ? 0 : void 0,
56
- className: r,
57
- ...i
75
+ className: n,
76
+ ...r
58
77
  });
59
- }), d = t(function({ align: e = "start", width: t = "auto", className: r, ...i }, a) {
60
- return /* @__PURE__ */ n("th", {
61
- ref: a,
78
+ }), v = i(function({ align: e = "start", width: t = "auto", className: n, ...r }, i) {
79
+ return /* @__PURE__ */ s("th", {
80
+ ref: i,
62
81
  scope: "col",
63
82
  "data-align": e,
64
83
  "data-width": t,
65
- className: r,
66
- ...i
84
+ className: n,
85
+ ...r
67
86
  });
68
- }), f = t(function({ align: e = "start", width: t = "auto", emphasis: r = "default", className: i, ...a }, o) {
69
- return /* @__PURE__ */ n("td", {
70
- ref: o,
87
+ }), y = i(function({ align: e = "start", width: t = "auto", emphasis: n = "default", className: r, ...i }, a) {
88
+ return /* @__PURE__ */ s("td", {
89
+ ref: a,
71
90
  "data-align": e,
72
91
  "data-width": t,
73
- "data-emphasis": r === "default" ? void 0 : r,
74
- className: i,
75
- ...a
92
+ "data-emphasis": n === "default" ? void 0 : n,
93
+ className: r,
94
+ ...i
76
95
  });
77
- }), p = t(function({ icon: t = "info", title: a, description: o, action: s, className: c, ...l }, u) {
78
- return /* @__PURE__ */ r("div", {
96
+ }), b = i(function({ icon: t = "info", title: n = "No data found.", description: r, action: i, className: a, ...o }, u) {
97
+ return /* @__PURE__ */ c("div", {
79
98
  ref: u,
80
- className: i("ds-table-empty", c),
81
- ...l,
99
+ className: l("ds-table-empty", a),
100
+ ...o,
82
101
  children: [
83
- /* @__PURE__ */ n(e, {
102
+ /* @__PURE__ */ s(e, {
84
103
  name: t,
85
104
  size: 24
86
105
  }),
87
- /* @__PURE__ */ n("span", {
106
+ /* @__PURE__ */ s("span", {
88
107
  style: {
89
108
  color: "var(--color-text)",
90
109
  fontWeight: "var(--font-weight-bold)"
91
110
  },
92
- children: a
111
+ children: n
93
112
  }),
94
- o && /* @__PURE__ */ n("span", { children: o }),
95
- s
113
+ r && /* @__PURE__ */ s("span", { children: r }),
114
+ i
96
115
  ]
97
116
  });
98
117
  });
99
118
  //#endregion
100
- export { s as Table, l as TableBody, f as TableCell, p as TableEmpty, a as TableFrame, c as TableHead, d as TableHeaderCell, u as TableRow, o as TableToolbar };
119
+ export { m as Table, g as TableBody, y as TableCell, b as TableEmpty, u as TableFrame, h as TableHead, v as TableHeaderCell, _ as TableRow, d as TableToolbar };
101
120
 
102
121
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Icon","cx","parts","TableFrame","forwardRef","rest","className","TableToolbar","start","end","Table","TableHead","TableBody","TableRow","isSelected","isInteractive","TableHeaderCell","align","width","TableCell","emphasis","TableEmpty","icon","title","description","action"],"sources":["../../../src/components/Table/index.tsx"],"sourcesContent":["import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n type TableHTMLAttributes,\n type TdHTMLAttributes,\n type ThHTMLAttributes,\n} from \"react\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../Icon/icons\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport interface TableFrameProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n}\n\n/** The 3px collection frame every table, list and board sits inside. */\nexport const TableFrame = forwardRef<HTMLDivElement, TableFrameProps>(function TableFrame(\n { className, children, ...rest },\n ref,\n) {\n return (\n <div ref={ref} className={cx(\"ds-table-frame\", className)} {...rest}>\n {children}\n </div>\n );\n});\n\nexport interface TableToolbarProps extends HTMLAttributes<HTMLDivElement> {\n /** Left side — usually a select-all checkbox, a title and a count badge. */\n start?: ReactNode;\n /** Right side — filters and the one primary action. */\n end?: ReactNode;\n}\n\n/** The band above the rules: selection, title, count, filters, primary action. */\nexport const TableToolbar = forwardRef<HTMLDivElement, TableToolbarProps>(\n function TableToolbar({ start, end, className, ...rest }, ref) {\n return (\n <div ref={ref} className={cx(\"ds-table-toolbar\", className)} {...rest}>\n <div className=\"ds-table-toolbar__group\">{start}</div>\n <div className=\"ds-table-toolbar__group\">{end}</div>\n </div>\n );\n },\n);\n\nexport interface TableProps extends TableHTMLAttributes<HTMLTableElement> {\n children?: ReactNode;\n}\n\n/** The rules layer. Always render it inside a `TableFrame`. */\nexport const Table = forwardRef<HTMLTableElement, TableProps>(function Table(\n { className, children, ...rest },\n ref,\n) {\n return (\n <div className=\"ds-table-frame__scroll\">\n <table ref={ref} className={cx(\"ds-table\", className)} {...rest}>\n {children}\n </table>\n </div>\n );\n});\n\nexport const TableHead = forwardRef<HTMLTableSectionElement, HTMLAttributes<HTMLTableSectionElement>>(\n function TableHead({ className, ...rest }, ref) {\n return <thead ref={ref} className={className} {...rest} />;\n },\n);\n\nexport const TableBody = forwardRef<HTMLTableSectionElement, HTMLAttributes<HTMLTableSectionElement>>(\n function TableBody({ className, ...rest }, ref) {\n return <tbody ref={ref} className={className} {...rest} />;\n },\n);\n\nexport interface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {\n /** Paints the soft fill and the solid rail. Never changes the row's size. */\n isSelected?: boolean;\n /** Marks the row clickable: hover fill plus a pointer cursor. */\n isInteractive?: boolean;\n}\n\nexport const TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(function TableRow(\n { isSelected = false, isInteractive = false, className, ...rest },\n ref,\n) {\n return (\n <tr\n ref={ref}\n data-selected={isSelected || undefined}\n data-interactive={isInteractive || undefined}\n tabIndex={isInteractive ? 0 : undefined}\n className={className}\n {...rest}\n />\n );\n});\n\nexport type TableAlign = \"start\" | \"end\";\nexport type TableCellWidth = \"auto\" | \"control\";\n\nexport interface TableHeaderCellProps\n extends Omit<ThHTMLAttributes<HTMLTableCellElement>, \"align\"> {\n align?: TableAlign;\n width?: TableCellWidth;\n}\n\nexport const TableHeaderCell = forwardRef<HTMLTableCellElement, TableHeaderCellProps>(\n function TableHeaderCell({ align = \"start\", width = \"auto\", className, ...rest }, ref) {\n return (\n <th\n ref={ref}\n scope=\"col\"\n data-align={align}\n data-width={width}\n className={className}\n {...rest}\n />\n );\n },\n);\n\nexport type TableCellEmphasis = \"default\" | \"primary\" | \"muted\";\n\nexport interface TableCellProps\n extends Omit<TdHTMLAttributes<HTMLTableCellElement>, \"align\"> {\n align?: TableAlign;\n width?: TableCellWidth;\n /** `primary` is the row's identity cell — one per row, never two. */\n emphasis?: TableCellEmphasis;\n}\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(function TableCell(\n { align = \"start\", width = \"auto\", emphasis = \"default\", className, ...rest },\n ref,\n) {\n return (\n <td\n ref={ref}\n data-align={align}\n data-width={width}\n data-emphasis={emphasis === \"default\" ? undefined : emphasis}\n className={className}\n {...rest}\n />\n );\n});\n\nexport interface TableEmptyProps extends HTMLAttributes<HTMLDivElement> {\n icon?: IconName;\n title: string;\n description?: string;\n /** One action at most — the thing that ends the empty state. */\n action?: ReactNode;\n}\n\n/** What the frame shows when the collection has no rows. */\nexport const TableEmpty = forwardRef<HTMLDivElement, TableEmptyProps>(function TableEmpty(\n { icon = \"info\", title, description, action, className, ...rest },\n ref,\n) {\n return (\n <div ref={ref} className={cx(\"ds-table-empty\", className)} {...rest}>\n <Icon name={icon} size={24} />\n <span style={{ color: \"var(--color-text)\", fontWeight: \"var(--font-weight-bold)\" }}>\n {title}\n </span>\n {description && <span>{description}</span>}\n {action}\n </div>\n );\n});\n"],"mappings":";;;;AAYA,SAASC,EAAG,GAAGC,GAAuC;CACpD,OAAOA,EAAM,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACvC;AAOA,IAAaC,IAAaC,EAA4C,SACpE,EAAE,cAAW,aAAU,GAAGC,KAC1B,GACA;CACA,OACE,kBAAC,OAAD;EAAU;EAAK,WAAWJ,EAAG,kBAAkBK,CAAS;EAAG,GAAID;EAC5D;CACE,CAAA;AAET,CAAC,GAUYE,IAAeH,EAC1B,SAAsB,EAAE,UAAO,QAAK,cAAW,GAAGC,KAAQ,GAAK;CAC7D,OACE,kBAAC,OAAD;EAAU;EAAK,WAAWJ,EAAG,oBAAoBK,CAAS;EAAG,GAAID;EAAjE,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;GAA2B,UAAAG;EAAW,CAAA,GACrD,kBAAC,OAAD;GAAK,WAAU;GAA2B,UAAAC;EAAS,CAAA,CAChD;;AAET,CACF,GAOaC,IAAQN,EAAyC,SAC5D,EAAE,cAAW,aAAU,GAAGC,KAC1B,GACA;CACA,OACE,kBAAC,OAAD;EAAK,WAAU;EACb,UAAA,kBAAC,SAAD;GAAY;GAAK,WAAWJ,EAAG,YAAYK,CAAS;GAAG,GAAID;GACxD;EACI,CAAA;CACJ,CAAA;AAET,CAAC,GAEYM,IAAYP,EACvB,SAAmB,EAAE,cAAW,GAAGC,KAAQ,GAAK;CAC9C,OAAO,kBAAC,SAAD;EAAY;EAAgB;EAAW,GAAIA;CAAO,CAAA;AAC3D,CACF,GAEaO,IAAYR,EACvB,SAAmB,EAAE,cAAW,GAAGC,KAAQ,GAAK;CAC9C,OAAO,kBAAC,SAAD;EAAY;EAAgB;EAAW,GAAIA;CAAO,CAAA;AAC3D,CACF,GASaQ,IAAWT,EAA+C,SACrE,EAAE,gBAAa,IAAO,mBAAgB,IAAO,cAAW,GAAGC,KAC3D,GACA;CACA,OACE,kBAAC,MAAD;EACO;EACL,iBAAeS,KAAc,KAAA;EAC7B,oBAAkBC,KAAiB,KAAA;EACnC,UAAUA,IAAgB,IAAI,KAAA;EACnB;EACX,GAAIV;CACL,CAAA;AAEL,CAAC,GAWYW,IAAkBZ,EAC7B,SAAyB,EAAE,WAAQ,SAAS,WAAQ,QAAQ,cAAW,GAAGC,KAAQ,GAAK;CACrF,OACE,kBAAC,MAAD;EACO;EACL,OAAM;EACN,cAAYY;EACZ,cAAYC;EACD;EACX,GAAIb;CACL,CAAA;AAEL,CACF,GAYac,IAAYf,EAAiD,SACxE,EAAE,WAAQ,SAAS,WAAQ,QAAQ,cAAW,WAAW,cAAW,GAAGC,KACvE,GACA;CACA,OACE,kBAAC,MAAD;EACO;EACL,cAAYY;EACZ,cAAYC;EACZ,iBAAeE,MAAa,YAAY,KAAA,IAAYA;EACzC;EACX,GAAIf;CACL,CAAA;AAEL,CAAC,GAWYgB,IAAajB,EAA4C,SACpE,EAAE,UAAO,QAAQ,UAAO,gBAAa,WAAQ,cAAW,GAAGC,KAC3D,GACA;CACA,OACE,kBAAC,OAAD;EAAU;EAAK,WAAWJ,EAAG,kBAAkBK,CAAS;EAAG,GAAID;EAA/D,UAAA;GACE,kBAACL,GAAD;IAAM,MAAMsB;IAAM,MAAM;GAAK,CAAA;GAC7B,kBAAC,QAAD;IAAM,OAAO;KAAE,OAAO;KAAqB,YAAY;IAA0B;IAC9E,UAAAC;GACG,CAAA;GACLC,KAAe,kBAAC,QAAD,EAAA,UAAOA,EAAkB,CAAA;GACxCC;EACE;;AAET,CAAC"}
1
+ {"version":3,"file":"index.js","names":["Icon","cx","parts","TableFrame","forwardRef","rest","className","TableToolbar","start","end","hasBodyContent","Children","children","isValidElement","child","Fragment","TableContext","createContext","Table","TableHead","TableBody","useContext","isEmpty","TableRow","TableCell","TableEmpty","emptyMessage","isSelected","isInteractive","TableHeaderCell","align","width","emphasis","icon","title","description","action"],"sources":["../../../src/components/Table/index.tsx"],"sourcesContent":["import {\n Children,\n Fragment,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n type HTMLAttributes,\n type ReactNode,\n type TableHTMLAttributes,\n type TdHTMLAttributes,\n type ThHTMLAttributes,\n} from \"react\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../Icon/icons\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport interface TableFrameProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n}\n\n/** The 3px collection frame every table, list and board sits inside. */\nexport const TableFrame = forwardRef<HTMLDivElement, TableFrameProps>(function TableFrame(\n { className, children, ...rest },\n ref,\n) {\n return (\n <div ref={ref} className={cx(\"ds-table-frame\", className)} {...rest}>\n {children}\n </div>\n );\n});\n\nexport interface TableToolbarProps extends HTMLAttributes<HTMLDivElement> {\n /** Left side — usually a select-all checkbox, a title and a count badge. */\n start?: ReactNode;\n /** Right side — filters and the one primary action. */\n end?: ReactNode;\n}\n\n/** The band above the rules: selection, title, count, filters, primary action. */\nexport const TableToolbar = forwardRef<HTMLDivElement, TableToolbarProps>(\n function TableToolbar({ start, end, className, ...rest }, ref) {\n return (\n <div ref={ref} className={cx(\"ds-table-toolbar\", className)} {...rest}>\n <div className=\"ds-table-toolbar__group\">{start}</div>\n <div className=\"ds-table-toolbar__group\">{end}</div>\n </div>\n );\n },\n);\n\nexport interface TableProps extends TableHTMLAttributes<HTMLTableElement> {\n /** Message shown when a body has no rows. */\n emptyMessage?: string;\n /** Override empty-child detection when rows are rendered by custom components. */\n isEmpty?: boolean;\n children?: ReactNode;\n}\n\nfunction hasBodyContent(children: ReactNode): boolean {\n return Children.toArray(children).some((child) =>\n isValidElement<{ children?: ReactNode }>(child) &&\n (child.type !== Fragment || hasBodyContent(child.props.children)),\n );\n}\n\nconst TableContext = createContext<{\n emptyMessage: string;\n isEmpty?: boolean;\n}>({ emptyMessage: \"No data found.\" });\n\n/** The rules layer. Always render it inside a `TableFrame`. */\nexport const Table = forwardRef<HTMLTableElement, TableProps>(function Table(\n { emptyMessage = \"No data found.\", isEmpty, className, children, ...rest },\n ref,\n) {\n return (\n <TableContext.Provider value={{ emptyMessage, isEmpty }}>\n <div className=\"ds-table-frame__scroll\">\n <table {...rest} ref={ref} className={cx(\"ds-table\", className)}>\n {children}\n </table>\n </div>\n </TableContext.Provider>\n );\n});\n\nexport const TableHead = forwardRef<HTMLTableSectionElement, HTMLAttributes<HTMLTableSectionElement>>(\n function TableHead({ className, ...rest }, ref) {\n return <thead ref={ref} className={className} {...rest} />;\n },\n);\n\nexport const TableBody = forwardRef<HTMLTableSectionElement, HTMLAttributes<HTMLTableSectionElement>>(\n function TableBody({ className, children, ...rest }, ref) {\n const { emptyMessage, isEmpty } = useContext(TableContext);\n return (\n <tbody ref={ref} className={className} {...rest}>\n {(isEmpty ?? !hasBodyContent(children)) ? (\n <TableRow>\n {/* HTML's maximum span covers the row without inspecting columns. */}\n <TableCell colSpan={1000} className=\"ds-table__empty-cell\">\n <TableEmpty title={emptyMessage} role=\"status\" />\n </TableCell>\n </TableRow>\n ) : children}\n </tbody>\n );\n },\n);\n\nexport interface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {\n /** Paints the soft fill and the solid rail. Never changes the row's size. */\n isSelected?: boolean;\n /** Marks the row clickable: hover fill plus a pointer cursor. */\n isInteractive?: boolean;\n}\n\nexport const TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(function TableRow(\n { isSelected = false, isInteractive = false, className, ...rest },\n ref,\n) {\n return (\n <tr\n ref={ref}\n data-selected={isSelected || undefined}\n data-interactive={isInteractive || undefined}\n tabIndex={isInteractive ? 0 : undefined}\n className={className}\n {...rest}\n />\n );\n});\n\nexport type TableAlign = \"start\" | \"end\";\nexport type TableCellWidth = \"auto\" | \"control\";\n\nexport interface TableHeaderCellProps\n extends Omit<ThHTMLAttributes<HTMLTableCellElement>, \"align\"> {\n align?: TableAlign;\n width?: TableCellWidth;\n}\n\nexport const TableHeaderCell = forwardRef<HTMLTableCellElement, TableHeaderCellProps>(\n function TableHeaderCell({ align = \"start\", width = \"auto\", className, ...rest }, ref) {\n return (\n <th\n ref={ref}\n scope=\"col\"\n data-align={align}\n data-width={width}\n className={className}\n {...rest}\n />\n );\n },\n);\n\nexport type TableCellEmphasis = \"default\" | \"primary\" | \"muted\";\n\nexport interface TableCellProps\n extends Omit<TdHTMLAttributes<HTMLTableCellElement>, \"align\"> {\n align?: TableAlign;\n width?: TableCellWidth;\n /** `primary` is the row's identity cell — one per row, never two. */\n emphasis?: TableCellEmphasis;\n}\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(function TableCell(\n { align = \"start\", width = \"auto\", emphasis = \"default\", className, ...rest },\n ref,\n) {\n return (\n <td\n ref={ref}\n data-align={align}\n data-width={width}\n data-emphasis={emphasis === \"default\" ? undefined : emphasis}\n className={className}\n {...rest}\n />\n );\n});\n\nexport interface TableEmptyProps extends HTMLAttributes<HTMLDivElement> {\n icon?: IconName;\n title?: string;\n description?: string;\n /** One action at most — the thing that ends the empty state. */\n action?: ReactNode;\n}\n\n/** What the frame shows when the collection has no rows. */\nexport const TableEmpty = forwardRef<HTMLDivElement, TableEmptyProps>(function TableEmpty(\n { icon = \"info\", title = \"No data found.\", description, action, className, ...rest },\n ref,\n) {\n return (\n <div ref={ref} className={cx(\"ds-table-empty\", className)} {...rest}>\n <Icon name={icon} size={24} />\n <span style={{ color: \"var(--color-text)\", fontWeight: \"var(--font-weight-bold)\" }}>\n {title}\n </span>\n {description && <span>{description}</span>}\n {action}\n </div>\n );\n});\n"],"mappings":"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"}
@@ -75,6 +75,10 @@
75
75
  font-weight: var(--font-weight-medium);
76
76
  }
77
77
 
78
+ .ds-table td.ds-table__empty-cell {
79
+ padding: 0;
80
+ }
81
+
78
82
  .ds-table td[data-emphasis="muted"] {
79
83
  color: var(--color-text-muted);
80
84
  font-size: var(--font-size-sm);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_Fragment","cx","parts","MONTHS","MINUTE","HOUR","DAY","WEEK","pad","value","formatAbsoluteDate","options","stem","date","hasYear","formatAbsoluteTime","stamp","hasTimeZone","zone","part","formatRelativeTime","delta","now","days","Time","forwardRef","describedBy","rest","anchorRef","useRef","isOpen","setIsOpen","useState","tooltipId","useId","setTick","useEffect","format","id","t","refreshInterval","label","isTipped","hasTooltip","Fragment","node","ref","className","tabIndex","title","onMouseEnter","event","onMouseLeave","onFocus","onBlur","onKeyDown","Popover"],"sources":["../../../src/components/Time/index.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n} from \"react\";\nimport { Popover } from \"../Popover\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nconst MONTHS = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nconst MINUTE = 60_000;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\n\nfunction pad(value: number) {\n return String(value).padStart(2, \"0\");\n}\n\n/** Day before month, one order everywhere: `12 Jun 2026`. */\nexport function formatAbsoluteDate(date: Date, options: { hasYear?: boolean } = {}) {\n const { hasYear = true } = options;\n const stem = `${date.getDate()} ${MONTHS[date.getMonth()]}`;\n return hasYear ? `${stem} ${date.getFullYear()}` : stem;\n}\n\n/** The tooltip form: `6 Aug 2026, 11:05`, with the reader's zone appended. */\nexport function formatAbsoluteTime(date: Date, options: { hasTimeZone?: boolean } = {}) {\n const { hasTimeZone = true } = options;\n const stamp = `${formatAbsoluteDate(date)}, ${pad(date.getHours())}:${pad(date.getMinutes())}`;\n if (!hasTimeZone) return stamp;\n const zone = new Intl.DateTimeFormat(undefined, { timeZoneName: \"short\" })\n .formatToParts(date)\n .find((part) => part.type === \"timeZoneName\")?.value;\n return zone ? `${stamp} ${zone}` : stamp;\n}\n\n/**\n * Relative up to a week, absolute after. Future dates are always absolute — a\n * scheduled publish reads `12 Jun`, never `in 3 days`.\n */\nexport function formatRelativeTime(date: Date, now: Date = new Date()) {\n const delta = now.getTime() - date.getTime();\n if (delta < 0) {\n return formatAbsoluteDate(date, { hasYear: date.getFullYear() !== now.getFullYear() });\n }\n if (delta < MINUTE) return \"Just now\";\n if (delta < HOUR) return `${Math.floor(delta / MINUTE)}m ago`;\n if (delta < DAY) return `${Math.floor(delta / HOUR)}h ago`;\n if (delta < WEEK) {\n const days = Math.floor(delta / DAY);\n return `${days} ${days === 1 ? \"day\" : \"days\"} ago`;\n }\n return formatAbsoluteDate(date, { hasYear: date.getFullYear() !== now.getFullYear() });\n}\n\nexport type TimeFormat = \"auto\" | \"relative\" | \"absolute\";\n\nexport interface TimeProps extends Omit<HTMLAttributes<HTMLElement>, \"children\"> {\n /** The instant to print — Date, epoch ms, or an ISO string. */\n value: Date | string | number;\n /** `auto` ages the value; `absolute` always prints the date. */\n format?: TimeFormat;\n /** Show the absolute stamp on hover and focus. */\n hasTooltip?: boolean;\n /** Append the reader's time zone to the tooltip. */\n hasTimeZone?: boolean;\n /** Pin \"now\" — useful for tests and stories. */\n now?: Date;\n /** Re-render interval in ms while the value is still relative. */\n refreshInterval?: number;\n}\n\n/**\n * A machine-readable `<time>` that ages itself. One form per cell: relative or\n * absolute, never both side by side.\n */\nexport const Time = forwardRef<HTMLTimeElement, TimeProps>(function Time(\n {\n value,\n format = \"auto\",\n hasTooltip = true,\n hasTimeZone = true,\n now,\n refreshInterval = 30_000,\n className,\n tabIndex,\n title,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n onKeyDown,\n \"aria-describedby\": describedBy,\n ...rest\n },\n ref,\n) {\n const date = value instanceof Date ? value : new Date(value);\n const anchorRef = useRef<HTMLTimeElement | null>(null);\n const [isOpen, setIsOpen] = useState(false);\n const tooltipId = useId();\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (format === \"absolute\" || now) return;\n const id = window.setInterval(() => setTick((t) => t + 1), refreshInterval);\n return () => window.clearInterval(id);\n }, [format, now, refreshInterval]);\n\n if (Number.isNaN(date.getTime())) return null;\n\n const reference = now ?? new Date();\n const label =\n format === \"absolute\"\n ? formatAbsoluteDate(date)\n : formatRelativeTime(date, reference);\n const stamp = formatAbsoluteTime(date, { hasTimeZone });\n const isTipped = hasTooltip && label !== stamp;\n\n return (\n <>\n <time\n ref={(node) => {\n anchorRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n dateTime={date.toISOString()}\n suppressHydrationWarning\n className={cx(\"ds-time\", !isTipped && \"ds-time--plain\", className)}\n tabIndex={tabIndex ?? (isTipped ? 0 : undefined)}\n aria-describedby={[describedBy, isTipped && isOpen && tooltipId].filter(Boolean).join(\" \") || undefined}\n title={title ?? (isTipped ? undefined : stamp)}\n onMouseEnter={(event) => {\n onMouseEnter?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(true);\n }}\n onMouseLeave={(event) => {\n onMouseLeave?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(false);\n }}\n onFocus={(event) => {\n onFocus?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(true);\n }}\n onBlur={(event) => {\n onBlur?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(false);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (isTipped && !event.defaultPrevented && event.key === \"Escape\") setIsOpen(false);\n }}\n {...rest}\n >\n {label}\n </time>\n {isTipped && (\n <Popover\n anchorRef={anchorRef}\n isOpen={isOpen}\n id={tooltipId}\n role=\"tooltip\"\n className=\"ds-surface-raised ds-time-tooltip\"\n >\n {stamp}\n </Popover>\n )}\n </>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_Fragment","Fragment$1","cx","parts","MONTHS","MINUTE","HOUR","DAY","WEEK","pad","value","formatAbsoluteDate","options","stem","date","hasYear","formatAbsoluteTime","stamp","hasTimeZone","zone","part","formatRelativeTime","delta","now","days","Time","forwardRef","describedBy","rest","anchorRef","useRef","isOpen","setIsOpen","useState","tooltipId","useId","setTick","useEffect","format","id","t","refreshInterval","label","isTipped","hasTooltip","node","ref","className","tabIndex","title","onMouseEnter","event","onMouseLeave","onFocus","onBlur","onKeyDown","Popover"],"sources":["../../../src/components/Time/index.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n} from \"react\";\nimport { Popover } from \"../Popover\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nconst MONTHS = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nconst MINUTE = 60_000;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\n\nfunction pad(value: number) {\n return String(value).padStart(2, \"0\");\n}\n\n/** Day before month, one order everywhere: `12 Jun 2026`. */\nexport function formatAbsoluteDate(date: Date, options: { hasYear?: boolean } = {}) {\n const { hasYear = true } = options;\n const stem = `${date.getDate()} ${MONTHS[date.getMonth()]}`;\n return hasYear ? `${stem} ${date.getFullYear()}` : stem;\n}\n\n/** The tooltip form: `6 Aug 2026, 11:05`, with the reader's zone appended. */\nexport function formatAbsoluteTime(date: Date, options: { hasTimeZone?: boolean } = {}) {\n const { hasTimeZone = true } = options;\n const stamp = `${formatAbsoluteDate(date)}, ${pad(date.getHours())}:${pad(date.getMinutes())}`;\n if (!hasTimeZone) return stamp;\n const zone = new Intl.DateTimeFormat(undefined, { timeZoneName: \"short\" })\n .formatToParts(date)\n .find((part) => part.type === \"timeZoneName\")?.value;\n return zone ? `${stamp} ${zone}` : stamp;\n}\n\n/**\n * Relative up to a week, absolute after. Future dates are always absolute — a\n * scheduled publish reads `12 Jun`, never `in 3 days`.\n */\nexport function formatRelativeTime(date: Date, now: Date = new Date()) {\n const delta = now.getTime() - date.getTime();\n if (delta < 0) {\n return formatAbsoluteDate(date, { hasYear: date.getFullYear() !== now.getFullYear() });\n }\n if (delta < MINUTE) return \"Just now\";\n if (delta < HOUR) return `${Math.floor(delta / MINUTE)}m ago`;\n if (delta < DAY) return `${Math.floor(delta / HOUR)}h ago`;\n if (delta < WEEK) {\n const days = Math.floor(delta / DAY);\n return `${days} ${days === 1 ? \"day\" : \"days\"} ago`;\n }\n return formatAbsoluteDate(date, { hasYear: date.getFullYear() !== now.getFullYear() });\n}\n\nexport type TimeFormat = \"auto\" | \"relative\" | \"absolute\";\n\nexport interface TimeProps extends Omit<HTMLAttributes<HTMLElement>, \"children\"> {\n /** The instant to print — Date, epoch ms, or an ISO string. */\n value: Date | string | number;\n /** `auto` ages the value; `absolute` always prints the date. */\n format?: TimeFormat;\n /** Show the absolute stamp on hover and focus. */\n hasTooltip?: boolean;\n /** Append the reader's time zone to the tooltip. */\n hasTimeZone?: boolean;\n /** Pin \"now\" — useful for tests and stories. */\n now?: Date;\n /** Re-render interval in ms while the value is still relative. */\n refreshInterval?: number;\n}\n\n/**\n * A machine-readable `<time>` that ages itself. One form per cell: relative or\n * absolute, never both side by side.\n */\nexport const Time = forwardRef<HTMLTimeElement, TimeProps>(function Time(\n {\n value,\n format = \"auto\",\n hasTooltip = true,\n hasTimeZone = true,\n now,\n refreshInterval = 30_000,\n className,\n tabIndex,\n title,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n onKeyDown,\n \"aria-describedby\": describedBy,\n ...rest\n },\n ref,\n) {\n const date = value instanceof Date ? value : new Date(value);\n const anchorRef = useRef<HTMLTimeElement | null>(null);\n const [isOpen, setIsOpen] = useState(false);\n const tooltipId = useId();\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (format === \"absolute\" || now) return;\n const id = window.setInterval(() => setTick((t) => t + 1), refreshInterval);\n return () => window.clearInterval(id);\n }, [format, now, refreshInterval]);\n\n if (Number.isNaN(date.getTime())) return null;\n\n const reference = now ?? new Date();\n const label =\n format === \"absolute\"\n ? formatAbsoluteDate(date)\n : formatRelativeTime(date, reference);\n const stamp = formatAbsoluteTime(date, { hasTimeZone });\n const isTipped = hasTooltip && label !== stamp;\n\n return (\n <>\n <time\n ref={(node) => {\n anchorRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n dateTime={date.toISOString()}\n suppressHydrationWarning\n className={cx(\"ds-time\", !isTipped && \"ds-time--plain\", className)}\n tabIndex={tabIndex ?? (isTipped ? 0 : undefined)}\n aria-describedby={[describedBy, isTipped && isOpen && tooltipId].filter(Boolean).join(\" \") || undefined}\n title={title ?? (isTipped ? undefined : stamp)}\n onMouseEnter={(event) => {\n onMouseEnter?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(true);\n }}\n onMouseLeave={(event) => {\n onMouseLeave?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(false);\n }}\n onFocus={(event) => {\n onFocus?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(true);\n }}\n onBlur={(event) => {\n onBlur?.(event);\n if (isTipped && !event.defaultPrevented) setIsOpen(false);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (isTipped && !event.defaultPrevented && event.key === \"Escape\") setIsOpen(false);\n }}\n {...rest}\n >\n {label}\n </time>\n {isTipped && (\n <Popover\n anchorRef={anchorRef}\n isOpen={isOpen}\n id={tooltipId}\n role=\"tooltip\"\n className=\"ds-surface-raised ds-time-tooltip\"\n >\n {stamp}\n </Popover>\n )}\n </>\n );\n});\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/Icon-CWsA1W83.cjs"),t=require("./components/Button/index.cjs"),n=require("./components/ButtonGroup/index.cjs"),r=require("./chunks/RichTextEditor-tFkISOvq.cjs"),i=require("./components/Badge/index.cjs"),a=require("./components/Modal/index.cjs"),o=require("./components/FieldAffix/index.cjs"),s=require("./components/SearchField/index.cjs"),c=require("./components/SortableList/index.cjs"),l=require("./components/EntryPicker/index.cjs"),u=require("./components/Field/index.cjs"),d=require("./components/NumberField/index.cjs"),f=require("./components/Switch/index.cjs"),p=require("./components/TextField/index.cjs"),m=require("./chunks/EntryEditor-cjDk4vdH.cjs"),h=require("./components/Board/index.cjs"),g=require("./components/Drawer/index.cjs"),_=require("./components/Avatar/index.cjs"),v=require("./components/Grid/index.cjs"),y=require("./components/Choice/index.cjs"),b=require("./components/Table/index.cjs"),x=require("./components/Popover/index.cjs"),S=require("./components/Menu/index.cjs"),C=require("./components/Toast/index.cjs"),w=require("./components/Skeleton/index.cjs"),T=require("./components/SideNav/index.cjs"),E=require("./components/TopNav/index.cjs"),D=require("./components/SubNav/index.cjs"),O=require("./components/SelectionCard/index.cjs"),k=require("./components/Stepper/index.cjs"),A=require("./components/AssetGrid/index.cjs"),j=require("./components/ImageCropper/index.cjs"),M=require("./components/Container/index.cjs"),N=require("./components/Select/index.cjs"),P=require("./components/Slider/index.cjs"),F=require("./components/DatePicker/index.cjs"),I=require("./components/TagsInput/index.cjs"),L=require("./components/Time/index.cjs");exports.AssetGrid=A.AssetGrid,exports.AssetGridEmpty=A.AssetGridEmpty,exports.AssetTile=A.AssetTile,exports.AssetTileSkeleton=A.AssetTileSkeleton,exports.Avatar=_.Avatar,exports.AvatarGroup=_.AvatarGroup,exports.Badge=i.Badge,exports.Board=h.Board,exports.BoardCard=h.BoardCard,exports.BoardColumn=h.BoardColumn,exports.Button=t.Button,exports.ButtonGroup=n.ButtonGroup,exports.Calendar=F.Calendar,exports.Checkbox=y.Checkbox,exports.CheckboxCard=O.CheckboxCard,exports.ChoiceGroup=y.ChoiceGroup,exports.Container=M.Container,exports.DateField=F.DateField,exports.DateRangeField=F.DateRangeField,exports.Drawer=g.Drawer,exports.EntryEditor=m.t,exports.EntryPicker=l.EntryPicker,exports.Field=u.Field,exports.FieldAffix=o.FieldAffix,exports.Grid=v.Grid,exports.GridItem=v.GridItem,exports.Icon=e.t,exports.ImageCropper=j.ImageCropper,exports.Menu=S.Menu,exports.MenuItem=S.MenuItem,exports.MenuLabel=S.MenuLabel,exports.MenuSeparator=S.MenuSeparator,exports.Modal=a.Modal,exports.NumberField=d.NumberField,exports.NumberRangeField=d.NumberRangeField,exports.Popover=x.Popover,exports.Radio=y.Radio,exports.RadioCard=O.RadioCard,exports.RangeSlider=P.RangeSlider,exports.RichTextEditor=r.t,exports.SearchField=s.SearchField,exports.Select=N.Select,exports.SelectionCardGroup=O.SelectionCardGroup,exports.SideNav=T.SideNav,exports.SideNavFooter=T.SideNavFooter,exports.SideNavHeader=T.SideNavHeader,exports.SideNavItem=T.SideNavItem,exports.SideNavSection=T.SideNavSection,exports.Skeleton=w.Skeleton,exports.SkeletonText=w.SkeletonText,exports.Slider=P.Slider,exports.SortableList=c.SortableList,exports.SortableListItem=c.SortableListItem,exports.Stack=v.Stack,exports.Stepper=k.Stepper,exports.SubNav=D.SubNav,exports.SubNavButton=D.SubNavButton,exports.SubNavItem=D.SubNavItem,exports.Switch=f.Switch,exports.Table=b.Table,exports.TableBody=b.TableBody,exports.TableCell=b.TableCell,exports.TableEmpty=b.TableEmpty,exports.TableFrame=b.TableFrame,exports.TableHead=b.TableHead,exports.TableHeaderCell=b.TableHeaderCell,exports.TableRow=b.TableRow,exports.TableToolbar=b.TableToolbar,exports.TagsInput=I.TagsInput,exports.TextArea=p.TextArea,exports.TextField=p.TextField,exports.Time=L.Time,exports.Toast=C.Toast,exports.ToastProvider=C.ToastProvider,exports.TopNav=E.TopNav,exports.TopNavItem=E.TopNavItem,exports.cropRatios=j.cropRatios,exports.cropToBlob=j.cropToBlob,exports.formatAbsoluteDate=L.formatAbsoluteDate,exports.formatAbsoluteTime=L.formatAbsoluteTime,exports.formatIsoDate=F.formatIsoDate,exports.formatRelativeTime=L.formatRelativeTime,exports.iconNames=e.n,exports.icons=e.r,exports.useSideNavCollapsed=T.useSideNavCollapsed,exports.useToast=C.useToast,exports.validateEntryValues=m.n;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/Icon-CWsA1W83.cjs"),t=require("./components/Button/index.cjs"),n=require("./components/ButtonGroup/index.cjs"),r=require("./components/Field/index.cjs"),i=require("./components/Modal/index.cjs"),a=require("./components/TextField/index.cjs"),o=require("./chunks/RichTextEditor-DC_0oN1s.cjs"),s=require("./components/Badge/index.cjs"),c=require("./components/FieldAffix/index.cjs"),l=require("./components/SearchField/index.cjs"),u=require("./components/SortableList/index.cjs"),d=require("./components/EntryPicker/index.cjs"),f=require("./components/NumberField/index.cjs"),p=require("./components/Switch/index.cjs"),m=require("./chunks/EntryEditor-C32lKKnV.cjs"),h=require("./components/Board/index.cjs"),g=require("./components/Drawer/index.cjs"),_=require("./components/Avatar/index.cjs"),v=require("./components/Grid/index.cjs"),y=require("./components/Choice/index.cjs"),b=require("./components/Table/index.cjs"),x=require("./components/Popover/index.cjs"),S=require("./components/Menu/index.cjs"),C=require("./components/Toast/index.cjs"),w=require("./components/Skeleton/index.cjs"),T=require("./components/SideNav/index.cjs"),E=require("./components/TopNav/index.cjs"),D=require("./components/SubNav/index.cjs"),O=require("./components/SelectionCard/index.cjs"),k=require("./components/Stepper/index.cjs"),A=require("./components/AssetGrid/index.cjs"),j=require("./components/ImageCropper/index.cjs"),M=require("./components/Container/index.cjs"),N=require("./components/Select/index.cjs"),P=require("./components/Slider/index.cjs"),F=require("./components/DatePicker/index.cjs"),I=require("./components/TagsInput/index.cjs"),L=require("./components/Time/index.cjs");exports.AssetGrid=A.AssetGrid,exports.AssetGridEmpty=A.AssetGridEmpty,exports.AssetTile=A.AssetTile,exports.AssetTileSkeleton=A.AssetTileSkeleton,exports.Avatar=_.Avatar,exports.AvatarGroup=_.AvatarGroup,exports.Badge=s.Badge,exports.Board=h.Board,exports.BoardCard=h.BoardCard,exports.BoardColumn=h.BoardColumn,exports.Button=t.Button,exports.ButtonGroup=n.ButtonGroup,exports.Calendar=F.Calendar,exports.Checkbox=y.Checkbox,exports.CheckboxCard=O.CheckboxCard,exports.ChoiceGroup=y.ChoiceGroup,exports.Container=M.Container,exports.DateField=F.DateField,exports.DateRangeField=F.DateRangeField,exports.Drawer=g.Drawer,exports.EntryEditor=m.t,exports.EntryPicker=d.EntryPicker,exports.Field=r.Field,exports.FieldAffix=c.FieldAffix,exports.Grid=v.Grid,exports.GridItem=v.GridItem,exports.Icon=e.t,exports.ImageCropper=j.ImageCropper,exports.Menu=S.Menu,exports.MenuItem=S.MenuItem,exports.MenuLabel=S.MenuLabel,exports.MenuSeparator=S.MenuSeparator,exports.Modal=i.Modal,exports.NumberField=f.NumberField,exports.NumberRangeField=f.NumberRangeField,exports.Popover=x.Popover,exports.Radio=y.Radio,exports.RadioCard=O.RadioCard,exports.RangeSlider=P.RangeSlider,exports.RichTextEditor=o.t,exports.SearchField=l.SearchField,exports.Select=N.Select,exports.SelectionCardGroup=O.SelectionCardGroup,exports.SideNav=T.SideNav,exports.SideNavFooter=T.SideNavFooter,exports.SideNavHeader=T.SideNavHeader,exports.SideNavItem=T.SideNavItem,exports.SideNavSection=T.SideNavSection,exports.Skeleton=w.Skeleton,exports.SkeletonText=w.SkeletonText,exports.Slider=P.Slider,exports.SortableList=u.SortableList,exports.SortableListItem=u.SortableListItem,exports.Stack=v.Stack,exports.Stepper=k.Stepper,exports.SubNav=D.SubNav,exports.SubNavButton=D.SubNavButton,exports.SubNavItem=D.SubNavItem,exports.Switch=p.Switch,exports.Table=b.Table,exports.TableBody=b.TableBody,exports.TableCell=b.TableCell,exports.TableEmpty=b.TableEmpty,exports.TableFrame=b.TableFrame,exports.TableHead=b.TableHead,exports.TableHeaderCell=b.TableHeaderCell,exports.TableRow=b.TableRow,exports.TableToolbar=b.TableToolbar,exports.TagsInput=I.TagsInput,exports.TextArea=a.TextArea,exports.TextField=a.TextField,exports.Time=L.Time,exports.Toast=C.Toast,exports.ToastProvider=C.ToastProvider,exports.TopNav=E.TopNav,exports.TopNavItem=E.TopNavItem,exports.cropRatios=j.cropRatios,exports.cropToBlob=j.cropToBlob,exports.formatAbsoluteDate=L.formatAbsoluteDate,exports.formatAbsoluteTime=L.formatAbsoluteTime,exports.formatIsoDate=F.formatIsoDate,exports.formatRelativeTime=L.formatRelativeTime,exports.iconNames=e.n,exports.icons=e.r,exports.useSideNavCollapsed=T.useSideNavCollapsed,exports.useToast=C.useToast,exports.validateEntryValues=m.n;
package/dist/index.js CHANGED
@@ -1,18 +1,18 @@
1
1
  import { n as e, r as t, t as n } from "./chunks/Icon-CGY1FNXT.js";
2
2
  import { Button as r } from "./components/Button/index.js";
3
3
  import { ButtonGroup as i } from "./components/ButtonGroup/index.js";
4
- import { t as a } from "./chunks/RichTextEditor-DRt-kibg.js";
5
- import { Badge as o } from "./components/Badge/index.js";
6
- import { Modal as s } from "./components/Modal/index.js";
7
- import { FieldAffix as c } from "./components/FieldAffix/index.js";
8
- import { SearchField as l } from "./components/SearchField/index.js";
9
- import { SortableList as u, SortableListItem as d } from "./components/SortableList/index.js";
10
- import { EntryPicker as f } from "./components/EntryPicker/index.js";
11
- import { Field as p } from "./components/Field/index.js";
12
- import { NumberField as m, NumberRangeField as h } from "./components/NumberField/index.js";
13
- import { Switch as g } from "./components/Switch/index.js";
14
- import { TextArea as _, TextField as v } from "./components/TextField/index.js";
15
- import { n as y, t as b } from "./chunks/EntryEditor-BF808OZR.js";
4
+ import { Field as a } from "./components/Field/index.js";
5
+ import { Modal as o } from "./components/Modal/index.js";
6
+ import { TextArea as s, TextField as c } from "./components/TextField/index.js";
7
+ import { t as l } from "./chunks/RichTextEditor-CSpjsL1z.js";
8
+ import { Badge as u } from "./components/Badge/index.js";
9
+ import { FieldAffix as d } from "./components/FieldAffix/index.js";
10
+ import { SearchField as f } from "./components/SearchField/index.js";
11
+ import { SortableList as p, SortableListItem as m } from "./components/SortableList/index.js";
12
+ import { EntryPicker as h } from "./components/EntryPicker/index.js";
13
+ import { NumberField as g, NumberRangeField as _ } from "./components/NumberField/index.js";
14
+ import { Switch as v } from "./components/Switch/index.js";
15
+ import { n as y, t as b } from "./chunks/EntryEditor-xVuiqtFo.js";
16
16
  import { Board as x, BoardCard as S, BoardColumn as C } from "./components/Board/index.js";
17
17
  import { Drawer as w } from "./components/Drawer/index.js";
18
18
  import { Avatar as T, AvatarGroup as E } from "./components/Avatar/index.js";
@@ -36,4 +36,4 @@ import { RangeSlider as Se, Slider as Ce } from "./components/Slider/index.js";
36
36
  import { Calendar as we, DateField as Te, DateRangeField as Ee, formatIsoDate as De } from "./components/DatePicker/index.js";
37
37
  import { TagsInput as Oe } from "./components/TagsInput/index.js";
38
38
  import { Time as ke, formatAbsoluteDate as Ae, formatAbsoluteTime as je, formatRelativeTime as Me } from "./components/Time/index.js";
39
- export { pe as AssetGrid, me as AssetGridEmpty, he as AssetTile, ge as AssetTileSkeleton, T as Avatar, E as AvatarGroup, o as Badge, x as Board, S as BoardCard, C as BoardColumn, r as Button, i as ButtonGroup, we as Calendar, A as Checkbox, le as CheckboxCard, j as ChoiceGroup, be as Container, Te as DateField, Ee as DateRangeField, w as Drawer, b as EntryEditor, f as EntryPicker, p as Field, c as FieldAffix, D as Grid, O as GridItem, n as Icon, _e as ImageCropper, U as Menu, W as MenuItem, G as MenuLabel, K as MenuSeparator, s as Modal, m as NumberField, h as NumberRangeField, H as Popover, M as Radio, ue as RadioCard, Se as RangeSlider, a as RichTextEditor, l as SearchField, xe as Select, de as SelectionCardGroup, Q as SideNav, $ as SideNavFooter, ee as SideNavHeader, te as SideNavItem, ne as SideNavSection, X as Skeleton, Z as SkeletonText, Ce as Slider, u as SortableList, d as SortableListItem, k as Stack, fe as Stepper, oe as SubNav, se as SubNavButton, ce as SubNavItem, g as Switch, N as Table, P as TableBody, F as TableCell, I as TableEmpty, L as TableFrame, R as TableHead, z as TableHeaderCell, B as TableRow, V as TableToolbar, Oe as TagsInput, _ as TextArea, v as TextField, ke as Time, q as Toast, J as ToastProvider, ie as TopNav, ae as TopNavItem, ve as cropRatios, ye as cropToBlob, Ae as formatAbsoluteDate, je as formatAbsoluteTime, De as formatIsoDate, Me as formatRelativeTime, e as iconNames, t as icons, re as useSideNavCollapsed, Y as useToast, y as validateEntryValues };
39
+ export { pe as AssetGrid, me as AssetGridEmpty, he as AssetTile, ge as AssetTileSkeleton, T as Avatar, E as AvatarGroup, u as Badge, x as Board, S as BoardCard, C as BoardColumn, r as Button, i as ButtonGroup, we as Calendar, A as Checkbox, le as CheckboxCard, j as ChoiceGroup, be as Container, Te as DateField, Ee as DateRangeField, w as Drawer, b as EntryEditor, h as EntryPicker, a as Field, d as FieldAffix, D as Grid, O as GridItem, n as Icon, _e as ImageCropper, U as Menu, W as MenuItem, G as MenuLabel, K as MenuSeparator, o as Modal, g as NumberField, _ as NumberRangeField, H as Popover, M as Radio, ue as RadioCard, Se as RangeSlider, l as RichTextEditor, f as SearchField, xe as Select, de as SelectionCardGroup, Q as SideNav, $ as SideNavFooter, ee as SideNavHeader, te as SideNavItem, ne as SideNavSection, X as Skeleton, Z as SkeletonText, Ce as Slider, p as SortableList, m as SortableListItem, k as Stack, fe as Stepper, oe as SubNav, se as SubNavButton, ce as SubNavItem, v as Switch, N as Table, P as TableBody, F as TableCell, I as TableEmpty, L as TableFrame, R as TableHead, z as TableHeaderCell, B as TableRow, V as TableToolbar, Oe as TagsInput, s as TextArea, c as TextField, ke as Time, q as Toast, J as ToastProvider, ie as TopNav, ae as TopNavItem, ve as cropRatios, ye as cropToBlob, Ae as formatAbsoluteDate, je as formatAbsoluteTime, De as formatIsoDate, Me as formatRelativeTime, e as iconNames, t as icons, re as useSideNavCollapsed, Y as useToast, y as validateEntryValues };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@namroodinc/liquid-editorial",
3
- "version": "0.1.2",
3
+ "version": "0.1.5",
4
4
  "description": "A bold, accessible React component library for editorial products.",
5
5
  "author": "Namrood Inc",
6
6
  "license": "MIT",
@@ -26,6 +26,8 @@
26
26
  },
27
27
  "files": [
28
28
  "dist",
29
+ "AGENTS.md",
30
+ "UPGRADING.md",
29
31
  "README.md",
30
32
  "LICENSE"
31
33
  ],
@@ -1,181 +0,0 @@
1
- import { n as e, r as t, t as n } from "./RichTextEditor-DRt-kibg.js";
2
- import { EntryPicker as r } from "../components/EntryPicker/index.js";
3
- import { Field as i } from "../components/Field/index.js";
4
- import { NumberField as a } from "../components/NumberField/index.js";
5
- import { Switch as o } from "../components/Switch/index.js";
6
- import { TextArea as s, TextField as c } from "../components/TextField/index.js";
7
- import { useState as l } from "react";
8
- import { jsx as u } from "react/jsx-runtime";
9
- //#region src/components/EntryEditor/model.ts
10
- var d = /* @__PURE__ */ new Set([
11
- "shortText",
12
- "longText",
13
- "richText",
14
- "number",
15
- "boolean",
16
- "dateTime",
17
- "asset",
18
- "reference"
19
- ]);
20
- function f(e) {
21
- let t = /* @__PURE__ */ new Set();
22
- for (let n of e.fields) {
23
- if (!n.id?.trim() || t.has(n.id)) throw Error("Content model field IDs must be nonempty and unique.");
24
- if (!d.has(n.type)) throw Error(`Unsupported content field type: ${n.type}`);
25
- t.add(n.id);
26
- }
27
- }
28
- function p(e) {
29
- if (typeof e != "string") return;
30
- let t = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2})(?::(\d{2})(?:\.(\d{1,3}))?)?(?:Z|\+00:00)$/.exec(e);
31
- if (!t) return;
32
- let n = `${t[1]}:${t[2] ?? "00"}.${(t[3] ?? "").padEnd(3, "0")}Z`, r = new Date(n);
33
- if (Number.isFinite(r.getTime()) && r.toISOString() === n) return n;
34
- }
35
- function m(e, t) {
36
- return !!e && typeof e == "object" && t in e && typeof e[t] == "string" && e[t].trim().length > 0;
37
- }
38
- function h(e) {
39
- return !!e.text?.trim() || e.type === "horizontalRule" || !!e.content?.some(h);
40
- }
41
- function g(t, n) {
42
- return f(t), Object.fromEntries(t.fields.flatMap((t) => {
43
- let r = Object.hasOwn(n, t.id) ? n[t.id] : void 0, i;
44
- if (r === void 0) t.required && (i = `${t.label} is required.`);
45
- else switch (t.type) {
46
- case "shortText":
47
- case "longText":
48
- typeof r == "string" ? t.required && !r.trim() && (i = `${t.label} is required.`) : i = "Enter text.";
49
- break;
50
- case "richText":
51
- i = e(r), !i && t.required && !h(r) && (i = `${t.label} is required.`);
52
- break;
53
- case "number":
54
- (typeof r != "number" || !Number.isFinite(r)) && (i = "Enter a finite number.");
55
- break;
56
- case "boolean":
57
- typeof r != "boolean" && (i = "Choose a boolean value.");
58
- break;
59
- case "dateTime":
60
- p(r) || (i = "Enter a valid UTC date and time.");
61
- break;
62
- case "asset":
63
- case "reference": {
64
- let e = t.type === "asset" ? "assetId" : "entryId";
65
- (t.multiple ? !Array.isArray(r) || !r.every((t) => m(t, e)) : !m(r, e)) ? i = t.multiple ? `Choose a list of ${t.type === "asset" ? "assets" : "entries"}.` : `Choose an ${t.type === "asset" ? "asset" : "entry"}.` : t.required && Array.isArray(r) && r.length === 0 && (i = `${t.label} is required.`);
66
- break;
67
- }
68
- }
69
- return i ? [[t.id, i]] : [];
70
- }));
71
- }
72
- //#endregion
73
- //#region src/components/EntryEditor/index.tsx
74
- function _(e, t) {
75
- let n = e.type === "asset" ? "assetId" : "entryId";
76
- return (Array.isArray(t) ? t : t === void 0 ? [] : [t]).flatMap((e) => {
77
- if (!e || typeof e != "object" || !(n in e)) return [];
78
- let t = e[n];
79
- return typeof t == "string" ? [t] : [];
80
- });
81
- }
82
- function v({ model: e, value: d, defaultValue: f = {}, onValueChange: m, pickerItems: h = {}, errors: v = {}, isDisabled: y = !1, showAllErrors: b = !1, className: x, ...S }) {
83
- let [C, w] = l(f), [T, E] = l(() => /* @__PURE__ */ new Set()), D = d ?? C, O = g(e, D), k = (e, t) => {
84
- if (y) return;
85
- let n = { ...D };
86
- t === void 0 ? delete n[e] : n[e] = t, d === void 0 && w(n), E((t) => new Set(t).add(e)), m?.(n);
87
- };
88
- return /* @__PURE__ */ u("div", {
89
- className: ["ds-entry-editor", x].filter(Boolean).join(" "),
90
- ...S,
91
- children: e.fields.map((e) => {
92
- let l = Object.hasOwn(D, e.id) ? D[e.id] : void 0, d = e.type === "asset" || e.type === "reference", f = e.type === "dateTime" ? `${e.label} (UTC)` : e.label, m = v[e.id] ?? (b || T.has(e.id) ? O[e.id] : void 0);
93
- return /* @__PURE__ */ u(i, {
94
- label: f,
95
- hint: e.hint,
96
- error: m,
97
- isRequired: e.required,
98
- isGroup: d,
99
- children: ({ required: i, ...d }) => {
100
- switch (e.type) {
101
- case "shortText":
102
- case "longText": {
103
- let t = e.type === "shortText" ? c : s;
104
- return /* @__PURE__ */ u(t, {
105
- ...d,
106
- required: i,
107
- disabled: y,
108
- placeholder: e.placeholder,
109
- value: typeof l == "string" ? l : "",
110
- onChange: (t) => k(e.id, t.target.value)
111
- });
112
- }
113
- case "number": return /* @__PURE__ */ u(a, {
114
- ...d,
115
- required: i,
116
- isDisabled: y,
117
- placeholder: e.placeholder,
118
- step: "any",
119
- hasSteppers: !1,
120
- value: typeof l == "number" && Number.isFinite(l) ? l : "",
121
- onValueChange: (t) => {
122
- (t === "" || Number.isFinite(t)) && k(e.id, t === "" ? void 0 : t);
123
- }
124
- });
125
- case "boolean": return /* @__PURE__ */ u(o, {
126
- ...d,
127
- isDisabled: y,
128
- isSelected: l === !0,
129
- onSelectedChange: (t) => k(e.id, t)
130
- });
131
- case "dateTime": return /* @__PURE__ */ u(c, {
132
- ...d,
133
- required: i,
134
- disabled: y,
135
- type: "datetime-local",
136
- step: "0.001",
137
- value: p(l)?.slice(0, -1) ?? "",
138
- onChange: (t) => k(e.id, p(`${t.target.value}Z`))
139
- });
140
- case "richText": return /* @__PURE__ */ u(n, {
141
- ...d,
142
- label: e.label,
143
- isRequired: i,
144
- isDisabled: y,
145
- placeholder: e.placeholder,
146
- format: "json",
147
- value: l === void 0 ? t : l,
148
- onChange: (t) => k(e.id, t)
149
- });
150
- case "asset":
151
- case "reference": return /* @__PURE__ */ u("div", {
152
- ...d,
153
- role: "group",
154
- children: /* @__PURE__ */ u(r, {
155
- items: h[e.id] ?? [],
156
- value: _(e, l),
157
- label: e.type === "asset" ? "Assets" : "Entries",
158
- addLabel: `Choose ${e.label}`,
159
- mode: e.multiple ? "multiple" : "single",
160
- isDisabled: y,
161
- onValueChange: (t) => {
162
- if (e.type === "asset") {
163
- let n = t.map((e) => ({ assetId: e }));
164
- k(e.id, e.multiple ? n : n[0]);
165
- } else {
166
- let n = t.map((e) => ({ entryId: e }));
167
- k(e.id, e.multiple ? n : n[0]);
168
- }
169
- }
170
- })
171
- });
172
- }
173
- }
174
- }, e.id);
175
- })
176
- });
177
- }
178
- //#endregion
179
- export { g as n, v as t };
180
-
181
- //# sourceMappingURL=EntryEditor-BF808OZR.js.map