diff --git a/Makefile b/Makefile
index 90fd89932..b079b12d5 100644
--- a/Makefile
+++ b/Makefile
@@ -54,7 +54,8 @@ MODULE_TARGETS = \
js/lib/id/services.js \
js/lib/id/ui/intro.js \
js/lib/id/svg.js \
- js/lib/id/ui.js \
+ js/lib/id/ui/index.js \
+ js/lib/id/ui/core.js \
js/lib/id/ui/intro.js \
js/lib/id/ui/preset.js \
js/lib/id/util.js \
@@ -100,14 +101,18 @@ js/lib/id/svg.js: $(shell find modules/svg -type f)
@rm -f $@
node_modules/.bin/rollup -f umd -n iD.svg modules/svg/index.js --no-strict -o $@
+js/lib/id/ui/index.js: $(shell find modules/ui -type f)
+ @rm -f $@
+ node_modules/.bin/rollup -f umd -n iD modules/ui/ui.js --no-strict -o $@
+
+js/lib/id/ui/core.js: $(shell find modules/ui/core -type f)
+ @rm -f $@
+ node_modules/.bin/rollup -f umd -n iD.ui modules/ui/core/index.js --no-strict -o $@
+
js/lib/id/ui/intro.js: $(shell find modules/ui/intro -type f)
@rm -f $@
node_modules/.bin/rollup -f umd -n iD.ui.intro modules/ui/intro/index.js --no-strict -o $@
-js/lib/id/ui.js: $(shell find modules/ui -type f)
- @rm -f $@
- node_modules/.bin/rollup -f umd -n iD.ui modules/ui/index.js --no-strict -o $@
-
js/lib/id/ui/preset.js: $(shell find modules/ui/preset -type f)
@rm -f $@
node_modules/.bin/rollup -f umd -n iD.ui.preset modules/ui/preset/index.js --no-strict -o $@
@@ -142,7 +147,6 @@ dist/iD.js: \
js/lib/marked.js \
js/id/start.js \
js/id/id.js \
- js/id/ui.js \
$(MODULE_TARGETS) \
js/id/end.js \
js/lib/locale.js \
diff --git a/index.html b/index.html
index 18c48b90b..64befdbcb 100644
--- a/index.html
+++ b/index.html
@@ -45,13 +45,16 @@
+
+
+
+
+
+
-
-
-
diff --git a/js/lib/id/ui.js b/js/lib/id/ui/core.js
similarity index 100%
rename from js/lib/id/ui.js
rename to js/lib/id/ui/core.js
diff --git a/js/lib/id/ui/index.js b/js/lib/id/ui/index.js
new file mode 100644
index 000000000..1df22b9df
--- /dev/null
+++ b/js/lib/id/ui/index.js
@@ -0,0 +1,251 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (factory((global.iD = global.iD || {})));
+}(this, function (exports) { 'use strict';
+
+ function ui(context) {
+ function render(container) {
+ var map = context.map();
+
+ if (iD.detect().opera) container.classed('opera', true);
+
+ var hash = iD.behavior.Hash(context);
+
+ hash();
+
+ if (!hash.hadHash) {
+ map.centerZoom([0, 0], 2);
+ }
+
+ container.append('svg')
+ .attr('id', 'defs')
+ .call(iD.svg.Defs(context));
+
+ container.append('div')
+ .attr('id', 'sidebar')
+ .attr('class', 'col4')
+ .call(ui.sidebar);
+
+ var content = container.append('div')
+ .attr('id', 'content');
+
+ var bar = content.append('div')
+ .attr('id', 'bar')
+ .attr('class', 'fillD');
+
+ content.append('div')
+ .attr('id', 'map')
+ .call(map);
+
+ content
+ .call(iD.ui.MapInMap(context));
+
+ content.append('div')
+ .call(iD.ui.Info(context));
+
+ bar.append('div')
+ .attr('class', 'spacer col4');
+
+ var limiter = bar.append('div')
+ .attr('class', 'limiter');
+
+ limiter.append('div')
+ .attr('class', 'button-wrap joined col3')
+ .call(iD.ui.Modes(context), limiter);
+
+ limiter.append('div')
+ .attr('class', 'button-wrap joined col1')
+ .call(iD.ui.UndoRedo(context));
+
+ limiter.append('div')
+ .attr('class', 'button-wrap col1')
+ .call(iD.ui.Save(context));
+
+ bar.append('div')
+ .attr('class', 'full-screen')
+ .call(iD.ui.FullScreen(context));
+
+ bar.append('div')
+ .attr('class', 'spinner')
+ .call(iD.ui.Spinner(context));
+
+ var controls = bar.append('div')
+ .attr('class', 'map-controls');
+
+ controls.append('div')
+ .attr('class', 'map-control zoombuttons')
+ .call(iD.ui.Zoom(context));
+
+ controls.append('div')
+ .attr('class', 'map-control geolocate-control')
+ .call(iD.ui.Geolocate(context));
+
+ controls.append('div')
+ .attr('class', 'map-control background-control')
+ .call(iD.ui.Background(context));
+
+ controls.append('div')
+ .attr('class', 'map-control map-data-control')
+ .call(iD.ui.MapData(context));
+
+ controls.append('div')
+ .attr('class', 'map-control help-control')
+ .call(iD.ui.Help(context));
+
+ var about = content.append('div')
+ .attr('id', 'about');
+
+ about.append('div')
+ .attr('id', 'attrib')
+ .call(iD.ui.Attribution(context));
+
+ var footer = about.append('div')
+ .attr('id', 'footer')
+ .attr('class', 'fillD');
+
+ footer.append('div')
+ .attr('class', 'api-status')
+ .call(iD.ui.Status(context));
+
+ footer.append('div')
+ .attr('id', 'scale-block')
+ .call(iD.ui.Scale(context));
+
+ var aboutList = footer.append('div')
+ .attr('id', 'info-block')
+ .append('ul')
+ .attr('id', 'about-list');
+
+ if (!context.embed()) {
+ aboutList.call(iD.ui.Account(context));
+ }
+
+ aboutList.append('li')
+ .append('a')
+ .attr('target', '_blank')
+ .attr('tabindex', -1)
+ .attr('href', 'https://github.com/openstreetmap/iD')
+ .text(iD.version);
+
+ var issueLinks = aboutList.append('li');
+
+ issueLinks.append('a')
+ .attr('target', '_blank')
+ .attr('tabindex', -1)
+ .attr('href', 'https://github.com/openstreetmap/iD/issues')
+ .call(iD.svg.Icon('#icon-bug', 'light'))
+ .call(bootstrap.tooltip()
+ .title(t('report_a_bug'))
+ .placement('top')
+ );
+
+ issueLinks.append('a')
+ .attr('target', '_blank')
+ .attr('tabindex', -1)
+ .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
+ .call(iD.svg.Icon('#icon-translate', 'light'))
+ .call(bootstrap.tooltip()
+ .title(t('help_translate'))
+ .placement('top')
+ );
+
+ aboutList.append('li')
+ .attr('class', 'feature-warning')
+ .attr('tabindex', -1)
+ .call(iD.ui.FeatureInfo(context));
+
+ aboutList.append('li')
+ .attr('class', 'user-list')
+ .attr('tabindex', -1)
+ .call(iD.ui.Contributors(context));
+
+ window.onbeforeunload = function() {
+ return context.save();
+ };
+
+ window.onunload = function() {
+ context.history().unlock();
+ };
+
+ var mapDimensions = map.dimensions();
+
+ d3.select(window).on('resize.editor', function() {
+ mapDimensions = content.dimensions(null);
+ map.dimensions(mapDimensions);
+ });
+
+ function pan(d) {
+ return function() {
+ d3.event.preventDefault();
+ if (!context.inIntro()) context.pan(d);
+ };
+ }
+
+ // pan amount
+ var pa = 10;
+
+ var keybinding = d3.keybinding('main')
+ .on('⌫', function() { d3.event.preventDefault(); })
+ .on('←', pan([pa, 0]))
+ .on('↑', pan([0, pa]))
+ .on('→', pan([-pa, 0]))
+ .on('↓', pan([0, -pa]))
+ .on('⇧←', pan([mapDimensions[0], 0]))
+ .on('⇧↑', pan([0, mapDimensions[1]]))
+ .on('⇧→', pan([-mapDimensions[0], 0]))
+ .on('⇧↓', pan([0, -mapDimensions[1]]))
+ .on(iD.ui.cmd('⌘←'), pan([mapDimensions[0], 0]))
+ .on(iD.ui.cmd('⌘↑'), pan([0, mapDimensions[1]]))
+ .on(iD.ui.cmd('⌘→'), pan([-mapDimensions[0], 0]))
+ .on(iD.ui.cmd('⌘↓'), pan([0, -mapDimensions[1]]));
+
+ d3.select(document)
+ .call(keybinding);
+
+ context.enter(iD.modes.Browse(context));
+
+ context.container()
+ .call(iD.ui.Splash(context))
+ .call(iD.ui.Restore(context));
+
+ var authenticating = iD.ui.Loading(context)
+ .message(t('loading_auth'));
+
+ context.connection()
+ .on('authenticating.ui', function() {
+ context.container()
+ .call(authenticating);
+ })
+ .on('authenticated.ui', function() {
+ authenticating.close();
+ });
+ }
+
+ function ui(container) {
+ context.container(container);
+ context.loadLocale(function() {
+ render(container);
+ });
+ }
+
+ ui.sidebar = iD.ui.Sidebar(context);
+
+ return ui;
+ }
+
+ ui.tooltipHtml = function(text, key) {
+ var s = '' + text + '';
+ if (key) {
+ s += '
' +
+ ' ' + (t('tooltip_keyhint')) + ' ' +
+ ' ' + key + '
';
+ }
+ return s;
+ };
+
+ exports.ui = ui;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
\ No newline at end of file
diff --git a/modules/ui/account.js b/modules/ui/core/account.js
similarity index 100%
rename from modules/ui/account.js
rename to modules/ui/core/account.js
diff --git a/modules/ui/attribution.js b/modules/ui/core/attribution.js
similarity index 100%
rename from modules/ui/attribution.js
rename to modules/ui/core/attribution.js
diff --git a/modules/ui/background.js b/modules/ui/core/background.js
similarity index 100%
rename from modules/ui/background.js
rename to modules/ui/core/background.js
diff --git a/modules/ui/cmd.js b/modules/ui/core/cmd.js
similarity index 100%
rename from modules/ui/cmd.js
rename to modules/ui/core/cmd.js
diff --git a/modules/ui/commit.js b/modules/ui/core/commit.js
similarity index 100%
rename from modules/ui/commit.js
rename to modules/ui/core/commit.js
diff --git a/modules/ui/confirm.js b/modules/ui/core/confirm.js
similarity index 100%
rename from modules/ui/confirm.js
rename to modules/ui/core/confirm.js
diff --git a/modules/ui/conflicts.js b/modules/ui/core/conflicts.js
similarity index 100%
rename from modules/ui/conflicts.js
rename to modules/ui/core/conflicts.js
diff --git a/modules/ui/contributors.js b/modules/ui/core/contributors.js
similarity index 100%
rename from modules/ui/contributors.js
rename to modules/ui/core/contributors.js
diff --git a/modules/ui/disclosure.js b/modules/ui/core/disclosure.js
similarity index 100%
rename from modules/ui/disclosure.js
rename to modules/ui/core/disclosure.js
diff --git a/modules/ui/entity_editor.js b/modules/ui/core/entity_editor.js
similarity index 100%
rename from modules/ui/entity_editor.js
rename to modules/ui/core/entity_editor.js
diff --git a/modules/ui/feature_info.js b/modules/ui/core/feature_info.js
similarity index 100%
rename from modules/ui/feature_info.js
rename to modules/ui/core/feature_info.js
diff --git a/modules/ui/feature_list.js b/modules/ui/core/feature_list.js
similarity index 100%
rename from modules/ui/feature_list.js
rename to modules/ui/core/feature_list.js
diff --git a/modules/ui/flash.js b/modules/ui/core/flash.js
similarity index 100%
rename from modules/ui/flash.js
rename to modules/ui/core/flash.js
diff --git a/modules/ui/full_screen.js b/modules/ui/core/full_screen.js
similarity index 100%
rename from modules/ui/full_screen.js
rename to modules/ui/core/full_screen.js
diff --git a/modules/ui/geolocate.js b/modules/ui/core/geolocate.js
similarity index 100%
rename from modules/ui/geolocate.js
rename to modules/ui/core/geolocate.js
diff --git a/modules/ui/help.js b/modules/ui/core/help.js
similarity index 100%
rename from modules/ui/help.js
rename to modules/ui/core/help.js
diff --git a/modules/ui/index.js b/modules/ui/core/index.js
similarity index 100%
rename from modules/ui/index.js
rename to modules/ui/core/index.js
diff --git a/modules/ui/info.js b/modules/ui/core/info.js
similarity index 100%
rename from modules/ui/info.js
rename to modules/ui/core/info.js
diff --git a/modules/ui/inspector.js b/modules/ui/core/inspector.js
similarity index 100%
rename from modules/ui/inspector.js
rename to modules/ui/core/inspector.js
diff --git a/modules/ui/intro.js b/modules/ui/core/intro.js
similarity index 100%
rename from modules/ui/intro.js
rename to modules/ui/core/intro.js
diff --git a/modules/ui/lasso.js b/modules/ui/core/lasso.js
similarity index 100%
rename from modules/ui/lasso.js
rename to modules/ui/core/lasso.js
diff --git a/modules/ui/loading.js b/modules/ui/core/loading.js
similarity index 100%
rename from modules/ui/loading.js
rename to modules/ui/core/loading.js
diff --git a/modules/ui/map_data.js b/modules/ui/core/map_data.js
similarity index 100%
rename from modules/ui/map_data.js
rename to modules/ui/core/map_data.js
diff --git a/modules/ui/map_in_map.js b/modules/ui/core/map_in_map.js
similarity index 100%
rename from modules/ui/map_in_map.js
rename to modules/ui/core/map_in_map.js
diff --git a/modules/ui/modal.js b/modules/ui/core/modal.js
similarity index 100%
rename from modules/ui/modal.js
rename to modules/ui/core/modal.js
diff --git a/modules/ui/modes.js b/modules/ui/core/modes.js
similarity index 100%
rename from modules/ui/modes.js
rename to modules/ui/core/modes.js
diff --git a/modules/ui/notice.js b/modules/ui/core/notice.js
similarity index 100%
rename from modules/ui/notice.js
rename to modules/ui/core/notice.js
diff --git a/modules/ui/preset.js b/modules/ui/core/preset.js
similarity index 100%
rename from modules/ui/preset.js
rename to modules/ui/core/preset.js
diff --git a/modules/ui/preset_icon.js b/modules/ui/core/preset_icon.js
similarity index 100%
rename from modules/ui/preset_icon.js
rename to modules/ui/core/preset_icon.js
diff --git a/modules/ui/preset_list.js b/modules/ui/core/preset_list.js
similarity index 100%
rename from modules/ui/preset_list.js
rename to modules/ui/core/preset_list.js
diff --git a/modules/ui/radial_menu.js b/modules/ui/core/radial_menu.js
similarity index 100%
rename from modules/ui/radial_menu.js
rename to modules/ui/core/radial_menu.js
diff --git a/modules/ui/raw_member_editor.js b/modules/ui/core/raw_member_editor.js
similarity index 100%
rename from modules/ui/raw_member_editor.js
rename to modules/ui/core/raw_member_editor.js
diff --git a/modules/ui/raw_membership_editor.js b/modules/ui/core/raw_membership_editor.js
similarity index 100%
rename from modules/ui/raw_membership_editor.js
rename to modules/ui/core/raw_membership_editor.js
diff --git a/modules/ui/raw_tag_editor.js b/modules/ui/core/raw_tag_editor.js
similarity index 100%
rename from modules/ui/raw_tag_editor.js
rename to modules/ui/core/raw_tag_editor.js
diff --git a/modules/ui/restore.js b/modules/ui/core/restore.js
similarity index 100%
rename from modules/ui/restore.js
rename to modules/ui/core/restore.js
diff --git a/modules/ui/save.js b/modules/ui/core/save.js
similarity index 100%
rename from modules/ui/save.js
rename to modules/ui/core/save.js
diff --git a/modules/ui/scale.js b/modules/ui/core/scale.js
similarity index 100%
rename from modules/ui/scale.js
rename to modules/ui/core/scale.js
diff --git a/modules/ui/selection_list.js b/modules/ui/core/selection_list.js
similarity index 100%
rename from modules/ui/selection_list.js
rename to modules/ui/core/selection_list.js
diff --git a/modules/ui/sidebar.js b/modules/ui/core/sidebar.js
similarity index 100%
rename from modules/ui/sidebar.js
rename to modules/ui/core/sidebar.js
diff --git a/modules/ui/source_switch.js b/modules/ui/core/source_switch.js
similarity index 100%
rename from modules/ui/source_switch.js
rename to modules/ui/core/source_switch.js
diff --git a/modules/ui/spinner.js b/modules/ui/core/spinner.js
similarity index 100%
rename from modules/ui/spinner.js
rename to modules/ui/core/spinner.js
diff --git a/modules/ui/splash.js b/modules/ui/core/splash.js
similarity index 100%
rename from modules/ui/splash.js
rename to modules/ui/core/splash.js
diff --git a/modules/ui/status.js b/modules/ui/core/status.js
similarity index 100%
rename from modules/ui/status.js
rename to modules/ui/core/status.js
diff --git a/modules/ui/success.js b/modules/ui/core/success.js
similarity index 100%
rename from modules/ui/success.js
rename to modules/ui/core/success.js
diff --git a/modules/ui/tag_reference.js b/modules/ui/core/tag_reference.js
similarity index 100%
rename from modules/ui/tag_reference.js
rename to modules/ui/core/tag_reference.js
diff --git a/modules/ui/toggle.js b/modules/ui/core/toggle.js
similarity index 100%
rename from modules/ui/toggle.js
rename to modules/ui/core/toggle.js
diff --git a/modules/ui/undo_redo.js b/modules/ui/core/undo_redo.js
similarity index 100%
rename from modules/ui/undo_redo.js
rename to modules/ui/core/undo_redo.js
diff --git a/modules/ui/view_on_osm.js b/modules/ui/core/view_on_osm.js
similarity index 100%
rename from modules/ui/view_on_osm.js
rename to modules/ui/core/view_on_osm.js
diff --git a/modules/ui/zoom.js b/modules/ui/core/zoom.js
similarity index 100%
rename from modules/ui/zoom.js
rename to modules/ui/core/zoom.js
diff --git a/js/id/ui.js b/modules/ui/ui.js
similarity index 98%
rename from js/id/ui.js
rename to modules/ui/ui.js
index f06f3a845..74b3d07bb 100644
--- a/js/id/ui.js
+++ b/modules/ui/ui.js
@@ -1,4 +1,4 @@
-iD.ui = function(context) {
+export function ui(context) {
function render(container) {
var map = context.map();
@@ -226,9 +226,9 @@ iD.ui = function(context) {
ui.sidebar = iD.ui.Sidebar(context);
return ui;
-};
+}
-iD.ui.tooltipHtml = function(text, key) {
+ui.tooltipHtml = function(text, key) {
var s = '' + text + '';
if (key) {
s += '' +
diff --git a/test/index.html b/test/index.html
index d305c0218..125e39bab 100644
--- a/test/index.html
+++ b/test/index.html
@@ -52,13 +52,12 @@
-
-
-
-
+
+
+