@k2b/ui 0.51.0 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base.css +3 -0
- package/dist/browser/actions/Toolbar.js +8 -2
- package/dist/browser/actions/Toolbar.js.map +1 -1
- package/dist/browser/charts/core/bar-labels.js +5 -0
- package/dist/browser/charts/core/bar-labels.js.map +1 -0
- package/dist/browser/charts/core/bubble.js +166 -0
- package/dist/browser/charts/core/bubble.js.map +1 -0
- package/dist/browser/charts/core/default-styles.js +83 -0
- package/dist/browser/charts/core/default-styles.js.map +1 -0
- package/dist/browser/charts/core/funnel-layout.js +79 -0
- package/dist/browser/charts/core/funnel-layout.js.map +1 -0
- package/dist/browser/charts/core/funnel.js +27 -0
- package/dist/browser/charts/core/funnel.js.map +1 -0
- package/dist/browser/charts/core/index.js +6 -1
- package/dist/browser/charts/core/index.js.map +1 -1
- package/dist/browser/charts/core/pareto.js +120 -0
- package/dist/browser/charts/core/pareto.js.map +1 -0
- package/dist/browser/charts/core/radar.js +101 -0
- package/dist/browser/charts/core/radar.js.map +1 -0
- package/dist/browser/charts/core/registry.js +11 -1
- package/dist/browser/charts/core/registry.js.map +1 -1
- package/dist/browser/charts/core/render-size.js +3 -1
- package/dist/browser/charts/core/render-size.js.map +1 -1
- package/dist/browser/charts/core/render.js +19 -0
- package/dist/browser/charts/core/render.js.map +1 -1
- package/dist/browser/charts/core/snapshot.js +1 -1
- package/dist/browser/charts/core/snapshot.js.map +1 -1
- package/dist/browser/charts/core/svg-barGauge.js +67 -0
- package/dist/browser/charts/core/svg-barGauge.js.map +1 -0
- package/dist/browser/charts/core/svg-boxplot.js +127 -0
- package/dist/browser/charts/core/svg-boxplot.js.map +1 -0
- package/dist/browser/charts/core/svg-common.js +1065 -0
- package/dist/browser/charts/core/svg-common.js.map +1 -0
- package/dist/browser/charts/core/svg-gauge.js +185 -0
- package/dist/browser/charts/core/svg-gauge.js.map +1 -0
- package/dist/browser/charts/core/svg-heatmap.js +80 -0
- package/dist/browser/charts/core/svg-heatmap.js.map +1 -0
- package/dist/browser/charts/core/svg-histogram.js +73 -0
- package/dist/browser/charts/core/svg-histogram.js.map +1 -0
- package/dist/browser/charts/core/svg-renderers.js +9 -1777
- package/dist/browser/charts/core/svg-renderers.js.map +1 -1
- package/dist/browser/charts/core/svg-scatter.js +114 -0
- package/dist/browser/charts/core/svg-scatter.js.map +1 -0
- package/dist/browser/charts/core/treemap.js +138 -0
- package/dist/browser/charts/core/treemap.js.map +1 -0
- package/dist/browser/charts/description.js.map +1 -1
- package/dist/browser/content/ChartRoot.js +21 -7
- package/dist/browser/content/ChartRoot.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +4 -1
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/DataTable.js +186 -193
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/Lightbox.js +55 -23
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/ThumbnailStrip.js +174 -0
- package/dist/browser/content/ThumbnailStrip.js.map +1 -0
- package/dist/browser/content/chart-bar.js +98 -0
- package/dist/browser/content/chart-bar.js.map +1 -1
- package/dist/browser/content/chart-inspection-core.js +28 -8
- package/dist/browser/content/chart-inspection-core.js.map +1 -1
- package/dist/browser/content/chart-message-catalog.js +18 -0
- package/dist/browser/content/chart-message-catalog.js.map +1 -1
- package/dist/browser/content/index.js +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/thumbnail-strip-messages.js +24 -0
- package/dist/browser/content/thumbnail-strip-messages.js.map +1 -0
- package/dist/browser/inputs/ChoiceInputs.js +132 -101
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/index.js +1 -0
- package/dist/browser/inputs/index.js.map +1 -1
- package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js +330 -0
- package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
- package/dist/browser/internal/field.js +96 -77
- package/dist/browser/internal/field.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +7 -5
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/PanelDialog.js +92 -68
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +82 -70
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/stat-cell-messages.js +4 -2
- package/dist/browser/surfaces/stat-cell-messages.js.map +1 -1
- package/dist/browser/widgets/DashboardFrame.js +93 -88
- package/dist/browser/widgets/DashboardFrame.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js +8 -2
- package/dist/ssr/actions/Toolbar.js.map +1 -1
- package/dist/ssr/charts/core/bar-labels.js +5 -0
- package/dist/ssr/charts/core/bar-labels.js.map +1 -0
- package/dist/ssr/charts/core/bubble.js +166 -0
- package/dist/ssr/charts/core/bubble.js.map +1 -0
- package/dist/ssr/charts/core/default-styles.js +83 -0
- package/dist/ssr/charts/core/default-styles.js.map +1 -0
- package/dist/ssr/charts/core/funnel-layout.js +79 -0
- package/dist/ssr/charts/core/funnel-layout.js.map +1 -0
- package/dist/ssr/charts/core/funnel.js +27 -0
- package/dist/ssr/charts/core/funnel.js.map +1 -0
- package/dist/ssr/charts/core/index.js +6 -1
- package/dist/ssr/charts/core/index.js.map +1 -1
- package/dist/ssr/charts/core/pareto.js +120 -0
- package/dist/ssr/charts/core/pareto.js.map +1 -0
- package/dist/ssr/charts/core/radar.js +101 -0
- package/dist/ssr/charts/core/radar.js.map +1 -0
- package/dist/ssr/charts/core/registry.js +11 -1
- package/dist/ssr/charts/core/registry.js.map +1 -1
- package/dist/ssr/charts/core/render-size.js +3 -1
- package/dist/ssr/charts/core/render-size.js.map +1 -1
- package/dist/ssr/charts/core/render.js +19 -0
- package/dist/ssr/charts/core/render.js.map +1 -1
- package/dist/ssr/charts/core/snapshot.js +1 -1
- package/dist/ssr/charts/core/snapshot.js.map +1 -1
- package/dist/ssr/charts/core/svg-barGauge.js +67 -0
- package/dist/ssr/charts/core/svg-barGauge.js.map +1 -0
- package/dist/ssr/charts/core/svg-boxplot.js +127 -0
- package/dist/ssr/charts/core/svg-boxplot.js.map +1 -0
- package/dist/ssr/charts/core/svg-common.js +1065 -0
- package/dist/ssr/charts/core/svg-common.js.map +1 -0
- package/dist/ssr/charts/core/svg-gauge.js +185 -0
- package/dist/ssr/charts/core/svg-gauge.js.map +1 -0
- package/dist/ssr/charts/core/svg-heatmap.js +80 -0
- package/dist/ssr/charts/core/svg-heatmap.js.map +1 -0
- package/dist/ssr/charts/core/svg-histogram.js +73 -0
- package/dist/ssr/charts/core/svg-histogram.js.map +1 -0
- package/dist/ssr/charts/core/svg-renderers.js +9 -1777
- package/dist/ssr/charts/core/svg-renderers.js.map +1 -1
- package/dist/ssr/charts/core/svg-scatter.js +114 -0
- package/dist/ssr/charts/core/svg-scatter.js.map +1 -0
- package/dist/ssr/charts/core/treemap.js +138 -0
- package/dist/ssr/charts/core/treemap.js.map +1 -0
- package/dist/ssr/charts/description.js.map +1 -1
- package/dist/ssr/content/ChartRoot.js +21 -7
- package/dist/ssr/content/ChartRoot.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +1 -0
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +12 -16
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +32 -3
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/ThumbnailStrip.js +103 -0
- package/dist/ssr/content/ThumbnailStrip.js.map +1 -0
- package/dist/ssr/content/chart-bar.js +98 -0
- package/dist/ssr/content/chart-bar.js.map +1 -1
- package/dist/ssr/content/chart-inspection-core.js +28 -8
- package/dist/ssr/content/chart-inspection-core.js.map +1 -1
- package/dist/ssr/content/chart-message-catalog.js +18 -0
- package/dist/ssr/content/chart-message-catalog.js.map +1 -1
- package/dist/ssr/content/index.js +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/thumbnail-strip-messages.js +24 -0
- package/dist/ssr/content/thumbnail-strip-messages.js.map +1 -0
- package/dist/ssr/inputs/ChoiceInputs.js +55 -40
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/index.js +1 -0
- package/dist/ssr/inputs/index.js.map +1 -1
- package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js +293 -0
- package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
- package/dist/ssr/internal/field.js +36 -24
- package/dist/ssr/internal/field.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +5 -1
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/PanelDialog.js +40 -26
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +29 -18
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/stat-cell-messages.js +4 -2
- package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -1
- package/dist/ssr/widgets/DashboardFrame.js +6 -11
- package/dist/ssr/widgets/DashboardFrame.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Toolbar.d.ts +2 -0
- package/dist/types/charts/core/bar-labels.d.ts +1 -0
- package/dist/types/charts/core/bubble.d.ts +66 -0
- package/dist/types/charts/core/default-styles.d.ts +1 -0
- package/dist/types/charts/core/funnel-layout.d.ts +43 -0
- package/dist/types/charts/core/funnel.d.ts +13 -0
- package/dist/types/charts/core/index.d.ts +6 -1
- package/dist/types/charts/core/pareto.d.ts +40 -0
- package/dist/types/charts/core/radar.d.ts +47 -0
- package/dist/types/charts/core/registry.d.ts +10 -0
- package/dist/types/charts/core/render-size.d.ts +1 -1
- package/dist/types/charts/core/svg-barGauge.d.ts +3 -0
- package/dist/types/charts/core/svg-boxplot.d.ts +18 -0
- package/dist/types/charts/core/svg-common.d.ts +612 -0
- package/dist/types/charts/core/svg-gauge.d.ts +6 -0
- package/dist/types/charts/core/svg-heatmap.d.ts +6 -0
- package/dist/types/charts/core/svg-histogram.d.ts +16 -0
- package/dist/types/charts/core/svg-renderers.d.ts +8 -612
- package/dist/types/charts/core/svg-scatter.d.ts +23 -0
- package/dist/types/charts/core/treemap.d.ts +45 -0
- package/dist/types/charts/description.d.ts +63 -0
- package/dist/types/content/ChartRoot.d.ts +1 -1
- package/dist/types/content/Lightbox.d.ts +2 -0
- package/dist/types/content/ThumbnailStrip.d.ts +29 -0
- package/dist/types/content/chart-bar.d.ts +38 -2
- package/dist/types/content/chart-inspection-core.d.ts +7 -0
- package/dist/types/content/chart-inspection.d.ts +1 -0
- package/dist/types/content/chart-message-catalog.d.ts +8 -0
- package/dist/types/content/index.d.ts +1 -0
- package/dist/types/content/thumbnail-strip-messages.d.ts +10 -0
- package/dist/types/inputs/ChoiceInputs.d.ts +2 -0
- package/dist/types/inputs/index.d.ts +2 -0
- package/dist/types/inputs/markdown/MarkdownSelectionToolbar.d.ts +19 -0
- package/dist/types/internal/field.d.ts +2 -0
- package/dist/types/layout/PanelDialog.d.ts +5 -0
- package/dist/types/surfaces/stat-cell-messages.d.ts +1 -0
- package/dist/types/widgets/DashboardFrame.d.ts +4 -1
- package/package.json +2 -2
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
2
|
+
import { escape as _$escape } from "solid-js/web";
|
|
3
|
+
import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
|
|
4
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
5
|
+
var _tmpl$ = ["<div style=\"", "\">", "", "", "", "", "", "", "", "</div>"];
|
|
6
|
+
import { i18n } from "@k2b/stdlib";
|
|
7
|
+
import { batch, createEffect, createMemo, createSignal, onCleanup, onMount, Show } from "solid-js";
|
|
8
|
+
import { SelectionToolbar } from "../../actions/SelectionToolbar";
|
|
9
|
+
import { Toolbar } from "../../actions/Toolbar";
|
|
10
|
+
import { useLocale } from "../../intl/locale";
|
|
11
|
+
import { insertLink, toggleBold, toggleBulletList, toggleCode, toggleItalic, toggleNumberedList, toggleQuote } from "./actions";
|
|
12
|
+
import { computeActiveFormats } from "./active-formats";
|
|
13
|
+
const selectionMessages = i18n.define({
|
|
14
|
+
baseLocale: "en",
|
|
15
|
+
messages: {
|
|
16
|
+
en: {
|
|
17
|
+
bold: "Bold",
|
|
18
|
+
italic: "Italic",
|
|
19
|
+
inlineCode: "Inline code",
|
|
20
|
+
link: "Link",
|
|
21
|
+
bulletList: "Bullet list",
|
|
22
|
+
numberedList: "Numbered list",
|
|
23
|
+
quote: "Quote",
|
|
24
|
+
selectionFormatting: "Format selection"
|
|
25
|
+
},
|
|
26
|
+
de: {
|
|
27
|
+
bold: "Fett",
|
|
28
|
+
italic: "Kursiv",
|
|
29
|
+
inlineCode: "Inline-Code",
|
|
30
|
+
link: "Link",
|
|
31
|
+
bulletList: "Aufzählung",
|
|
32
|
+
numberedList: "Nummerierte Liste",
|
|
33
|
+
quote: "Zitat",
|
|
34
|
+
selectionFormatting: "Auswahl formatieren"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
export const checkSelectionMessages = () => selectionMessages.check();
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The box of a text range's first line in the editor's mirrored presentation layer, or nothing when that line is
|
|
42
|
+
* scrolled out of the surface. The layer holds the same text as the textarea, so its text nodes map offsets to places.
|
|
43
|
+
*/
|
|
44
|
+
export const textRangeBox = (layer, surface, start, end) => {
|
|
45
|
+
const walker = document.createTreeWalker(layer, 4 /* NodeFilter.SHOW_TEXT */);
|
|
46
|
+
let offset = 0;
|
|
47
|
+
let from;
|
|
48
|
+
let to;
|
|
49
|
+
for (let node = walker.nextNode(); node; node = walker.nextNode()) {
|
|
50
|
+
const length = node.textContent?.length ?? 0;
|
|
51
|
+
if (!from && start <= offset + length) from = [node, start - offset];
|
|
52
|
+
if (end <= offset + length) {
|
|
53
|
+
to = [node, end - offset];
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
offset += length;
|
|
57
|
+
}
|
|
58
|
+
if (!from || !to) return null;
|
|
59
|
+
const range = document.createRange();
|
|
60
|
+
range.setStart(...from);
|
|
61
|
+
range.setEnd(...to);
|
|
62
|
+
const rects = Array.from(range.getClientRects()).filter(rect => rect.width > 0 || rect.height > 0);
|
|
63
|
+
const first = rects[0];
|
|
64
|
+
if (!first) return null;
|
|
65
|
+
const line = rects.filter(rect => Math.abs(rect.top - first.top) < 4);
|
|
66
|
+
const multiline = line.length < rects.length;
|
|
67
|
+
const right = multiline ? layer.getBoundingClientRect().right : Math.max(...line.map(rect => rect.right));
|
|
68
|
+
const visible = surface.getBoundingClientRect();
|
|
69
|
+
if (first.bottom <= visible.top || first.top >= visible.bottom) return null;
|
|
70
|
+
return new DOMRect(first.left, first.top, Math.max(1, right - first.left), first.height);
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* A small formatting toolbar that floats above selected text in a `MarkdownEditor`: bold, italic, code, link, lists, and
|
|
74
|
+
* quote. Place it beside an editor with `noToolbar` and pass the editor's textarea. It appears once the pointer lets go
|
|
75
|
+
* of a selection and closes on Escape, a collapsed selection, or when the focus leaves both text and toolbar. Touch
|
|
76
|
+
* devices keep their own selection menu, so nothing of it renders there; the keyboard shortcuts work everywhere. It
|
|
77
|
+
* listens to the textarea itself, so editors without it carry none of its code.
|
|
78
|
+
*/
|
|
79
|
+
export function MarkdownSelectionToolbar(props) {
|
|
80
|
+
return _$createComponent(Show, {
|
|
81
|
+
get when() {
|
|
82
|
+
return props.textarea;
|
|
83
|
+
},
|
|
84
|
+
children: textarea => _$createComponent(SelectionFormatting, {
|
|
85
|
+
get textarea() {
|
|
86
|
+
return textarea();
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function SelectionFormatting(props) {
|
|
92
|
+
const locale = useLocale();
|
|
93
|
+
const messages = () => selectionMessages.resolve([locale()]).t;
|
|
94
|
+
const textarea = props.textarea;
|
|
95
|
+
// The editor's surface and its presentation layer: the same text as the textarea, laid out the same way.
|
|
96
|
+
const surface = textarea.parentElement ?? textarea;
|
|
97
|
+
const layer = surface.querySelector(".k2b-markdown-editor__preview") ?? surface;
|
|
98
|
+
const [revision, setRevision] = createSignal(0);
|
|
99
|
+
const bump = () => setRevision(value => value + 1);
|
|
100
|
+
const [finePointer, setFinePointer] = createSignal(false);
|
|
101
|
+
const [dragging, setDragging] = createSignal(false);
|
|
102
|
+
const [textFocused, setTextFocused] = createSignal(document.activeElement === textarea);
|
|
103
|
+
const [toolbarFocused, setToolbarFocused] = createSignal(false);
|
|
104
|
+
const [dismissed, setDismissed] = createSignal();
|
|
105
|
+
let root;
|
|
106
|
+
const selectionKey = () => `${textarea.selectionStart}:${textarea.selectionEnd}`;
|
|
107
|
+
const anchor = () => {
|
|
108
|
+
revision();
|
|
109
|
+
if (textarea.disabled || !finePointer() || dragging() || !(textFocused() || toolbarFocused())) return null;
|
|
110
|
+
if (textarea.selectionStart === textarea.selectionEnd || dismissed() === selectionKey()) return null;
|
|
111
|
+
return textRangeBox(layer, surface, textarea.selectionStart, textarea.selectionEnd);
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// Escape closes the toolbar for that one selection: a collapsed selection forgets it, so selecting the same words
|
|
115
|
+
// again shows it again.
|
|
116
|
+
createEffect(() => {
|
|
117
|
+
revision();
|
|
118
|
+
if (textarea.selectionStart === textarea.selectionEnd) setDismissed(undefined);
|
|
119
|
+
});
|
|
120
|
+
onMount(() => {
|
|
121
|
+
const query = window.matchMedia("(pointer: coarse)");
|
|
122
|
+
const update = () => setFinePointer(!query.matches);
|
|
123
|
+
update();
|
|
124
|
+
const press = () => {
|
|
125
|
+
setDismissed(undefined);
|
|
126
|
+
setDragging(true);
|
|
127
|
+
const release = () => {
|
|
128
|
+
setDragging(false);
|
|
129
|
+
document.removeEventListener("pointerup", release, true);
|
|
130
|
+
document.removeEventListener("pointercancel", release, true);
|
|
131
|
+
};
|
|
132
|
+
document.addEventListener("pointerup", release, true);
|
|
133
|
+
document.addEventListener("pointercancel", release, true);
|
|
134
|
+
};
|
|
135
|
+
const key = event => {
|
|
136
|
+
if (event.key === "Escape") {
|
|
137
|
+
if (event.defaultPrevented || !anchor()) return;
|
|
138
|
+
event.preventDefault();
|
|
139
|
+
setDismissed(selectionKey());
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Selection changes can arrive as one event, so the next key that may select again forgets Escape too.
|
|
143
|
+
if (!["Shift", "Control", "Meta", "Alt"].includes(event.key)) setDismissed(undefined);
|
|
144
|
+
};
|
|
145
|
+
const focus = () => setTextFocused(true);
|
|
146
|
+
const blur = event => batch(() => {
|
|
147
|
+
// Tab into the toolbar keeps it open: the toolbar takes the focus in the same move.
|
|
148
|
+
if (event.relatedTarget instanceof Node && root?.contains(event.relatedTarget)) setToolbarFocused(true);
|
|
149
|
+
setTextFocused(false);
|
|
150
|
+
});
|
|
151
|
+
const selection = () => {
|
|
152
|
+
if (document.activeElement === textarea) bump();
|
|
153
|
+
};
|
|
154
|
+
// The presentation layer renders a frame after an edit; the toolbar measures again once it did.
|
|
155
|
+
const layerElement = layer;
|
|
156
|
+
const layerObserver = new MutationObserver(bump);
|
|
157
|
+
layerObserver.observe(layerElement, {
|
|
158
|
+
childList: true,
|
|
159
|
+
subtree: true,
|
|
160
|
+
characterData: true
|
|
161
|
+
});
|
|
162
|
+
query.addEventListener("change", update);
|
|
163
|
+
textarea.addEventListener("pointerdown", press);
|
|
164
|
+
textarea.addEventListener("keydown", key);
|
|
165
|
+
textarea.addEventListener("focus", focus);
|
|
166
|
+
textarea.addEventListener("blur", blur);
|
|
167
|
+
textarea.addEventListener("input", bump);
|
|
168
|
+
// The toolbar hides while its line is scrolled away and shows again when it returns.
|
|
169
|
+
textarea.addEventListener("scroll", bump);
|
|
170
|
+
document.addEventListener("selectionchange", selection);
|
|
171
|
+
onCleanup(() => {
|
|
172
|
+
layerObserver.disconnect();
|
|
173
|
+
query.removeEventListener("change", update);
|
|
174
|
+
textarea.removeEventListener("pointerdown", press);
|
|
175
|
+
textarea.removeEventListener("keydown", key);
|
|
176
|
+
textarea.removeEventListener("focus", focus);
|
|
177
|
+
textarea.removeEventListener("blur", blur);
|
|
178
|
+
textarea.removeEventListener("input", bump);
|
|
179
|
+
textarea.removeEventListener("scroll", bump);
|
|
180
|
+
document.removeEventListener("selectionchange", selection);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
const run = format => () => format(textarea);
|
|
184
|
+
const formats = createMemo(() => {
|
|
185
|
+
revision();
|
|
186
|
+
return computeActiveFormats(textarea);
|
|
187
|
+
});
|
|
188
|
+
const pressed = format => formats().has(format);
|
|
189
|
+
|
|
190
|
+
// Touch devices keep their own selection menu: the toolbar is not rendered there at all, so nothing of it mounts
|
|
191
|
+
// or animates.
|
|
192
|
+
return _$createComponent(Show, {
|
|
193
|
+
get when() {
|
|
194
|
+
return finePointer();
|
|
195
|
+
},
|
|
196
|
+
get children() {
|
|
197
|
+
return _$createComponent(SelectionToolbar, {
|
|
198
|
+
get label() {
|
|
199
|
+
return messages().selectionFormatting;
|
|
200
|
+
},
|
|
201
|
+
anchor: anchor,
|
|
202
|
+
onEscape: () => {
|
|
203
|
+
setDismissed(selectionKey());
|
|
204
|
+
textarea.focus();
|
|
205
|
+
},
|
|
206
|
+
get children() {
|
|
207
|
+
return _$ssr(_tmpl$, _$ssrStyleProperty("display:", "contents"), _$escape(_$createComponent(Toolbar.Action, {
|
|
208
|
+
get label() {
|
|
209
|
+
return messages().bold;
|
|
210
|
+
},
|
|
211
|
+
icon: "ti ti-bold",
|
|
212
|
+
get pressed() {
|
|
213
|
+
return pressed("bold");
|
|
214
|
+
},
|
|
215
|
+
keys: "mod+b",
|
|
216
|
+
get onClick() {
|
|
217
|
+
return run(toggleBold);
|
|
218
|
+
}
|
|
219
|
+
})), _$escape(_$createComponent(Toolbar.Action, {
|
|
220
|
+
get label() {
|
|
221
|
+
return messages().italic;
|
|
222
|
+
},
|
|
223
|
+
icon: "ti ti-italic",
|
|
224
|
+
get pressed() {
|
|
225
|
+
return pressed("italic");
|
|
226
|
+
},
|
|
227
|
+
keys: "mod+i",
|
|
228
|
+
get onClick() {
|
|
229
|
+
return run(toggleItalic);
|
|
230
|
+
}
|
|
231
|
+
})), _$escape(_$createComponent(Toolbar.Action, {
|
|
232
|
+
get label() {
|
|
233
|
+
return messages().inlineCode;
|
|
234
|
+
},
|
|
235
|
+
icon: "ti ti-code",
|
|
236
|
+
get pressed() {
|
|
237
|
+
return pressed("code");
|
|
238
|
+
},
|
|
239
|
+
keys: "mod+e",
|
|
240
|
+
get onClick() {
|
|
241
|
+
return run(toggleCode);
|
|
242
|
+
}
|
|
243
|
+
})), _$escape(_$createComponent(Toolbar.Action, {
|
|
244
|
+
get label() {
|
|
245
|
+
return messages().link;
|
|
246
|
+
},
|
|
247
|
+
icon: "ti ti-link",
|
|
248
|
+
keys: "mod+k",
|
|
249
|
+
get onClick() {
|
|
250
|
+
return run(insertLink);
|
|
251
|
+
}
|
|
252
|
+
})), _$escape(_$createComponent(Toolbar.Separator, {})), _$escape(_$createComponent(Toolbar.Action, {
|
|
253
|
+
get label() {
|
|
254
|
+
return messages().bulletList;
|
|
255
|
+
},
|
|
256
|
+
icon: "ti ti-list",
|
|
257
|
+
get pressed() {
|
|
258
|
+
return pressed("bullet");
|
|
259
|
+
},
|
|
260
|
+
keys: "mod+shift+8",
|
|
261
|
+
get onClick() {
|
|
262
|
+
return run(toggleBulletList);
|
|
263
|
+
}
|
|
264
|
+
})), _$escape(_$createComponent(Toolbar.Action, {
|
|
265
|
+
get label() {
|
|
266
|
+
return messages().numberedList;
|
|
267
|
+
},
|
|
268
|
+
icon: "ti ti-list-numbers",
|
|
269
|
+
get pressed() {
|
|
270
|
+
return pressed("ordered");
|
|
271
|
+
},
|
|
272
|
+
keys: "mod+shift+7",
|
|
273
|
+
get onClick() {
|
|
274
|
+
return run(toggleNumberedList);
|
|
275
|
+
}
|
|
276
|
+
})), _$escape(_$createComponent(Toolbar.Action, {
|
|
277
|
+
get label() {
|
|
278
|
+
return messages().quote;
|
|
279
|
+
},
|
|
280
|
+
icon: "ti ti-quote",
|
|
281
|
+
get pressed() {
|
|
282
|
+
return pressed("quote");
|
|
283
|
+
},
|
|
284
|
+
get onClick() {
|
|
285
|
+
return run(toggleQuote);
|
|
286
|
+
}
|
|
287
|
+
})));
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=MarkdownSelectionToolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/markdown/MarkdownSelectionToolbar.tsx"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { batch, createEffect, createMemo, createSignal, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { SelectionToolbar } from \"../../actions/SelectionToolbar\";\nimport { Toolbar } from \"../../actions/Toolbar\";\nimport { useLocale } from \"../../intl/locale\";\nimport { insertLink, toggleBold, toggleBulletList, toggleCode, toggleItalic, toggleNumberedList, toggleQuote } from \"./actions\";\nimport { computeActiveFormats } from \"./active-formats\";\n\nconst selectionMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n bold: \"Bold\",\n italic: \"Italic\",\n inlineCode: \"Inline code\",\n link: \"Link\",\n bulletList: \"Bullet list\",\n numberedList: \"Numbered list\",\n quote: \"Quote\",\n selectionFormatting: \"Format selection\",\n },\n de: {\n bold: \"Fett\",\n italic: \"Kursiv\",\n inlineCode: \"Inline-Code\",\n link: \"Link\",\n bulletList: \"Aufzählung\",\n numberedList: \"Nummerierte Liste\",\n quote: \"Zitat\",\n selectionFormatting: \"Auswahl formatieren\",\n },\n },\n});\n\nexport const checkSelectionMessages = () => selectionMessages.check();\n\n/**\n * The box of a text range's first line in the editor's mirrored presentation layer, or nothing when that line is\n * scrolled out of the surface. The layer holds the same text as the textarea, so its text nodes map offsets to places.\n */\nexport const textRangeBox = (layer: HTMLElement, surface: HTMLElement, start: number, end: number): DOMRect | null => {\n const walker = document.createTreeWalker(layer, 4 /* NodeFilter.SHOW_TEXT */);\n let offset = 0;\n let from: [Node, number] | undefined;\n let to: [Node, number] | undefined;\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n const length = node.textContent?.length ?? 0;\n if (!from && start <= offset + length) from = [node, start - offset];\n if (end <= offset + length) {\n to = [node, end - offset];\n break;\n }\n offset += length;\n }\n if (!from || !to) return null;\n const range = document.createRange();\n range.setStart(...from);\n range.setEnd(...to);\n const rects = Array.from(range.getClientRects()).filter((rect) => rect.width > 0 || rect.height > 0);\n const first = rects[0];\n if (!first) return null;\n const line = rects.filter((rect) => Math.abs(rect.top - first.top) < 4);\n const multiline = line.length < rects.length;\n const right = multiline ? layer.getBoundingClientRect().right : Math.max(...line.map((rect) => rect.right));\n const visible = surface.getBoundingClientRect();\n if (first.bottom <= visible.top || first.top >= visible.bottom) return null;\n return new DOMRect(first.left, first.top, Math.max(1, right - first.left), first.height);\n};\n\nexport type MarkdownSelectionToolbarProps = {\n /** The editor's textarea, from `MarkdownEditor`'s `textareaRef`. The toolbar attaches once it is there. */\n textarea: HTMLTextAreaElement | undefined;\n};\n\n/**\n * A small formatting toolbar that floats above selected text in a `MarkdownEditor`: bold, italic, code, link, lists, and\n * quote. Place it beside an editor with `noToolbar` and pass the editor's textarea. It appears once the pointer lets go\n * of a selection and closes on Escape, a collapsed selection, or when the focus leaves both text and toolbar. Touch\n * devices keep their own selection menu, so nothing of it renders there; the keyboard shortcuts work everywhere. It\n * listens to the textarea itself, so editors without it carry none of its code.\n */\nexport function MarkdownSelectionToolbar(props: MarkdownSelectionToolbarProps): JSX.Element {\n return <Show when={props.textarea}>{(textarea) => <SelectionFormatting textarea={textarea()} />}</Show>;\n}\n\nfunction SelectionFormatting(props: { textarea: HTMLTextAreaElement }): JSX.Element {\n const locale = useLocale();\n const messages = () => selectionMessages.resolve([locale()]).t;\n const textarea = props.textarea;\n // The editor's surface and its presentation layer: the same text as the textarea, laid out the same way.\n const surface = textarea.parentElement ?? textarea;\n const layer = surface.querySelector<HTMLElement>(\".k2b-markdown-editor__preview\") ?? surface;\n const [revision, setRevision] = createSignal(0);\n const bump = () => setRevision((value) => value + 1);\n const [finePointer, setFinePointer] = createSignal(false);\n const [dragging, setDragging] = createSignal(false);\n const [textFocused, setTextFocused] = createSignal(document.activeElement === textarea);\n const [toolbarFocused, setToolbarFocused] = createSignal(false);\n const [dismissed, setDismissed] = createSignal<string>();\n let root: HTMLDivElement | undefined;\n\n const selectionKey = () => `${textarea.selectionStart}:${textarea.selectionEnd}`;\n const anchor = () => {\n revision();\n if (textarea.disabled || !finePointer() || dragging() || !(textFocused() || toolbarFocused())) return null;\n if (textarea.selectionStart === textarea.selectionEnd || dismissed() === selectionKey()) return null;\n return textRangeBox(layer, surface, textarea.selectionStart, textarea.selectionEnd);\n };\n\n // Escape closes the toolbar for that one selection: a collapsed selection forgets it, so selecting the same words\n // again shows it again.\n createEffect(() => {\n revision();\n if (textarea.selectionStart === textarea.selectionEnd) setDismissed(undefined);\n });\n\n onMount(() => {\n const query = window.matchMedia(\"(pointer: coarse)\");\n const update = () => setFinePointer(!query.matches);\n update();\n const press = () => {\n setDismissed(undefined);\n setDragging(true);\n const release = () => {\n setDragging(false);\n document.removeEventListener(\"pointerup\", release, true);\n document.removeEventListener(\"pointercancel\", release, true);\n };\n document.addEventListener(\"pointerup\", release, true);\n document.addEventListener(\"pointercancel\", release, true);\n };\n const key = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n if (event.defaultPrevented || !anchor()) return;\n event.preventDefault();\n setDismissed(selectionKey());\n return;\n }\n // Selection changes can arrive as one event, so the next key that may select again forgets Escape too.\n if (![\"Shift\", \"Control\", \"Meta\", \"Alt\"].includes(event.key)) setDismissed(undefined);\n };\n const focus = () => setTextFocused(true);\n const blur = (event: FocusEvent) =>\n batch(() => {\n // Tab into the toolbar keeps it open: the toolbar takes the focus in the same move.\n if (event.relatedTarget instanceof Node && root?.contains(event.relatedTarget)) setToolbarFocused(true);\n setTextFocused(false);\n });\n const selection = () => {\n if (document.activeElement === textarea) bump();\n };\n // The presentation layer renders a frame after an edit; the toolbar measures again once it did.\n const layerElement = layer;\n const layerObserver = new MutationObserver(bump);\n layerObserver.observe(layerElement, { childList: true, subtree: true, characterData: true });\n query.addEventListener(\"change\", update);\n textarea.addEventListener(\"pointerdown\", press);\n textarea.addEventListener(\"keydown\", key);\n textarea.addEventListener(\"focus\", focus);\n textarea.addEventListener(\"blur\", blur);\n textarea.addEventListener(\"input\", bump);\n // The toolbar hides while its line is scrolled away and shows again when it returns.\n textarea.addEventListener(\"scroll\", bump);\n document.addEventListener(\"selectionchange\", selection);\n onCleanup(() => {\n layerObserver.disconnect();\n query.removeEventListener(\"change\", update);\n textarea.removeEventListener(\"pointerdown\", press);\n textarea.removeEventListener(\"keydown\", key);\n textarea.removeEventListener(\"focus\", focus);\n textarea.removeEventListener(\"blur\", blur);\n textarea.removeEventListener(\"input\", bump);\n textarea.removeEventListener(\"scroll\", bump);\n document.removeEventListener(\"selectionchange\", selection);\n });\n });\n\n const run = (format: (textarea: HTMLTextAreaElement) => void) => () => format(textarea);\n const formats = createMemo(() => {\n revision();\n return computeActiveFormats(textarea);\n });\n const pressed = (format: string) => formats().has(format);\n\n // Touch devices keep their own selection menu: the toolbar is not rendered there at all, so nothing of it mounts\n // or animates.\n return (\n <Show when={finePointer()}>\n <SelectionToolbar\n label={messages().selectionFormatting}\n anchor={anchor}\n onEscape={() => {\n setDismissed(selectionKey());\n textarea.focus();\n }}\n >\n <div\n ref={root}\n style={{ display: \"contents\" }}\n onFocusIn={() => setToolbarFocused(true)}\n onFocusOut={(event) => {\n if (!(event.relatedTarget instanceof Node && event.currentTarget.contains(event.relatedTarget))) setToolbarFocused(false);\n }}\n >\n <Toolbar.Action label={messages().bold} icon=\"ti ti-bold\" pressed={pressed(\"bold\")} keys=\"mod+b\" onClick={run(toggleBold)} />\n <Toolbar.Action\n label={messages().italic}\n icon=\"ti ti-italic\"\n pressed={pressed(\"italic\")}\n keys=\"mod+i\"\n onClick={run(toggleItalic)}\n />\n <Toolbar.Action\n label={messages().inlineCode}\n icon=\"ti ti-code\"\n pressed={pressed(\"code\")}\n keys=\"mod+e\"\n onClick={run(toggleCode)}\n />\n <Toolbar.Action label={messages().link} icon=\"ti ti-link\" keys=\"mod+k\" onClick={run(insertLink)} />\n <Toolbar.Separator />\n <Toolbar.Action\n label={messages().bulletList}\n icon=\"ti ti-list\"\n pressed={pressed(\"bullet\")}\n keys=\"mod+shift+8\"\n onClick={run(toggleBulletList)}\n />\n <Toolbar.Action\n label={messages().numberedList}\n icon=\"ti ti-list-numbers\"\n pressed={pressed(\"ordered\")}\n keys=\"mod+shift+7\"\n onClick={run(toggleNumberedList)}\n />\n <Toolbar.Action label={messages().quote} icon=\"ti ti-quote\" pressed={pressed(\"quote\")} onClick={run(toggleQuote)} />\n </div>\n </SelectionToolbar>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,10 +4,11 @@ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
|
4
4
|
import { escape as _$escape } from "solid-js/web";
|
|
5
5
|
var _tmpl$ = "<span class=\"k2b-field__required\" aria-hidden=\"true\">*</span>",
|
|
6
6
|
_tmpl$2 = ["<label", " class=\"k2b-field__label\"", ">", "", "</label>"],
|
|
7
|
-
_tmpl$3 = ["<
|
|
8
|
-
_tmpl$4 = ["<
|
|
9
|
-
_tmpl$5 = ["<
|
|
10
|
-
_tmpl$6 = ["<
|
|
7
|
+
_tmpl$3 = ["<span", " class=\"k2b-field__label\">", "", "</span>"],
|
|
8
|
+
_tmpl$4 = ["<div class=\"k2b-field__label-row\">", "", "</div>"],
|
|
9
|
+
_tmpl$5 = ["<p class=\"k2b-field__description\"", ">", "</p>"],
|
|
10
|
+
_tmpl$6 = ["<p class=\"k2b-field__error\"", " role=\"alert\" aria-live=\"polite\">", "</p>"],
|
|
11
|
+
_tmpl$7 = ["<div class=\"", "\"", ">", "", "", "", "</div>"];
|
|
11
12
|
import { createUniqueId, Show } from "solid-js";
|
|
12
13
|
import { resolveMaybeAccessor } from "../inputs/field-contract";
|
|
13
14
|
export const createFieldMeta = id => {
|
|
@@ -22,34 +23,45 @@ export const createFieldMeta = id => {
|
|
|
22
23
|
};
|
|
23
24
|
export function Field(props) {
|
|
24
25
|
const error = () => resolveMaybeAccessor(props.error);
|
|
25
|
-
|
|
26
|
+
const label = () => _$createComponent(Show, {
|
|
27
|
+
get when() {
|
|
28
|
+
return props.labelFor !== false;
|
|
29
|
+
},
|
|
30
|
+
get fallback() {
|
|
31
|
+
return _$ssr(_tmpl$3, _$ssrAttribute("id", _$escape(props.meta.labelId, true), false), _$escape(props.label), _$escape(_$createComponent(Show, {
|
|
32
|
+
get when() {
|
|
33
|
+
return props.required;
|
|
34
|
+
},
|
|
35
|
+
get children() {
|
|
36
|
+
return _$ssr(_tmpl$);
|
|
37
|
+
}
|
|
38
|
+
})));
|
|
39
|
+
},
|
|
40
|
+
get children() {
|
|
41
|
+
return _$ssr(_tmpl$2, _$ssrAttribute("id", _$escape(props.meta.labelId, true), false), _$ssrAttribute("for", _$escape(props.labelFor || props.meta.controlId, true), false), _$escape(props.label), _$escape(_$createComponent(Show, {
|
|
42
|
+
get when() {
|
|
43
|
+
return props.required;
|
|
44
|
+
},
|
|
45
|
+
get children() {
|
|
46
|
+
return _$ssr(_tmpl$);
|
|
47
|
+
}
|
|
48
|
+
})));
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return _$ssr(_tmpl$7, `k2b-field ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-disabled", props.disabled ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-invalid", error() ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
26
52
|
get when() {
|
|
27
53
|
return props.label;
|
|
28
54
|
},
|
|
29
55
|
get children() {
|
|
30
56
|
return _$createComponent(Show, {
|
|
31
57
|
get when() {
|
|
32
|
-
return props.
|
|
58
|
+
return props.labelEnd;
|
|
33
59
|
},
|
|
34
60
|
get fallback() {
|
|
35
|
-
return
|
|
36
|
-
get when() {
|
|
37
|
-
return props.required;
|
|
38
|
-
},
|
|
39
|
-
get children() {
|
|
40
|
-
return _$ssr(_tmpl$);
|
|
41
|
-
}
|
|
42
|
-
})));
|
|
61
|
+
return label();
|
|
43
62
|
},
|
|
44
63
|
get children() {
|
|
45
|
-
return _$ssr(_tmpl$
|
|
46
|
-
get when() {
|
|
47
|
-
return props.required;
|
|
48
|
-
},
|
|
49
|
-
get children() {
|
|
50
|
-
return _$ssr(_tmpl$);
|
|
51
|
-
}
|
|
52
|
-
})));
|
|
64
|
+
return _$ssr(_tmpl$4, _$escape(label()), _$escape(props.labelEnd));
|
|
53
65
|
}
|
|
54
66
|
});
|
|
55
67
|
}
|
|
@@ -58,14 +70,14 @@ export function Field(props) {
|
|
|
58
70
|
return props.description;
|
|
59
71
|
},
|
|
60
72
|
get children() {
|
|
61
|
-
return _$ssr(_tmpl$
|
|
73
|
+
return _$ssr(_tmpl$5, _$ssrAttribute("id", _$escape(props.meta.descriptionId, true), false), _$escape(props.description));
|
|
62
74
|
}
|
|
63
75
|
})), _$escape(props.children), _$escape(_$createComponent(Show, {
|
|
64
76
|
get when() {
|
|
65
77
|
return error();
|
|
66
78
|
},
|
|
67
79
|
get children() {
|
|
68
|
-
return _$ssr(_tmpl$
|
|
80
|
+
return _$ssr(_tmpl$6, _$ssrAttribute("id", _$escape(props.meta.errorId, true), false), _$escape(error()));
|
|
69
81
|
}
|
|
70
82
|
})));
|
|
71
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["aria-label","aria-labelledby","aria-describedby","aria-invalid","aria-required"],"sources":["internal/field.tsx"],"sourcesContent":["import { createUniqueId, type JSX, Show } from \"solid-js\";\nimport type { FieldProps } from \"../inputs/field-contract\";\nimport { resolveMaybeAccessor } from \"../inputs/field-contract\";\n\nexport type FieldMeta = {\n controlId: string;\n labelId: string;\n descriptionId: string;\n errorId: string;\n};\n\nexport const createFieldMeta = (id?: string): FieldMeta => {\n const generatedId = createUniqueId();\n const controlId = id ?? `k2b-field-${generatedId}`;\n\n return {\n controlId,\n labelId: `${controlId}-label`,\n descriptionId: `${controlId}-description`,\n errorId: `${controlId}-error`,\n };\n};\n\ntype FieldLayoutProps = {\n children: JSX.Element;\n meta: FieldMeta;\n fill?: boolean;\n /** Composite controls use aria-labelledby instead of an HTML label target. */\n labelFor?: string | false;\n} & Pick<FieldProps, \"class\" | \"description\" | \"error\" | \"label\" | \"required\" | \"disabled\">;\n\nexport function Field(props: FieldLayoutProps): JSX.Element {\n const error = () => resolveMaybeAccessor(props.error);\n
|
|
1
|
+
{"version":3,"names":["aria-label","aria-labelledby","aria-describedby","aria-invalid","aria-required"],"sources":["internal/field.tsx"],"sourcesContent":["import { createUniqueId, type JSX, Show } from \"solid-js\";\nimport type { FieldProps } from \"../inputs/field-contract\";\nimport { resolveMaybeAccessor } from \"../inputs/field-contract\";\n\nexport type FieldMeta = {\n controlId: string;\n labelId: string;\n descriptionId: string;\n errorId: string;\n};\n\nexport const createFieldMeta = (id?: string): FieldMeta => {\n const generatedId = createUniqueId();\n const controlId = id ?? `k2b-field-${generatedId}`;\n\n return {\n controlId,\n labelId: `${controlId}-label`,\n descriptionId: `${controlId}-description`,\n errorId: `${controlId}-error`,\n };\n};\n\ntype FieldLayoutProps = {\n children: JSX.Element;\n meta: FieldMeta;\n fill?: boolean;\n /** Composite controls use aria-labelledby instead of an HTML label target. */\n labelFor?: string | false;\n /** Optional controls beside the label, outside its clickable target. */\n labelEnd?: JSX.Element;\n} & Pick<FieldProps, \"class\" | \"description\" | \"error\" | \"label\" | \"required\" | \"disabled\">;\n\nexport function Field(props: FieldLayoutProps): JSX.Element {\n const error = () => resolveMaybeAccessor(props.error);\n const label = () => (\n <Show\n when={props.labelFor !== false}\n fallback={\n <span id={props.meta.labelId} class=\"k2b-field__label\">\n {props.label}\n <Show when={props.required}>\n <span class=\"k2b-field__required\" aria-hidden=\"true\">\n *\n </span>\n </Show>\n </span>\n }\n >\n <label id={props.meta.labelId} class=\"k2b-field__label\" for={props.labelFor || props.meta.controlId}>\n {props.label}\n <Show when={props.required}>\n <span class=\"k2b-field__required\" aria-hidden=\"true\">\n *\n </span>\n </Show>\n </label>\n </Show>\n );\n\n return (\n <div\n class={`k2b-field ${props.class ?? \"\"}`}\n data-disabled={props.disabled ? \"true\" : undefined}\n data-fill={props.fill ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n >\n <Show when={props.label}>\n <Show when={props.labelEnd} fallback={label()}>\n <div class=\"k2b-field__label-row\">\n {label()}\n {props.labelEnd}\n </div>\n </Show>\n </Show>\n <Show when={props.description}>\n <p class=\"k2b-field__description\" id={props.meta.descriptionId}>\n {props.description}\n </p>\n </Show>\n {props.children}\n <Show when={error()}>\n <p class=\"k2b-field__error\" id={props.meta.errorId} role=\"alert\" aria-live=\"polite\">\n {error()}\n </p>\n </Show>\n </div>\n );\n}\n\ntype FieldAriaOwner = Pick<FieldProps, \"aria-describedby\" | \"aria-label\" | \"description\" | \"error\" | \"label\" | \"required\">;\n\nexport const fieldDescribedBy = (meta: FieldMeta, owner: FieldAriaOwner): string | undefined =>\n [\n owner[\"aria-describedby\"],\n owner.description ? meta.descriptionId : undefined,\n resolveMaybeAccessor(owner.error) ? meta.errorId : undefined,\n ]\n .filter(Boolean)\n .join(\" \") || undefined;\n\nexport const fieldControlAria = (meta: FieldMeta, owner: FieldAriaOwner) => ({\n get \"aria-label\"() {\n return owner.label ? undefined : owner[\"aria-label\"];\n },\n get \"aria-labelledby\"() {\n return owner.label ? meta.labelId : undefined;\n },\n get \"aria-describedby\"() {\n return fieldDescribedBy(meta, owner);\n },\n get \"aria-invalid\"() {\n return resolveMaybeAccessor(owner.error) ? (\"true\" as const) : undefined;\n },\n get \"aria-required\"() {\n return owner.required || undefined;\n },\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2064,6 +2064,10 @@ const AppWorkspace = props => {
|
|
|
2064
2064
|
setSidebarId,
|
|
2065
2065
|
initialLayoutState
|
|
2066
2066
|
};
|
|
2067
|
+
// Read once in the untracked component body and written once: the controller owns the sizes after the first
|
|
2068
|
+
// frame. In the root's effect, every rerun (a class that follows the view) rewrote the inline style and showed
|
|
2069
|
+
// the restored widths for a frame.
|
|
2070
|
+
const restoredStyle = appWorkspaceLayoutStyle(initialLayoutState());
|
|
2067
2071
|
|
|
2068
2072
|
// The resize handles are inert markup until the controller is attached, so
|
|
2069
2073
|
// the workspace attaches it itself and scopes it to this root. `onMount`
|
|
@@ -2105,7 +2109,7 @@ const AppWorkspace = props => {
|
|
|
2105
2109
|
return _$createComponent(WorkspaceContext.Provider, {
|
|
2106
2110
|
value: workspace,
|
|
2107
2111
|
get children() {
|
|
2108
|
-
return _$ssr(_tmpl$53, `k2b-app-workspace ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-mobile-surface", _$escape(props.mobileSurface, true), false) + _$ssrAttribute("data-flat", props.flat ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-sidebar-collapsed", initialLayoutState()?.sidebarCollapsed === undefined ? _$escape(undefined, true) : _$escape(String(initialLayoutState()?.sidebarCollapsed), true), false) + _$ssrAttribute("data-workspace-resizable", props.resizable === false ? "false" : "true", false), _$ssrStyle(
|
|
2112
|
+
return _$ssr(_tmpl$53, `k2b-app-workspace ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-mobile-surface", _$escape(props.mobileSurface, true), false) + _$ssrAttribute("data-flat", props.flat ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-sidebar-collapsed", initialLayoutState()?.sidebarCollapsed === undefined ? _$escape(undefined, true) : _$escape(String(initialLayoutState()?.sidebarCollapsed), true), false) + _$ssrAttribute("data-workspace-resizable", props.resizable === false ? "false" : "true", false), _$ssrStyle(restoredStyle), _$escape(contents()));
|
|
2109
2113
|
}
|
|
2110
2114
|
});
|
|
2111
2115
|
}
|