@oh-just-another/react-ui 0.57.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 (186) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +54 -0
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/bottom-sheet.d.ts +26 -0
  6. package/dist/bottom-sheet.d.ts.map +1 -0
  7. package/dist/bottom-sheet.js +87 -0
  8. package/dist/bottom-sheet.js.map +1 -0
  9. package/dist/button-group.d.ts +14 -0
  10. package/dist/button-group.d.ts.map +1 -0
  11. package/dist/button-group.js +3 -0
  12. package/dist/button-group.js.map +1 -0
  13. package/dist/color-palette.d.ts +34 -0
  14. package/dist/color-palette.d.ts.map +1 -0
  15. package/dist/color-palette.js +77 -0
  16. package/dist/color-palette.js.map +1 -0
  17. package/dist/color-swatch-picker.d.ts +29 -0
  18. package/dist/color-swatch-picker.d.ts.map +1 -0
  19. package/dist/color-swatch-picker.js +56 -0
  20. package/dist/color-swatch-picker.js.map +1 -0
  21. package/dist/command-palette.d.ts +13 -0
  22. package/dist/command-palette.d.ts.map +1 -0
  23. package/dist/command-palette.js +146 -0
  24. package/dist/command-palette.js.map +1 -0
  25. package/dist/comments-panel.d.ts +27 -0
  26. package/dist/comments-panel.d.ts.map +1 -0
  27. package/dist/comments-panel.js +139 -0
  28. package/dist/comments-panel.js.map +1 -0
  29. package/dist/constants.d.ts +112 -0
  30. package/dist/constants.d.ts.map +1 -0
  31. package/dist/constants.js +119 -0
  32. package/dist/constants.js.map +1 -0
  33. package/dist/context-menu-controller.d.ts +41 -0
  34. package/dist/context-menu-controller.d.ts.map +1 -0
  35. package/dist/context-menu-controller.js +26 -0
  36. package/dist/context-menu-controller.js.map +1 -0
  37. package/dist/context-menu.d.ts +53 -0
  38. package/dist/context-menu.d.ts.map +1 -0
  39. package/dist/context-menu.js +333 -0
  40. package/dist/context-menu.js.map +1 -0
  41. package/dist/context.d.ts +44 -0
  42. package/dist/context.d.ts.map +1 -0
  43. package/dist/context.js +95 -0
  44. package/dist/context.js.map +1 -0
  45. package/dist/diagram-bars.d.ts +21 -0
  46. package/dist/diagram-bars.d.ts.map +1 -0
  47. package/dist/diagram-bars.js +4 -0
  48. package/dist/diagram-bars.js.map +1 -0
  49. package/dist/diagram-canvas.d.ts +39 -0
  50. package/dist/diagram-canvas.d.ts.map +1 -0
  51. package/dist/diagram-canvas.js +9 -0
  52. package/dist/diagram-canvas.js.map +1 -0
  53. package/dist/diagram-root.d.ts +70 -0
  54. package/dist/diagram-root.d.ts.map +1 -0
  55. package/dist/diagram-root.js +180 -0
  56. package/dist/diagram-root.js.map +1 -0
  57. package/dist/diff-panel.d.ts +25 -0
  58. package/dist/diff-panel.d.ts.map +1 -0
  59. package/dist/diff-panel.js +77 -0
  60. package/dist/diff-panel.js.map +1 -0
  61. package/dist/edge-style-panel.d.ts +19 -0
  62. package/dist/edge-style-panel.d.ts.map +1 -0
  63. package/dist/edge-style-panel.js +120 -0
  64. package/dist/edge-style-panel.js.map +1 -0
  65. package/dist/frame-name-editor-overlay.d.ts +13 -0
  66. package/dist/frame-name-editor-overlay.d.ts.map +1 -0
  67. package/dist/frame-name-editor-overlay.js +84 -0
  68. package/dist/frame-name-editor-overlay.js.map +1 -0
  69. package/dist/frame-panel.d.ts +19 -0
  70. package/dist/frame-panel.d.ts.map +1 -0
  71. package/dist/frame-panel.js +66 -0
  72. package/dist/frame-panel.js.map +1 -0
  73. package/dist/help-button.d.ts +16 -0
  74. package/dist/help-button.d.ts.map +1 -0
  75. package/dist/help-button.js +14 -0
  76. package/dist/help-button.js.map +1 -0
  77. package/dist/help-dialog.d.ts +56 -0
  78. package/dist/help-dialog.d.ts.map +1 -0
  79. package/dist/help-dialog.js +142 -0
  80. package/dist/help-dialog.js.map +1 -0
  81. package/dist/hooks.d.ts +54 -0
  82. package/dist/hooks.d.ts.map +1 -0
  83. package/dist/hooks.js +85 -0
  84. package/dist/hooks.js.map +1 -0
  85. package/dist/icon-button.d.ts +28 -0
  86. package/dist/icon-button.d.ts.map +1 -0
  87. package/dist/icon-button.js +14 -0
  88. package/dist/icon-button.js.map +1 -0
  89. package/dist/index.d.ts +45 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +46 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/layer-panel.d.ts +13 -0
  94. package/dist/layer-panel.d.ts.map +1 -0
  95. package/dist/layer-panel.js +109 -0
  96. package/dist/layer-panel.js.map +1 -0
  97. package/dist/library-panel.d.ts +33 -0
  98. package/dist/library-panel.d.ts.map +1 -0
  99. package/dist/library-panel.js +37 -0
  100. package/dist/library-panel.js.map +1 -0
  101. package/dist/link-caption-editor.d.ts +8 -0
  102. package/dist/link-caption-editor.d.ts.map +1 -0
  103. package/dist/link-caption-editor.js +65 -0
  104. package/dist/link-caption-editor.js.map +1 -0
  105. package/dist/link-drop-shape-menu.d.ts +12 -0
  106. package/dist/link-drop-shape-menu.d.ts.map +1 -0
  107. package/dist/link-drop-shape-menu.js +55 -0
  108. package/dist/link-drop-shape-menu.js.map +1 -0
  109. package/dist/link-hover-popup.d.ts +2 -0
  110. package/dist/link-hover-popup.d.ts.map +1 -0
  111. package/dist/link-hover-popup.js +96 -0
  112. package/dist/link-hover-popup.js.map +1 -0
  113. package/dist/main-menu.d.ts +67 -0
  114. package/dist/main-menu.d.ts.map +1 -0
  115. package/dist/main-menu.js +243 -0
  116. package/dist/main-menu.js.map +1 -0
  117. package/dist/markdown.d.ts +10 -0
  118. package/dist/markdown.d.ts.map +1 -0
  119. package/dist/markdown.js +131 -0
  120. package/dist/markdown.js.map +1 -0
  121. package/dist/merge-dialog.d.ts +22 -0
  122. package/dist/merge-dialog.d.ts.map +1 -0
  123. package/dist/merge-dialog.js +46 -0
  124. package/dist/merge-dialog.js.map +1 -0
  125. package/dist/modal.d.ts +19 -0
  126. package/dist/modal.d.ts.map +1 -0
  127. package/dist/modal.js +87 -0
  128. package/dist/modal.js.map +1 -0
  129. package/dist/palette.d.ts +73 -0
  130. package/dist/palette.d.ts.map +1 -0
  131. package/dist/palette.js +330 -0
  132. package/dist/palette.js.map +1 -0
  133. package/dist/popover.d.ts +33 -0
  134. package/dist/popover.d.ts.map +1 -0
  135. package/dist/popover.js +107 -0
  136. package/dist/popover.js.map +1 -0
  137. package/dist/property-panel.d.ts +32 -0
  138. package/dist/property-panel.d.ts.map +1 -0
  139. package/dist/property-panel.js +728 -0
  140. package/dist/property-panel.js.map +1 -0
  141. package/dist/reset-to-content-button.d.ts +10 -0
  142. package/dist/reset-to-content-button.d.ts.map +1 -0
  143. package/dist/reset-to-content-button.js +62 -0
  144. package/dist/reset-to-content-button.js.map +1 -0
  145. package/dist/segmented-control.d.ts +23 -0
  146. package/dist/segmented-control.d.ts.map +1 -0
  147. package/dist/segmented-control.js +5 -0
  148. package/dist/segmented-control.js.map +1 -0
  149. package/dist/selection-floating-panel.d.ts +56 -0
  150. package/dist/selection-floating-panel.d.ts.map +1 -0
  151. package/dist/selection-floating-panel.js +251 -0
  152. package/dist/selection-floating-panel.js.map +1 -0
  153. package/dist/sidebar.d.ts +31 -0
  154. package/dist/sidebar.d.ts.map +1 -0
  155. package/dist/sidebar.js +66 -0
  156. package/dist/sidebar.js.map +1 -0
  157. package/dist/slider.d.ts +20 -0
  158. package/dist/slider.d.ts.map +1 -0
  159. package/dist/slider.js +9 -0
  160. package/dist/slider.js.map +1 -0
  161. package/dist/text-editor-overlay.d.ts +16 -0
  162. package/dist/text-editor-overlay.d.ts.map +1 -0
  163. package/dist/text-editor-overlay.js +112 -0
  164. package/dist/text-editor-overlay.js.map +1 -0
  165. package/dist/toast.d.ts +34 -0
  166. package/dist/toast.d.ts.map +1 -0
  167. package/dist/toast.js +89 -0
  168. package/dist/toast.js.map +1 -0
  169. package/dist/toolbar.d.ts +149 -0
  170. package/dist/toolbar.d.ts.map +1 -0
  171. package/dist/toolbar.js +282 -0
  172. package/dist/toolbar.js.map +1 -0
  173. package/dist/tooltip.d.ts +21 -0
  174. package/dist/tooltip.d.ts.map +1 -0
  175. package/dist/tooltip.js +217 -0
  176. package/dist/tooltip.js.map +1 -0
  177. package/dist/ui-layer.d.ts +22 -0
  178. package/dist/ui-layer.d.ts.map +1 -0
  179. package/dist/ui-layer.js +3 -0
  180. package/dist/ui-layer.js.map +1 -0
  181. package/dist/versioning.d.ts +32 -0
  182. package/dist/versioning.d.ts.map +1 -0
  183. package/dist/versioning.js +206 -0
  184. package/dist/versioning.js.map +1 -0
  185. package/package.json +81 -0
  186. package/src/styles.css +1502 -0
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Element + canvas color palettes used by the bundled
3
+ * `<ColorSwatchPicker>`. Hosts that want a custom palette import
4
+ * these constants and concat their own; the picker accepts any
5
+ * `readonly string[]`.
6
+ *
7
+ * Palette is sourced from `@oh-just-another/tokens`. Each hue carries
8
+ * two pinned tones — step-4 ("subtle") for fills and step-9 ("solid")
9
+ * for strokes / marks. Step-9 stays the same hex on both themes per
10
+ * Radix spec, so the picker reads as the same "brand" colour
11
+ * regardless of the active theme.
12
+ *
13
+ * `"transparent"` is the canonical "no colour" sentinel — the picker
14
+ * renders it as a checkerboard swatch and writes the string
15
+ * `"transparent"` into the underlying style.
16
+ */
17
+ import { CANVAS_TONES, HUES, HUE_TONES } from "@oh-just-another/tokens";
18
+ const fillsLight = HUES.map((hue) => HUE_TONES.light[hue].fill);
19
+ const solidsLight = HUES.map((hue) => HUE_TONES.light[hue].solid);
20
+ const fillsDark = HUES.map((hue) => HUE_TONES.dark[hue].fill);
21
+ const solidsDark = HUES.map((hue) => HUE_TONES.dark[hue].solid);
22
+ const canvasLight = HUES.map((hue) => CANVAS_TONES.light[hue]);
23
+ const canvasDark = HUES.map((hue) => CANVAS_TONES.dark[hue]);
24
+ /**
25
+ * Light-theme element palette: step-4 subtle tints first row,
26
+ * step-9 solids second row, neutrals + transparent last row.
27
+ */
28
+ export const ELEMENT_PALETTE_LIGHT = [
29
+ ...fillsLight,
30
+ ...solidsLight,
31
+ "#ffffff",
32
+ "#1e1e1e",
33
+ "transparent",
34
+ ];
35
+ /**
36
+ * Dark-theme element palette — step-4 dark tints for fills,
37
+ * step-9 dark for solids. Per Radix spec, the step-9 hex matches
38
+ * the light variant so brand colour stays anchored across themes;
39
+ * only the tint row swaps to deep-tinted backgrounds.
40
+ */
41
+ export const ELEMENT_PALETTE_DARK = [
42
+ ...fillsDark,
43
+ ...solidsDark,
44
+ "#1e1e1e",
45
+ "#ffffff",
46
+ "transparent",
47
+ ];
48
+ /**
49
+ * Light-theme canvas palette — paper-like backgrounds for the
50
+ * editor surface. Pure white sits first; the rest are step-2 hues
51
+ * (almost-pure tints with a hint of colour). Meant for the canvas
52
+ * itself, not for shapes.
53
+ */
54
+ export const CANVAS_PALETTE_LIGHT = ["#ffffff", ...canvasLight];
55
+ /**
56
+ * Dark-theme canvas palette — near-black backgrounds. Step-2 dark
57
+ * from each Radix hue: deep, almost-neutral tints that read as
58
+ * "themed background" rather than "filled colour".
59
+ */
60
+ export const CANVAS_PALETTE_DARK = ["#121113", ...canvasDark];
61
+ /**
62
+ * Resolve which palette flavour to use given a `theme` setting
63
+ * ("light" / "dark" / "system"). For `"system"` consults the OS
64
+ * `prefers-color-scheme` media query, re-checked on each call so a
65
+ * host that re-renders on theme change picks up the switch without
66
+ * subscribing.
67
+ */
68
+ export const resolvePaletteTheme = (theme) => {
69
+ if (theme === "light" || theme === "dark")
70
+ return theme;
71
+ if (typeof window === "undefined")
72
+ return "light";
73
+ return window.matchMedia("(prefers-color-scheme: dark)").matches
74
+ ? "dark"
75
+ : "light";
76
+ };
77
+ //# sourceMappingURL=color-palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-palette.js","sourceRoot":"","sources":["../src/color-palette.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAExE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AAChE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAClE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAEhE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACtD,GAAG,UAAU;IACb,GAAG,WAAW;IACd,SAAS;IACT,SAAS;IACT,aAAa;CACd,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,GAAG,SAAS;IACZ,GAAG,UAAU;IACb,SAAS;IACT,SAAS;IACT,aAAa;CACd,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB,CAAC,SAAS,EAAE,GAAG,WAAW,CAAC,CAAC;AAEnF;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsB,CAAC,SAAS,EAAE,GAAG,UAAU,CAAC,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAkC,EAChB,EAAE;IACpB,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACxD,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC;IAClD,OAAO,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO;QAC9D,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Swatch grid + custom-colour picker. A row of pinned palette colours;
3
+ * users click a swatch to pick, or click the `+` button to open a
4
+ * native colour picker for anything outside the palette. The
5
+ * "transparent" swatch shows a checkerboard pattern and reports `null`
6
+ * upstream.
7
+ *
8
+ * Each cell is a fixed 26 × 26 box: a 24 × 24 colour fill sits
9
+ * centred inside, with 1 px of breathing room. On hover the fill
10
+ * grows to the full 26 × 26 (no layout shift — the cell itself
11
+ * stays at 26). Selected cells get a 2-px tonal ring on the cell
12
+ * border so the ring sits outside the fill, not over it.
13
+ *
14
+ * Default palette is theme-aware — when `palette` is omitted, the
15
+ * picker reads from the OS theme (via `prefers-color-scheme`) and
16
+ * picks the appropriate light / dark palette.
17
+ */
18
+ export interface ColorSwatchPickerProps {
19
+ readonly value: string | null;
20
+ readonly onChange: (color: string | null) => void;
21
+ /** Override the bundled palette. Defaults to theme-aware element palette. */
22
+ readonly palette?: readonly string[];
23
+ /** Show the `+` button that opens the native colour picker. Default `true`. */
24
+ readonly allowCustom?: boolean;
25
+ /** Show the `×` clear button that sets value to `null`. Default `true`. */
26
+ readonly allowClear?: boolean;
27
+ }
28
+ export declare const ColorSwatchPicker: ({ value, onChange, palette, allowCustom, allowClear, }: ColorSwatchPickerProps) => import("react/jsx-runtime").JSX.Element;
29
+ //# sourceMappingURL=color-swatch-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-swatch-picker.d.ts","sourceRoot":"","sources":["../src/color-swatch-picker.tsx"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,iBAAiB,GAAI,wDAM/B,sBAAsB,4CAoCxB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Plus, X } from "lucide-react";
4
+ import { ELEMENT_PALETTE_LIGHT, ELEMENT_PALETTE_DARK, resolvePaletteTheme, } from "./color-palette.js";
5
+ export const ColorSwatchPicker = ({ value, onChange, palette, allowCustom = true, allowClear = true, }) => {
6
+ const resolved = palette ?? defaultPaletteForCurrentTheme();
7
+ const [customOpen, setCustomOpen] = useState(false);
8
+ return (_jsxs("div", { className: "du-swatch-grid", role: "radiogroup", "aria-label": "Colour", children: [resolved.map((c) => (_jsx(Swatch, { color: c, selected: normalise(c) === normalise(value), onClick: () => { onChange(c === "transparent" ? null : c); } }, c))), allowCustom ? (_jsx(CustomSwatch, { value: value, onChange: onChange, open: customOpen, onOpenChange: setCustomOpen })) : null, allowClear ? (_jsx("button", { type: "button", "aria-label": "Clear colour", title: "Clear colour", onClick: () => { onChange(null); }, className: "du-swatch du-swatch-clear", children: _jsx("span", { className: "du-swatch-fill du-swatch-fill-blank", children: _jsx(X, { size: 12, strokeWidth: 2 }) }) })) : null] }));
9
+ };
10
+ const Swatch = ({ color, selected, onClick, }) => {
11
+ const isTransparent = color === "transparent";
12
+ return (_jsx("button", { type: "button", role: "radio", "aria-checked": selected, "aria-label": color, title: color, onClick: onClick, className: "du-swatch", children: _jsx("span", { className: "du-swatch-fill", style: {
13
+ background: isTransparent
14
+ ? "repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%) 50% / 6px 6px"
15
+ : color,
16
+ } }) }));
17
+ };
18
+ /**
19
+ * The `+` button — opens the browser's native colour picker. When
20
+ * `value` is already a custom colour (not in palette) the trigger
21
+ * shows that colour instead of a `+`.
22
+ */
23
+ const CustomSwatch = ({ value, onChange, open, onOpenChange, }) => {
24
+ const hasColour = !!value && value !== "transparent";
25
+ return (_jsxs("label", { className: "du-swatch du-swatch-custom", title: "Pick custom colour", children: [_jsx("span", { className: "du-swatch-fill", style: hasColour ? { background: value } : undefined, children: hasColour ? null : _jsx(Plus, { size: 12, strokeWidth: 2 }) }), _jsx("input", { type: "color", "aria-label": "Custom colour", value: normaliseHex(value), onChange: (ev) => {
26
+ onChange(ev.target.value);
27
+ onOpenChange(false);
28
+ }, onClick: () => { onOpenChange(!open); }, className: "du-swatch-color-input" })] }));
29
+ };
30
+ const normalise = (color) => color === null ? "transparent" : color.toLowerCase();
31
+ const normaliseHex = (value) => {
32
+ if (!value || value === "transparent")
33
+ return "#000000";
34
+ if (/^#[0-9a-f]{6}$/i.test(value))
35
+ return value.toLowerCase();
36
+ if (/^#[0-9a-f]{3}$/i.test(value)) {
37
+ const v = value.slice(1);
38
+ return `#${v[0]}${v[0]}${v[1]}${v[1]}${v[2]}${v[2]}`.toLowerCase();
39
+ }
40
+ return "#000000";
41
+ };
42
+ const defaultPaletteForCurrentTheme = () => {
43
+ if (typeof document === "undefined")
44
+ return ELEMENT_PALETTE_LIGHT;
45
+ // Respect the host's forced theme attribute when present; fall
46
+ // back to OS preference otherwise.
47
+ const attr = document.documentElement.getAttribute("data-theme");
48
+ if (attr === "dark")
49
+ return ELEMENT_PALETTE_DARK;
50
+ if (attr === "light")
51
+ return ELEMENT_PALETTE_LIGHT;
52
+ return resolvePaletteTheme("system") === "dark"
53
+ ? ELEMENT_PALETTE_DARK
54
+ : ELEMENT_PALETTE_LIGHT;
55
+ };
56
+ //# sourceMappingURL=color-swatch-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-swatch-picker.js","sourceRoot":"","sources":["../src/color-swatch-picker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type ReactElement } from "react";
2
+ /**
3
+ * Command palette (standard `⌘K`). A searchable list of every registered action,
4
+ * dispatched through the same `ActionRegistry` as hotkeys / context menu — so
5
+ * it stays in sync automatically as actions are added. Self-contained: manages
6
+ * its own open state and registers the `open-command-palette` action (so the
7
+ * `⌘K` shortcut also appears in the help dialog). Mount once per host.
8
+ *
9
+ * Predicate-gated actions whose predicate currently fails are shown disabled
10
+ * (greyed, not runnable) so the list is stable but can't fire a no-op.
11
+ */
12
+ export declare const CommandPalette: () => ReactElement | null;
13
+ //# sourceMappingURL=command-palette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-palette.d.ts","sourceRoot":"","sources":["../src/command-palette.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,OAAO,CAAC;AAUf;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,QAAO,YAAY,GAAG,IA8HhD,CAAC"}
@@ -0,0 +1,146 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useState, } from "react";
3
+ import { defaultActionRegistry, formatHotkey, } from "@oh-just-another/state";
4
+ import { Modal } from "./modal.js";
5
+ import { useDiagramOptional } from "./hooks.js";
6
+ /**
7
+ * Command palette (standard `⌘K`). A searchable list of every registered action,
8
+ * dispatched through the same `ActionRegistry` as hotkeys / context menu — so
9
+ * it stays in sync automatically as actions are added. Self-contained: manages
10
+ * its own open state and registers the `open-command-palette` action (so the
11
+ * `⌘K` shortcut also appears in the help dialog). Mount once per host.
12
+ *
13
+ * Predicate-gated actions whose predicate currently fails are shown disabled
14
+ * (greyed, not runnable) so the list is stable but can't fire a no-op.
15
+ */
16
+ export const CommandPalette = () => {
17
+ const editor = useDiagramOptional();
18
+ const [open, setOpen] = useState(false);
19
+ const [query, setQuery] = useState("");
20
+ const [active, setActive] = useState(0);
21
+ const inputRef = useRef(null);
22
+ // Register the open action so `⌘K` routes through the registry like every
23
+ // other hotkey (fed by the host keydown listener) and shows in the help
24
+ // dialog. `replace` is idempotent across StrictMode / HMR.
25
+ useEffect(() => {
26
+ defaultActionRegistry.replace({
27
+ id: "open-command-palette",
28
+ label: "Command palette",
29
+ category: "other",
30
+ hotkey: { key: "k", meta: true },
31
+ perform: () => { setOpen(true); },
32
+ });
33
+ return () => { defaultActionRegistry.unregister("open-command-palette"); };
34
+ }, []);
35
+ // Actions with a label, minus the palette opener itself. Built once; the
36
+ // registry is stable for the session.
37
+ const all = useMemo(() => defaultActionRegistry
38
+ .getAll()
39
+ .filter((a) => a.label !== undefined && a.id !== "open-command-palette"), [open]);
40
+ const ctx = editor ? { editor } : null;
41
+ const matches = useMemo(() => {
42
+ const q = query.trim().toLowerCase();
43
+ const list = q
44
+ ? all.filter((a) => (a.label ?? "").toLowerCase().includes(q))
45
+ : all;
46
+ return list.map((a) => ({
47
+ action: a,
48
+ enabled: ctx ? (a.predicate ? a.predicate(ctx) : true) : false,
49
+ }));
50
+ }, [all, query, ctx]);
51
+ // Reset transient state whenever the palette opens.
52
+ useEffect(() => {
53
+ if (!open)
54
+ return;
55
+ setQuery("");
56
+ setActive(0);
57
+ // Focus the input after the modal mounts.
58
+ const id = requestAnimationFrame(() => inputRef.current?.focus());
59
+ return () => { cancelAnimationFrame(id); };
60
+ }, [open]);
61
+ useEffect(() => { setActive(0); }, [query]);
62
+ if (!open)
63
+ return null;
64
+ const close = () => { setOpen(false); };
65
+ const run = (entry) => {
66
+ if (!entry.enabled || !ctx)
67
+ return;
68
+ close();
69
+ defaultActionRegistry.dispatch(entry.action.id, ctx);
70
+ };
71
+ const onInputKey = (ev) => {
72
+ if (ev.key === "ArrowDown") {
73
+ ev.preventDefault();
74
+ setActive((i) => Math.min(matches.length - 1, i + 1));
75
+ }
76
+ else if (ev.key === "ArrowUp") {
77
+ ev.preventDefault();
78
+ setActive((i) => Math.max(0, i - 1));
79
+ }
80
+ else if (ev.key === "Enter") {
81
+ ev.preventDefault();
82
+ const entry = matches[active];
83
+ if (entry)
84
+ run(entry);
85
+ }
86
+ };
87
+ const rowStyle = (i, enabled) => ({
88
+ display: "flex",
89
+ alignItems: "center",
90
+ justifyContent: "space-between",
91
+ gap: 12,
92
+ padding: "8px 14px",
93
+ cursor: enabled ? "pointer" : "default",
94
+ opacity: enabled ? 1 : 0.4,
95
+ background: i === active ? "var(--du-ui-hover, rgba(0,0,0,0.06))" : "transparent",
96
+ });
97
+ return (_jsxs(Modal, { open: open, onClose: close, title: "Command palette", style: MODAL_STYLE, children: [_jsx("input", { ref: inputRef, value: query, onChange: (e) => { setQuery(e.target.value); }, onKeyDown: onInputKey, placeholder: "Search commands\u2026", "aria-label": "Search commands", style: INPUT_STYLE }), _jsx("ul", { style: LIST_STYLE, role: "listbox", children: matches.length === 0 ? (_jsx("li", { style: { padding: "12px 14px", opacity: 0.6 }, children: "No commands" })) : (matches.map((entry, i) => {
98
+ const keys = actionHotkey(entry.action);
99
+ return (_jsxs("li", { role: "option", "aria-selected": i === active, "aria-disabled": !entry.enabled, style: rowStyle(i, entry.enabled), onPointerEnter: () => { setActive(i); }, onClick: () => { run(entry); }, children: [_jsx("span", { children: entry.action.label }), keys ? _jsx("kbd", { style: KBD_STYLE, children: keys }) : null] }, entry.action.id));
100
+ })) })] }));
101
+ };
102
+ /** First hotkey/sequence of an action, formatted for the chip (or null). */
103
+ const actionHotkey = (action) => {
104
+ if (action.hotkey) {
105
+ const raw = Array.isArray(action.hotkey)
106
+ ? action.hotkey
107
+ : [action.hotkey];
108
+ const first = raw[0];
109
+ if (first)
110
+ return formatHotkey(first);
111
+ }
112
+ if (action.sequence && action.sequence.length > 0) {
113
+ return action.sequence.map((k) => (k.length === 1 ? k.toUpperCase() : k)).join(" ");
114
+ }
115
+ return null;
116
+ };
117
+ const MODAL_STYLE = {
118
+ maxWidth: 520,
119
+ width: "calc(100vw - 64px)",
120
+ padding: 0,
121
+ display: "flex",
122
+ flexDirection: "column",
123
+ overflow: "hidden",
124
+ };
125
+ const INPUT_STYLE = {
126
+ border: "none",
127
+ borderBottom: "1px solid var(--du-ui-border)",
128
+ outline: "none",
129
+ padding: "14px 16px",
130
+ fontSize: 15,
131
+ background: "transparent",
132
+ color: "inherit",
133
+ };
134
+ const LIST_STYLE = {
135
+ listStyle: "none",
136
+ margin: 0,
137
+ padding: 4,
138
+ maxHeight: 360,
139
+ overflowY: "auto",
140
+ };
141
+ const KBD_STYLE = {
142
+ fontSize: 11,
143
+ color: "var(--du-text-muted, #6b6b6b)",
144
+ fontFamily: "inherit",
145
+ };
146
+ //# sourceMappingURL=command-palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-palette.js","sourceRoot":"","sources":["../src/command-palette.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type CSSProperties } from "react";
2
+ /**
3
+ * Side-panel listing every annotation thread in the scene. Each row is
4
+ * a button that focuses the annotation (opens `<CommentsPopover>` and
5
+ * highlights the pin). Resolved threads render dimmed. Hosts that want
6
+ * a different layout can compose their own from `useAnnotations` +
7
+ * `editor.setSelectedAnnotation`.
8
+ */
9
+ export interface CommentsPanelProps {
10
+ readonly style?: CSSProperties;
11
+ readonly className?: string;
12
+ }
13
+ export declare const CommentsPanel: ({ style, className }: CommentsPanelProps) => import("react/jsx-runtime").JSX.Element;
14
+ /**
15
+ * Floating thread view for the focused annotation. Renders nothing
16
+ * when no annotation is open. Drop it as a sibling of `<DiagramSurface>`
17
+ * inside `<DiagramRoot>` so it can position itself over the canvas.
18
+ *
19
+ * Composes from `useAnnotations` + `useSelectedAnnotation`; hosts that
20
+ * want a different layout (modal, side-panel, etc.) can rebuild it.
21
+ */
22
+ export interface CommentsPopoverProps {
23
+ readonly style?: CSSProperties;
24
+ readonly className?: string;
25
+ }
26
+ export declare const CommentsPopover: ({ style, className }: CommentsPopoverProps) => import("react/jsx-runtime").JSX.Element | null;
27
+ //# sourceMappingURL=comments-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-panel.d.ts","sourceRoot":"","sources":["../src/comments-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAKrD;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,aAAa,GAAI,sBAAsB,kBAAkB,4CAyFrE,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,eAAe,GAAI,sBAAsB,oBAAoB,mDAyJzE,CAAC"}
@@ -0,0 +1,139 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { useAnnotations, useDiagramOptional, useSelectedAnnotation } from "./hooks.js";
4
+ import { COMMENTS_PANEL_WIDTH } from "./constants.js";
5
+ import { Markdown } from "./markdown.js";
6
+ export const CommentsPanel = ({ style, className }) => {
7
+ const editor = useDiagramOptional();
8
+ const annotations = useAnnotations();
9
+ const selectedId = useSelectedAnnotation();
10
+ return (_jsxs("aside", { className: className, style: {
11
+ flex: "0 0 240px",
12
+ background: "var(--panel, #161616)",
13
+ color: "var(--text, #ddd)",
14
+ borderLeft: "1px solid var(--border, #2a2a2a)",
15
+ display: "flex",
16
+ flexDirection: "column",
17
+ minHeight: 0,
18
+ ...style,
19
+ }, children: [_jsxs("header", { style: {
20
+ padding: "8px 12px",
21
+ fontSize: 11,
22
+ textTransform: "uppercase",
23
+ letterSpacing: 0.5,
24
+ color: "var(--muted, #888)",
25
+ borderBottom: "1px solid var(--border, #2a2a2a)",
26
+ }, children: ["Comments (", annotations.length, ")"] }), _jsx("div", { style: { flex: 1, overflowY: "auto" }, children: annotations.length === 0 ? (_jsx("div", { style: { padding: "16px 12px", color: "var(--faint, #555)", fontSize: 12 }, children: "No comments yet. Right-click on the canvas to add one." })) : (annotations.map((ann) => {
27
+ const first = ann.thread[0];
28
+ const isOpen = ann.id === selectedId;
29
+ return (_jsxs("button", { type: "button", onClick: () => editor?.setSelectedAnnotation(ann.id), style: {
30
+ display: "block",
31
+ width: "100%",
32
+ textAlign: "left",
33
+ padding: "8px 12px",
34
+ border: "none",
35
+ borderLeft: isOpen ? "3px solid var(--accent, #1a73e8)" : "3px solid transparent",
36
+ background: isOpen ? "var(--cursor-bg, rgba(26,115,232,0.12))" : "transparent",
37
+ color: "inherit",
38
+ cursor: "pointer",
39
+ opacity: ann.resolved ? 0.55 : 1,
40
+ borderBottom: "1px solid var(--divider, #333)",
41
+ font: "inherit",
42
+ fontSize: 12,
43
+ }, children: [_jsxs("div", { style: { display: "flex", gap: 6, marginBottom: 2 }, children: [_jsx("span", { style: { fontWeight: 600 }, children: first?.authorName ?? "—" }), ann.thread.length > 1 ? (_jsxs("span", { style: { color: "var(--muted, #888)" }, children: ["+", ann.thread.length - 1] })) : null, ann.resolved ? (_jsx("span", { style: { marginLeft: "auto", color: "var(--muted, #888)" }, children: "resolved" })) : null] }), _jsx("div", { style: {
44
+ color: "var(--muted, #888)",
45
+ overflow: "hidden",
46
+ textOverflow: "ellipsis",
47
+ whiteSpace: "nowrap",
48
+ }, children: first?.body ?? "(empty)" })] }, ann.id));
49
+ })) })] }));
50
+ };
51
+ export const CommentsPopover = ({ style, className }) => {
52
+ const editor = useDiagramOptional();
53
+ const annotations = useAnnotations();
54
+ const selectedId = useSelectedAnnotation();
55
+ const [draft, setDraft] = useState("");
56
+ if (!editor || !selectedId)
57
+ return null;
58
+ const ann = annotations.find((a) => a.id === selectedId);
59
+ if (!ann)
60
+ return null;
61
+ const submit = () => {
62
+ const body = draft.trim();
63
+ if (!body)
64
+ return;
65
+ editor.addComment(ann.id, body);
66
+ setDraft("");
67
+ };
68
+ return (_jsxs("div", { className: className, role: "dialog", "aria-label": "Annotation thread", style: {
69
+ position: "absolute",
70
+ top: 16,
71
+ right: 16,
72
+ width: COMMENTS_PANEL_WIDTH,
73
+ maxHeight: "70vh",
74
+ display: "flex",
75
+ flexDirection: "column",
76
+ background: "var(--panel, #161616)",
77
+ color: "var(--text, #ddd)",
78
+ border: "1px solid var(--border, #2a2a2a)",
79
+ borderRadius: 8,
80
+ boxShadow: "0 6px 24px rgba(0,0,0,0.4)",
81
+ font: "13px system-ui, -apple-system, sans-serif",
82
+ ...style,
83
+ }, children: [_jsxs("header", { style: {
84
+ display: "flex",
85
+ alignItems: "center",
86
+ gap: 8,
87
+ padding: "8px 10px",
88
+ borderBottom: "1px solid var(--divider, #333)",
89
+ }, children: [_jsx("span", { style: { fontSize: 11, color: "var(--muted, #888)" }, children: ann.resolved ? "Resolved" : "Open" }), _jsx("button", { type: "button", onClick: () => { editor.toggleAnnotationResolved(ann.id); }, style: popoverButtonStyle, children: ann.resolved ? "Reopen" : "Resolve" }), _jsx("button", { type: "button", onClick: () => {
90
+ editor.removeAnnotation(ann.id);
91
+ }, style: popoverButtonStyle, "aria-label": "Delete thread", children: "\u00D7" }), _jsx("button", { type: "button", onClick: () => { editor.setSelectedAnnotation(null); }, style: { ...popoverButtonStyle, marginLeft: 4 }, "aria-label": "Close", children: "\u2304" })] }), _jsx("div", { style: { flex: 1, overflowY: "auto", padding: "8px 10px" }, children: ann.thread.length === 0 ? (_jsx("div", { style: { color: "var(--faint, #555)" }, children: "No comments yet." })) : (ann.thread.map((c) => (_jsxs("div", { style: { marginBottom: 10, position: "relative" }, children: [_jsx("button", { type: "button", onClick: () => { editor.removeComment(ann.id, c.id); }, "aria-label": "Delete comment", title: "Delete comment", style: {
92
+ position: "absolute",
93
+ top: 0,
94
+ right: 0,
95
+ background: "transparent",
96
+ border: "none",
97
+ color: "var(--muted, #888)",
98
+ cursor: "pointer",
99
+ padding: "0 4px",
100
+ fontSize: 12,
101
+ lineHeight: 1,
102
+ }, children: "\u00D7" }), _jsxs("div", { style: {
103
+ fontSize: 11,
104
+ color: "var(--muted, #888)",
105
+ marginBottom: 2,
106
+ }, children: [_jsx("strong", { style: { color: "var(--text, #ddd)" }, children: c.authorName }), " ", formatTime(c.createdAt)] }), _jsx("div", { style: { whiteSpace: "pre-wrap", paddingRight: 16 }, children: _jsx(Markdown, { text: c.body }) })] }, c.id)))) }), _jsxs("form", { onSubmit: (ev) => {
107
+ ev.preventDefault();
108
+ submit();
109
+ }, style: {
110
+ padding: "8px 10px",
111
+ borderTop: "1px solid var(--divider, #333)",
112
+ display: "flex",
113
+ gap: 6,
114
+ }, children: [_jsx("input", { type: "text", value: draft, onChange: (ev) => { setDraft(ev.target.value); }, placeholder: "Reply\u2026", style: {
115
+ flex: 1,
116
+ background: "var(--button-bg, #2a2a2a)",
117
+ border: "1px solid var(--border, #2a2a2a)",
118
+ color: "inherit",
119
+ padding: "4px 8px",
120
+ borderRadius: 4,
121
+ font: "inherit",
122
+ } }), _jsx("button", { type: "submit", style: popoverButtonStyle, disabled: !draft.trim(), children: "Send" })] })] }));
123
+ };
124
+ const popoverButtonStyle = {
125
+ background: "var(--button-bg, #2a2a2a)",
126
+ border: "1px solid var(--border, #2a2a2a)",
127
+ color: "inherit",
128
+ padding: "3px 8px",
129
+ borderRadius: 4,
130
+ cursor: "pointer",
131
+ fontSize: 11,
132
+ };
133
+ const formatTime = (iso) => {
134
+ const date = new Date(iso);
135
+ if (Number.isNaN(date.getTime()))
136
+ return "";
137
+ return date.toLocaleString();
138
+ };
139
+ //# sourceMappingURL=comments-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-panel.js","sourceRoot":"","sources":["../src/comments-panel.tsx"],"names":[],"mappings":"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"}