@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.
Files changed (58) hide show
  1. package/Button.svelte +77 -0
  2. package/Button.svelte.d.ts +30 -0
  3. package/Checkbox.svelte +2 -1
  4. package/Checkbox.svelte.d.ts +1 -0
  5. package/Container.svelte +18 -19
  6. package/Container.svelte.d.ts +2 -0
  7. package/Dialog.svelte +137 -0
  8. package/Dialog.svelte.d.ts +49 -0
  9. package/FieldAutocomplete.svelte +4 -7
  10. package/FieldAutocomplete.svelte.d.ts +1 -1
  11. package/FieldCheckbox.svelte +3 -2
  12. package/FieldCheckbox.svelte.d.ts +2 -1
  13. package/FieldChoices.svelte +3 -2
  14. package/FieldChoices.svelte.d.ts +1 -0
  15. package/FieldChooserLink.svelte +4 -2
  16. package/FieldChooserLink.svelte.d.ts +1 -0
  17. package/FieldDate.svelte +3 -2
  18. package/FieldDate.svelte.d.ts +1 -0
  19. package/FieldDateTime.svelte +3 -2
  20. package/FieldDateTime.svelte.d.ts +1 -0
  21. package/FieldMultiple.svelte +14 -7
  22. package/FieldMultiple.svelte.d.ts +3 -0
  23. package/FieldMultiselect.svelte +29 -22
  24. package/FieldNumber.svelte +3 -2
  25. package/FieldNumber.svelte.d.ts +1 -0
  26. package/FieldRadio.svelte +9 -4
  27. package/FieldRadio.svelte.d.ts +6 -0
  28. package/FieldSelect.svelte +9 -3
  29. package/FieldSelect.svelte.d.ts +6 -0
  30. package/FieldStandard.svelte +8 -3
  31. package/FieldStandard.svelte.d.ts +6 -0
  32. package/FieldText.svelte +3 -2
  33. package/FieldText.svelte.d.ts +1 -0
  34. package/FieldTextArea.svelte +5 -3
  35. package/FieldTextArea.svelte.d.ts +1 -0
  36. package/Form.svelte +3 -3
  37. package/FormDialog.svelte +34 -0
  38. package/FormDialog.svelte.d.ts +38 -0
  39. package/Input.svelte +4 -1
  40. package/Input.svelte.d.ts +1 -0
  41. package/Listbox.svelte +1 -0
  42. package/Radio.svelte +5 -2
  43. package/Radio.svelte.d.ts +1 -0
  44. package/Tab.svelte +4 -3
  45. package/TabStore.d.ts +8 -1
  46. package/TabStore.js +18 -3
  47. package/Tabs.svelte +65 -18
  48. package/Tabs.svelte.d.ts +2 -4
  49. package/chooser/Chooser.svelte +1 -1
  50. package/chooser/Details.svelte +1 -1
  51. package/colorpicker/{FieldColorPIcker.svelte → FieldColorPicker.svelte} +0 -0
  52. package/fileIcons.d.ts +2 -1
  53. package/helpers.d.ts +1 -0
  54. package/helpers.js +5 -0
  55. package/iconpicker/FieldIconPicker.svelte +6 -6
  56. package/index.d.ts +4 -0
  57. package/index.js +4 -0
  58. 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 { setContext } from 'svelte';
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 current = store.currentTitle();
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
- $: active = $current;
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="dialog-tab-buttons" role="tablist">
86
+ <ul use:resize={{ store }} class="tabs-buttons" role="tablist">
58
87
  {#each $store.tabs as tab, idx (tab.title)}
59
- {@const active = isActive(idx, $store.current)}
60
- {@const left = idx % cols === 0}
61
- <li bind:this={tabelements[idx]} 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} style:width={left ? widthleft : width} aria-selected={active} aria-controls={$store.panelids[tab.title]} role="tab" tabindex={active ? 0 : -1} on:click={onClick(idx)} on:keydown={onKeyDown(idx)}><Icon icon={tab.icon} inline />{tab.title}</li>
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
- li {
94
- border: var(--tabs-border, 1px solid #666666);
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
- color: var(--tabs-active-text, #ffffff);
103
- background-color: var(--tabs-active-bg, #333333);
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
  };
@@ -92,7 +92,7 @@ onMount(async () => {
92
92
  </ul>
93
93
  </Loading>
94
94
  </section>
95
- <section class="dialog-chooser-preview" tabindex={$preview ? 0 : -1}>
95
+ <section class="dialog-chooser-preview" tabindex="-1">
96
96
  {#if $preview}
97
97
  <Thumbnail item={$preview} />
98
98
  <Details item={$preview}>
@@ -2,7 +2,7 @@
2
2
  export let item;
3
3
  </script>
4
4
 
5
- <ul class="dialog-chooser-info">
5
+ <ul class="dialog-chooser-info" aria-live="polite">
6
6
  {#if item.type !== 'raw'}
7
7
  <li>{item.name}</li>
8
8
  {/if}
package/fileIcons.d.ts CHANGED
@@ -1 +1,2 @@
1
- export declare function iconForMime(mime: string): import("@iconify/types").IconifyIcon;
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
@@ -0,0 +1,5 @@
1
+ import { isNotBlank } from 'txstate-utils';
2
+ export function getDescribedBy(ids) {
3
+ const descby = ids.filter(isNotBlank).join(' ');
4
+ return isNotBlank(descby) ? descby : null;
5
+ }
@@ -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
- else if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {
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 tabindex="0">
127
+ <fieldset>
128
128
  <ScreenReaderOnly><legend class="sr-only">Icons</legend></ScreenReaderOnly>
129
- <div class="icon-picker-items" role="radiogroup" on:keydown={onKeyDown}>
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.18",
4
+ "version": "0.0.20",
5
5
  "dependencies": {
6
- "@txstate-mws/svelte-components": "^1.3.0",
7
- "@txstate-mws/svelte-forms": ">=0.0.22",
8
- "@iconify/svelte": "^2.2.1",
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.3"
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": "^21.0.1",
18
- "eslint-plugin-svelte3": "^3.2.1",
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.4.14",
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/FieldColorPIcker.svelte": "./colorpicker/FieldColorPIcker.svelte",
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",