@expressive/ui 0.0.0-stage → 0.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.
Files changed (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -2
  3. package/dist/button/base.d.ts +63 -0
  4. package/dist/button/base.js +90 -0
  5. package/dist/button/base.js.map +1 -0
  6. package/dist/button/button.d.ts +56 -0
  7. package/dist/button/button.js +138 -0
  8. package/dist/button/button.js.map +1 -0
  9. package/dist/calendar/base.d.ts +112 -0
  10. package/dist/calendar/base.js +235 -0
  11. package/dist/calendar/base.js.map +1 -0
  12. package/dist/calendar/calendar.d.ts +78 -0
  13. package/dist/calendar/calendar.js +145 -0
  14. package/dist/calendar/calendar.js.map +1 -0
  15. package/dist/calendar/date.js +56 -0
  16. package/dist/calendar/date.js.map +1 -0
  17. package/dist/dialog/base.d.ts +74 -0
  18. package/dist/dialog/base.js +143 -0
  19. package/dist/dialog/base.js.map +1 -0
  20. package/dist/dialog/dialog.d.ts +69 -0
  21. package/dist/dialog/dialog.js +108 -0
  22. package/dist/dialog/dialog.js.map +1 -0
  23. package/dist/dom.d.ts +16 -0
  24. package/dist/dom.js +17 -0
  25. package/dist/dropzone/base.d.ts +77 -0
  26. package/dist/dropzone/base.js +159 -0
  27. package/dist/dropzone/base.js.map +1 -0
  28. package/dist/dropzone/dropzone.d.ts +38 -0
  29. package/dist/dropzone/dropzone.js +92 -0
  30. package/dist/dropzone/dropzone.js.map +1 -0
  31. package/dist/form/base.d.ts +157 -0
  32. package/dist/form/base.js +243 -0
  33. package/dist/form/base.js.map +1 -0
  34. package/dist/form/form.d.ts +123 -0
  35. package/dist/form/form.js +179 -0
  36. package/dist/form/form.js.map +1 -0
  37. package/dist/icons/caret.d.ts +8 -0
  38. package/dist/icons/caret.js +16 -0
  39. package/dist/icons/caret.js.map +1 -0
  40. package/dist/icons/check.d.ts +8 -0
  41. package/dist/icons/check.js +16 -0
  42. package/dist/icons/check.js.map +1 -0
  43. package/dist/icons/cross.d.ts +8 -0
  44. package/dist/icons/cross.js +16 -0
  45. package/dist/icons/cross.js.map +1 -0
  46. package/dist/icons/icon.js +16 -0
  47. package/dist/icons/icon.js.map +1 -0
  48. package/dist/icons/spinner.d.ts +8 -0
  49. package/dist/icons/spinner.js +27 -0
  50. package/dist/icons/spinner.js.map +1 -0
  51. package/dist/icons/upload.d.ts +8 -0
  52. package/dist/icons/upload.js +16 -0
  53. package/dist/icons/upload.js.map +1 -0
  54. package/dist/index.d.ts +11 -0
  55. package/dist/index.js +12 -0
  56. package/dist/layout/base.d.ts +88 -0
  57. package/dist/layout/base.js +158 -0
  58. package/dist/layout/base.js.map +1 -0
  59. package/dist/layout/layout.d.ts +53 -0
  60. package/dist/layout/layout.js +80 -0
  61. package/dist/layout/layout.js.map +1 -0
  62. package/dist/piece.js +13 -0
  63. package/dist/piece.js.map +1 -0
  64. package/dist/popover/base.d.ts +94 -0
  65. package/dist/popover/base.js +176 -0
  66. package/dist/popover/base.js.map +1 -0
  67. package/dist/popover/place.d.ts +12 -0
  68. package/dist/popover/place.js +32 -0
  69. package/dist/popover/place.js.map +1 -0
  70. package/dist/popover/popover.d.ts +52 -0
  71. package/dist/popover/popover.js +104 -0
  72. package/dist/popover/popover.js.map +1 -0
  73. package/dist/select/base.d.ts +196 -0
  74. package/dist/select/base.js +409 -0
  75. package/dist/select/base.js.map +1 -0
  76. package/dist/select/select.d.ts +119 -0
  77. package/dist/select/select.js +219 -0
  78. package/dist/select/select.js.map +1 -0
  79. package/dist/table/base.d.ts +96 -0
  80. package/dist/table/base.js +154 -0
  81. package/dist/table/base.js.map +1 -0
  82. package/dist/table/column.d.ts +53 -0
  83. package/dist/table/column.js +29 -0
  84. package/dist/table/column.js.map +1 -0
  85. package/dist/table/table.d.ts +41 -0
  86. package/dist/table/table.js +101 -0
  87. package/dist/table/table.js.map +1 -0
  88. package/package.json +76 -4
@@ -0,0 +1,101 @@
1
+ import { Column } from "./column.js";
2
+ import { Row as Row$1, Table as Table$1 } from "./base.js";
3
+ import { style } from "@expressive/dom";
4
+ import { jsx } from "@expressive/dom/jsx-runtime";
5
+
6
+ //#region src/table/table.tsx
7
+ const Root = ({ children }) => /* @__PURE__ */ jsx("table", { children });
8
+ style(Root, {
9
+ width: "100%",
10
+ borderCollapse: "collapse",
11
+ fontVariantNumeric: "tabular-nums"
12
+ });
13
+ const Header = ({ children }) => /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children }) });
14
+ const Body = ({ children }) => /* @__PURE__ */ jsx("tbody", { children });
15
+ const pad = {
16
+ padding: "8px 12px",
17
+ textAlign: "left"
18
+ };
19
+ const Head = ({ field, className, children }) => {
20
+ const { size } = field;
21
+ const width = typeof size == "number" ? `${size}px` : size;
22
+ return /* @__PURE__ */ jsx("th", {
23
+ scope: "col",
24
+ className,
25
+ style: width && { width },
26
+ children
27
+ });
28
+ };
29
+ style(Head, pad, {
30
+ borderBottom: "1px solid var(--ui-line, #ccc)",
31
+ color: "var(--ui-muted, #999)",
32
+ fontSize: "85%",
33
+ fontWeight: "500"
34
+ });
35
+ var Row = class extends Row$1 {
36
+ render({ children }) {
37
+ const { attrs, pressable, selected } = this;
38
+ return /* @__PURE__ */ jsx("tr", {
39
+ ...attrs,
40
+ _pressable: pressable,
41
+ _selected: selected,
42
+ children
43
+ });
44
+ }
45
+ };
46
+ style(Row, {
47
+ _pressable: {
48
+ cursor: "pointer",
49
+ outline: "0",
50
+ ":hover": { background: "var(--ui-highlight, #deebff)" },
51
+ ":focus-visible": { boxShadow: "inset 0 0 0 2px var(--ui-accent, #2684ff)" }
52
+ },
53
+ _selected: {
54
+ background: "var(--ui-accent, #2684ff)",
55
+ color: "#fff",
56
+ ":hover": { background: "var(--ui-accent, #2684ff)" }
57
+ }
58
+ });
59
+ const Cell = ({ className, children }) => /* @__PURE__ */ jsx("td", {
60
+ className,
61
+ children
62
+ });
63
+ style(Cell, pad, { borderBottom: "1px solid var(--ui-line, #ccc)" });
64
+ const Empty = ({ span }) => {
65
+ const { empty } = Table$1.get();
66
+ return /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
67
+ colSpan: span,
68
+ children: empty
69
+ }) });
70
+ };
71
+ style(Empty, { _td: [pad, {
72
+ textAlign: "center",
73
+ color: "var(--ui-muted, #999)"
74
+ }] });
75
+ /**
76
+ * Data table whose columns are declared as `Column` children.
77
+ *
78
+ * Pieces - `Root`, `Header`, `Body`, `Head`, `Row`, `Cell`, `Empty` - are function components reading `Table.get()`,
79
+ * each styled on its own; pass one as a prop or assign it in a subclass to replace it. Stock pieces are statics. A
80
+ * `Column` can also bring its own `Head` or `Cell`. With `onPress`, rows are focusable and respond to click, Enter
81
+ * and Space; `selected` marks one.
82
+ *
83
+ * @example
84
+ * <Table data={people} rowKey={(person) => person.id}>
85
+ * <Column name="Name" />
86
+ * <Column name="Age" format={(person) => `${person.age} yrs`} />
87
+ * </Table>
88
+ */
89
+ var Table = class extends Table$1 {
90
+ static Root = Root;
91
+ static Header = Header;
92
+ static Body = Body;
93
+ static Head = Head;
94
+ static Row = Row;
95
+ static Cell = Cell;
96
+ static Empty = Empty;
97
+ };
98
+
99
+ //#endregion
100
+ export { Table };
101
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","names":["Base.Row","Base.Table"],"sources":["../../src/table/table.tsx"],"sourcesContent":["/** @jsxImportSource @expressive/dom */\nimport { Component } from '@expressive/mvc';\nimport { style } from '@expressive/dom';\n\nimport type { CellProps, CellSlot, HeadProps, HeadSlot } from './column';\nimport * as Base from './base';\n\ndeclare namespace Table {\n type RowProps<T = any> = Base.Table.RowProps<T>;\n}\n\nconst Root = ({ children }: { children: Component.Node }): Component.Node => <table>{children}</table>;\n\nstyle(Root, {\n width: '100%',\n borderCollapse: 'collapse',\n fontVariantNumeric: 'tabular-nums'\n});\n\nconst Header = ({ children }: { children: Component.Node }): Component.Node => (\n <thead>\n <tr>{children}</tr>\n </thead>\n);\n\nconst Body = ({ children }: { children: Component.Node }): Component.Node => <tbody>{children}</tbody>;\n\nconst pad = {\n padding: '8px 12px',\n textAlign: 'left'\n};\n\nconst Head = ({ field, className, children }: HeadProps<any>): Component.Node => {\n const { size } = field;\n const width = typeof size == 'number' ? `${size}px` : size;\n\n return (\n <th scope=\"col\" className={className} style={width && { width }}>\n {children}\n </th>\n );\n};\n\nstyle(Head, pad, {\n borderBottom: '1px solid var(--ui-line, #ccc)',\n color: 'var(--ui-muted, #999)',\n fontSize: '85%',\n fontWeight: '500'\n});\n\nclass Row<T = any> extends Base.Row<T> {\n render({ children }: { children: Component.Node }): Component.Node {\n const { attrs, pressable, selected } = this;\n\n return (\n <tr {...attrs} _pressable={pressable} _selected={selected}>\n {children}\n </tr>\n );\n }\n}\n\nstyle(Row, {\n _pressable: {\n cursor: 'pointer',\n outline: '0',\n ':hover': {\n background: 'var(--ui-highlight, #deebff)'\n },\n ':focus-visible': {\n boxShadow: 'inset 0 0 0 2px var(--ui-accent, #2684ff)'\n }\n },\n _selected: {\n background: 'var(--ui-accent, #2684ff)',\n color: '#fff',\n ':hover': {\n background: 'var(--ui-accent, #2684ff)'\n }\n }\n});\n\nconst Cell = ({ className, children }: CellProps<any>): Component.Node => <td className={className}>{children}</td>;\n\nstyle(Cell, pad, {\n borderBottom: '1px solid var(--ui-line, #ccc)'\n});\n\nconst Empty = ({ span }: { span: number }): Component.Node => {\n const { empty } = Base.Table.get();\n\n return (\n <tr>\n <td colSpan={span}>{empty}</td>\n </tr>\n );\n};\n\nstyle(Empty, {\n _td: [pad, {\n textAlign: 'center',\n color: 'var(--ui-muted, #999)'\n }]\n});\n\n/**\n * Data table whose columns are declared as `Column` children.\n *\n * Pieces - `Root`, `Header`, `Body`, `Head`, `Row`, `Cell`, `Empty` - are function components reading `Table.get()`,\n * each styled on its own; pass one as a prop or assign it in a subclass to replace it. Stock pieces are statics. A\n * `Column` can also bring its own `Head` or `Cell`. With `onPress`, rows are focusable and respond to click, Enter\n * and Space; `selected` marks one.\n *\n * @example\n * <Table data={people} rowKey={(person) => person.id}>\n * <Column name=\"Name\" />\n * <Column name=\"Age\" format={(person) => `${person.age} yrs`} />\n * </Table>\n */\nclass Table<T = any> extends Base.Table<T> {\n static Root: Base.Table.Wrap = Root;\n static Header: Base.Table.Wrap = Header;\n static Body: Base.Table.Wrap = Body;\n static Head: HeadSlot = Head;\n static Row: typeof Row<any> = Row;\n static Cell: CellSlot = Cell;\n static Empty: Base.Table.Fill = Empty;\n}\n\nexport { Column } from './column';\nexport type { CellProps, CellSlot, Field, HeadProps, HeadSlot } from './column';\nexport { Body, Cell, Empty, Head, Header, Root, Row, Table };\n"],"mappings":";;;;;;AAWA,MAAM,QAAQ,EAAE,eAA6D,oBAAC,WAAO,WAAiB;AAEtG,MAAM,MAAM;CACV,OAAO;CACP,gBAAgB;CAChB,oBAAoB;CACrB,CAAC;AAEF,MAAM,UAAU,EAAE,eAChB,oBAAC,qBACC,oBAAC,QAAI,WAAc,GACb;AAGV,MAAM,QAAQ,EAAE,eAA6D,oBAAC,WAAO,WAAiB;AAEtG,MAAM,MAAM;CACV,SAAS;CACT,WAAW;CACZ;AAED,MAAM,QAAQ,EAAE,OAAO,WAAW,eAA+C;CAC/E,MAAM,EAAE,SAAS;CACjB,MAAM,QAAQ,OAAO,QAAQ,WAAW,GAAG,KAAK,MAAM;AAEtD,QACE,oBAAC;EAAG,OAAM;EAAiB;EAAW,OAAO,SAAS,EAAE,OAAO;EAC5D;GACE;;AAIT,MAAM,MAAM,KAAK;CACf,cAAc;CACd,OAAO;CACP,UAAU;CACV,YAAY;CACb,CAAC;AAEF,IAAM,MAAN,cAA2BA,MAAY;CACrC,OAAO,EAAE,YAA0D;EACjE,MAAM,EAAE,OAAO,WAAW,aAAa;AAEvC,SACE,oBAAC;GAAG,GAAI;GAAO,YAAY;GAAW,WAAW;GAC9C;IACE;;;AAKX,MAAM,KAAK;CACT,YAAY;EACV,QAAQ;EACR,SAAS;EACT,UAAU,EACR,YAAY,gCACb;EACD,kBAAkB,EAChB,WAAW,6CACZ;EACF;CACD,WAAW;EACT,YAAY;EACZ,OAAO;EACP,UAAU,EACR,YAAY,6BACb;EACF;CACF,CAAC;AAEF,MAAM,QAAQ,EAAE,WAAW,eAA+C,oBAAC;CAAc;CAAY;EAAc;AAEnH,MAAM,MAAM,KAAK,EACf,cAAc,kCACf,CAAC;AAEF,MAAM,SAAS,EAAE,WAA6C;CAC5D,MAAM,EAAE,kBAAqB,KAAK;AAElC,QACE,oBAAC,kBACC,oBAAC;EAAG,SAAS;YAAO;GAAW,GAC5B;;AAIT,MAAM,OAAO,EACX,KAAK,CAAC,KAAK;CACT,WAAW;CACX,OAAO;CACR,CAAC,EACH,CAAC;;;;;;;;;;;;;;;AAgBF,IAAM,QAAN,cAA6BC,QAAc;CACzC,OAAO,OAAwB;CAC/B,OAAO,SAA0B;CACjC,OAAO,OAAwB;CAC/B,OAAO,OAAiB;CACxB,OAAO,MAAuB;CAC9B,OAAO,OAAiB;CACxB,OAAO,QAAyB"}
package/package.json CHANGED
@@ -1,6 +1,78 @@
1
1
  {
2
2
  "name": "@expressive/ui",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Components for Expressive MVC: host-agnostic behavior from the root, styled for @expressive/dom from /dom, every piece replaceable.",
5
+ "sideEffects": false,
6
+ "license": "MIT",
7
+ "author": {
8
+ "name": "Gabe Klein",
9
+ "email": "gabe@termtm.com",
10
+ "url": "https://github.com/gabeklein"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/gabeklein/expressive-ui.git"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "type": "module",
20
+ "main": "dist/index.js",
21
+ "types": "dist/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "default": "./dist/index.js"
26
+ },
27
+ "./dom": {
28
+ "types": "./dist/dom.d.ts",
29
+ "default": "./dist/dom.js"
30
+ }
31
+ },
32
+ "engines": {
33
+ "node": ">=20"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "scripts": {
39
+ "build": "tsdown",
40
+ "typecheck": "tsc --noEmit --incremental && tsc -p examples",
41
+ "coverage": "vitest run --coverage",
42
+ "test": "bun run typecheck && bun run coverage",
43
+ "dev": "cd examples && expressive dev",
44
+ "e2e": "cd examples && playwright test",
45
+ "changeset": "changeset",
46
+ "ci:version": "changeset version && bun install",
47
+ "ci:publish": "bun run build && bun .github/scripts/shake-check.ts && changeset publish"
48
+ },
49
+ "devDependencies": {
50
+ "@changesets/changelog-github": "^1.0.1",
51
+ "@changesets/cli": "^3.0.3",
52
+ "@codemirror/lang-css": "^6.3.1",
53
+ "@codemirror/lang-javascript": "^6.2.5",
54
+ "@codemirror/language": "^6.13.1",
55
+ "@codemirror/state": "^6.7.6",
56
+ "@codemirror/view": "^6.43.15",
57
+ "@expressive/dev": "^0.1.3",
58
+ "@expressive/dom": "^0.12.1",
59
+ "@expressive/mvc": "^0.94.3",
60
+ "@lezer/highlight": "^1.2.5",
61
+ "@playwright/test": "^1.65.0",
62
+ "@vitest/coverage-istanbul": "^4.1.10",
63
+ "happy-dom": "^20.11.1",
64
+ "tsdown": "^0.20.1",
65
+ "typescript": "^5.9.3",
66
+ "vitest": "^4.1.10"
67
+ },
68
+ "peerDependencies": {
69
+ "@expressive/mvc": "^0.94.3",
70
+ "@expressive/dom": "^0.12.1"
71
+ },
72
+ "peerDependenciesMeta": {
73
+ "@expressive/dom": {
74
+ "optional": true
75
+ }
76
+ },
77
+ "packageManager": "bun@1.3.1"
78
+ }