Rich Harris
4fe8d95a6d
dont typecast numeric attributes
7 years ago
Rich Harris
a3add04e7c
remove code, map and cssMap from svelte.compile output
7 years ago
Rich Harris
2f86bd339d
update tests to account for removal of observe
7 years ago
Rich Harris
daa2635cd3
update snapshot tests
7 years ago
Rich Harris
34d2fbfa58
remove ES5 constraint
7 years ago
Rich Harris
6249fa6bc8
Merge pull request #1345 from sveltejs/gh-1069
...
use destructuring syntax for computed props in v2 mode - fixes #1069
7 years ago
Rich Harris
99ea7539af
use destructuring syntax for computed props in v2 mode - fixes #1069
7 years ago
Rich Harris
c1573dbf2c
implement onstate and onupdate
7 years ago
Rich Harris
33afb7e49a
add some onstate/onupdate tests
7 years ago
Conduitry
bed13d2147
in v2, don't parse for interpolations in non-root style elements ( #1339 )
7 years ago
Rich Harris
2b3fe0edc1
attribute shorthand test
7 years ago
Rich Harris
7576d7dc93
update keyed each block syntax
7 years ago
Rich Harris
9bba8d18d1
implement dynamic components etc
7 years ago
Rich Harris
07a53e55de
Merge pull request #1311 from sveltejs/gh-1278
...
treat component events the same as element events
7 years ago
Rich Harris
4a6807eab1
Merge pull request #1312 from sveltejs/gh-1275
...
deconflict against inherited contexts
7 years ago
Rich-Harris
6ef808c941
support custom events on <:Window> - fixes #1268
7 years ago
Rich-Harris
34bedcc299
deconflict against inherited contexts - fixes #1275
7 years ago
Rich-Harris
029e952171
treat component events the same as element events - fixes #1278
7 years ago
Rich-Harris
dd247447c0
ensure correct order of DOM insertions with neighbouring keyed each blocks - fixes #1306
7 years ago
Rich-Harris
ee7f6769c4
spread on dynamic component - fixes #1307
7 years ago
Rich Harris
f27b29d5cb
Merge pull request #1289 from sveltejs/gh-195
...
Multi-spread
7 years ago
Rich-Harris
7c47cc19f7
handle boolean attributes
7 years ago
Rich-Harris
5980f0752c
fix element spread SSR
7 years ago
Rich-Harris
5a45b0e7b4
tidy up/notes to self
7 years ago
Rich Harris
47da7d1ed6
Merge pull request #1295 from sveltejs/each-block-keyed-empty
...
handle empty each blocks
7 years ago
Rich-Harris
e585ccf242
Merge branch 'custom-event-teardown' of https://github.com/ekhaled/svelte into ekhaled-custom-event-teardown
7 years ago
Rich-Harris
50ed9252de
handle empty each blocks
7 years ago
Rich-Harris
01a10d9511
argh, need a precommit check for this
7 years ago
Rich-Harris
2c670a43ac
allow keyed each block to have static content - fixes #1291
7 years ago
ekhaled
298a339df9
add dev mode warning when teardown is returned instead of destroy
7 years ago
Rich-Harris
40cf29b2b7
basic attribute spreading on elements
7 years ago
Josh Duff
e81fb88f41
Fix backtick string literals not being recognized for the svg property
...
Failing test for #1284
Fixes #1284
7 years ago
Rich-Harris
3f32be8c04
Merge branch 'master' into mrkishi-spread
7 years ago
Conduitry
7b6f206003
fix assembly of initial state object
7 years ago
Rich-Harris
d0c696bb2b
merge master -> mrkishi-spreadh
7 years ago
Rich Harris
c9435fc87f
Merge pull request #1279 from jacwright/action-this
...
Make actions execute with the component context
7 years ago
Conduitry
d3451a530f
when mounting dynamic components, set ref if required
7 years ago
Jacob Wright
297ee65737
Make tests work when running all of them together.
...
They were only passing when running just the runtime tests, but failing with `<button>undefined</button>` when running all the tests.
7 years ago
Jacob Wright
9b0a884035
Make actions execute with the component context
7 years ago
Rich Harris
e77988b195
Merge pull request #1247 from jacwright/behaviors
...
Adds actions to components
7 years ago
Rich-Harris
fb84d729d8
tidy up
7 years ago
Rich-Harris
4b2a01f2e9
all tests passing
7 years ago
Rich-Harris
a3e91eb267
holy shit i think i did it
7 years ago
Rich-Harris
7c953a6622
am close...
7 years ago
Jacob Wright
04f5d5c975
Adds actions to components
...
Actions add additional functionality to elements within your component's template that may be difficult to add with other mechanisms. Examples of functionality which actions makes trivial to attach are:
* tooltips
* image lazy loaders
* drag and drop functionality
Actions can be added to an element with the `use` directive.
```html
<img use:lazyload data-src="giant-photo.jpg>
```
Data may be passed to the action as an object literal (e.g. `use:b="{ setting: true }"`, a literal value (e.g. `use:b="'a string'"`), or a value or function from your component's state (e.g. `add:b="foo"` or `add:b="foo()"`).
Actions are defined in a "actions" property on your component definition.
```html
<script>
export default {
actions: {
b(node, data) {
// do something
return {
update(data) {},
destroy() {}
}
}
}
}
</script>
```
A action is a function which receives a reference to an element and optionally the data if it is added in the HTML. This function can then attach listeners or alter the element as needed. The action can optionally return an object with the methods `update(data)` and `destroy()`.
When data is added in the HTML and comes from state, the action's `update(data)` will be called if defined whenever the state is changed.
When the element is removed from the DOM `destroy()` will be called if provided, allowing for cleanup of event listeners, etc.
See https://github.com/sveltejs/svelte/issues/469 for discussion around this feature and more examples of how it could be used.
7 years ago
Rich Harris
4b5d465a97
prevent name collisions with each block index - fixes #1254
7 years ago
Rich Harris
4cb8effccd
failing test for #1254
7 years ago
Rich Harris
a2d09c2136
simplify updateKeyedEach
7 years ago
Rich Harris
10600eb776
Merge pull request #1249 from btakita/issues/588
...
Speed up keyed swap rows benchmark by moving existing DOM elements instead of creating new elements
7 years ago
Brian Takita
66e4df11a7
Implement https://github.com/sveltejs/svelte/issues/588
...
* Performance Improvement with Keyed EachBlock
* All DOM nodes for existing data are reused between changes to state
* Speed up Keyed Swap Rows Benchmark
* https://github.com/krausest/js-framework-benchmark
* Fixed Build
* Introduced jsdom.VirtualConsole
7 years ago
mrkishi
9b80eee51a
Prioritize named over spread attributes
7 years ago
mrkishi
b5102f4f1b
Add spread -- rough idea
7 years ago
Rich Harris
6f65554c93
failing test for #1240
7 years ago
Rich Harris
38b34bbe1d
reenable all tests
7 years ago
Rich Harris
140e2271f7
scale transition duration by delta - fixes #1221
7 years ago
Rich Harris
b763714222
allow SVG elements to have scoped CSS - fixes #1224
7 years ago
Rich Harris
ddd67dd844
add each_value to contextProps - fixes #1206
7 years ago
pk
58d5c2040a
failing test for #1217
7 years ago
Rich Harris
fad5ccdf59
prevent context variables being called component or state - fixes #1213
7 years ago
ekhaled
f9d606a5c9
re-add Child.html
7 years ago
ekhaled
b8beb002a1
remove file
7 years ago
ekhaled
6792e77392
some case-sensitivity thing
7 years ago
ekhaled
ae86cf9f4b
clarify in test that its an intro test only
7 years ago
ekhaled
7b2246126e
fix tests on linux
7 years ago
ekhaled
7401004a66
add test for transitions on nested components
7 years ago
Rich Harris
7b4c486be9
only apply key to keyed each block, not its children - fixes #1202
7 years ago
Conduitry
ff6e104f92
add failing test for #1195
7 years ago
Rich Harris
e95a0b60a9
Merge branch 'master' into gh-1175
7 years ago
Rich Harris
a5cc451c9c
only use page[XY]Offset
7 years ago
Rich Harris
0131216a1a
Merge branch 'master' into gh-1144
7 years ago
Rich Harris
cb8071acd4
allow observing $foo in dev mode - #1181
7 years ago
Rich Harris
c2bb549901
wrap <slot> updates in conditional - fixes #1144
7 years ago
Robert Hall
836cc36598
Using pageYOffset & pageXOffset
7 years ago
Rich Harris
1b599bd57b
put _differs on prototype, remove runtime option
7 years ago
Rich Harris
81b12e030e
Merge branch 'immutable-support' of https://github.com/jacwright/svelte into jacwright-immutable-support
7 years ago
Jacob Wright
cb446bca64
Adds some runtime tests for the immutable option
7 years ago
Rich Harris
dfff2957a0
increase test coverage
7 years ago
Rich Harris
cccc3e4c41
failing test for second part of #1100
7 years ago
Rich Harris
e5e6959281
Merge pull request #1153 from sveltejs/gh-1100
...
component store bindings
7 years ago
Conduitry
7b282e58a0
Merge branch 'master' into sigil-component-attribute-ssr
7 years ago
Conduitry
f606aee209
do not escape html characters in tags in non-root <style> in SSR mode
7 years ago
Rich Harris
a33dfe5bf3
Merge pull request #1160 from sveltejs/gh-1108
...
remove <noscript> elements in DOM mode (#1108 )
7 years ago
Conduitry
fc34792743
expand escape-template-literals test
7 years ago
Conduitry
132901bbe7
fix escaping of sigils in component attribute values in SSR
7 years ago
Conduitry
fc2ecce4ef
make test more robust
7 years ago
Conduitry
cf3705dc11
add test
7 years ago
Rich Harris
1719a318ad
failing test for #1082
7 years ago
Conduitry
50d95e1642
remove <noscript> elements in DOM mode ( #1108 )
7 years ago
Conduitry
c481c8d2b3
escape attribute values in SSR
7 years ago
Rich Harris
99fbb69c74
component store bindings - fixes #1100
7 years ago
Rich Harris
bf25248f9e
prevent await blocks using stale state - fixes #1131
7 years ago
Rich Harris
ca779a452d
Merge pull request #1145 from jacobmischka/fix-destructured-hoisting
...
Add destructured context container to usedContexts
7 years ago
Jacob Mischka
b5a3e2224d
Add audio video volume binding ( #1148 )
...
* Add audio/video volume binding
Fixes #1143
* Update test and add volumechange event
* Set volume on initial update
* Update test after setting volume initially
Oops.
7 years ago
Jacob Mischka
31de60ece6
Add destructured context container to usedContexts
...
Fixes #1139
7 years ago
Rich Harris
3cd9779b37
Merge pull request #1137 from sveltejs/gh-1135
...
Fix order of `oncreate` in sibling components
7 years ago
Rich Harris
6f5b6ddda9
Merge branch 'master' into gh-1135
7 years ago
Rich Harris
c3bec8f632
Merge branch 'master' into gh-1062-again
7 years ago
Rich Harris
2d0f01e49d
change test outcome for uninitialised component bindings inside conditionals
7 years ago
Rich Harris
5e41ecb34a
run oncreate functions in sensible order ( #1135 )
7 years ago
Conduitry
0a6ffb769c
update jsdom; update `window.performance.now` test shim
7 years ago
Conduitry
94da329305
another stab at #1062 ; also fix attribute case in static HTML
7 years ago
Conduitry
57b737b3bc
fix handling of boolean attributes in SSR ( #1109 )
7 years ago
James Birtles
6596913da3
addd failing nested store test
7 years ago
Rich Harris
49bc092db6
Merge pull request #1094 from sveltejs/gh-1061-b
...
fire oncreate handlers for components inside await blocks
7 years ago
Rich Harris
2781968e43
be more relaxed about attribute casing - fixes #1062
7 years ago
Rich Harris
c1b5bed6d2
fire oncreate handlers for components inside await blocks ( #1061 )
7 years ago
Rich Harris
f6e6cb6988
add test to ensure only <, > and & are escaped
7 years ago
Rich Harris
d4d7ef9c04
failing tests for #1066
7 years ago
Rich Harris
b7d8c49dc8
Merge branch 'master' into gh-1027
7 years ago
Rich Harris
646b0c0e01
optimise <title> - fixes #1027
7 years ago
Rich Harris
146f645502
detect unused/misplaced components - closes #1039
7 years ago
Rich Harris
cf7104dbaa
fix data references in event handlers inside await-then-catch ( fixes #1032 )
7 years ago
Rich Harris
831cc411a1
Merge pull request #1048 from sveltejs/gh-1022
...
allow options outside <select> elements
7 years ago
Rich Harris
6d9abe2219
reenable tests
7 years ago
Rich Harris
2120a81958
boy do i feel stupid. fixes #1022
7 years ago
Rich Harris
7a8e17779c
create initial data for dynamic components in correct place - fixes #1040
7 years ago
Rich Harris
f7c540b4ed
get store() to work with nested components in SSR compiler
7 years ago
Emil Ajdyna
d398b34a41
Add state() method handling for components
7 years ago
Rich Harris
394dec9f11
Merge pull request #1024 from sveltejs/gh-1013
...
update SSR render method, and introduce <:Head>
7 years ago
Rich Harris
291a0baa16
unmount head children correctly
7 years ago
Rich Harris
ed44f7d1fa
server-side <:Head>
7 years ago
Rich Harris
50654fab88
remove <:Document>, implement <:Head> on client-side
7 years ago
Rich Harris
bc505161d1
deconflict properly
7 years ago
Rich Harris
0127f9f0ca
change server-side render method signature
7 years ago
Rich Harris
e57ddb0503
add new <:Document> meta-component
7 years ago
Rich Harris
6bd410c886
implement preload
7 years ago
Rich Harris
bc7ade0bbd
Merge pull request #1019 from sveltejs/gh-1012
...
deconflict computed properties with arguments to _recompute
7 years ago
Rich Harris
b252e3378f
Merge pull request #1018 from sveltejs/gh-1014
...
allow await blocks in slots
7 years ago
Rich Harris
47b4162759
remove solo
7 years ago
Rich Harris
e4d257da1e
deconflict computed properties with arguments to _recompute - fixes #1012
7 years ago
Rich Harris
8c7e5b7758
allow await blocks in slots - fixes #1014
7 years ago
Rich Harris
9377331203
allow components without slots to have whitespace as only child - fixes #1007
7 years ago
Rich Harris
b83afb0528
await...then shorthand - fixes #957
7 years ago
Rich Harris
81f449093d
emit dev mode error for bad arguments to set - fixes #990
7 years ago
Rich Harris
d10f7fbdbf
don't add event to expectedProperties - fixes #972
7 years ago
Rich Harris
e20b38e7c0
fix dynamic components inside elements - fixes #994
7 years ago
Rich Harris
1636f1733b
Merge branch 'master' into gh-640
7 years ago
Rich Harris
978e628e67
mount await blocks with siblings ( #974 ), and unmount correctly ( #975 )
7 years ago
Rich Harris
0d42ff84db
fix tests, finish renaming stuff
7 years ago
Rich Harris
e6ef5af6ba
slotted contents of dynamic components
7 years ago
Tim Hall
a6836bd395
Failing test for #975
7 years ago
Tim Hall
aeabf1cca5
Failing test for #974
7 years ago
Rich Harris
f4e66c0e72
update props of existing dynamic component
7 years ago
Rich Harris
dd9ecb8064
dynamic component bindings
7 years ago
Rich Harris
caa4d7d76d
rename tests
7 years ago
Rich Harris
e1777b6037
dynamic component event handlers
7 years ago
Rich Harris
dba32df84e
client-side dynamic components mostly working ( #640 )
7 years ago
Rich Harris
3350f166db
dont transform bidi transitions twice - fixes #962
7 years ago
Rich Harris
844e89f277
correctly mount await block that has an anchor
7 years ago
Rich Harris
82fc0f2713
Merge branch 'master' into gh-654
7 years ago
Rich Harris
f10e86f6e2
prevent boolean attributes breaking shapes inside estree-walker - fixes #961
7 years ago
Rich Harris
faf5ca8de2
fix test failures resulting from new JSDOM version
7 years ago
Rich Harris
0b904b6fb7
gah i always forget this. need a pre-commit hook
7 years ago
Rich Harris
ada52c7f13
allow parameterised transitions - fixes #962
7 years ago
Rich Harris
a669dbfcd4
add combineStores function
7 years ago
Rich Harris
ccef13a2d5
ditch async/await in tests, so that they run in node 6
7 years ago
Rich Harris
56b167b44f
await-then-catch with non-promise
7 years ago
Rich Harris
8f52587539
show output using cjs format, so stack traces make sense
7 years ago
Rich Harris
a2d885c8ba
basic client-side await-then-catch working
7 years ago
Rich Harris
d783993d23
halfway there
7 years ago
Rich Harris
1cdfb84fec
remove solo: true
7 years ago
Rich Harris
edc61b7bd8
fix tests, now that computed prop dependencies are expected
7 years ago
Rich Harris
3206e08286
allow computed properties to depend on store props
7 years ago
Rich Harris
a87d30e0e6
allow event handlers to call store methods
7 years ago
Rich Harris
945d8ce526
store bindings
7 years ago
Rich Harris
f64e473d2e
reenable all tests
7 years ago
Rich Harris
f80ace5fd6
client-side store subscriptions
7 years ago
Rich Harris
d32328ca69
append to the dom, not a document fragment, when updating each block in slot - fixes #927
7 years ago
Rich Harris
51901442c9
attach globals to state object on initialisation
...
fixes #908
7 years ago
Rich Harris
775866780e
combine multiple bindings in single handler, implement bind:indeterminate — fixes #910
7 years ago
Rich Harris
02b0dda9cc
update tests
7 years ago
Rich Harris
7e07cde021
use <option> children as value attribute, if none exists. fixes #928
7 years ago
Rich Harris
0a4e795498
Merge pull request #921 from sveltejs/gh-917
...
check component exists after _bind before continuing
7 years ago
Rich Harris
d28942d91a
dont use innerHTML for options inside optgroups - fixes #915
7 years ago
Rich Harris
0b56e20300
oops
7 years ago
Rich Harris
96428312ec
check component exists after _bind before continuing - fixes #917
7 years ago
Rich Harris
6000e9b6e2
Merge pull request #902 from sveltejs/gh-893
...
possible fix for #893
7 years ago
Rich Harris
d05b212581
oops
7 years ago
Rich Harris
c5943d7b6d
skip async-await tests below node 8
7 years ago
Johnny Hauser
0997107e1d
oncreate async tests (function, arrow, arrow block)
7 years ago
Rich Harris
1dad8f1936
add test for #891
7 years ago
Rich Harris
5646df77ac
possible fix for #893
7 years ago
Conduitry
db5646821d
add failing test for each block updates
7 years ago
Jacob Mischka
a60a7e6773
Remove Object.entries from test
7 years ago
Jacob Mischka
ffbc991027
Add missing runtime test, add contexts to SSR
7 years ago
Conduitry
9c7c5b9636
more testing
7 years ago
Conduitry
7b25b1202f
expand unit test
7 years ago
Rich Harris
dc3785c1e2
fix escaping of %-prefixed names
7 years ago
Rich Harris
4dbfc65e74
fix indentation, update snapshot tests
7 years ago
Rich Harris
fcf2b03ba6
take template object out of IIFE
7 years ago
Rich Harris
dabc2d1fdf
dont wrap ESM in IIFE
7 years ago
Rich Harris
fdd7ac71c2
Merge branch 'master' into iife
7 years ago
Rich Harris
64026c3ba9
Merge pull request #854 from sveltejs/gh-782
...
allow console.* calls in event handlers
7 years ago
Rich Harris
4f1d48c4a6
more readable each block values
7 years ago
Rich Harris
abea37af71
wrap ES modules in an IIFE
7 years ago
Rich Harris
58cc7f8ed1
allow console.* calls in event handlers. fixes #782
7 years ago
Rich Harris
0a0f474e43
use anchor.parentNode as target instead of slot document fragment - fixes #850
7 years ago
Rich Harris
40df1c64ac
failing test for #850
7 years ago
Rich Harris
5ed74df4d3
Merge branch 'master' into gh-827
7 years ago
Rich Harris
61476048c8
dont use skipped text nodes as anchors - fixes #843
7 years ago
Rich Harris
975a974578
use anchors for slotted content - fixes #822
7 years ago
Rich Harris
5ff5852f67
failing test for #827
7 years ago
Rich Harris
75651bb070
use component name in runtime dev warnings - fixes #781
7 years ago
Rich Harris
afe3e2e669
basic custom element generation ( #797 )
7 years ago
Rich Harris
fb972566a4
prevent mutation bug from incorrectly calling observer ( fixes #804 )
7 years ago
Rich Harris
f5958584d9
dont noop set/get until after component is destroyed ( fixes #788 )
7 years ago
Rich Harris
a68f7e103f
stack up append targets so that slotted content in nested components works in SSR mode ( fixes #801 )
7 years ago
Rich Harris
6499d4714d
only use noscript if necessary
7 years ago
Rich Harris
a197c18523
failing tests for #637
7 years ago
Rich Harris
ce109f0eb3
Merge pull request #794 from sveltejs/gh-550
...
attach options to component (#550 )
7 years ago
Rich Harris
f50a6c50af
remove test of instantiation without options, its nonsensical
7 years ago
Rich Harris
d8269b3e7f
attach options to component ( #550 )
7 years ago
Rich Harris
5b3e8cd88f
support nested <slot> elements
7 years ago
Rich Harris
143d0ea753
dont actually render <slot> elements
7 years ago
Rich Harris
361a19df17
wrap fallback hydration code in conditional
7 years ago
Rich Harris
aa183df289
fallback content
7 years ago
Rich Harris
41026341d8
populate component.slots
7 years ago
Rich Harris
1ae3ab7bf9
server-side named slots
7 years ago
Rich Harris
efe25555cf
client-side named slots
7 years ago
Rich Harris
7a8c8fd577
replace {{yield}} with <slot/>
7 years ago
Rich Harris
d734a6b823
start work on <slot>
7 years ago
Rich Harris
6366a4f55e
update component bindings together. WIP
7 years ago
Rich Harris
4dd5fc5594
apply optimisation to raw tags
7 years ago
Rich Harris
5070219218
fix select edge case
7 years ago
Rich Harris
531354fc39
only cache values when it makes sense
7 years ago
Rich Harris
0f7e87c804
do dirty check in _set, so we can easily skip unnecessary computations later ( #768 )
7 years ago
Rich Harris
3757e75d51
Merge pull request #766 from sveltejs/gh-740
...
bind to change events for range inputs, as well as input events
7 years ago
Rich Harris
da6b08ccc7
bind to change events for range inputs, as well as input events ( #740 )
7 years ago
Rich Harris
1f5f9604a8
call create() on new iterations of static each blocks ( #762 )
7 years ago
Rich Harris
86fb0e4ced
handle set after destroy, and move destroy into shared helpers
7 years ago
Conduitry
6ef59234a3
add test
7 years ago
Rich Harris
057a257482
rename test
7 years ago
Rich Harris
dd8d4ed7ff
failing tests for #741
7 years ago
Rich Harris
ae060cfa3b
Merge pull request #737 from sveltejs/update-deps
...
[WIP] Update dependencies etc
7 years ago
Rich Harris
8020fe53fc
remove babel etc
7 years ago
Rich Harris
e2d63d1b34
add dev mode warning for double destroy
7 years ago
Rich Harris
65e484b6ae
remove reify
7 years ago
Rich Harris
46cb2a4da3
update jsdom
7 years ago
Rich Harris
962f04f4bf
dont throw error if component is destroyed twice ( closes #643 )
7 years ago
Rich Harris
71047c2961
Merge pull request #732 from sveltejs/gh-638
...
Event propagation shorthand
7 years ago
Rich Harris
57e7f75eee
Merge pull request #728 from sveltejs/gh-721
...
use _set, not set, when updating child components
7 years ago
Rich Harris
1b92f5fa20
event propagation shorthand for components ( #638 )
7 years ago
Rich Harris
51af8c29e0
event propagation shorthand for elements ( #638 )
7 years ago
Rich Harris
cb030fd780
use _set, not set, when updating child components - fixes #721
7 years ago
Rich Harris
4d36908525
clear refs in destroy, not unmount, so that refs are populated in ondestroy. fixes #706
7 years ago
Rich Harris
b701bf24b4
unescape hash character ( #722 )
7 years ago
Yury Zhuravlev
246b4d70dc
Fix binding in each block
7 years ago
Rich Harris
2ab2661585
Merge pull request #720 from sveltejs/gh-711
...
ensure data is up to date when re-rendering yield blocks
7 years ago
Rich Harris
5f09421a18
Merge pull request #719 from sveltejs/gh-712
...
Fix escaping bugs
7 years ago
Rich Harris
94037f1eca
Merge pull request #718 from sveltejs/gh-713
...
don't strip whitespace at the end of an each block
7 years ago