@txstate-mws/svelte-components 1.0.2 → 1.0.3

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 (130) hide show
  1. package/README.md +40 -17
  2. package/{dist/ts/actions → actions}/buttonify.d.ts +0 -0
  3. package/{dist/actions → actions}/buttonify.js +1 -6
  4. package/{dist/ts/actions → actions}/glue.d.ts +1 -1
  5. package/{dist/actions → actions}/glue.js +8 -13
  6. package/actions/index.d.ts +7 -0
  7. package/actions/index.js +7 -0
  8. package/actions/offset.d.ts +15 -0
  9. package/actions/offset.js +35 -0
  10. package/{dist/ts/actions → actions}/portal.d.ts +0 -0
  11. package/actions/portal.js +13 -0
  12. package/{dist/ts/actions → actions}/resize.d.ts +6 -2
  13. package/actions/resize.js +45 -0
  14. package/{dist/ts/actions → actions}/sticky.d.ts +2 -2
  15. package/{dist/actions → actions}/sticky.js +10 -18
  16. package/{dist/ts/actions → actions}/stickyfixed.d.ts +2 -2
  17. package/{dist/actions → actions}/stickyfixed.js +14 -23
  18. package/{dist/components → components}/CollapsingTable.svelte +12 -13
  19. package/components/CollapsingTable.svelte.d.ts +59 -0
  20. package/{dist/ts/components → components}/ConditionalWrapper.svelte +6 -7
  21. package/components/ConditionalWrapper.svelte.d.ts +23 -0
  22. package/{dist/components → components}/FocusLock.svelte +11 -9
  23. package/components/FocusLock.svelte.d.ts +26 -0
  24. package/{dist/components → components}/Modal.svelte +5 -4
  25. package/components/Modal.svelte.d.ts +27 -0
  26. package/{dist/components → components}/PopupMenu.svelte +13 -16
  27. package/components/PopupMenu.svelte.d.ts +44 -0
  28. package/{dist/components → components}/ScreenReaderOnly.svelte +1 -1
  29. package/components/ScreenReaderOnly.svelte.d.ts +20 -0
  30. package/{dist/ts/components → components}/index.d.ts +0 -0
  31. package/components/index.js +6 -0
  32. package/index.d.ts +4 -0
  33. package/index.js +4 -0
  34. package/package.json +47 -76
  35. package/{dist/ts/types → types}/CollapsingTable.d.ts +0 -0
  36. package/{dist/ts/tests/Actions/Actions.stories.d.ts → types/CollapsingTable.js} +0 -0
  37. package/{dist/ts/types → types}/PopupMenu.d.ts +0 -0
  38. package/{dist/ts/tests/CollapsingTable/CollapsingTable.stories.d.ts → types/PopupMenu.js} +0 -0
  39. package/types/index.d.ts +2 -0
  40. package/types/index.js +2 -0
  41. package/{dist/ts/lib → util}/bodyoffset.d.ts +2 -1
  42. package/{dist/lib → util}/bodyoffset.js +10 -14
  43. package/util/index.d.ts +3 -0
  44. package/util/index.js +3 -0
  45. package/{dist/ts/lib → util}/repositioned.d.ts +1 -2
  46. package/{dist/lib → util}/repositioned.js +14 -24
  47. package/{dist/ts/lib → util}/util.d.ts +0 -0
  48. package/util/util.js +10 -0
  49. package/LICENSE +0 -21
  50. package/dist/actions/buttonify.js.map +0 -1
  51. package/dist/actions/glue.js.map +0 -1
  52. package/dist/actions/index.js +0 -20
  53. package/dist/actions/index.js.map +0 -1
  54. package/dist/actions/offset.js +0 -35
  55. package/dist/actions/offset.js.map +0 -1
  56. package/dist/actions/portal.js +0 -19
  57. package/dist/actions/portal.js.map +0 -1
  58. package/dist/actions/resize.js +0 -48
  59. package/dist/actions/resize.js.map +0 -1
  60. package/dist/actions/sticky.js.map +0 -1
  61. package/dist/actions/stickyfixed.js.map +0 -1
  62. package/dist/components/ConditionalWrapper.svelte +0 -38
  63. package/dist/components/index.js +0 -19
  64. package/dist/components/index.js.map +0 -1
  65. package/dist/index.js +0 -17
  66. package/dist/index.js.map +0 -1
  67. package/dist/lib/activestore.js +0 -123
  68. package/dist/lib/activestore.js.map +0 -1
  69. package/dist/lib/bodyoffset.js.map +0 -1
  70. package/dist/lib/convertedstore.js +0 -41
  71. package/dist/lib/convertedstore.js.map +0 -1
  72. package/dist/lib/derivedstore.js +0 -65
  73. package/dist/lib/derivedstore.js.map +0 -1
  74. package/dist/lib/index.js +0 -22
  75. package/dist/lib/index.js.map +0 -1
  76. package/dist/lib/repositioned.js.map +0 -1
  77. package/dist/lib/safestore.js +0 -16
  78. package/dist/lib/safestore.js.map +0 -1
  79. package/dist/lib/store.js +0 -27
  80. package/dist/lib/store.js.map +0 -1
  81. package/dist/lib/substore.js +0 -47
  82. package/dist/lib/substore.js.map +0 -1
  83. package/dist/lib/util.js +0 -16
  84. package/dist/lib/util.js.map +0 -1
  85. package/dist/ts/actions/index.d.ts +0 -7
  86. package/dist/ts/actions/offset.d.ts +0 -15
  87. package/dist/ts/components/CollapsingTable.svelte +0 -147
  88. package/dist/ts/components/FocusLock.svelte +0 -101
  89. package/dist/ts/components/Modal.svelte +0 -54
  90. package/dist/ts/components/PopupMenu.svelte +0 -279
  91. package/dist/ts/components/ScreenReaderOnly.svelte +0 -26
  92. package/dist/ts/index.d.ts +0 -4
  93. package/dist/ts/lib/activestore.d.ts +0 -60
  94. package/dist/ts/lib/convertedstore.d.ts +0 -16
  95. package/dist/ts/lib/derivedstore.d.ts +0 -23
  96. package/dist/ts/lib/index.d.ts +0 -9
  97. package/dist/ts/lib/safestore.d.ts +0 -4
  98. package/dist/ts/lib/store.d.ts +0 -16
  99. package/dist/ts/lib/substore.d.ts +0 -24
  100. package/dist/ts/tests/Actions/Offset.svelte +0 -34
  101. package/dist/ts/tests/Actions/Resize.svelte +0 -31
  102. package/dist/ts/tests/Actions/Sticky.svelte +0 -65
  103. package/dist/ts/tests/CollapsingTable/CollapsingTable.test.d.ts +0 -1
  104. package/dist/ts/tests/CollapsingTable/CollapsingTableTest.svelte +0 -36
  105. package/dist/ts/tests/Modal/Modal.stories.d.ts +0 -1
  106. package/dist/ts/tests/Modal/Modal.test.d.ts +0 -1
  107. package/dist/ts/tests/Modal/ModalTest.svelte +0 -58
  108. package/dist/ts/tests/PopupMenu/PopupMenu.stories.d.ts +0 -1
  109. package/dist/ts/tests/PopupMenu/PopupMenu.test.d.ts +0 -1
  110. package/dist/ts/tests/PopupMenu/PopupMenuBody.svelte +0 -34
  111. package/dist/ts/tests/PopupMenu/PopupMenuButtonIsParent.svelte +0 -36
  112. package/dist/ts/tests/PopupMenu/PopupMenuComplex.svelte +0 -34
  113. package/dist/ts/tests/PopupMenu/PopupMenuSimple.svelte +0 -36
  114. package/dist/ts/tests/stores/deepstore.test.d.ts +0 -1
  115. package/dist/ts/types/index.d.ts +0 -2
  116. package/dist/types/CollapsingTable.js +0 -3
  117. package/dist/types/CollapsingTable.js.map +0 -1
  118. package/dist/types/PopupMenu.js +0 -3
  119. package/dist/types/PopupMenu.js.map +0 -1
  120. package/dist/types/index.js +0 -15
  121. package/dist/types/index.js.map +0 -1
  122. package/docs/CollapsingTable.md +0 -79
  123. package/docs/ConditionalWrapper.md +0 -35
  124. package/docs/Modal.md +0 -63
  125. package/docs/PopupMenu.md +0 -31
  126. package/docs/ScreenReaderOnly.md +0 -10
  127. package/docs/actions.md +0 -84
  128. package/docs/stores.md +0 -203
  129. package/esm/index.js +0 -1
  130. package/esm/package.json +0 -3
