terminoir 0.13.1 → 0.15.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/README.md +2 -1
- package/css/glass.css +1 -1
- package/css/shell.css +5 -5
- package/dist/components/AppShell.svelte +1 -1
- package/dist/components/DataTable.svelte +2 -2
- package/dist/components/EditableText.svelte +122 -0
- package/dist/components/EditableText.svelte.d.ts +12 -0
- package/dist/components/EmptyState.svelte +10 -3
- package/dist/components/EmptyState.svelte.d.ts +2 -0
- package/dist/components/ListItem.svelte +17 -4
- package/dist/components/ListItem.svelte.d.ts +4 -0
- package/dist/components/Page.svelte +4 -4
- package/dist/components/PageHeader.svelte +10 -1
- package/dist/components/PageHeader.svelte.d.ts +4 -0
- package/dist/components/Tabs.svelte +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/utils/rename.d.ts +2 -0
- package/dist/utils/rename.js +5 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -136,7 +136,7 @@ Import from **`terminoir`**:
|
|
|
136
136
|
| `AppShell` | `header` + `sidebar` snippets; mobile drawer; `fitViewport` (main scrolls, for canvases), `flush`, `headerMode="mobile"`; `toggleSidebar()` / `closeMobileDrawer()` via `bind:this` |
|
|
137
137
|
| `AppShellNavLink` | `href?`, `active`, nav row with active highlight |
|
|
138
138
|
| `SettingsPage`, `SettingsSection` | Settings layout — intro + stacked glass section cards |
|
|
139
|
-
| `EmptyState`, `Skeleton`, `Avatar`, `Kbd` | Presentation |
|
|
139
|
+
| `EmptyState`, `Skeleton`, `Avatar`, `Kbd` | Presentation; `EmptyState framed={false}` inside a Panel or card |
|
|
140
140
|
| `FontPicker` | UI + code font lists, lazy `@fontsource`, persisted per `appId` |
|
|
141
141
|
| `NavIcon` | `name`, optional `color` — Font Awesome 6 (`fa-*` or plain ids like `inbox`); host app loads FA CSS |
|
|
142
142
|
| `IconField` | `bind:value` icon id picker (`ICON_PICKER_OPTIONS`); `compact` opens the grid in a popover |
|
|
@@ -159,6 +159,7 @@ Building blocks so apps compose screens without CSS of their own. See the demo's
|
|
|
159
159
|
| `PropertyRow` | Compact icon + label row for inline-edited values (record properties); hover highlights the row |
|
|
160
160
|
| `ChipSelect`, `DateField` | Value shown as a coloured `Chip` that opens a grouped option list (`ChipSelectOption`, `ChipSelectGroup`); date shown as "Today" / "Tomorrow" / weekday / "Nov 12" (`dayLabel`), `deadline` tints past and today, opens the native picker, Backspace clears |
|
|
161
161
|
| `TitleInput`, `FileButton`, `RadioCards` | Borderless heading input; button that opens a file picker; card-style radio group |
|
|
162
|
+
| `EditableText` | A name you click to rename in place (Enter or click away saves, Escape cancels); `PageHeader` and `ListItem` take `onrename` for the same |
|
|
162
163
|
| `CalendarGrid` | Week (scrolling hours) and month grids; `CalendarEvent` with `muted`/`color`; helpers `calendarRange`, `shiftCalendar`, `eventsOn` |
|
|
163
164
|
| `CanvasStage`, `DocumentViewer` | Full-bleed canvas host with floating overlay and side panel; paged viewer with toolbar and highlight marks |
|
|
164
165
|
| `AccentSwatches` | `bind:value` accent hex from `ACCENT_PALETTE` |
|
package/css/glass.css
CHANGED
package/css/shell.css
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
.terminoir-shell {
|
|
7
|
-
--terminoir-sidebar-width:
|
|
7
|
+
--terminoir-sidebar-width: 236px;
|
|
8
8
|
--terminoir-sidebar-min: 180px;
|
|
9
9
|
--terminoir-sidebar-max: 420px;
|
|
10
10
|
--terminoir-shell-duration: var(--duration-normal);
|
|
11
11
|
display: grid;
|
|
12
|
-
grid-template-columns: var(--terminoir-sidebar-width,
|
|
12
|
+
grid-template-columns: var(--terminoir-sidebar-width, 236px) minmax(0, 1fr);
|
|
13
13
|
min-height: 100dvh;
|
|
14
14
|
transition: grid-template-columns var(--terminoir-shell-duration) var(--ease-out-soft);
|
|
15
15
|
}
|
|
@@ -34,12 +34,12 @@
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
.terminoir-shell__sidebar-inner {
|
|
37
|
-
width: var(--terminoir-sidebar-width,
|
|
37
|
+
width: var(--terminoir-sidebar-width, 236px);
|
|
38
38
|
height: 100%;
|
|
39
39
|
min-height: 100dvh;
|
|
40
40
|
display: flex;
|
|
41
41
|
flex-direction: column;
|
|
42
|
-
padding: var(--space-
|
|
42
|
+
padding: var(--space-3);
|
|
43
43
|
gap: var(--space-2);
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
align-items: center;
|
|
49
49
|
gap: var(--space-2);
|
|
50
50
|
width: 100%;
|
|
51
|
-
padding: 0.
|
|
51
|
+
padding: 0.35rem 0.6rem;
|
|
52
52
|
border: 1px solid transparent;
|
|
53
53
|
border-radius: var(--radius-control);
|
|
54
54
|
background: transparent;
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
th {
|
|
98
98
|
position: sticky;
|
|
99
99
|
top: 0;
|
|
100
|
-
padding: 0.
|
|
100
|
+
padding: 0.35rem 0.75rem;
|
|
101
101
|
text-align: left;
|
|
102
102
|
font-size: 0.6875rem;
|
|
103
103
|
font-weight: 600;
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
white-space: nowrap;
|
|
110
110
|
}
|
|
111
111
|
td {
|
|
112
|
-
padding: 0.
|
|
112
|
+
padding: 0.35rem 0.75rem;
|
|
113
113
|
border-bottom: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
|
|
114
114
|
vertical-align: middle;
|
|
115
115
|
max-width: 0;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { tick } from 'svelte';
|
|
3
|
+
import { cn } from '../utils/cn.js';
|
|
4
|
+
import { renamedValue } from '../utils/rename.js';
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
value,
|
|
8
|
+
label,
|
|
9
|
+
onrename,
|
|
10
|
+
class: className = '',
|
|
11
|
+
}: {
|
|
12
|
+
/** The current name, shown as text until clicked. */
|
|
13
|
+
value: string;
|
|
14
|
+
/** Accessible name of the field while editing, such as "Dashboard name". */
|
|
15
|
+
label: string;
|
|
16
|
+
/** Called with the trimmed new name; not called for a blank or unchanged name. */
|
|
17
|
+
onrename: (value: string) => void | Promise<void>;
|
|
18
|
+
class?: string;
|
|
19
|
+
} = $props();
|
|
20
|
+
|
|
21
|
+
let editing = $state(false);
|
|
22
|
+
let draft = $state('');
|
|
23
|
+
/** The name being saved, shown until `onrename` settles. */
|
|
24
|
+
let saving = $state<string | null>(null);
|
|
25
|
+
let trigger = $state<HTMLButtonElement>();
|
|
26
|
+
|
|
27
|
+
function focusAndSelect(node: HTMLInputElement) {
|
|
28
|
+
node.focus();
|
|
29
|
+
node.select();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function start() {
|
|
33
|
+
draft = value;
|
|
34
|
+
editing = true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function stop(refocus: boolean) {
|
|
38
|
+
editing = false;
|
|
39
|
+
if (refocus) {
|
|
40
|
+
await tick();
|
|
41
|
+
trigger?.focus();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function commit(refocus: boolean) {
|
|
46
|
+
if (!editing) return;
|
|
47
|
+
const next = renamedValue(draft, value);
|
|
48
|
+
void stop(refocus);
|
|
49
|
+
if (next === null) return;
|
|
50
|
+
saving = next;
|
|
51
|
+
try {
|
|
52
|
+
await onrename(next);
|
|
53
|
+
} finally {
|
|
54
|
+
saving = null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function onkeydown(event: KeyboardEvent) {
|
|
59
|
+
if (event.key === 'Enter') {
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
void commit(true);
|
|
62
|
+
} else if (event.key === 'Escape') {
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
event.stopPropagation();
|
|
65
|
+
void stop(true);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
{#if editing}
|
|
71
|
+
<input
|
|
72
|
+
class={cn('terminoir-editable-text terminoir-editable-text--input', className)}
|
|
73
|
+
aria-label={label}
|
|
74
|
+
autocomplete="off"
|
|
75
|
+
bind:value={draft}
|
|
76
|
+
use:focusAndSelect
|
|
77
|
+
{onkeydown}
|
|
78
|
+
onblur={() => void commit(false)}
|
|
79
|
+
/>
|
|
80
|
+
{:else}
|
|
81
|
+
<button
|
|
82
|
+
bind:this={trigger}
|
|
83
|
+
type="button"
|
|
84
|
+
class={cn('terminoir-editable-text', className)}
|
|
85
|
+
title="Click to rename"
|
|
86
|
+
onclick={start}
|
|
87
|
+
>{saving ?? value}</button>
|
|
88
|
+
{/if}
|
|
89
|
+
|
|
90
|
+
<style>
|
|
91
|
+
.terminoir-editable-text {
|
|
92
|
+
display: inline-block;
|
|
93
|
+
max-width: 100%;
|
|
94
|
+
margin: 0 -0.25rem;
|
|
95
|
+
padding: 0 0.25rem;
|
|
96
|
+
border: 1px solid transparent;
|
|
97
|
+
border-radius: var(--radius-control);
|
|
98
|
+
background: transparent;
|
|
99
|
+
color: inherit;
|
|
100
|
+
font: inherit;
|
|
101
|
+
letter-spacing: inherit;
|
|
102
|
+
line-height: inherit;
|
|
103
|
+
text-align: start;
|
|
104
|
+
vertical-align: bottom;
|
|
105
|
+
box-sizing: content-box;
|
|
106
|
+
}
|
|
107
|
+
button.terminoir-editable-text {
|
|
108
|
+
overflow: hidden;
|
|
109
|
+
text-overflow: ellipsis;
|
|
110
|
+
white-space: inherit;
|
|
111
|
+
overflow-wrap: inherit;
|
|
112
|
+
cursor: text;
|
|
113
|
+
}
|
|
114
|
+
button.terminoir-editable-text:hover { border-color: color-mix(in srgb, var(--foreground) 10%, transparent); }
|
|
115
|
+
/* The ring is the border, so it is not clipped inside truncating rows. */
|
|
116
|
+
.terminoir-editable-text:focus-visible { outline: none; box-shadow: none; border-color: var(--ring); }
|
|
117
|
+
.terminoir-editable-text--input {
|
|
118
|
+
min-width: 6ch;
|
|
119
|
+
field-sizing: content;
|
|
120
|
+
border-color: var(--ring);
|
|
121
|
+
}
|
|
122
|
+
</style>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type $$ComponentProps = {
|
|
2
|
+
/** The current name, shown as text until clicked. */
|
|
3
|
+
value: string;
|
|
4
|
+
/** Accessible name of the field while editing, such as "Dashboard name". */
|
|
5
|
+
label: string;
|
|
6
|
+
/** Called with the trimmed new name; not called for a blank or unchanged name. */
|
|
7
|
+
onrename: (value: string) => void | Promise<void>;
|
|
8
|
+
class?: string;
|
|
9
|
+
};
|
|
10
|
+
declare const EditableText: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
11
|
+
type EditableText = ReturnType<typeof EditableText>;
|
|
12
|
+
export default EditableText;
|
|
@@ -5,17 +5,20 @@
|
|
|
5
5
|
let {
|
|
6
6
|
title,
|
|
7
7
|
description,
|
|
8
|
+
framed = true,
|
|
8
9
|
class: className = '',
|
|
9
10
|
children,
|
|
10
11
|
}: {
|
|
11
12
|
title: string;
|
|
12
13
|
description?: string;
|
|
14
|
+
/** Glass panel around it. Set false inside a Panel or card, so the frames don't nest. */
|
|
15
|
+
framed?: boolean;
|
|
13
16
|
class?: string;
|
|
14
17
|
children?: Snippet;
|
|
15
18
|
} = $props();
|
|
16
19
|
</script>
|
|
17
20
|
|
|
18
|
-
<div class={cn('terminoir-empty glass-panel', className)} role="status">
|
|
21
|
+
<div class={cn('terminoir-empty', framed ? 'glass-panel' : 'terminoir-empty--bare', className)} role="status">
|
|
19
22
|
<h2 class="terminoir-empty__title">{title}</h2>
|
|
20
23
|
{#if description}<p class="terminoir-empty__desc">{description}</p>{/if}
|
|
21
24
|
{@render children?.()}
|
|
@@ -23,17 +26,21 @@
|
|
|
23
26
|
|
|
24
27
|
<style>
|
|
25
28
|
.terminoir-empty {
|
|
26
|
-
padding: var(--space-
|
|
29
|
+
padding: var(--space-5) var(--space-4);
|
|
27
30
|
text-align: center;
|
|
28
31
|
}
|
|
29
32
|
|
|
33
|
+
.terminoir-empty--bare {
|
|
34
|
+
padding: var(--space-3) var(--space-2);
|
|
35
|
+
}
|
|
36
|
+
|
|
30
37
|
.terminoir-empty__title {
|
|
31
38
|
margin: 0 0 var(--space-2);
|
|
32
39
|
font-size: 1.125rem;
|
|
33
40
|
}
|
|
34
41
|
|
|
35
42
|
.terminoir-empty__desc {
|
|
36
|
-
margin: 0
|
|
43
|
+
margin: 0;
|
|
37
44
|
color: var(--muted-foreground);
|
|
38
45
|
}
|
|
39
46
|
</style>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import { cn } from '../utils/cn.js';
|
|
4
|
+
import EditableText from './EditableText.svelte';
|
|
4
5
|
|
|
5
6
|
let {
|
|
6
7
|
title,
|
|
@@ -13,6 +14,8 @@
|
|
|
13
14
|
expanded,
|
|
14
15
|
details,
|
|
15
16
|
children,
|
|
17
|
+
onrename,
|
|
18
|
+
renameLabel = 'Name',
|
|
16
19
|
...rest
|
|
17
20
|
}: {
|
|
18
21
|
title?: string;
|
|
@@ -30,6 +33,10 @@
|
|
|
30
33
|
details?: Snippet;
|
|
31
34
|
/** Replaces title/description for custom content. */
|
|
32
35
|
children?: Snippet;
|
|
36
|
+
/** Makes the title editable in place (rows without `onclick` only). */
|
|
37
|
+
onrename?: (title: string) => void | Promise<void>;
|
|
38
|
+
/** Accessible name of the title field while renaming. */
|
|
39
|
+
renameLabel?: string;
|
|
33
40
|
} & Record<string, unknown> = $props();
|
|
34
41
|
</script>
|
|
35
42
|
|
|
@@ -39,7 +46,11 @@
|
|
|
39
46
|
{#if children}
|
|
40
47
|
{@render children()}
|
|
41
48
|
{:else}
|
|
42
|
-
{#if title}
|
|
49
|
+
{#if title}
|
|
50
|
+
<span class={cn('terminoir-list-item__title', onrename && !onclick && 'terminoir-list-item__title--editable')}>
|
|
51
|
+
{#if onrename && !onclick}<EditableText value={title} label={renameLabel} {onrename} />{:else}{title}{/if}
|
|
52
|
+
</span>
|
|
53
|
+
{/if}
|
|
43
54
|
{#if description}<span class="terminoir-list-item__description">{description}</span>{/if}
|
|
44
55
|
{/if}
|
|
45
56
|
</span>
|
|
@@ -66,8 +77,8 @@
|
|
|
66
77
|
align-items: center;
|
|
67
78
|
gap: var(--space-3);
|
|
68
79
|
width: 100%;
|
|
69
|
-
min-height: 2.
|
|
70
|
-
padding: 0.
|
|
80
|
+
min-height: 2.25rem;
|
|
81
|
+
padding: 0.35rem 0.75rem;
|
|
71
82
|
box-sizing: border-box;
|
|
72
83
|
}
|
|
73
84
|
.terminoir-list-item__button {
|
|
@@ -105,6 +116,8 @@
|
|
|
105
116
|
text-overflow: ellipsis;
|
|
106
117
|
white-space: nowrap;
|
|
107
118
|
}
|
|
119
|
+
/* Room for the rename field's border, which the truncating title would clip. */
|
|
120
|
+
.terminoir-list-item__title--editable { padding: 1px 0.3rem; margin: -1px -0.3rem; }
|
|
108
121
|
.terminoir-list-item__description {
|
|
109
122
|
font-size: 0.75rem;
|
|
110
123
|
color: var(--muted-foreground);
|
|
@@ -113,7 +126,7 @@
|
|
|
113
126
|
white-space: nowrap;
|
|
114
127
|
}
|
|
115
128
|
.terminoir-list-item__details {
|
|
116
|
-
padding: var(--space-1) 0.
|
|
129
|
+
padding: var(--space-1) 0.75rem var(--space-3) calc(0.75rem + 1.25rem + var(--space-3));
|
|
117
130
|
}
|
|
118
131
|
.terminoir-list-item__trailing {
|
|
119
132
|
display: inline-flex;
|
|
@@ -15,6 +15,10 @@ type $$ComponentProps = {
|
|
|
15
15
|
details?: Snippet;
|
|
16
16
|
/** Replaces title/description for custom content. */
|
|
17
17
|
children?: Snippet;
|
|
18
|
+
/** Makes the title editable in place (rows without `onclick` only). */
|
|
19
|
+
onrename?: (title: string) => void | Promise<void>;
|
|
20
|
+
/** Accessible name of the title field while renaming. */
|
|
21
|
+
renameLabel?: string;
|
|
18
22
|
} & Record<string, unknown>;
|
|
19
23
|
declare const ListItem: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
20
24
|
type ListItem = ReturnType<typeof ListItem>;
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
.terminoir-page {
|
|
27
27
|
display: flex;
|
|
28
28
|
flex-direction: column;
|
|
29
|
-
gap: var(--space-
|
|
29
|
+
gap: var(--space-4);
|
|
30
30
|
width: 100%;
|
|
31
31
|
margin-inline: auto;
|
|
32
|
-
padding: var(--space-
|
|
32
|
+
padding: var(--space-4) var(--space-5) var(--space-8);
|
|
33
33
|
box-sizing: border-box;
|
|
34
34
|
min-width: 0;
|
|
35
35
|
}
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
}
|
|
47
47
|
@media (max-width: 700px) {
|
|
48
48
|
.terminoir-page:not(.terminoir-page--fill) {
|
|
49
|
-
padding: var(--space-
|
|
50
|
-
gap: var(--space-
|
|
49
|
+
padding: var(--space-3) var(--space-3) var(--space-6);
|
|
50
|
+
gap: var(--space-4);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
</style>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import { cn } from '../utils/cn.js';
|
|
4
|
+
import EditableText from './EditableText.svelte';
|
|
4
5
|
|
|
5
6
|
let {
|
|
6
7
|
title,
|
|
@@ -9,6 +10,8 @@
|
|
|
9
10
|
leading,
|
|
10
11
|
meta,
|
|
11
12
|
actions,
|
|
13
|
+
onrename,
|
|
14
|
+
renameLabel = 'Title',
|
|
12
15
|
}: {
|
|
13
16
|
title: string;
|
|
14
17
|
description?: string;
|
|
@@ -19,6 +22,10 @@
|
|
|
19
22
|
meta?: Snippet;
|
|
20
23
|
/** Buttons aligned to the right. */
|
|
21
24
|
actions?: Snippet;
|
|
25
|
+
/** Makes the title editable in place: click it, type, Enter or click away to save, Escape to cancel. */
|
|
26
|
+
onrename?: (title: string) => void | Promise<void>;
|
|
27
|
+
/** Accessible name of the title field while renaming. */
|
|
28
|
+
renameLabel?: string;
|
|
22
29
|
} = $props();
|
|
23
30
|
</script>
|
|
24
31
|
|
|
@@ -27,7 +34,9 @@
|
|
|
27
34
|
<div class="terminoir-page-header__leading">{@render leading()}</div>
|
|
28
35
|
{/if}
|
|
29
36
|
<div class="terminoir-page-header__text">
|
|
30
|
-
<h1 class="terminoir-page-header__title">
|
|
37
|
+
<h1 class="terminoir-page-header__title">
|
|
38
|
+
{#if onrename}<EditableText value={title} label={renameLabel} {onrename} />{:else}{title}{/if}
|
|
39
|
+
</h1>
|
|
31
40
|
{#if meta}<div class="terminoir-page-header__meta">{@render meta()}</div>{/if}
|
|
32
41
|
{#if description}<p class="terminoir-page-header__description">{description}</p>{/if}
|
|
33
42
|
</div>
|
|
@@ -9,6 +9,10 @@ type $$ComponentProps = {
|
|
|
9
9
|
meta?: Snippet;
|
|
10
10
|
/** Buttons aligned to the right. */
|
|
11
11
|
actions?: Snippet;
|
|
12
|
+
/** Makes the title editable in place: click it, type, Enter or click away to save, Escape to cancel. */
|
|
13
|
+
onrename?: (title: string) => void | Promise<void>;
|
|
14
|
+
/** Accessible name of the title field while renaming. */
|
|
15
|
+
renameLabel?: string;
|
|
12
16
|
};
|
|
13
17
|
declare const PageHeader: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
14
18
|
type PageHeader = ReturnType<typeof PageHeader>;
|
package/dist/index.d.ts
CHANGED
|
@@ -84,6 +84,7 @@ export { default as SearchPicker } from './components/SearchPicker.svelte';
|
|
|
84
84
|
export { default as MarkdownEditor } from './components/MarkdownEditor.svelte';
|
|
85
85
|
export { default as FileButton } from './components/FileButton.svelte';
|
|
86
86
|
export { default as TitleInput } from './components/TitleInput.svelte';
|
|
87
|
+
export { default as EditableText } from './components/EditableText.svelte';
|
|
87
88
|
export type { PickerOption } from './utils/componentTypes.js';
|
|
88
89
|
export { default as RadioCards } from './components/RadioCards.svelte';
|
|
89
90
|
export type { RadioCardOption } from './utils/componentTypes.js';
|
package/dist/index.js
CHANGED
|
@@ -76,6 +76,7 @@ export { default as SearchPicker } from './components/SearchPicker.svelte';
|
|
|
76
76
|
export { default as MarkdownEditor } from './components/MarkdownEditor.svelte';
|
|
77
77
|
export { default as FileButton } from './components/FileButton.svelte';
|
|
78
78
|
export { default as TitleInput } from './components/TitleInput.svelte';
|
|
79
|
+
export { default as EditableText } from './components/EditableText.svelte';
|
|
79
80
|
export { default as RadioCards } from './components/RadioCards.svelte';
|
|
80
81
|
export { default as SegmentedControl } from './components/SegmentedControl.svelte';
|
|
81
82
|
// Overlays
|