@dosgato/dialog 0.0.18 → 0.0.20
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/Button.svelte +77 -0
- package/Button.svelte.d.ts +30 -0
- package/Checkbox.svelte +2 -1
- package/Checkbox.svelte.d.ts +1 -0
- package/Container.svelte +18 -19
- package/Container.svelte.d.ts +2 -0
- package/Dialog.svelte +137 -0
- package/Dialog.svelte.d.ts +49 -0
- package/FieldAutocomplete.svelte +4 -7
- package/FieldAutocomplete.svelte.d.ts +1 -1
- package/FieldCheckbox.svelte +3 -2
- package/FieldCheckbox.svelte.d.ts +2 -1
- package/FieldChoices.svelte +3 -2
- package/FieldChoices.svelte.d.ts +1 -0
- package/FieldChooserLink.svelte +4 -2
- package/FieldChooserLink.svelte.d.ts +1 -0
- package/FieldDate.svelte +3 -2
- package/FieldDate.svelte.d.ts +1 -0
- package/FieldDateTime.svelte +3 -2
- package/FieldDateTime.svelte.d.ts +1 -0
- package/FieldMultiple.svelte +14 -7
- package/FieldMultiple.svelte.d.ts +3 -0
- package/FieldMultiselect.svelte +29 -22
- package/FieldNumber.svelte +3 -2
- package/FieldNumber.svelte.d.ts +1 -0
- package/FieldRadio.svelte +9 -4
- package/FieldRadio.svelte.d.ts +6 -0
- package/FieldSelect.svelte +9 -3
- package/FieldSelect.svelte.d.ts +6 -0
- package/FieldStandard.svelte +8 -3
- package/FieldStandard.svelte.d.ts +6 -0
- package/FieldText.svelte +3 -2
- package/FieldText.svelte.d.ts +1 -0
- package/FieldTextArea.svelte +5 -3
- package/FieldTextArea.svelte.d.ts +1 -0
- package/Form.svelte +3 -3
- package/FormDialog.svelte +34 -0
- package/FormDialog.svelte.d.ts +38 -0
- package/Input.svelte +4 -1
- package/Input.svelte.d.ts +1 -0
- package/Listbox.svelte +1 -0
- package/Radio.svelte +5 -2
- package/Radio.svelte.d.ts +1 -0
- package/Tab.svelte +4 -3
- package/TabStore.d.ts +8 -1
- package/TabStore.js +18 -3
- package/Tabs.svelte +65 -18
- package/Tabs.svelte.d.ts +2 -4
- package/chooser/Chooser.svelte +1 -1
- package/chooser/Details.svelte +1 -1
- package/colorpicker/{FieldColorPIcker.svelte → FieldColorPicker.svelte} +0 -0
- package/fileIcons.d.ts +2 -1
- package/helpers.d.ts +1 -0
- package/helpers.js +5 -0
- package/iconpicker/FieldIconPicker.svelte +6 -6
- package/index.d.ts +4 -0
- package/index.js +4 -0
- package/package.json +14 -10
package/Tabs.svelte
CHANGED
|
@@ -1,20 +1,33 @@
|
|
|
1
|
-
<script>import { modifierKey, resize } from '@txstate-mws/svelte-components';
|
|
2
|
-
import {
|
|
1
|
+
<script>import { modifierKey, resize, offset } from '@txstate-mws/svelte-components';
|
|
2
|
+
import { Store } from '@txstate-mws/svelte-store';
|
|
3
|
+
import { getContext, setContext } from 'svelte';
|
|
3
4
|
import { roundTo } from 'txstate-utils';
|
|
5
|
+
import { DIALOG_TABS_CONTEXT } from './Dialog.svelte';
|
|
4
6
|
import Icon from './Icon.svelte';
|
|
5
7
|
import { TabStore, TAB_CONTEXT } from './TabStore';
|
|
6
8
|
export let tabs;
|
|
7
9
|
export let active = undefined;
|
|
8
10
|
export let store = new TabStore(tabs, active);
|
|
11
|
+
// TODO: react to tabs prop changing
|
|
12
|
+
const activeStore = new Store({});
|
|
9
13
|
const tabelements = [];
|
|
14
|
+
let activeelement;
|
|
10
15
|
setContext(TAB_CONTEXT, { store, onClick, onKeyDown, tabelements });
|
|
11
|
-
const
|
|
16
|
+
const dialogContext = getContext(DIALOG_TABS_CONTEXT);
|
|
17
|
+
dialogContext.onNext = () => { store.right(); };
|
|
18
|
+
dialogContext.onPrev = () => { store.left(); };
|
|
19
|
+
$: dialogContext.prevTitle = $store.prevTitle;
|
|
20
|
+
$: dialogContext.nextTitle = $store.nextTitle;
|
|
21
|
+
$: dialogContext.hasRequired = $store.requireNext;
|
|
22
|
+
$: dialogContext.change($store);
|
|
23
|
+
setContext(DIALOG_TABS_CONTEXT, {}); // reset context so that any sub-tabs do NOT control the Dialog component
|
|
24
|
+
const currentTitle = store.currentTitle();
|
|
25
|
+
const currentIdx = store.currentIdx();
|
|
12
26
|
const accordion = store.accordion();
|
|
13
27
|
$: cols = Math.min(Math.floor($store.clientWidth / 90), $store.tabs.length);
|
|
14
28
|
$: scalefactor = Math.min(roundTo($store.clientWidth / (cols * 130), 4), 1);
|
|
15
|
-
$: width = `calc(${100 / cols}% + 1px)`;
|
|
16
|
-
$: widthleft = `${100 / cols}%`;
|
|
17
29
|
$: wrapping = cols !== $store.tabs.length;
|
|
30
|
+
$: dialogContext.hasTabs = !$accordion;
|
|
18
31
|
function onClick(idx) {
|
|
19
32
|
return () => store.activate(idx);
|
|
20
33
|
}
|
|
@@ -50,17 +63,34 @@ function onKeyDown(idx) {
|
|
|
50
63
|
function isActive(idx, activeidx) {
|
|
51
64
|
return idx === (activeidx ?? 0);
|
|
52
65
|
}
|
|
53
|
-
|
|
66
|
+
const activeOversize = 2;
|
|
67
|
+
async function reactToCurrent(..._) {
|
|
68
|
+
if (!activeelement)
|
|
69
|
+
return;
|
|
70
|
+
const tabelement = tabelements[$currentIdx];
|
|
71
|
+
if (!tabelement)
|
|
72
|
+
return;
|
|
73
|
+
const span = tabelement.querySelector(':scope > span');
|
|
74
|
+
if (!span)
|
|
75
|
+
return;
|
|
76
|
+
const left = span.offsetLeft - activeelement.offsetLeft - activeOversize;
|
|
77
|
+
const width = span.offsetWidth + (activeOversize * 2);
|
|
78
|
+
activeelement.style.transform = `translateX(${left}px)`;
|
|
79
|
+
activeelement.style.width = `${width}px`;
|
|
80
|
+
}
|
|
81
|
+
$: active = $currentTitle;
|
|
82
|
+
$: reactToCurrent($activeStore);
|
|
54
83
|
</script>
|
|
55
84
|
|
|
56
85
|
{#if !$accordion}
|
|
57
|
-
<ul use:resize={{ store }} class="
|
|
86
|
+
<ul use:resize={{ store }} class="tabs-buttons" role="tablist">
|
|
58
87
|
{#each $store.tabs as tab, idx (tab.title)}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
88
|
+
{@const active = isActive(idx, $store.current)}
|
|
89
|
+
{@const left = idx % cols === 0}
|
|
90
|
+
<li bind:this={tabelements[idx]} use:offset={{ store: active ? activeStore : undefined }} id={$store.tabids[tab.title]} class="tabs-tab" class:left class:wrapping class:active style:font-size="{scalefactor}em" style:line-height={1.2 / scalefactor} aria-selected={active} aria-controls={$store.panelids[tab.title]} role="tab" tabindex={active ? 0 : -1} on:click={onClick(idx)} on:keydown={onKeyDown(idx)}><span><Icon icon={tab.icon} inline />{tab.title}</span></li>
|
|
62
91
|
{/each}
|
|
63
92
|
</ul>
|
|
93
|
+
<div bind:this={activeelement} class="tabs-active"></div>
|
|
64
94
|
<slot current={$store.current} />
|
|
65
95
|
{:else}
|
|
66
96
|
<div use:resize={{ store }} class="tabs-container">
|
|
@@ -70,6 +100,7 @@ $: active = $current;
|
|
|
70
100
|
|
|
71
101
|
<style>
|
|
72
102
|
.tabs-container {
|
|
103
|
+
position: relative;
|
|
73
104
|
display: flex;
|
|
74
105
|
flex-wrap: wrap;
|
|
75
106
|
border-radius: var(--tabs-radius, 0.6em);
|
|
@@ -84,22 +115,38 @@ $: active = $current;
|
|
|
84
115
|
list-style-type: none;
|
|
85
116
|
display: flex;
|
|
86
117
|
flex-wrap: wrap;
|
|
118
|
+
justify-content: flex-start;
|
|
119
|
+
font-size: 0.9em;
|
|
87
120
|
}
|
|
88
121
|
li, .tabs-container :global(.tabs-tab) {
|
|
89
|
-
padding: var(--tabs-padding, 0.7em 1em);
|
|
122
|
+
padding: var(--tabs-padding-vert, 0.7em) var(--tabs-padding-hori, 1em);
|
|
90
123
|
cursor: pointer;
|
|
91
124
|
word-break: break-word;
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
border-top-left-radius: var(--tabs-radius, 0.6em);
|
|
96
|
-
border-top-right-radius: var(--tabs-radius, 0.6em);
|
|
125
|
+
text-transform: uppercase;
|
|
126
|
+
font-weight: 500;
|
|
127
|
+
color: var(--tabs-text, #363534)
|
|
97
128
|
}
|
|
98
129
|
li:not(.left) {
|
|
99
130
|
margin-left: -1px;
|
|
100
131
|
}
|
|
132
|
+
|
|
101
133
|
li:global(.tabs-tab[aria-selected="true"]), .tabs-container :global(.tabs-tab[aria-selected="true"]) {
|
|
102
|
-
|
|
103
|
-
|
|
134
|
+
font-weight: 700;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.tabs-active {
|
|
138
|
+
background: var(--dg-tabs-active, var(--dg-button-bg, #501214));
|
|
139
|
+
height: 3px;
|
|
140
|
+
border-radius: 2px;
|
|
141
|
+
overflow: hidden;
|
|
142
|
+
width: 0px;
|
|
143
|
+
margin-top: calc(-1 * var(--tabs-padding-vert, 0.7em));
|
|
144
|
+
margin-bottom: var(--tabs-padding-vert, 0.7em);
|
|
145
|
+
transition: 0.2s transform;
|
|
146
|
+
}
|
|
147
|
+
@media (prefers-reduced-motion) {
|
|
148
|
+
.tabs-active {
|
|
149
|
+
transition: none;
|
|
150
|
+
}
|
|
104
151
|
}
|
|
105
152
|
</style>
|
package/Tabs.svelte.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import { TabStore } from './TabStore';
|
|
2
|
+
import { TabStore, type TabDef } from './TabStore';
|
|
3
3
|
declare const __propDef: {
|
|
4
4
|
props: {
|
|
5
|
-
tabs:
|
|
6
|
-
title: string;
|
|
7
|
-
}[];
|
|
5
|
+
tabs: TabDef[];
|
|
8
6
|
active?: string | undefined;
|
|
9
7
|
store?: TabStore;
|
|
10
8
|
};
|
package/chooser/Chooser.svelte
CHANGED
|
@@ -92,7 +92,7 @@ onMount(async () => {
|
|
|
92
92
|
</ul>
|
|
93
93
|
</Loading>
|
|
94
94
|
</section>
|
|
95
|
-
<section class="dialog-chooser-preview" tabindex=
|
|
95
|
+
<section class="dialog-chooser-preview" tabindex="-1">
|
|
96
96
|
{#if $preview}
|
|
97
97
|
<Thumbnail item={$preview} />
|
|
98
98
|
<Details item={$preview}>
|
package/chooser/Details.svelte
CHANGED
|
File without changes
|
package/fileIcons.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import type { IconifyIcon } from '@iconify/svelte';
|
|
2
|
+
export declare function iconForMime(mime: string): IconifyIcon;
|
package/helpers.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getDescribedBy(ids: string[]): string;
|
package/helpers.js
ADDED
|
@@ -73,10 +73,10 @@ function onSelectCategory() {
|
|
|
73
73
|
}
|
|
74
74
|
function onKeyDown(e) {
|
|
75
75
|
const currentSelectionIndex = visibleIcons.findIndex(i => i.class === selected.icon);
|
|
76
|
-
let newIndex;
|
|
77
76
|
if (modifierKey(e))
|
|
78
77
|
return;
|
|
79
|
-
|
|
78
|
+
let newIndex;
|
|
79
|
+
if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {
|
|
80
80
|
e.preventDefault();
|
|
81
81
|
if (currentSelectionIndex === visibleIcons.length - 1) {
|
|
82
82
|
newIndex = 0;
|
|
@@ -124,11 +124,11 @@ function onKeyDown(e) {
|
|
|
124
124
|
{/each}
|
|
125
125
|
</select>
|
|
126
126
|
</div>
|
|
127
|
-
<fieldset
|
|
127
|
+
<fieldset>
|
|
128
128
|
<ScreenReaderOnly><legend class="sr-only">Icons</legend></ScreenReaderOnly>
|
|
129
|
-
<div class="icon-picker-items" role="radiogroup"
|
|
129
|
+
<div class="icon-picker-items" role="radiogroup">
|
|
130
130
|
{#each visibleIcons as icon, idx (icon.class)}
|
|
131
|
-
<div bind:this={iconElements[idx]} id={icon.class} class="icon-picker-item" role="radio" aria-checked={icon.class === selected.icon} tabindex={icon.class === selected.icon ? 0 : -1} data-index={idx} on:click={() => onSelectIcon(icon.class)}>
|
|
131
|
+
<div bind:this={iconElements[idx]} id={icon.class} class="icon-picker-item" role="radio" aria-checked={icon.class === selected.icon} tabindex={icon.class === selected.icon ? 0 : -1} data-index={idx} on:click={() => onSelectIcon(icon.class)} on:keydown={onKeyDown}>
|
|
132
132
|
<Icon icon={`${iconToPrefix[icon.class] === 'fab' ? 'fa-brands' : 'fa-solid'}:${icon.class.slice(3)}`}/>
|
|
133
133
|
<ScreenReaderOnly>{icon.label}</ScreenReaderOnly>
|
|
134
134
|
</div>
|
|
@@ -253,4 +253,4 @@ function onKeyDown(e) {
|
|
|
253
253
|
line-height: 250px;
|
|
254
254
|
color: #999;
|
|
255
255
|
}
|
|
256
|
-
</style>
|
|
256
|
+
</style>
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
export { default as Button } from './Button.svelte';
|
|
1
2
|
export { default as Checkbox } from './Checkbox.svelte';
|
|
2
3
|
export { default as Container } from './Container.svelte';
|
|
4
|
+
export { default as Dialog } from './Dialog.svelte';
|
|
3
5
|
export { default as FieldAutocomplete } from './FieldAutocomplete.svelte';
|
|
4
6
|
export { default as FieldCheckbox } from './FieldCheckbox.svelte';
|
|
5
7
|
export { default as FieldChoices } from './FieldChoices.svelte';
|
|
@@ -18,6 +20,7 @@ export { default as FieldText } from './FieldText.svelte';
|
|
|
18
20
|
export { default as FieldTextArea } from './FieldTextArea.svelte';
|
|
19
21
|
export { default as FileIcon } from './FileIcon.svelte';
|
|
20
22
|
export { default as Form } from './Form.svelte';
|
|
23
|
+
export { default as FormDialog } from './FormDialog.svelte';
|
|
21
24
|
export { default as Icon } from './Icon.svelte';
|
|
22
25
|
export { default as InlineMessage } from './InlineMessage.svelte';
|
|
23
26
|
export { default as InlineMessages } from './InlineMessages.svelte';
|
|
@@ -31,3 +34,4 @@ export * from './fileIcons.js';
|
|
|
31
34
|
export * from './TabStore.js';
|
|
32
35
|
export * from './iconpicker/index.js';
|
|
33
36
|
export * from './colorpicker/index.js';
|
|
37
|
+
export * from './helpers.js';
|
package/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
export { default as Button } from './Button.svelte';
|
|
1
2
|
export { default as Checkbox } from './Checkbox.svelte';
|
|
2
3
|
export { default as Container } from './Container.svelte';
|
|
4
|
+
export { default as Dialog } from './Dialog.svelte';
|
|
3
5
|
export { default as FieldAutocomplete } from './FieldAutocomplete.svelte';
|
|
4
6
|
export { default as FieldCheckbox } from './FieldCheckbox.svelte';
|
|
5
7
|
export { default as FieldChoices } from './FieldChoices.svelte';
|
|
@@ -18,6 +20,7 @@ export { default as FieldText } from './FieldText.svelte';
|
|
|
18
20
|
export { default as FieldTextArea } from './FieldTextArea.svelte';
|
|
19
21
|
export { default as FileIcon } from './FileIcon.svelte';
|
|
20
22
|
export { default as Form } from './Form.svelte';
|
|
23
|
+
export { default as FormDialog } from './FormDialog.svelte';
|
|
21
24
|
export { default as Icon } from './Icon.svelte';
|
|
22
25
|
export { default as InlineMessage } from './InlineMessage.svelte';
|
|
23
26
|
export { default as InlineMessages } from './InlineMessages.svelte';
|
|
@@ -31,3 +34,4 @@ export * from './fileIcons.js';
|
|
|
31
34
|
export * from './TabStore.js';
|
|
32
35
|
export * from './iconpicker/index.js';
|
|
33
36
|
export * from './colorpicker/index.js';
|
|
37
|
+
export * from './helpers.js';
|
package/package.json
CHANGED
|
@@ -1,34 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dosgato/dialog",
|
|
3
3
|
"description": "A component library for building forms that edit a JSON document.",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.20",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@txstate-mws/svelte-components": "^1.3.
|
|
7
|
-
"@txstate-mws/svelte-forms": "
|
|
8
|
-
"@iconify/svelte": "^
|
|
6
|
+
"@txstate-mws/svelte-components": "^1.3.4",
|
|
7
|
+
"@txstate-mws/svelte-forms": "^1.1.2",
|
|
8
|
+
"@iconify/svelte": "^3.0.0",
|
|
9
9
|
"@iconify-icons/mdi": "^1.2.22",
|
|
10
10
|
"@iconify-icons/ph": "^1.2.2",
|
|
11
|
-
"txstate-utils": "^1.7.
|
|
11
|
+
"txstate-utils": "^1.7.12"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@sveltejs/adapter-auto": "next",
|
|
15
15
|
"@sveltejs/kit": "next",
|
|
16
|
-
"@sveltejs/package": "next",
|
|
17
|
-
"eslint-config-standard-with-typescript": "^
|
|
18
|
-
"eslint-plugin-svelte3": "^
|
|
16
|
+
"@sveltejs/package": "^1.0.0-next.5",
|
|
17
|
+
"eslint-config-standard-with-typescript": "^23.0.0",
|
|
18
|
+
"eslint-plugin-svelte3": "^4.0.0",
|
|
19
19
|
"svelte": "^3.44.0",
|
|
20
20
|
"svelte-check": "^2.2.6",
|
|
21
21
|
"svelte-preprocess": "^4.9.4",
|
|
22
|
-
"svelte2tsx": "^0.
|
|
22
|
+
"svelte2tsx": "^0.5.20",
|
|
23
23
|
"tslib": "^2.3.1",
|
|
24
24
|
"typescript": "^4.4.3"
|
|
25
25
|
},
|
|
26
26
|
"type": "module",
|
|
27
27
|
"exports": {
|
|
28
28
|
"./package.json": "./package.json",
|
|
29
|
+
"./Button.svelte": "./Button.svelte",
|
|
29
30
|
"./ButtonGroup.svelte": "./ButtonGroup.svelte",
|
|
30
31
|
"./Checkbox.svelte": "./Checkbox.svelte",
|
|
31
32
|
"./Container.svelte": "./Container.svelte",
|
|
33
|
+
"./Dialog.svelte": "./Dialog.svelte",
|
|
32
34
|
"./FieldAutocomplete.svelte": "./FieldAutocomplete.svelte",
|
|
33
35
|
"./FieldCheckbox.svelte": "./FieldCheckbox.svelte",
|
|
34
36
|
"./FieldChoices.svelte": "./FieldChoices.svelte",
|
|
@@ -48,6 +50,7 @@
|
|
|
48
50
|
"./FieldTextArea.svelte": "./FieldTextArea.svelte",
|
|
49
51
|
"./FileIcon.svelte": "./FileIcon.svelte",
|
|
50
52
|
"./Form.svelte": "./Form.svelte",
|
|
53
|
+
"./FormDialog.svelte": "./FormDialog.svelte",
|
|
51
54
|
"./Icon.svelte": "./Icon.svelte",
|
|
52
55
|
"./InlineMessage.svelte": "./InlineMessage.svelte",
|
|
53
56
|
"./InlineMessages.svelte": "./InlineMessages.svelte",
|
|
@@ -66,10 +69,11 @@
|
|
|
66
69
|
"./chooser/Page.svelte": "./chooser/Page.svelte",
|
|
67
70
|
"./chooser/Thumbnail.svelte": "./chooser/Thumbnail.svelte",
|
|
68
71
|
"./chooser": "./chooser/index.js",
|
|
69
|
-
"./colorpicker/
|
|
72
|
+
"./colorpicker/FieldColorPicker.svelte": "./colorpicker/FieldColorPicker.svelte",
|
|
70
73
|
"./colorpicker/colorpicker": "./colorpicker/colorpicker.js",
|
|
71
74
|
"./colorpicker": "./colorpicker/index.js",
|
|
72
75
|
"./fileIcons": "./fileIcons.js",
|
|
76
|
+
"./helpers": "./helpers.js",
|
|
73
77
|
"./iconpicker/FieldIconPicker.svelte": "./iconpicker/FieldIconPicker.svelte",
|
|
74
78
|
"./iconpicker/iconpicker": "./iconpicker/iconpicker.js",
|
|
75
79
|
"./iconpicker": "./iconpicker/index.js",
|