@@ -1,279 +0,0 @@
1
- <script lang="ts">
2
- import type { GlueAlignOpts, GlueAlignStore } from '../actions'
3
- import { glue, portal } from '../actions'
4
- import { createEventDispatcher, onDestroy, tick } from 'svelte'
5
- import { randomid } from 'txstate-utils'
6
- import type { PopupMenuItem } from '../types'
7
- import { Store } from '../lib'
8
- import ScreenReaderOnly from './ScreenReaderOnly.svelte'
9
- const dispatch = createEventDispatcher()
10
-
11
- export let menushown = false
12
- export let menuContainerClass = ''
13
- export let menuClass = ''
14
- export let menuItemClass = ''
15
- export let menuItemHilitedClass = ''
16
- export let menuItemSelectedClass = ''
17
- export let items: PopupMenuItem[] = []
18
- export let buttonelement: HTMLElement
19
- export let align: GlueAlignOpts = 'auto'
20
- export let cover = false
21
- export let showSelected = true
22
- export let width:string|undefined = undefined
23
- export let computedalign = new Store<GlueAlignStore>({ valign: 'bottom', halign: 'left' })
24
- export let usePortal: HTMLElement|true|undefined = undefined
25
- export let emptyText: string|undefined = undefined
26
- export let value: string|undefined = undefined
27
-
28
- let hilited: number|undefined = undefined
29
- let menuelement: HTMLElement|undefined
30
- let itemelements: HTMLElement[] = []
31
- const menuid = randomid()
32
- let firstactive = 0
33
- let lastactive = items.length - 1
34
-
35
- function hiddenItem (item: PopupMenuItem) {
36
- return !!item && !showSelected && item.value === value
37
- }
38
-
39
- async function reactToItems (..._: any[]) {
40
- firstactive = items.findIndex(itm => !itm.disabled && !hiddenItem(itm))
41
- lastactive = items.length - [...items].reverse().findIndex(itm => !itm.disabled && !hiddenItem(itm)) - 1
42
- if (hilited && items[hilited]?.disabled) hilited = firstactive
43
- }
44
- $: reactToItems(items, value)
45
-
46
- async function reactToMenuShown (_: boolean) {
47
- if (!buttonelement) {
48
- hilited = undefined
49
- return
50
- }
51
- await tick()
52
- if (!menushown) {
53
- hilited = undefined
54
- buttonelement.removeAttribute('aria-controls')
55
- buttonelement.setAttribute('aria-expanded', 'false')
56
- } else {
57
- buttonelement.setAttribute('aria-controls', menuid)
58
- buttonelement.setAttribute('aria-expanded', 'true')
59
- }
60
- buttonelement.focus()
61
- }
62
- $: reactToMenuShown(menushown)
63
-
64
- function move (idx: number) {
65
- if (!menushown) return
66
- if (items[idx]?.disabled) return
67
- hilited = Math.max(firstactive, Math.min(lastactive, idx))
68
- itemelements[hilited].scrollIntoView({ block: 'center' })
69
- buttonelement.setAttribute('aria-activedescendant', `${menuid}-${hilited}`)
70
- }
71
-
72
- function onkeydown (e: KeyboardEvent) {
73
- if (e.key === 'ArrowDown') {
74
- e.preventDefault()
75
- if (menushown) {
76
- let i = (hilited ?? firstactive - 1) + 1
77
- while(items[i]?.disabled || hiddenItem(items[i])) i++
78
- move(i)
79
- } else {
80
- menushown = true
81
- move(firstactive)
82
- }
83
- } else if (e.key === 'ArrowUp') {
84
- e.preventDefault()
85
- if (menushown) {
86
- let i = (hilited ?? lastactive + 1) - 1
87
- while(items[i]?.disabled || hiddenItem(items[i])) i--
88
- move(i)
89
- } else {
90
- menushown = true
91
- move(lastactive)
92
- }
93
- } else if (e.key === 'Enter') {
94
- e.preventDefault()
95
- if (menushown) {
96
- menushown = false
97
- if (typeof hilited !== 'undefined') {
98
- value = items[hilited]?.value
99
- dispatch('change', items[hilited])
100
- }
101
- } else {
102
- menushown = true
103
- move(firstactive)
104
- }
105
- } else if (e.key === ' ') {
106
- // buttonelement might be a text input if this popup is searchable,
107
- // so we want to allow spaces to be entered without changing the menu situation
108
- if (menushown) {
109
- if (typeof hilited !== 'undefined') {
110
- e.preventDefault()
111
- menushown = false
112
- value = items[hilited]?.value
113
- dispatch('change', items[hilited])
114
- } else {
115
- if (buttonelement.tagName !== 'INPUT') {
116
- e.preventDefault()
117
- menushown = false
118
- }
119
- }
120
- } else {
121
- if (buttonelement.tagName !== 'INPUT') {
122
- e.preventDefault()
123
- menushown = true
124
- move(firstactive)
125
- }
126
- }
127
- } else if (menushown && e.key === 'Escape') {
128
- e.preventDefault()
129
- e.stopPropagation()
130
- menushown = false
131
- }
132
- }
133
-
134
- function onbuttonclick (e: MouseEvent) {
135
- e.preventDefault()
136
- menushown = !menushown
137
- }
138
-
139
- async function onblur (e: FocusEvent) {
140
- // tabindex=-1 on our menu elements means e.relatedTarget will be set
141
- if (!(e.relatedTarget instanceof HTMLElement && menuelement?.contains(e.relatedTarget))) menushown = false
142
- }
143
-
144
- function cleanup (element: HTMLElement) {
145
- if (element) {
146
- element.removeEventListener('click', onbuttonclick)
147
- element.removeEventListener('keydown', onkeydown)
148
- element.removeEventListener('blur', onblur)
149
- element.removeAttribute('aria-disabled')
150
- element.removeAttribute('aria-haspopup')
151
- element.removeAttribute('aria-expanded')
152
- element.removeAttribute('aria-controls')
153
- element.removeAttribute('aria-activedescendant')
154
- }
155
- }
156
-
157
- onDestroy(() => cleanup(buttonelement))
158
-
159
- // if buttonelement changes we need to handle listeners and aria
160
- let lastbuttonelement: HTMLElement
161
- function reactToButtonElement (buttonelement: HTMLElement) {
162
- cleanup(lastbuttonelement)
163
- lastbuttonelement = buttonelement
164
- if (buttonelement) {
165
- buttonelement.setAttribute('aria-haspopup', 'listbox')
166
- buttonelement.addEventListener('click', onbuttonclick)
167
- buttonelement.addEventListener('keydown', onkeydown)
168
- buttonelement.addEventListener('blur', onblur)
169
- }
170
- }
171
- $: reactToButtonElement(buttonelement)
172
-
173
- const onclick = (item: PopupMenuItem) => (e: MouseEvent) => {
174
- e.stopPropagation()
175
- e.preventDefault()
176
- if (item.disabled) return
177
- menushown = false
178
- value = item.value
179
- dispatch('change', item)
180
- }
181
-
182
- $: hasSelected = showSelected && items.some(itm => itm.value === value)
183
- </script>
184
-
185
- {#if menushown}
186
- <div use:portal={usePortal === true ? document.body : (usePortal || null)} use:glue={{ target: buttonelement, align, cover, store: computedalign }} class={menuContainerClass}>
187
- <ul bind:this={menuelement} id={menuid} role='listbox' style={width ? `width: ${width}` : ''} class={menuClass} class:hasSelected class:defaultmenu={!menuClass && !menuContainerClass} on:keydown={onkeydown}>
188
- {#each items as item, i (item.value)}
189
- {#if showSelected || item.value !== value}
190
- <li
191
- id={`${menuid}-${i}`}
192
- bind:this={itemelements[i]}
193
- class={`${menuItemClass} ${i === hilited ? menuItemHilitedClass || '' : ''} ${value === item.value ? menuItemSelectedClass || '' : ''}`}
194
- class:disabled={!!item.disabled}
195
- class:hilited={!menuItemHilitedClass && i === hilited}
196
- class:selected={showSelected && !menuItemSelectedClass && value === item.value}
197
- on:click={onclick(item)}
198
- role="option"
199
- tabindex=-1
200
- aria-disabled={item.disabled}
201
- ><slot {item} label={item.label || item.value} hilited={i === hilited} selected={value === item.value}>{item.label || item.value}</slot></li>
202
- {/if}
203
- {/each}
204
- {#if items.length === 0}
205
- <li role="option" class={`${menuItemClass} disabled`} aria-live="assertive">
206
- <slot name="noresults">
207
- {#if !emptyText}
208
- <span aria-hidden="true">{'¯\\_(ツ)_/¯'}</span><ScreenReaderOnly>{emptyText || 'empty popup menu'}</ScreenReaderOnly>
209
- {:else}
210
- {emptyText}
211
- {/if}
212
- </slot>
213
- </li>
214
- {/if}
215
- </ul>
216
- </div>
217
- {/if}
218
-
219
- <style>
220
- div {
221
- position: absolute !important;
222
- }
223
- ul {
224
- list-style: none;
225
- }
226
- ul.defaultmenu {
227
- margin: 0;
228
- padding: 0.4em;
229
- background: white;
230
- border: 1px solid slategray;
231
- border-radius: 3px;
232
- min-width: 10em;
233
- max-height: 20em;
234
- overflow-y: auto;
235
- }
236
- ul.defaultmenu li.disabled {
237
- color: rgba(0,0,0,0.6);
238
- }
239
- ul.defaultmenu::-webkit-scrollbar {
240
- appearance: none;
241
- width: 7px;
242
- }
243
- ul.defaultmenu::-webkit-scrollbar-thumb {
244
- border-radius: 4px;
245
- background-color: rgba(0,0,0,.5);
246
- box-shadow: 0 0 1px rgba(255,255,255,.5);
247
- }
248
- ul.defaultmenu::-webkit-scrollbar-track {
249
- background-color: rgba(0,0,0,.1);
250
- }
251
- li {
252
- cursor: pointer;
253
- }
254
- li.hilited {
255
- background: lightblue;
256
- }
257
- li.disabled {
258
- cursor: auto;
259
- }
260
- li.selected {
261
- position: relative;
262
- }
263
- ul.hasSelected li {
264
- padding-left: 1.4em;
265
- }
266
- li.selected:after {
267
- content: ' ';
268
- position: absolute;
269
- left: 0.5em;
270
- top: calc(50% - 0.11em);
271
- transform: translateY(-50%) rotate(38deg);
272
- display: block;
273
- height: 0.786em;
274
- width: 0.4286em;
275
- border-bottom: 0.2em solid;
276
- border-right: 0.2em solid;
277
- box-sizing: border-box;
278
- }
279
- </style>
@@ -1,26 +0,0 @@
1
- <script lang="ts">
2
- export let id: string|undefined = undefined
3
- export let arialive: svelte.JSX.AriaAttributes['aria-live'] = undefined
4
- export let ariaatomic: svelte.JSX.AriaAttributes['aria-atomic'] = undefined
5
- </script>
6
-
7
- <style>
8
- .sr-only {
9
- border: 0 !important;
10
- clip: rect(1px, 1px, 1px, 1px) !important;
11
- -webkit-clip-path: inset(50%) !important;
12
- clip-path: inset(50%) !important;
13
- height: 1px !important;
14
- margin: -1px !important;
15
- overflow: hidden !important;
16
- padding: 0 !important;
17
- position: absolute !important;
18
- width: 1px !important;
19
- white-space: nowrap !important;
20
- font-size: 20px !important;
21
- background: white !important;
22
- color: black !important;
23
- }
24
- </style>
25
-
26
- <span {id} class="sr-only" aria-live={arialive} aria-atomic={ariaatomic}><slot/></span>
@@ -1,4 +0,0 @@
1
- export * from './components';
2
- export * from './actions';
3
- export * from './lib';
4
- export * from './types';
@@ -1,60 +0,0 @@
1
- import { Writable } from 'svelte/store';
2
- export interface UsableSubject<T> {
3
- subscribe: (observer: (value: T) => void) => () => void;
4
- }
5
- export interface WritableSubject<T> extends UsableSubject<T> {
6
- update: (updater: (value: T) => T) => void;
7
- }
8
- export interface SettableSubject<T> extends WritableSubject<T> {
9
- set: (value: T) => void;
10
- }
11
- export declare function isUsable<T>(value: T | UsableSubject<T> | undefined): value is UsableSubject<T>;
12
- export declare function isWritable<T>(value: T | UsableSubject<T> | undefined): value is WritableSubject<T>;
13
- export declare function isSettable<T>(value: T | UsableSubject<T> | undefined): value is SettableSubject<T>;
14
- /**
15
- * An alternative to svelte's "writable" that does not check equality before notifying
16
- * subscribers. A writable will notify subscribers after a shallow equality check, which
17
- * does not work with mutated states:
18
- * store.update(v => { v.someprop = 'newvalue'; return v })
19
- *
20
- * With a writable, this line would NOT notify subscribers because the state will be compared
21
- * against itself and always found to be equal.
22
- *
23
- * An alternative to this store type is SafeStore, which will do a deep equality check but
24
- * clone data so that it is safe against mutations. It costs more CPU cycles but results in
25
- * fewer notifications to subscribers which could be an overall win.
26
- */
27
- export declare class ActiveStore<T> implements Writable<T> {
28
- protected value: T;
29
- protected subscribers: Map<string, (s: T) => void>;
30
- private cleanups;
31
- private sourceInits;
32
- constructor(value: T);
33
- clone(value: T): T;
34
- equal(a: T, b: T): boolean;
35
- set(value: T): void;
36
- update(updater: (value: T) => T): void;
37
- subscribe(run: (s: T) => any): () => void;
38
- /**
39
- * Provided as a last ditch avenue to clean up memory after rogue subscribers forget
40
- * to unsubscribe themselves. For example, in an SSR environment one could clear out
41
- * global stores anytime a request finishes and no other requests are being processed.
42
- */
43
- clearSubscribers(): void;
44
- /**
45
- * Stores that subscribe to external events should set it up with a start/stop mentality
46
- * so that the external events can be unsubscribed when the store itself has no listeners
47
- * to notify. This helps ensure unused stores can be garbage collected.
48
- *
49
- * To do this, pass registerSource a function that initializes the subscription to the external
50
- * event, and returns a function that can unsubscribe from the external event. This parent
51
- * class will take care of running those functions at appropriate times.
52
- */
53
- protected registerSource(fn: () => () => void): void;
54
- /**
55
- * Provided in case a child class has a need to change out the external resources
56
- */
57
- protected unregisterSources(): void;
58
- private subscribeToSources;
59
- private unsubscribeFromSources;
60
- }
@@ -1,16 +0,0 @@
1
- import { Store } from './store';
2
- import { UsableSubject } from './activestore';
3
- /**
4
- * A store that allows you to pass in a traditional svelte store in the constructor.
5
- *
6
- * Updates to the original store will be sent to subscribers of this store, but only after a deep equality check.
7
- *
8
- * Updates to this store will also be sent to the original store after a deep equality check.
9
- */
10
- export declare class ConvertedStore<T> extends Store<T> {
11
- private valueStore;
12
- private pause;
13
- constructor(value: UsableSubject<T>);
14
- set(value: T): void;
15
- }
16
- export declare function convertStore<T>(store: UsableSubject<T>): ConvertedStore<T>;
@@ -1,23 +0,0 @@
1
- import { Store } from './store';
2
- import { UsableSubject } from './activestore';
3
- export interface DerivedStoreOptions {
4
- debounce?: number | boolean;
5
- }
6
- /**
7
- * Watch one or more parent stores for changes. Each time, run a function to derive
8
- * a new state from the parent state(s). Subscribers will only be notified if the
9
- * derived state has changed (uses fast-deep-equal).
10
- *
11
- * If only one parent store, it's possible to use a dot-prop string as the getter.
12
- */
13
- export declare class DerivedStore<DerivedType, ParentType = any> extends Store<DerivedType> {
14
- constructor(store: UsableSubject<ParentType> | UsableSubject<any>[], getter: string | ((value: any) => DerivedType) | ((values: any[]) => DerivedType), options?: DerivedStoreOptions);
15
- }
16
- export declare function derivedStore<DerivedType, ParentType, A extends keyof ParentType>(store: UsableSubject<ParentType>, accessor: A, options?: DerivedStoreOptions): DerivedStore<ParentType[A], ParentType>;
17
- export declare function derivedStore<DerivedType, ParentType = any>(store: UsableSubject<ParentType>, accessor: string, options?: DerivedStoreOptions): DerivedStore<DerivedType, ParentType>;
18
- export declare function derivedStore<DerivedType, ParentType>(store: UsableSubject<ParentType>, getter: (value: ParentType) => DerivedType, options?: DerivedStoreOptions): DerivedStore<DerivedType, ParentType>;
19
- export declare function derivedStore<DerivedType, T1, T2>(store: [UsableSubject<T1>, UsableSubject<T2>], getter: (value: [T1, T2]) => DerivedType, options?: DerivedStoreOptions): DerivedStore<DerivedType>;
20
- export declare function derivedStore<DerivedType, T1, T2, T3>(store: [UsableSubject<T1>, UsableSubject<T2>, UsableSubject<T3>], getter: (value: [T1, T2, T3]) => DerivedType, options?: DerivedStoreOptions): DerivedStore<DerivedType>;
21
- export declare function derivedStore<DerivedType, T1, T2, T3, T4>(store: [UsableSubject<T1>, UsableSubject<T2>, UsableSubject<T3>, UsableSubject<T4>], getter: (value: [T1, T2, T3, T4]) => DerivedType, options?: DerivedStoreOptions): DerivedStore<DerivedType>;
22
- export declare function derivedStore<DerivedType, T1, T2, T3, T4, T5>(store: [UsableSubject<T1>, UsableSubject<T2>, UsableSubject<T3>, UsableSubject<T4>, UsableSubject<T5>], getter: (value: [T1, T2, T3, T4, T5]) => DerivedType, options?: DerivedStoreOptions): DerivedStore<DerivedType>;
23
- export declare function derivedStore<DerivedType>(store: UsableSubject<any>[], getter: (value: any[]) => DerivedType, options?: DerivedStoreOptions): DerivedStore<DerivedType>;
@@ -1,9 +0,0 @@
1
- export * from './bodyoffset';
2
- export * from './convertedstore';
3
- export * from './derivedstore';
4
- export * from './activestore';
5
- export * from './repositioned';
6
- export * from './safestore';
7
- export * from './store';
8
- export * from './substore';
9
- export * from './util';
@@ -1,4 +0,0 @@
1
- import { Store } from './store';
2
- export declare class SafeStore<T> extends Store<T> {
3
- clone(value: T): T;
4
- }
@@ -1,16 +0,0 @@
1
- import { ActiveStore } from './activestore';
2
- /**
3
- * An alternative to svelte's "writable" that also checks deep equality (fast-deep-equal) before
4
- * notifying subscribers. A writable will notify subscribers after a shallow equality check, which
5
- * only works for scalars.
6
- *
7
- * Note that this strategy is weak against mutable state updates:
8
- * store.update(v => { v.someprop = 'newvalue'; return v })
9
- *
10
- * This line would NOT notify subscribers because the state will be compared against
11
- * itself and always found to be equal. If you are making updates in a mutable fashion,
12
- * use a SafeStore instead.
13
- */
14
- export declare class Store<T> extends ActiveStore<T> {
15
- equal(a: T, b: T): boolean;
16
- }
@@ -1,24 +0,0 @@
1
- import { Store } from './store';
2
- import { WritableSubject } from './activestore';
3
- /**
4
- * Create a store that represents a part of a larger store. Updates to the parent store will propagate
5
- * down to the SubStore as appropriate, and updates to the SubStore will propagate
6
- * back up to the parent store. This requires both a getter and setter function to handle each
7
- * direction. The setter is given the new SubStore state and the existing parent store state and
8
- * should return a new state for the parent store.
9
- *
10
- * Alternatively, a dot-prop string can be provided and both the getter and setter will be automatically
11
- * generated. For example, a parent store containing state { deep: { value: 'here' }, hello: 'world' }
12
- * could be used with the getter string "deep.value". The SubStore's initial state would be "here", and
13
- * updating it to "there" would update the parent store state to { deep: { value: 'there' }, hello: 'world' }
14
- */
15
- export declare class SubStore<SubType, ParentType = any> extends Store<SubType> {
16
- protected parentStore: WritableSubject<ParentType>;
17
- protected setter: (value: SubType, state: ParentType) => ParentType;
18
- constructor(store: WritableSubject<ParentType>, getter: keyof ParentType | string | ((value: ParentType) => SubType), setter?: (value: SubType, state: ParentType) => ParentType);
19
- set(value: SubType): void;
20
- clone(state: SubType): any;
21
- }
22
- export declare function subStore<SubType, ParentType, A extends keyof ParentType>(store: WritableSubject<ParentType>, accessor: A): SubStore<ParentType[A], ParentType>;
23
- export declare function subStore<SubType, ParentType = any>(store: WritableSubject<ParentType>, accessor: string): SubStore<SubType, ParentType>;
24
- export declare function subStore<SubType, ParentType>(store: WritableSubject<ParentType>, getter: (value: ParentType) => SubType, setter: (value: SubType, state: ParentType) => ParentType): SubStore<SubType, ParentType>;
@@ -1,34 +0,0 @@
1
- <script lang="ts">
2
- import { writable } from 'svelte/store'
3
- import type { ElementOffsets } from '../../lib/repositioned'
4
- import { offset } from '../../actions/offset'
5
- export let debounce = false
6
- let myoffset = writable<ElementOffsets>({})
7
- </script>
8
-
9
- <div class='resizable'>resize this div</div>
10
- <div use:offset={{ store: myoffset, debounce }} class="offset">
11
- This div's offset...<br>
12
- Left: {$myoffset.left}<br>
13
- Top: {$myoffset.top}<br>
14
- Right: {$myoffset.right}<br>
15
- Bottom: {$myoffset.bottom}
16
- </div>
17
- debounce: {debounce}
18
-
19
- <style>
20
- div {
21
- max-width: 300px;
22
- }
23
- .resizable {
24
- resize: both;
25
- overflow: auto;
26
- min-height: 100px;
27
- background: lightblue;
28
- border: 1px solid black;
29
- }
30
- .offset {
31
- border: 1px solid blue;
32
- text-align: center;
33
- }
34
- </style>
@@ -1,31 +0,0 @@
1
- <script lang="ts">
2
- import { writable } from 'svelte/store'
3
- import type { ElementSize } from '../../actions/resize'
4
- import { resize } from '../../actions/resize'
5
- export let debounce = false
6
- let mysize = writable<ElementSize>({})
7
- </script>
8
-
9
- <div use:resize={{ store: mysize, debounce }} class='resizable'>resize this div</div>
10
- <div class="display">
11
- Above div's size...<br>
12
- Width: {$mysize.offsetWidth}<br>
13
- Height: {$mysize.offsetHeight}
14
- </div>
15
- debounce: {debounce}
16
-
17
- <style>
18
- div {
19
- max-width: 300px;
20
- }
21
- .resizable {
22
- resize: both;
23
- overflow: auto;
24
- min-height: 100px;
25
- background: lightblue;
26
- border: 1px solid black;
27
- }
28
- .display {
29
- text-align: center;
30
- }
31
- </style>
@@ -1,65 +0,0 @@
1
- <script lang="ts">
2
- import { sticky, stickyfixed } from '../../actions'
3
- let target: HTMLElement
4
- </script>
5
-
6
- <div class='above'>above</div>
7
- <table>
8
- <thead>
9
- <tr use:sticky><th>Name</th><th>Bedtime</th></tr>
10
- </thead>
11
- <tbody>
12
- <tr><td>Bobby</td><td>10pm</td></tr>
13
- <tr><td>Sue</td><td>3am</td></tr>
14
- <tr><td>Billy</td><td>11pm</td></tr>
15
- <tr><td>Mary</td><td>7pm</td></tr>
16
- <tr><td>Kevin</td><td>9:30pm</td></tr>
17
- <tr><td>Jess</td><td>12am</td></tr>
18
- <tr><td>Randy</td><td>1am</td></tr>
19
- <tr><td>Daniel</td><td>11pm</td></tr>
20
- <tr><td>Elizabetd</td><td>8pm</td></tr>
21
- <tr><td>Catderine</td><td>4pm</td></tr>
22
- <tr><td>Mandy</td><td>8:30pm</td></tr>
23
- <tr><td>Chris</td><td>9pm</td></tr>
24
- <tr><td>Sean</td><td>10:45pm</td></tr>
25
- <tr><td>Jack</td><td>2am</td></tr>
26
- <tr><td>Morgan</td><td>3pm</td></tr>
27
- <tr><td>Chuck</td><td>8pm</td></tr>
28
- </tbody>
29
- </table>
30
- <div class="extendedcontainer" bind:this={target}>
31
- <table>
32
- <thead use:stickyfixed={{ target }}>
33
- <tr><th>Person</th><th>Calories</th><th>Fat</th><th>Protein</th></tr>
34
- </thead>
35
- <tbody>
36
- <tr><td>Mirna</td><td>1</td><td>28g</td><td>29g</td></tr>
37
- <tr><td>Fernando</td><td>38</td><td>2g</td><td>48g</td></tr>
38
- <tr><td>Lisette</td><td>18</td><td>9g</td><td>23g</td></tr>
39
- <tr><td>Ahmad</td><td>42</td><td>26g</td><td>49g</td></tr>
40
- <tr><td>Laquanda</td><td>27</td><td>27g</td><td>49g</td></tr>
41
- </tbody>
42
- </table>
43
- sticky header should continue to the bottom of this container
44
- </div>
45
- <div class='below'>below</div>
46
-
47
- <style>
48
- .above { height: 400px; }
49
- .below { height: 1000px; }
50
- .extendedcontainer { padding-bottom: 50px; border: 1px solid black; }
51
- table {
52
- position: relative;
53
- box-sizing: border-box;
54
- }
55
- table th {
56
- background: lightgray;
57
- border: 2px solid black;
58
- }
59
- th:first-child, td:first-child {
60
- width: 20em;
61
- }
62
- th:last-child, td:last-child {
63
- width: 8em;
64
- }
65
- </style>
@@ -1 +0,0 @@
1
- import '@testing-library/jest-dom';
@@ -1,36 +0,0 @@
1
- <script lang="ts">
2
- import CollapsingTable from '../../components/CollapsingTable.svelte'
3
- import { CollapsingTableColumn } from '../../types'
4
- export let stickyheader = false
5
- const items = [
6
- { id: 1, name: 'John Smith', age: 42, one: 1, two: 2, three: 3, four: 4, five: 5, six: 6 },
7
- { id: 3, name: 'Mary Sue', age: 23, one: 1, two: 2, three: 3, four: 4, five: 5, six: 6 },
8
- { id: 6, name: 'Billy Bob', age: 12, one: 1, two: 2, three: 3, four: 4, five: 5, six: 6 }
9
- ]
10
- const config: CollapsingTableColumn[] = [
11
- { key: 'id' },
12
- { key: 'name', neverhide: true },
13
- { key: 'age' },
14
- { key: 'one' },
15
- { key: 'two' },
16
- { key: 'three' },
17
- { key: 'four', bodyCellClass: 'four' },
18
- { key: 'five' },
19
- { key: 'six' }
20
- ]
21
- </script>
22
-
23
- <div class="before"></div>
24
- <CollapsingTable {items} {config} {stickyheader} let:key let:value>
25
- {#if key === 'five'}
26
- <span class='test'>{value}</span>
27
- {:else}
28
- {value}
29
- {/if}
30
- </CollapsingTable>
31
- <div class="after"></div>
32
-
33
- <style>
34
- .before { height: 40px; }
35
- .after { height: 1000px; }
36
- </style>
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- import '@testing-library/jest-dom';