diff --git a/packages/editor/package.json b/packages/editor/package.json index 181f2320..b08accde 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -53,4 +53,4 @@ "react-dom": "^17.0.0", "react-intl": "^5.24.3" } -} \ No newline at end of file +} diff --git a/packages/mindplot/assets/icons/arrow_down.gif b/packages/mindplot/assets/icons/arrow_down.gif deleted file mode 100644 index 552f123e..00000000 Binary files a/packages/mindplot/assets/icons/arrow_down.gif and /dev/null differ diff --git a/packages/mindplot/assets/icons/arrow_down.png b/packages/mindplot/assets/icons/arrow_down.png deleted file mode 100755 index 2c4e2793..00000000 Binary files a/packages/mindplot/assets/icons/arrow_down.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/arrow_left.png b/packages/mindplot/assets/icons/arrow_left.png deleted file mode 100755 index 5dc69678..00000000 Binary files a/packages/mindplot/assets/icons/arrow_left.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/arrow_merge.png b/packages/mindplot/assets/icons/arrow_merge.png deleted file mode 100755 index 7502dbb3..00000000 Binary files a/packages/mindplot/assets/icons/arrow_merge.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/arrow_right.png b/packages/mindplot/assets/icons/arrow_right.png deleted file mode 100755 index 4bfba64a..00000000 Binary files a/packages/mindplot/assets/icons/arrow_right.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/arrow_up.png b/packages/mindplot/assets/icons/arrow_up.png deleted file mode 100755 index 1ebb1932..00000000 Binary files a/packages/mindplot/assets/icons/arrow_up.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/arrowc_rotate_anticlockwise.png b/packages/mindplot/assets/icons/arrowc_rotate_anticlockwise.png deleted file mode 100755 index 46c75aa8..00000000 Binary files a/packages/mindplot/assets/icons/arrowc_rotate_anticlockwise.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/arrowc_rotate_clockwise.png b/packages/mindplot/assets/icons/arrowc_rotate_clockwise.png deleted file mode 100755 index aa65210e..00000000 Binary files a/packages/mindplot/assets/icons/arrowc_rotate_clockwise.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/arrowc_turn_left.png b/packages/mindplot/assets/icons/arrowc_turn_left.png deleted file mode 100755 index a3d6c9e3..00000000 Binary files a/packages/mindplot/assets/icons/arrowc_turn_left.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/arrowc_turn_right.png b/packages/mindplot/assets/icons/arrowc_turn_right.png deleted file mode 100755 index 629f20d6..00000000 Binary files a/packages/mindplot/assets/icons/arrowc_turn_right.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/bomb.png b/packages/mindplot/assets/icons/bomb.png deleted file mode 100755 index 1be37974..00000000 Binary files a/packages/mindplot/assets/icons/bomb.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/bulb_light_off.png b/packages/mindplot/assets/icons/bulb_light_off.png deleted file mode 100644 index e95b8c5b..00000000 Binary files a/packages/mindplot/assets/icons/bulb_light_off.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/bulb_light_on.png b/packages/mindplot/assets/icons/bulb_light_on.png deleted file mode 100644 index d22fde8b..00000000 Binary files a/packages/mindplot/assets/icons/bulb_light_on.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/chart_bar.png b/packages/mindplot/assets/icons/chart_bar.png deleted file mode 100755 index 9051fbc6..00000000 Binary files a/packages/mindplot/assets/icons/chart_bar.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/chart_curve.png b/packages/mindplot/assets/icons/chart_curve.png deleted file mode 100755 index 01e933a6..00000000 Binary files a/packages/mindplot/assets/icons/chart_curve.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/chart_line.png b/packages/mindplot/assets/icons/chart_line.png deleted file mode 100755 index 85020f32..00000000 Binary files a/packages/mindplot/assets/icons/chart_line.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/chart_organisation.png b/packages/mindplot/assets/icons/chart_organisation.png deleted file mode 100755 index c32d25c1..00000000 Binary files a/packages/mindplot/assets/icons/chart_organisation.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/chart_pie.png b/packages/mindplot/assets/icons/chart_pie.png deleted file mode 100755 index fe00fa05..00000000 Binary files a/packages/mindplot/assets/icons/chart_pie.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/close.png b/packages/mindplot/assets/icons/close.png deleted file mode 100644 index 4de1c381..00000000 Binary files a/packages/mindplot/assets/icons/close.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/face_crying.png b/packages/mindplot/assets/icons/face_crying.png deleted file mode 100644 index a7e3f49f..00000000 Binary files a/packages/mindplot/assets/icons/face_crying.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/face_plain.png b/packages/mindplot/assets/icons/face_plain.png deleted file mode 100644 index a6761bd1..00000000 Binary files a/packages/mindplot/assets/icons/face_plain.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/face_sad.png b/packages/mindplot/assets/icons/face_sad.png deleted file mode 100644 index fa258956..00000000 Binary files a/packages/mindplot/assets/icons/face_sad.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/face_smile-big.png b/packages/mindplot/assets/icons/face_smile-big.png deleted file mode 100644 index 4cebcff6..00000000 Binary files a/packages/mindplot/assets/icons/face_smile-big.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/face_smile.png b/packages/mindplot/assets/icons/face_smile.png deleted file mode 100644 index 01e01170..00000000 Binary files a/packages/mindplot/assets/icons/face_smile.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/face_surprise.png b/packages/mindplot/assets/icons/face_surprise.png deleted file mode 100644 index 863f3048..00000000 Binary files a/packages/mindplot/assets/icons/face_surprise.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/face_wink.png b/packages/mindplot/assets/icons/face_wink.png deleted file mode 100644 index 46be6855..00000000 Binary files a/packages/mindplot/assets/icons/face_wink.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/flag_blue.png b/packages/mindplot/assets/icons/flag_blue.png deleted file mode 100755 index 003924f5..00000000 Binary files a/packages/mindplot/assets/icons/flag_blue.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/flag_green.png b/packages/mindplot/assets/icons/flag_green.png deleted file mode 100755 index e4bc611f..00000000 Binary files a/packages/mindplot/assets/icons/flag_green.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/flag_orange.png b/packages/mindplot/assets/icons/flag_orange.png deleted file mode 100755 index e6320242..00000000 Binary files a/packages/mindplot/assets/icons/flag_orange.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/flag_pink.png b/packages/mindplot/assets/icons/flag_pink.png deleted file mode 100755 index 5f15e526..00000000 Binary files a/packages/mindplot/assets/icons/flag_pink.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/flag_purple.png b/packages/mindplot/assets/icons/flag_purple.png deleted file mode 100755 index d0698664..00000000 Binary files a/packages/mindplot/assets/icons/flag_purple.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/flag_yellow.png b/packages/mindplot/assets/icons/flag_yellow.png deleted file mode 100755 index 14c89a54..00000000 Binary files a/packages/mindplot/assets/icons/flag_yellow.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/funy_angel.png b/packages/mindplot/assets/icons/funy_angel.png deleted file mode 100644 index d2c5e940..00000000 Binary files a/packages/mindplot/assets/icons/funy_angel.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/funy_devilish.png b/packages/mindplot/assets/icons/funy_devilish.png deleted file mode 100644 index 8e2cd458..00000000 Binary files a/packages/mindplot/assets/icons/funy_devilish.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/funy_glasses.png b/packages/mindplot/assets/icons/funy_glasses.png deleted file mode 100644 index d13f2c8c..00000000 Binary files a/packages/mindplot/assets/icons/funy_glasses.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/funy_grin.png b/packages/mindplot/assets/icons/funy_grin.png deleted file mode 100644 index d15cf2d4..00000000 Binary files a/packages/mindplot/assets/icons/funy_grin.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/funy_kiss.png b/packages/mindplot/assets/icons/funy_kiss.png deleted file mode 100644 index 809c1cf7..00000000 Binary files a/packages/mindplot/assets/icons/funy_kiss.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/funy_monkey.png b/packages/mindplot/assets/icons/funy_monkey.png deleted file mode 100644 index 69db8fa5..00000000 Binary files a/packages/mindplot/assets/icons/funy_monkey.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/gener_female.png b/packages/mindplot/assets/icons/gener_female.png deleted file mode 100755 index f92958e6..00000000 Binary files a/packages/mindplot/assets/icons/gener_female.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/gener_male.png b/packages/mindplot/assets/icons/gener_male.png deleted file mode 100755 index 25d6ea91..00000000 Binary files a/packages/mindplot/assets/icons/gener_male.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/hard_cd.png b/packages/mindplot/assets/icons/hard_cd.png deleted file mode 100755 index ef432235..00000000 Binary files a/packages/mindplot/assets/icons/hard_cd.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/hard_computer.png b/packages/mindplot/assets/icons/hard_computer.png deleted file mode 100755 index 9bc37dce..00000000 Binary files a/packages/mindplot/assets/icons/hard_computer.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/hard_controller.png b/packages/mindplot/assets/icons/hard_controller.png deleted file mode 100755 index 5cf76ed0..00000000 Binary files a/packages/mindplot/assets/icons/hard_controller.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/hard_drive_cd.png b/packages/mindplot/assets/icons/hard_drive_cd.png deleted file mode 100755 index 1850b701..00000000 Binary files a/packages/mindplot/assets/icons/hard_drive_cd.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/hard_driver_disk.png b/packages/mindplot/assets/icons/hard_driver_disk.png deleted file mode 100755 index 99d532e8..00000000 Binary files a/packages/mindplot/assets/icons/hard_driver_disk.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/hard_ipod.png b/packages/mindplot/assets/icons/hard_ipod.png deleted file mode 100755 index 3f768da5..00000000 Binary files a/packages/mindplot/assets/icons/hard_ipod.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/hard_keyboard.png b/packages/mindplot/assets/icons/hard_keyboard.png deleted file mode 100755 index 898d402d..00000000 Binary files a/packages/mindplot/assets/icons/hard_keyboard.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/hard_mouse.png b/packages/mindplot/assets/icons/hard_mouse.png deleted file mode 100755 index 63a92fa9..00000000 Binary files a/packages/mindplot/assets/icons/hard_mouse.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/hard_printer.png b/packages/mindplot/assets/icons/hard_printer.png deleted file mode 100755 index a350d187..00000000 Binary files a/packages/mindplot/assets/icons/hard_printer.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/lock_close.png b/packages/mindplot/assets/icons/lock_close.png deleted file mode 100755 index 2ebc4f6f..00000000 Binary files a/packages/mindplot/assets/icons/lock_close.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/lock_open.png b/packages/mindplot/assets/icons/lock_open.png deleted file mode 100755 index a471765f..00000000 Binary files a/packages/mindplot/assets/icons/lock_open.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/mail_edit.png b/packages/mindplot/assets/icons/mail_edit.png deleted file mode 100755 index b4d31ce2..00000000 Binary files a/packages/mindplot/assets/icons/mail_edit.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/mail_envelop.png b/packages/mindplot/assets/icons/mail_envelop.png deleted file mode 100755 index 7348aed7..00000000 Binary files a/packages/mindplot/assets/icons/mail_envelop.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/mail_list.png b/packages/mindplot/assets/icons/mail_list.png deleted file mode 100755 index abcd9368..00000000 Binary files a/packages/mindplot/assets/icons/mail_list.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/mail_mailbox.png b/packages/mindplot/assets/icons/mail_mailbox.png deleted file mode 100755 index 8443c23e..00000000 Binary files a/packages/mindplot/assets/icons/mail_mailbox.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/money_coins.png b/packages/mindplot/assets/icons/money_coins.png deleted file mode 100644 index 0ca9074d..00000000 Binary files a/packages/mindplot/assets/icons/money_coins.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/money_dollar.png b/packages/mindplot/assets/icons/money_dollar.png deleted file mode 100755 index 59af1638..00000000 Binary files a/packages/mindplot/assets/icons/money_dollar.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/money_euro.png b/packages/mindplot/assets/icons/money_euro.png deleted file mode 100755 index b322ba92..00000000 Binary files a/packages/mindplot/assets/icons/money_euro.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/money_money.png b/packages/mindplot/assets/icons/money_money.png deleted file mode 100755 index 42c52d05..00000000 Binary files a/packages/mindplot/assets/icons/money_money.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/money_pound.png b/packages/mindplot/assets/icons/money_pound.png deleted file mode 100755 index b7113646..00000000 Binary files a/packages/mindplot/assets/icons/money_pound.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/money_ruby.png b/packages/mindplot/assets/icons/money_ruby.png deleted file mode 100644 index f763a168..00000000 Binary files a/packages/mindplot/assets/icons/money_ruby.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/money_yen.png b/packages/mindplot/assets/icons/money_yen.png deleted file mode 100755 index 228a6778..00000000 Binary files a/packages/mindplot/assets/icons/money_yen.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/number_1.png b/packages/mindplot/assets/icons/number_1.png deleted file mode 100755 index 7e84b55a..00000000 Binary files a/packages/mindplot/assets/icons/number_1.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/number_2.png b/packages/mindplot/assets/icons/number_2.png deleted file mode 100755 index c1f38f54..00000000 Binary files a/packages/mindplot/assets/icons/number_2.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/number_3.png b/packages/mindplot/assets/icons/number_3.png deleted file mode 100755 index 4c7aec83..00000000 Binary files a/packages/mindplot/assets/icons/number_3.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/number_4.png b/packages/mindplot/assets/icons/number_4.png deleted file mode 100755 index 5195f575..00000000 Binary files a/packages/mindplot/assets/icons/number_4.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/number_5.png b/packages/mindplot/assets/icons/number_5.png deleted file mode 100755 index 7ffcb61b..00000000 Binary files a/packages/mindplot/assets/icons/number_5.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/number_6.png b/packages/mindplot/assets/icons/number_6.png deleted file mode 100755 index 14fe947a..00000000 Binary files a/packages/mindplot/assets/icons/number_6.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/number_7.png b/packages/mindplot/assets/icons/number_7.png deleted file mode 100755 index 07edafa0..00000000 Binary files a/packages/mindplot/assets/icons/number_7.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/number_8.png b/packages/mindplot/assets/icons/number_8.png deleted file mode 100755 index cd26e35c..00000000 Binary files a/packages/mindplot/assets/icons/number_8.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/number_9.png b/packages/mindplot/assets/icons/number_9.png deleted file mode 100755 index a3e908ee..00000000 Binary files a/packages/mindplot/assets/icons/number_9.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_bell.png b/packages/mindplot/assets/icons/object_bell.png deleted file mode 100755 index 6e0015df..00000000 Binary files a/packages/mindplot/assets/icons/object_bell.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_cake.png b/packages/mindplot/assets/icons/object_cake.png deleted file mode 100755 index 4ef151ae..00000000 Binary files a/packages/mindplot/assets/icons/object_cake.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_camera.png b/packages/mindplot/assets/icons/object_camera.png deleted file mode 100755 index 8536d1a7..00000000 Binary files a/packages/mindplot/assets/icons/object_camera.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_clanbomber.png b/packages/mindplot/assets/icons/object_clanbomber.png deleted file mode 100755 index 1be37974..00000000 Binary files a/packages/mindplot/assets/icons/object_clanbomber.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_clip.png b/packages/mindplot/assets/icons/object_clip.png deleted file mode 100755 index ea897cc9..00000000 Binary files a/packages/mindplot/assets/icons/object_clip.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_house.png b/packages/mindplot/assets/icons/object_house.png deleted file mode 100755 index fed62219..00000000 Binary files a/packages/mindplot/assets/icons/object_house.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_key.png b/packages/mindplot/assets/icons/object_key.png deleted file mode 100755 index 4ec1a928..00000000 Binary files a/packages/mindplot/assets/icons/object_key.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_magnifier.png b/packages/mindplot/assets/icons/object_magnifier.png deleted file mode 100755 index cf3d97f7..00000000 Binary files a/packages/mindplot/assets/icons/object_magnifier.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_music.png b/packages/mindplot/assets/icons/object_music.png deleted file mode 100755 index a8b3ede3..00000000 Binary files a/packages/mindplot/assets/icons/object_music.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_palette.png b/packages/mindplot/assets/icons/object_palette.png deleted file mode 100755 index 73c5b3f2..00000000 Binary files a/packages/mindplot/assets/icons/object_palette.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_pencil.png b/packages/mindplot/assets/icons/object_pencil.png deleted file mode 100755 index 0bfecd50..00000000 Binary files a/packages/mindplot/assets/icons/object_pencil.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_phone.png b/packages/mindplot/assets/icons/object_phone.png deleted file mode 100755 index c39f162f..00000000 Binary files a/packages/mindplot/assets/icons/object_phone.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_rainbow.png b/packages/mindplot/assets/icons/object_rainbow.png deleted file mode 100755 index 5ede989a..00000000 Binary files a/packages/mindplot/assets/icons/object_rainbow.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_star.png b/packages/mindplot/assets/icons/object_star.png deleted file mode 100755 index b88c8578..00000000 Binary files a/packages/mindplot/assets/icons/object_star.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/object_wizard.png b/packages/mindplot/assets/icons/object_wizard.png deleted file mode 100755 index 44ccbf81..00000000 Binary files a/packages/mindplot/assets/icons/object_wizard.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/onoff_add.png b/packages/mindplot/assets/icons/onoff_add.png deleted file mode 100644 index 6332fefe..00000000 Binary files a/packages/mindplot/assets/icons/onoff_add.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/onoff_clock.png b/packages/mindplot/assets/icons/onoff_clock.png deleted file mode 100644 index e2672c20..00000000 Binary files a/packages/mindplot/assets/icons/onoff_clock.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/onoff_clock_red.png b/packages/mindplot/assets/icons/onoff_clock_red.png deleted file mode 100644 index 2842cc33..00000000 Binary files a/packages/mindplot/assets/icons/onoff_clock_red.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/onoff_delete.png b/packages/mindplot/assets/icons/onoff_delete.png deleted file mode 100644 index 08f24936..00000000 Binary files a/packages/mindplot/assets/icons/onoff_delete.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/people_female1.png b/packages/mindplot/assets/icons/people_female1.png deleted file mode 100755 index 7c71de03..00000000 Binary files a/packages/mindplot/assets/icons/people_female1.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/people_female2.png b/packages/mindplot/assets/icons/people_female2.png deleted file mode 100755 index 30383c2d..00000000 Binary files a/packages/mindplot/assets/icons/people_female2.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/people_group.png b/packages/mindplot/assets/icons/people_group.png deleted file mode 100755 index 7fb4e1f1..00000000 Binary files a/packages/mindplot/assets/icons/people_group.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/people_male1.png b/packages/mindplot/assets/icons/people_male1.png deleted file mode 100755 index b3454e15..00000000 Binary files a/packages/mindplot/assets/icons/people_male1.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/people_male2.png b/packages/mindplot/assets/icons/people_male2.png deleted file mode 100755 index 79f35ccb..00000000 Binary files a/packages/mindplot/assets/icons/people_male2.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sign_cancel.png b/packages/mindplot/assets/icons/sign_cancel.png deleted file mode 100755 index c149c2bc..00000000 Binary files a/packages/mindplot/assets/icons/sign_cancel.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sign_closed.png b/packages/mindplot/assets/icons/sign_closed.png deleted file mode 100755 index 08f24936..00000000 Binary files a/packages/mindplot/assets/icons/sign_closed.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sign_exclamation.png b/packages/mindplot/assets/icons/sign_exclamation.png deleted file mode 100755 index c37bd062..00000000 Binary files a/packages/mindplot/assets/icons/sign_exclamation.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sign_help.png b/packages/mindplot/assets/icons/sign_help.png deleted file mode 100755 index 5c870176..00000000 Binary files a/packages/mindplot/assets/icons/sign_help.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sign_info.png b/packages/mindplot/assets/icons/sign_info.png deleted file mode 100755 index 12cd1aef..00000000 Binary files a/packages/mindplot/assets/icons/sign_info.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sign_stop.png b/packages/mindplot/assets/icons/sign_stop.png deleted file mode 100755 index 0cfd5859..00000000 Binary files a/packages/mindplot/assets/icons/sign_stop.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sign_warning.png b/packages/mindplot/assets/icons/sign_warning.png deleted file mode 100755 index 628cf2da..00000000 Binary files a/packages/mindplot/assets/icons/sign_warning.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/soft_bug.png b/packages/mindplot/assets/icons/soft_bug.png deleted file mode 100755 index 2d5fb90e..00000000 Binary files a/packages/mindplot/assets/icons/soft_bug.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/soft_cursor.png b/packages/mindplot/assets/icons/soft_cursor.png deleted file mode 100755 index 532f532d..00000000 Binary files a/packages/mindplot/assets/icons/soft_cursor.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/soft_database.png b/packages/mindplot/assets/icons/soft_database.png deleted file mode 100755 index 3d09261a..00000000 Binary files a/packages/mindplot/assets/icons/soft_database.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/soft_database_table.png b/packages/mindplot/assets/icons/soft_database_table.png deleted file mode 100755 index 693709cb..00000000 Binary files a/packages/mindplot/assets/icons/soft_database_table.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/soft_feed.png b/packages/mindplot/assets/icons/soft_feed.png deleted file mode 100755 index 315c4f4f..00000000 Binary files a/packages/mindplot/assets/icons/soft_feed.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/soft_folder_explore.png b/packages/mindplot/assets/icons/soft_folder_explore.png deleted file mode 100755 index 0ba93918..00000000 Binary files a/packages/mindplot/assets/icons/soft_folder_explore.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/soft_penguin.png b/packages/mindplot/assets/icons/soft_penguin.png deleted file mode 100755 index bbefe2ec..00000000 Binary files a/packages/mindplot/assets/icons/soft_penguin.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/soft_rss.png b/packages/mindplot/assets/icons/soft_rss.png deleted file mode 100755 index 1dc6ff30..00000000 Binary files a/packages/mindplot/assets/icons/soft_rss.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/soft_stuff_folder.png b/packages/mindplot/assets/icons/soft_stuff_folder.png deleted file mode 100755 index 784e8fa4..00000000 Binary files a/packages/mindplot/assets/icons/soft_stuff_folder.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sport_basketball.png b/packages/mindplot/assets/icons/sport_basketball.png deleted file mode 100644 index f7a000b9..00000000 Binary files a/packages/mindplot/assets/icons/sport_basketball.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sport_football.png b/packages/mindplot/assets/icons/sport_football.png deleted file mode 100644 index 199f0f7f..00000000 Binary files a/packages/mindplot/assets/icons/sport_football.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sport_golf.png b/packages/mindplot/assets/icons/sport_golf.png deleted file mode 100644 index e21fa44c..00000000 Binary files a/packages/mindplot/assets/icons/sport_golf.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sport_raquet.png b/packages/mindplot/assets/icons/sport_raquet.png deleted file mode 100644 index f5e0f0c2..00000000 Binary files a/packages/mindplot/assets/icons/sport_raquet.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sport_shuttlecock.png b/packages/mindplot/assets/icons/sport_shuttlecock.png deleted file mode 100644 index 917287fa..00000000 Binary files a/packages/mindplot/assets/icons/sport_shuttlecock.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sport_soccer.png b/packages/mindplot/assets/icons/sport_soccer.png deleted file mode 100644 index 3eb1828b..00000000 Binary files a/packages/mindplot/assets/icons/sport_soccer.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/sport_tennis.png b/packages/mindplot/assets/icons/sport_tennis.png deleted file mode 100644 index e88a6efa..00000000 Binary files a/packages/mindplot/assets/icons/sport_tennis.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tag_blue.png b/packages/mindplot/assets/icons/tag_blue.png deleted file mode 100755 index 9757fc6e..00000000 Binary files a/packages/mindplot/assets/icons/tag_blue.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tag_blue_add.png b/packages/mindplot/assets/icons/tag_blue_add.png deleted file mode 100755 index 887972eb..00000000 Binary files a/packages/mindplot/assets/icons/tag_blue_add.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tag_blue_add2.png b/packages/mindplot/assets/icons/tag_blue_add2.png deleted file mode 100755 index 997c191a..00000000 Binary files a/packages/mindplot/assets/icons/tag_blue_add2.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tag_green.png b/packages/mindplot/assets/icons/tag_green.png deleted file mode 100755 index 83ec984b..00000000 Binary files a/packages/mindplot/assets/icons/tag_green.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tag_orange.png b/packages/mindplot/assets/icons/tag_orange.png deleted file mode 100755 index 454a59f3..00000000 Binary files a/packages/mindplot/assets/icons/tag_orange.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tag_pink.png b/packages/mindplot/assets/icons/tag_pink.png deleted file mode 100755 index 76e2296c..00000000 Binary files a/packages/mindplot/assets/icons/tag_pink.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tag_purple.png b/packages/mindplot/assets/icons/tag_purple.png deleted file mode 100755 index ebaf0e87..00000000 Binary files a/packages/mindplot/assets/icons/tag_purple.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tag_red.png b/packages/mindplot/assets/icons/tag_red.png deleted file mode 100755 index 6ebb37d2..00000000 Binary files a/packages/mindplot/assets/icons/tag_red.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tag_yellow.png b/packages/mindplot/assets/icons/tag_yellow.png deleted file mode 100755 index 83d12924..00000000 Binary files a/packages/mindplot/assets/icons/tag_yellow.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/task_0.png b/packages/mindplot/assets/icons/task_0.png deleted file mode 100755 index f2bc1a43..00000000 Binary files a/packages/mindplot/assets/icons/task_0.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/task_100.png b/packages/mindplot/assets/icons/task_100.png deleted file mode 100755 index d9e7a29d..00000000 Binary files a/packages/mindplot/assets/icons/task_100.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/task_25.png b/packages/mindplot/assets/icons/task_25.png deleted file mode 100755 index a029e29d..00000000 Binary files a/packages/mindplot/assets/icons/task_25.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/task_50.png b/packages/mindplot/assets/icons/task_50.png deleted file mode 100755 index 5471a2d2..00000000 Binary files a/packages/mindplot/assets/icons/task_50.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/task_75.png b/packages/mindplot/assets/icons/task_75.png deleted file mode 100755 index 55fcb1af..00000000 Binary files a/packages/mindplot/assets/icons/task_75.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/thumb_thumb_down.png b/packages/mindplot/assets/icons/thumb_thumb_down.png deleted file mode 100755 index 3c832d4c..00000000 Binary files a/packages/mindplot/assets/icons/thumb_thumb_down.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/thumb_thumb_up.png b/packages/mindplot/assets/icons/thumb_thumb_up.png deleted file mode 100755 index 2bd16ccf..00000000 Binary files a/packages/mindplot/assets/icons/thumb_thumb_up.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tick_cross.png b/packages/mindplot/assets/icons/tick_cross.png deleted file mode 100644 index 1514d51a..00000000 Binary files a/packages/mindplot/assets/icons/tick_cross.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/tick_tick.png b/packages/mindplot/assets/icons/tick_tick.png deleted file mode 100644 index a9925a06..00000000 Binary files a/packages/mindplot/assets/icons/tick_tick.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/time_calendar.png b/packages/mindplot/assets/icons/time_calendar.png deleted file mode 100755 index 9740f76e..00000000 Binary files a/packages/mindplot/assets/icons/time_calendar.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/time_clock.png b/packages/mindplot/assets/icons/time_clock.png deleted file mode 100755 index 911da3f1..00000000 Binary files a/packages/mindplot/assets/icons/time_clock.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/time_hourglass.png b/packages/mindplot/assets/icons/time_hourglass.png deleted file mode 100755 index 57b03ce7..00000000 Binary files a/packages/mindplot/assets/icons/time_hourglass.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/weather_clear-night.png b/packages/mindplot/assets/icons/weather_clear-night.png deleted file mode 100644 index 43457526..00000000 Binary files a/packages/mindplot/assets/icons/weather_clear-night.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/weather_clear.png b/packages/mindplot/assets/icons/weather_clear.png deleted file mode 100644 index 7dc15ea9..00000000 Binary files a/packages/mindplot/assets/icons/weather_clear.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/weather_few-clouds-night.png b/packages/mindplot/assets/icons/weather_few-clouds-night.png deleted file mode 100644 index d69efec9..00000000 Binary files a/packages/mindplot/assets/icons/weather_few-clouds-night.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/weather_few-clouds.png b/packages/mindplot/assets/icons/weather_few-clouds.png deleted file mode 100644 index 0e633a38..00000000 Binary files a/packages/mindplot/assets/icons/weather_few-clouds.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/weather_overcast.png b/packages/mindplot/assets/icons/weather_overcast.png deleted file mode 100644 index 0045129b..00000000 Binary files a/packages/mindplot/assets/icons/weather_overcast.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/weather_severe-alert.png b/packages/mindplot/assets/icons/weather_severe-alert.png deleted file mode 100644 index 98e9f6c1..00000000 Binary files a/packages/mindplot/assets/icons/weather_severe-alert.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/weather_showers-scattered.png b/packages/mindplot/assets/icons/weather_showers-scattered.png deleted file mode 100644 index 8d10d844..00000000 Binary files a/packages/mindplot/assets/icons/weather_showers-scattered.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/weather_showers.png b/packages/mindplot/assets/icons/weather_showers.png deleted file mode 100644 index d9685d24..00000000 Binary files a/packages/mindplot/assets/icons/weather_showers.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/weather_snow.png b/packages/mindplot/assets/icons/weather_snow.png deleted file mode 100644 index a83d8559..00000000 Binary files a/packages/mindplot/assets/icons/weather_snow.png and /dev/null differ diff --git a/packages/mindplot/assets/icons/weather_storm.png b/packages/mindplot/assets/icons/weather_storm.png deleted file mode 100644 index feebe1d4..00000000 Binary files a/packages/mindplot/assets/icons/weather_storm.png and /dev/null differ diff --git a/packages/mindplot/assets/images/links.png b/packages/mindplot/assets/images/links.png deleted file mode 100644 index dd3b830f..00000000 Binary files a/packages/mindplot/assets/images/links.png and /dev/null differ diff --git a/packages/mindplot/assets/images/notes.png b/packages/mindplot/assets/images/notes.png deleted file mode 100644 index bf438b1d..00000000 Binary files a/packages/mindplot/assets/images/notes.png and /dev/null differ diff --git a/packages/mindplot/assets/images/shape-circle.png b/packages/mindplot/assets/images/shape-circle.png deleted file mode 100644 index cae3eead..00000000 Binary files a/packages/mindplot/assets/images/shape-circle.png and /dev/null differ diff --git a/packages/mindplot/assets/images/shape-line.png b/packages/mindplot/assets/images/shape-line.png deleted file mode 100644 index 89f5a5bc..00000000 Binary files a/packages/mindplot/assets/images/shape-line.png and /dev/null differ diff --git a/packages/mindplot/assets/images/shape-rectangle-round.png b/packages/mindplot/assets/images/shape-rectangle-round.png deleted file mode 100644 index c34e767c..00000000 Binary files a/packages/mindplot/assets/images/shape-rectangle-round.png and /dev/null differ diff --git a/packages/mindplot/assets/images/shape-rectangle.png b/packages/mindplot/assets/images/shape-rectangle.png deleted file mode 100644 index 9f05ac23..00000000 Binary files a/packages/mindplot/assets/images/shape-rectangle.png and /dev/null differ diff --git a/packages/mindplot/cypress/snapshots/playground.test.js/container.snap.png b/packages/mindplot/cypress/snapshots/playground.test.js/container.snap.png deleted file mode 100644 index ca5ce98e..00000000 Binary files a/packages/mindplot/cypress/snapshots/playground.test.js/container.snap.png and /dev/null differ diff --git a/packages/mindplot/cypress/snapshots/playground.test.js/editor.snap.png b/packages/mindplot/cypress/snapshots/playground.test.js/editor.snap.png deleted file mode 100644 index af97f33b..00000000 Binary files a/packages/mindplot/cypress/snapshots/playground.test.js/editor.snap.png and /dev/null differ diff --git a/packages/mindplot/src/components/.gitignore b/packages/mindplot/src/components/.gitignore deleted file mode 100644 index cc4e9f6e..00000000 --- a/packages/mindplot/src/components/.gitignore +++ /dev/null @@ -1 +0,0 @@ -MessageBundle_* \ No newline at end of file diff --git a/packages/mindplot/src/components/ActionDispatcher.js b/packages/mindplot/src/components/ActionDispatcher.js deleted file mode 100644 index bb166439..00000000 --- a/packages/mindplot/src/components/ActionDispatcher.js +++ /dev/null @@ -1,111 +0,0 @@ -/* eslint-disable no-unused-vars */ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert } from '@wisemapping/core-js'; -import Events from './Events'; - -class ActionDispatcher extends Events { - constructor(commandContext) { - $assert(commandContext, 'commandContext can not be null'); - super(); - } - - addRelationship(model, mindmap) { - throw new Error('method must be implemented.'); - } - - addTopics(models, parentTopicId) { - throw new Error('method must be implemented.'); - } - - deleteEntities(topicsIds, relIds) { - throw new Error('method must be implemented.'); - } - - dragTopic(topicId, position, order, parentTopic) { - throw new Error('method must be implemented.'); - } - - moveTopic(topicId, position) { - throw new Error('method must be implemented.'); - } - - moveControlPoint(ctrlPoint, point) { - throw new Error('method must be implemented.'); - } - - changeFontFamilyToTopic(topicIds, fontFamily) { - throw new Error('method must be implemented.'); - } - - changeFontStyleToTopic(topicsIds) { - throw new Error('method must be implemented.'); - } - - changeFontColorToTopic(topicsIds, color) { - throw new Error('method must be implemented.'); - } - - changeFontSizeToTopic(topicsIds, size) { - throw new Error('method must be implemented.'); - } - - changeBackgroundColorToTopic(topicsIds, color) { - throw new Error('method must be implemented.'); - } - - changeBorderColorToTopic(topicsIds, color) { - throw new Error('method must be implemented.'); - } - - changeShapeTypeToTopic(topicsIds, shapeType) { - throw new Error('method must be implemented.'); - } - - changeFontWeightToTopic(topicsIds) { - throw new Error('method must be implemented.'); - } - - changeTextToTopic(topicsIds, text) { - throw new Error('method must be implemented.'); - } - - shrinkBranch(topicsIds, collapse) { - throw new Error('method must be implemented.'); - } - - addFeatureToTopic(topicId, type, attributes) { - throw new Error('method must be implemented.'); - } - - changeFeatureToTopic(topicId, featureId, attributes) { - throw new Error('method must be implemented.'); - } - - removeFeatureFromTopic(topicId, featureId) { - throw new Error('method must be implemented.'); - } -} - -ActionDispatcher.setInstance = (dispatcher) => { - ActionDispatcher._instance = dispatcher; -}; - -ActionDispatcher.getInstance = () => ActionDispatcher._instance; - -export default ActionDispatcher; diff --git a/packages/mindplot/src/components/CentralTopic.js b/packages/mindplot/src/components/CentralTopic.js deleted file mode 100644 index 25fcfa00..00000000 --- a/packages/mindplot/src/components/CentralTopic.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Point } from '@wisemapping/web2d'; -import { $assert } from '@wisemapping/core-js'; -import Topic from './Topic'; -import Shape from './util/Shape'; - -class CentralTopic extends Topic { - _registerEvents() { - super._registerEvents(); - - // This disable the drag of the central topic. - // But solves the problem of deselecting the nodes when the screen is clicked. - this.addEvent('mousedown', (event) => { - event.stopPropagation(); - }); - } - - /** */ - workoutIncomingConnectionPoint() { - return this.getPosition(); - } - - /** */ - setCursor(type) { - super.setCursor(type === 'move' ? 'default' : type); - } - - /** */ - updateTopicShape() { } - - _updatePositionOnChangeSize() { - // Center main topic ... - const zeroPoint = new Point(0, 0); - this.setPosition(zeroPoint); - } - - /** */ - getShrinkConnector() { - return null; - } - - /** */ - workoutOutgoingConnectionPoint(targetPosition) { - $assert(targetPosition, 'targetPoint can not be null'); - const pos = this.getPosition(); - const isAtRight = Shape.isAtRight(targetPosition, pos); - const size = this.getSize(); - return Shape.calculateRectConnectionPoint(pos, size, !isAtRight); - } -} - -export default CentralTopic; diff --git a/packages/mindplot/src/components/Command.js b/packages/mindplot/src/components/Command.js deleted file mode 100644 index f259b7ea..00000000 --- a/packages/mindplot/src/components/Command.js +++ /dev/null @@ -1,57 +0,0 @@ -/* -* Copyright [2015] [wisemapping] -* -* Licensed under WiseMapping Public License, Version 1.0 (the "License"). -* It is basically the Apache License, Version 2.0 (the "License") plus the -* "powered by wisemapping" text requirement on every single page; -* you may not use this file except in compliance with the License. -* You may obtain a copy of the license at -* -* http://www.wisemapping.org/license -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -import { $defined } from '@wisemapping/core-js'; - -class Command { - /** - * @classdesc The command base class for handling do/undo mindmap operations - * @constructs - */ - constructor() { - this._id = Command._nextUUID(); - } - - // eslint-disable-next-line no-unused-vars - execute(commandContext) { - throw new Error('execute must be implemented.'); - } - - // eslint-disable-next-line no-unused-vars - undoExecute(commandContext) { - throw new Error('undo must be implemented.'); - } - - /** - * Returns the unique id of this command - * @returns {Number} command id - */ - getId() { - return this._id; - } -} - -Command._nextUUID = function _nextUUID() { - if (!$defined(Command._uuid)) { - Command._uuid = 1; - } - - Command._uuid += 1; - return Command._uuid; -}; - -export default Command; diff --git a/packages/mindplot/src/components/CommandContext.js b/packages/mindplot/src/components/CommandContext.js deleted file mode 100644 index f89bddb0..00000000 --- a/packages/mindplot/src/components/CommandContext.js +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import EventBus from './layout/EventBus'; -import NodeModel from './model/NodeModel'; - -class CommandContext { - constructor(designer) { - $assert(designer, 'designer can not be null'); - this._designer = designer; - } - - /** */ - findTopics(topicIds) { - $assert($defined(topicIds), 'topicsIds can not be null'); - const topicsIds = Array.isArray(topicIds) ? topicIds : [topicIds]; - const designerTopics = this._designer.getModel().getTopics(); - const result = designerTopics.filter((topic) => topicsIds.includes(topic.getId())); - - if (result.length !== topicsIds.length) { - const ids = designerTopics.map((topic) => topic.getId()); - $assert( - result.length === topicsIds.length, - `Could not find topic. Result:${result - } Filter Criteria:${topicsIds - } Current Topics: [${ids - }]`, - ); - } - return result; - } - - /** */ - deleteTopic(topic) { - this._designer.removeTopic(topic); - } - - /** */ - createTopic(model) { - $assert(model, 'model can not be null'); - return this._designer.nodeModelToNodeGraph(model); - } - - /** */ - createModel() { - const mindmap = this._designer.getMindmap(); - return mindmap.createNode(NodeModel.MAIN_TOPIC_TYPE); - } - - /** */ - addTopic(topic) { - const mindmap = this._designer.getMindmap(); - return mindmap.addBranch(topic.getModel()); - } - - /** */ - connect(childTopic, parentTopic) { - childTopic.connectTo(parentTopic, this._designer._workspace); - } - - /** */ - disconnect(topic) { - topic.disconnect(this._designer._workspace); - } - - /** */ - addRelationship(model) { - $assert(model, 'model cannot be null'); - return this._designer.addRelationship(model); - } - - /** */ - deleteRelationship(relationship) { - this._designer.deleteRelationship(relationship); - } - - /** */ - findRelationships(relationshipIds) { - $assert($defined(relationshipIds), 'relId can not be null'); - const relIds = Array.isArray(relationshipIds) ? relationshipIds : [relationshipIds]; - - const designerRel = this._designer.getModel().getRelationships(); - return designerRel.filter((rel) => relIds.includes(rel.getId())); - } - - /** */ - moveTopic(topic, position) { - $assert(topic, 'topic cannot be null'); - $assert(position, 'position cannot be null'); - EventBus.instance.fireEvent(EventBus.events.NodeMoveEvent, { - node: topic.getModel(), - position, - }); - } -} -// eslint-disable-next-line import/prefer-default-export -export default CommandContext; diff --git a/packages/mindplot/src/components/Designer.js b/packages/mindplot/src/components/Designer.js deleted file mode 100644 index 634fb3a4..00000000 --- a/packages/mindplot/src/components/Designer.js +++ /dev/null @@ -1,999 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import $ from 'jquery'; -import Messages, { $msg } from './Messages'; - -import Events from './Events'; -import StandaloneActionDispatcher from './StandaloneActionDispatcher'; - -import CommandContext from './CommandContext'; -import ActionDispatcher from './ActionDispatcher'; - -import DesignerModel from './DesignerModel'; -import DesignerKeyboard from './DesignerKeyboard'; - -import ScreenManager from './ScreenManager'; -import Workspace from './Workspace'; - -import DragConnector from './DragConnector'; -import DragManager from './DragManager'; -import RelationshipPivot from './RelationshipPivot'; -import Relationship from './Relationship'; - -import TopicEventDispatcher, { TopicEvent } from './TopicEventDispatcher'; -import TopicFeature from './TopicFeature'; - -import { create } from './NodeGraphUtils'; - -import EventBus from './layout/EventBus'; -import EventBusDispatcher from './layout/EventBusDispatcher'; - -import LayoutManager from './layout/LayoutManager'; - -import INodeModel, { TopicShape } from './model/INodeModel'; -import { $notify } from './widget/ToolbarNotifier'; - -class Designer extends Events { - constructor(options, divElement) { - $assert(options, 'options must be defined'); - $assert(options.zoom, 'zoom must be defined'); - $assert(options.size, 'size must be defined'); - $assert(divElement, 'divElement must be defined'); - super(); - - // Set up i18n location ... - Messages.init(options.locale); - - this._options = options; - - // Set full div elem render area ... - divElement.css(options.size); - - // Dispatcher manager ... - const commandContext = new CommandContext(this); - this._actionDispatcher = new StandaloneActionDispatcher(commandContext); - - const me = this; - this._actionDispatcher.addEvent('modelUpdate', (event) => { - me.fireEvent('modelUpdate', event); - }); - - ActionDispatcher.setInstance(this._actionDispatcher); - this._model = new DesignerModel(options); - - // Init Screen manager.. - const screenManager = new ScreenManager(divElement); - this._workspace = new Workspace(screenManager, this._model.getZoom()); - - // Init layout manager ... - this._eventBussDispatcher = new EventBusDispatcher(this.getModel()); - - // Register events - if (!this.isReadOnly()) { - // Register mouse events ... - this._registerMouseEvents(); - - // Register keyboard events ... - DesignerKeyboard.register(this); - - this._dragManager = this._buildDragManager(this._workspace); - } - this._registerWheelEvents(); - - this._relPivot = new RelationshipPivot(this._workspace, this); - - // Set editor working area ... - this.setViewPort(options.viewPort); - - TopicEventDispatcher.configure(this.isReadOnly()); - this._clipboard = []; - - // Hack: There are static reference to designer variable. Needs to be reviewed. - global.designer = this; - } - - /** - * @private - */ - _registerWheelEvents() { - const zoomFactor = 1.006; - const me = this; - // Zoom In and Zoom Out must active event - $(document).on('mousewheel', (event) => { - if (event.deltaY > 0) { - me.zoomIn(zoomFactor); - } else { - me.zoomOut(zoomFactor); - } - event.preventDefault(); - }); - } - - /** - * @param {String} type the event type - * @param {Function} listener - * forwards to the TopicEventDispatcher or the parent Events class, depending on the type - */ - addEvent(type, listener) { - if (type === TopicEvent.EDIT || type === TopicEvent.CLICK) { - const editor = TopicEventDispatcher.getInstance(); - editor.addEvent(type, listener); - } else { - super.addEvent(type, listener); - } - } - - /** - * @private - */ - _registerMouseEvents() { - const workspace = this._workspace; - const screenManager = workspace.getScreenManager(); - const me = this; - // Initialize workspace event listeners. - screenManager.addEvent('update', () => { - // Topic must be set to his original state. All editors must be closed. - const topics = me.getModel().getTopics(); - topics.forEach((object) => { - object.closeEditors(); - }); - - // Clean some selected nodes on event .. - if (me._cleanScreen) me._cleanScreen(); - }); - - // Deselect on click ... - screenManager.addEvent('click', (event) => { - me.onObjectFocusEvent(null, event); - }); - - // Create nodes on double click... - screenManager.addEvent('dblclick', (event) => { - if (workspace.isWorkspaceEventsEnabled()) { - const mousePos = screenManager.getWorkspaceMousePosition(event); - const centralTopic = me.getModel().getCentralTopic(); - const model = me._createChildModel(centralTopic, mousePos); - this._actionDispatcher.addTopics([model], [centralTopic.getId()]); - } - }); - } - - /** - * @private - * @param {mindplot.Workspace} workspace - * @return {mindplot.DragManager} the new dragManager for the workspace with events - * registered - */ - _buildDragManager(workspace) { - const designerModel = this.getModel(); - const dragConnector = new DragConnector(designerModel, this._workspace); - const dragManager = new DragManager(workspace, this._eventBussDispatcher); - const topics = designerModel.getTopics(); - - // Enable all mouse events. - dragManager.addEvent('startdragging', () => { - topics.forEach((topic) => topic.setMouseEventsEnabled(false)); - }); - - dragManager.addEvent('dragging', (event, dragTopic) => { - dragTopic.updateFreeLayout(event); - if (!dragTopic.isFreeLayoutOn(event)) { - // The node is being drag. Is the connection still valid ? - dragConnector.checkConnection(dragTopic); - - if (!dragTopic.isVisible() && dragTopic.isConnected()) { - dragTopic.setVisibility(true); - } - } - }); - - dragManager.addEvent('enddragging', (event, dragTopic) => { - topics.forEach((topic) => topic.setMouseEventsEnabled(true)); - dragTopic.applyChanges(workspace); - }); - - return dragManager; - } - - /** - * @param {{width:Number, height:Number}} size - * sets width and height of the workspace - */ - setViewPort(size) { - this._workspace.setViewPort(size); - const model = this.getModel(); - this._workspace.setZoom(model.getZoom(), true); - } - - /** - * @private - * @param {mindplot.model.NodeModel} model - * @param {Boolean} readOnly - * @return {mindplot.CentralTopic|mindplot.MainTopic} the topic to the given model, - * connected, added to the drag manager, with events registered - complying type & read mode - */ - _buildNodeGraph(model, readOnly) { - // Create node graph ... - const topic = create(model, { readOnly }); - this.getModel().addTopic(topic); - const me = this; - // Add Topic events ... - if (!readOnly) { - // If a node had gained focus, clean the rest of the nodes ... - topic.addEvent('mousedown', (event) => { - me.onObjectFocusEvent(topic, event); - }); - - // Register node listeners ... - if (topic.getType() !== INodeModel.CENTRAL_TOPIC_TYPE) { - // Central Topic doesn't support to be dragged - this._dragManager.add(topic); - } - } - - // Connect Topic ... - const isConnected = model.isConnected(); - if (isConnected) { - // Improve this ... - const targetTopicModel = model.getParent(); - - // Find target topic with the same model ... - const topics = this.getModel().getTopics(); - const targetTopic = topics.find((t) => t.getModel() === targetTopicModel); - if (targetTopic) { - model.disconnect(); - } else { - $assert(targetTopic, 'Could not find a topic to connect'); - } - topic.connectTo(targetTopic, this._workspace); - } - - topic.addEvent('ontblur', () => { - const topics = me.getModel().filterSelectedTopics(); - const rels = me.getModel().filterSelectedRelationships(); - - if (topics.length === 0 || rels.length === 0) { - me.fireEvent('onblur'); - } - }); - - topic.addEvent('ontfocus', () => { - const topics = me.getModel().filterSelectedTopics(); - const rels = me.getModel().filterSelectedRelationships(); - - if (topics.length === 1 || rels.length === 1) { - me.fireEvent('onfocus'); - } - }); - - return topic; - } - - /** - * @param {?mindplot.Topic} currentObject - * @param {Event=} event - * sets focus to the given currentObject and removes it from any other objects if not - * triggered with Ctrl pressed - */ - onObjectFocusEvent(currentObject, event) { - // Close node editors .. - const topics = this.getModel().getTopics(); - topics.forEach((topic) => topic.closeEditors()); - - const model = this.getModel(); - const objects = model.getEntities(); - objects.forEach((object) => { - // Disable all nodes on focus but not the current if Ctrl key isn't being pressed - if (!$defined(event) || (!event.ctrlKey && !event.metaKey)) { - if (object.isOnFocus() && object !== currentObject) { - object.setOnFocus(false); - } - } - }); - } - - /** sets focus to all model entities, i.e. relationships and topics */ - selectAll() { - const model = this.getModel(); - const objects = model.getEntities(); - objects.forEach((object) => { - object.setOnFocus(true); - }); - } - - /** removes focus from all model entities, i.e. relationships and topics */ - deselectAll() { - const objects = this.getModel().getEntities(); - objects.forEach((object) => { - object.setOnFocus(false); - }); - } - - /** - * Set the zoom of the map - * @param {Number} zoom number between 0.3 and 1.9 - */ - setZoom(zoom) { - if (zoom > 1.9 || zoom < 0.3) { - $notify($msg('ZOOM_IN_ERROR')); - return; - } - this.getModel().setZoom(zoom); - this._workspace.setZoom(zoom); - } - - /** - * @param {Number=} factor - * zoom out by the given factor, or 1.2, if undefined - */ - zoomOut(factor = 1.2) { - const model = this.getModel(); - const scale = model.getZoom() * factor; - if (scale <= 1.9) { - model.setZoom(scale); - this._workspace.setZoom(scale); - } else { - $notify($msg('ZOOM_ERROR')); - } - } - - /** - * @param {Number=} factor - * zoom in by the given factor, or 1.2, if undefined - */ - zoomIn(factor = 1.2) { - const model = this.getModel(); - const scale = model.getZoom() / factor; - - if (scale >= 0.3) { - model.setZoom(scale); - this._workspace.setZoom(scale); - } else { - $notify($msg('ZOOM_ERROR')); - } - } - - /** copy selected topics to a private clipboard */ - copyToClipboard() { - let topics = this.getModel().filterSelectedTopics(); - if (topics.length <= 0) { - // If there are more than one node selected, - $notify($msg('AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED')); - return; - } - - // Exclude central topic .. - topics = topics.filter((topic) => !topic.isCentralTopic()); - - this._clipboard = topics.map((topic) => { - const nodeModel = topic.getModel().deepCopy(); - - // Change position to make the new topic evident... - const pos = nodeModel.getPosition(); - nodeModel.setPosition(pos.x + 60 * Math.sign(pos.x), pos.y + 30); - - return nodeModel; - }); - - $notify($msg('SELECTION_COPIED_TO_CLIPBOARD')); - } - - /** paste clipboard contents to the mindmap */ - pasteClipboard() { - if (this._clipboard.length === 0) { - $notify($msg('CLIPBOARD_IS_EMPTY')); - return; - } - this._actionDispatcher.addTopics(this._clipboard); - this._clipboard = []; - } - - /** @return {mindplot.DesignerModel} model */ - getModel() { - return this._model; - } - - /** collapse the subtree of the selected topic */ - shrinkSelectedBranch() { - const nodes = this.getModel().filterSelectedTopics(); - if (nodes.length <= 0 || nodes.length !== 1) { - // If there are more than one node selected, - $notify($msg('ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE')); - return; - } - // Execute event ... - const topic = nodes[0]; - if (topic.getType() !== INodeModel.CENTRAL_TOPIC_TYPE) { - this._actionDispatcher.shrinkBranch([topic.getId()], !topic.areChildrenShrunken()); - } - } - - /** create a NodeModel for the selected node's child and add it via the ActionDispatcher */ - createChildForSelectedNode() { - const nodes = this.getModel().filterSelectedTopics(); - if (nodes.length <= 0) { - // If there are more than one node selected, - $notify($msg('ONE_TOPIC_MUST_BE_SELECTED')); - return; - } - if (nodes.length !== 1) { - // If there are more than one node selected, - $notify($msg('ONLY_ONE_TOPIC_MUST_BE_SELECTED')); - return; - } - - // Add new node ... - const parentTopic = nodes[0]; - const parentTopicId = parentTopic.getId(); - const childModel = this._createChildModel(parentTopic); - - // Execute event ... - this._actionDispatcher.addTopics([childModel], [parentTopicId]); - } - - /** - * @private - */ - _copyNodeProps(sourceModel, targetModel) { - // I don't copy the font size if the target is the source is the central topic. - if (sourceModel.getType() !== INodeModel.CENTRAL_TOPIC_TYPE) { - const fontSize = sourceModel.getFontSize(); - if (fontSize) { - targetModel.setFontSize(fontSize); - } - } - - const fontFamily = sourceModel.getFontFamily(); - if (fontFamily) { - targetModel.setFontFamily(fontFamily); - } - - const fontColor = sourceModel.getFontColor(); - if (fontColor) { - targetModel.setFontColor(fontColor); - } - - const fontWeight = sourceModel.getFontWeight(); - if (fontWeight) { - targetModel.setFontWeight(fontWeight); - } - - const fontStyle = sourceModel.getFontStyle(); - if (fontStyle) { - targetModel.setFontStyle(fontStyle); - } - - const shape = sourceModel.getShapeType(); - if (shape) { - targetModel.setShapeType(shape); - } - - const borderColor = sourceModel.getBorderColor(); - if (borderColor) { - targetModel.setBorderColor(borderColor); - } - - const backgroundColor = sourceModel.getBackgroundColor(); - if (backgroundColor) { - targetModel.setBackgroundColor(backgroundColor); - } - } - - /** - * @private - * @param {Topic} topic the parent topic of the child to create the NodeModel for - * @param {Point} mousePos the mouse position - * @return {NodeModel} the node model for the new child - */ - _createChildModel(topic, mousePos) { - // Create a new node ... - const parentModel = topic.getModel(); - const mindmap = parentModel.getMindmap(); - const childModel = mindmap.createNode(); - - // Create a new node ... - const layoutManager = this._eventBussDispatcher.getLayoutManager(); - const result = layoutManager.predict(topic.getId(), null, mousePos); - childModel.setOrder(result.order); - - const { position } = result; - childModel.setPosition(position.x, position.y); - - this._copyNodeProps(parentModel, childModel); - - return childModel; - } - - addDraggedNode(event, model) { - $assert(event, 'event can not be null'); - $assert(model, 'model can not be null'); - - // Position far from the visual area ... - model.setPosition(1000, 1000); - - this._actionDispatcher.addTopics([model]); - const topic = this.getModel().findTopicById(model.getId()); - - // Simulate a mouse down event to start the dragging ... - topic.fireEvent('mousedown', event); - } - - /** - * creates a sibling or child node of the selected node, if the selected node is the - * central topic - */ - createSiblingForSelectedNode() { - const nodes = this.getModel().filterSelectedTopics(); - if (nodes.length <= 0) { - // If there are no nodes selected, - $notify($msg('ONE_TOPIC_MUST_BE_SELECTED')); - return; - } - if (nodes.length > 1) { - // If there are more than one node selected, - $notify($msg('ONLY_ONE_TOPIC_MUST_BE_SELECTED')); - return; - } - - const topic = nodes[0]; - if (!topic.getOutgoingConnectedTopic()) { - // Central topic and isolated topics .... - // Central topic doesn't have siblings ... - this.createChildForSelectedNode(); - } else { - const parentTopic = topic.getOutgoingConnectedTopic(); - const siblingModel = this._createSiblingModel(topic); - - // Hack: if parent is central topic, add node below not on opposite side. - // This should be done in the layout - if (parentTopic.getType() === INodeModel.CENTRAL_TOPIC_TYPE) { - siblingModel.setOrder(topic.getOrder() + 2); - } - - const parentTopicId = parentTopic.getId(); - this._actionDispatcher.addTopics([siblingModel], [parentTopicId]); - } - } - - /** - * @private - * @param {mindplot.Topic} topic the topic to create the sibling to - * @return {mindplot.NodeModel} the node model of the sibling - */ - _createSiblingModel(topic) { - let result = null; - let model = null; - const parentTopic = topic.getOutgoingConnectedTopic(); - if (parentTopic != null) { - // Create a new node ... - model = topic.getModel(); - const mindmap = model.getMindmap(); - result = mindmap.createNode(); - - // Create a new node ... - const order = topic.getOrder() + 1; - result.setOrder(order); - result.setPosition(10, 10); // Set a dummy position ... - } - - this._copyNodeProps(model, result); - - return result; - } - - /** - * @param {Event} event - */ - showRelPivot(event) { - const nodes = this.getModel().filterSelectedTopics(); - if (nodes.length <= 0) { - // This could not happen ... - $notify($msg('RELATIONSHIP_COULD_NOT_BE_CREATED')); - return; - } - - // Current mouse position .... - const screen = this._workspace.getScreenManager(); - const pos = screen.getWorkspaceMousePosition(event); - - // create a connection ... - this._relPivot.start(nodes[0], pos); - } - - /** @return {{zoom:Number}} the zoom */ - getMindmapProperties() { - const model = this.getModel(); - return { zoom: model.getZoom() }; - } - - /** - * @param {mindplot.Mindmap} model - * @throws will throw an error if mindmapModel is null or undefined - */ - loadMap(model) { - $assert(model, 'mindmapModel can not be null'); - this._mindmap = model; - - // Init layout manager ... - const size = { width: 25, height: 25 }; - const layoutManager = new LayoutManager(model.getCentralTopic().getId(), size); - const me = this; - layoutManager.addEvent('change', (event) => { - const id = event.getId(); - const topic = me.getModel().findTopicById(id); - topic.setPosition(event.getPosition()); - topic.setOrder(event.getOrder()); - }); - this._eventBussDispatcher.setLayoutManager(layoutManager); - - // Building node graph ... - const branches = model.getBranches(); - branches.forEach((branch) => { - const nodeGraph = this.nodeModelToNodeGraph(branch); - nodeGraph.setBranchVisibility(true); - }); - - // Connect relationships ... - const relationships = model.getRelationships(); - relationships.forEach((relationship) => this._relationshipModelToRelationship(relationship)); - - // Place the focus on the Central Topic - const centralTopic = this.getModel().getCentralTopic(); - this.goToNode(centralTopic); - - // Finally, sort the map ... - EventBus.instance.fireEvent(EventBus.events.DoLayout); - - this.fireEvent('loadSuccess'); - } - - /** */ - getMindmap() { - return this._mindmap; - } - - /** */ - undo() { - // @Todo: This is a hack... - this._actionDispatcher._actionRunner.undo(); - } - - /** */ - redo() { - this._actionDispatcher._actionRunner.redo(); - } - - /** */ - isReadOnly() { - return this._options.readOnly; - } - - /** - * @param {mindplot.model.NodeModel} nodeModel - * @return {mindplot.Topic} the topic (extends mindplot.NodeGraph) created to the model - */ - nodeModelToNodeGraph(nodeModel) { - $assert(nodeModel, 'Node model can not be null'); - let children = nodeModel.getChildren().slice(); - children = children.sort((a, b) => a.getOrder() - b.getOrder()); - - const result = this._buildNodeGraph(nodeModel, this.isReadOnly()); - result.setVisibility(false); - - this._workspace.append(result); - children.forEach((child) => { - if ($defined(child)) { - this.nodeModelToNodeGraph(child); - } - }); - return result; - } - - /** - * @private - * @param {mindplot.model.RelationshipModel} model - * @return {mindplot.Relationship} the relationship created to the model - * @throws will throw an error if model is null or undefined - */ - _relationshipModelToRelationship(model) { - $assert(model, 'Node model can not be null'); - - const result = this._buildRelationshipShape(model); - - const sourceTopic = result.getSourceTopic(); - sourceTopic.addRelationship(result); - - const targetTopic = result.getTargetTopic(); - targetTopic.addRelationship(result); - - result.setVisibility(sourceTopic.isVisible() && targetTopic.isVisible()); - - this._workspace.append(result); - return result; - } - - /** - * @param {mindplot.model.RelationshipModel} model - * @return {mindplot.Relationship} the relationship added to the mindmap - */ - addRelationship(model) { - const mindmap = this.getMindmap(); - mindmap.addRelationship(model); - return this._relationshipModelToRelationship(model); - } - - /** - * deletes the relationship from the linked topics, DesignerModel, Workspace and Mindmap - * @param {mindplot.Relationship} rel the relationship to delete - */ - deleteRelationship(rel) { - const sourceTopic = rel.getSourceTopic(); - sourceTopic.deleteRelationship(rel); - - const targetTopic = rel.getTargetTopic(); - targetTopic.deleteRelationship(rel); - - this.getModel().removeRelationship(rel); - this._workspace.removeChild(rel); - - const mindmap = this.getMindmap(); - mindmap.deleteRelationship(rel.getModel()); - } - - /** - * @private - * @param {mindplot.model.RelationshipModel} model - * @return {mindplot.Relationship} the new relationship with events registered - * @throws will throw an error if the target topic cannot be found - */ - _buildRelationshipShape(model) { - const dmodel = this.getModel(); - - const sourceTopicId = model.getFromNode(); - const sourceTopic = dmodel.findTopicById(sourceTopicId); - - const targetTopicId = model.getToNode(); - const targetTopic = dmodel.findTopicById(targetTopicId); - $assert( - targetTopic, - `targetTopic could not be found:${targetTopicId},${dmodel - .getTopics() - .map((e) => e.getId())}`, - ); - - // Build relationship line .... - const result = new Relationship(sourceTopic, targetTopic, model); - const me = this; - - result.addEvent('ontblur', () => { - const topics = me.getModel().filterSelectedTopics(); - const rels = me.getModel().filterSelectedRelationships(); - - if (topics.length === 0 || rels.length === 0) { - me.fireEvent('onblur'); - } - }); - - result.addEvent('ontfocus', () => { - const topics = me.getModel().filterSelectedTopics(); - const rels = me.getModel().filterSelectedRelationships(); - - if (topics.length === 1 || rels.length === 1) { - me.fireEvent('onfocus'); - } - }); - - // Append it to the workspace ... - dmodel.addRelationship(result); - - return result; - } - - /** - * @param {mindplot.Topic} node the topic to remove - * removes the given topic and its children from Workspace, DesignerModel and NodeModel - */ - removeTopic(node) { - if (!node.isCentralTopic()) { - const parent = node._parent; - node.disconnect(this._workspace); - - // remove children - while (node.getChildren().length > 0) { - this.removeTopic(node.getChildren()[0]); - } - - this._workspace.removeChild(node); - this.getModel().removeTopic(node); - - // Delete this node from the model... - const model = node.getModel(); - model.deleteNode(); - - if ($defined(parent)) { - this.goToNode(parent); - } - } - } - - /** - * @private - */ - _resetEdition() { - const screenManager = this._workspace.getScreenManager(); - screenManager.fireEvent('update'); - screenManager.fireEvent('mouseup'); - this._relPivot.dispose(); - } - - /** */ - deleteSelectedEntities() { - // Is there some action in progress ?. - this._resetEdition(); - - const topics = this.getModel().filterSelectedTopics(); - const relation = this.getModel().filterSelectedRelationships(); - if (topics.length <= 0 && relation.length <= 0) { - // If there are more than one node selected, - $notify($msg('ENTITIES_COULD_NOT_BE_DELETED')); - return; - } - if (topics.length === 1 && topics[0].isCentralTopic()) { - $notify($msg('CENTRAL_TOPIC_CAN_NOT_BE_DELETED')); - return; - } - - // If the central topic has been selected, I must filter ir - const topicIds = topics - .filter((topic) => !topic.isCentralTopic()) - .map((topic) => topic.getId()); - - const relIds = relation.map((rel) => rel.getId()); - - // Finally delete the topics ... - if (topicIds.length > 0 || relIds.length > 0) { - this._actionDispatcher.deleteEntities(topicIds, relIds); - } - } - - /** */ - changeFontFamily(font) { - const topicsIds = this.getModel().filterTopicsIds(); - if (topicsIds.length > 0) { - this._actionDispatcher.changeFontFamilyToTopic(topicsIds, font); - } - } - - /** */ - changeFontStyle() { - const topicsIds = this.getModel().filterTopicsIds(); - if (topicsIds.length > 0) { - this._actionDispatcher.changeFontStyleToTopic(topicsIds); - } - } - - /** */ - changeFontColor(color) { - $assert(color, 'color can not be null'); - - const topicsIds = this.getModel().filterTopicsIds(); - if (topicsIds.length > 0) { - this._actionDispatcher.changeFontColorToTopic(topicsIds, color); - } - } - - /** */ - changeBackgroundColor(color) { - const validateFunc = (topic) => topic.getShapeType() !== TopicShape.LINE; - const validateError = 'Color can not be set to line topics.'; - - const topicsIds = this.getModel().filterTopicsIds(validateFunc, validateError); - if (topicsIds.length > 0) { - this._actionDispatcher.changeBackgroundColorToTopic(topicsIds, color); - } - } - - /** */ - changeBorderColor(color) { - const validateFunc = (topic) => topic.getShapeType() !== TopicShape.LINE; - const validateError = 'Color can not be set to line topics.'; - const topicsIds = this.getModel().filterTopicsIds(validateFunc, validateError); - if (topicsIds.length > 0) { - this._actionDispatcher.changeBorderColorToTopic(topicsIds, color); - } - } - - /** */ - changeFontSize(size) { - const topicsIds = this.getModel().filterTopicsIds(); - if (topicsIds.length > 0) { - this._actionDispatcher.changeFontSizeToTopic(topicsIds, size); - } - } - - /** */ - changeTopicShape(shape) { - const validateFunc = (topic) => !( - topic.getType() === INodeModel.CENTRAL_TOPIC_TYPE && shape === TopicShape.LINE - ); - - const validateError = 'Central Topic shape can not be changed to line figure.'; - const topicsIds = this.getModel().filterTopicsIds(validateFunc, validateError); - if (topicsIds.length > 0) { - this._actionDispatcher.changeShapeTypeToTopic(topicsIds, shape); - } - } - - /** */ - changeFontWeight() { - const topicsIds = this.getModel().filterTopicsIds(); - if (topicsIds.length > 0) { - this._actionDispatcher.changeFontWeightToTopic(topicsIds); - } - } - - /** */ - addIconType(iconType) { - const topicsIds = this.getModel().filterTopicsIds(); - if (topicsIds.length > 0) { - this._actionDispatcher.addFeatureToTopic(topicsIds[0], TopicFeature.Icon.id, { - id: iconType, - }); - } - } - - /** - * lets the selected topic open the link editor where the user can define or modify an - * existing link - */ - addLink() { - const model = this.getModel(); - const topic = model.selectedTopic(); - if (topic) { - topic.showLinkEditor(); - this.onObjectFocusEvent(); - } - } - - /** */ - addNote() { - const model = this.getModel(); - const topic = model.selectedTopic(); - if (topic) { - topic.showNoteEditor(); - this.onObjectFocusEvent(); - } - } - - /** - * @param {mindplot.Topic} node - * sets the focus to the given node - */ - goToNode(node) { - node.setOnFocus(true); - this.onObjectFocusEvent(node); - } - - /** @return {mindplot.Workspace} */ - getWorkSpace() { - return this._workspace; - } -} - -export default Designer; diff --git a/packages/mindplot/src/components/DesignerKeyboard.js b/packages/mindplot/src/components/DesignerKeyboard.js deleted file mode 100644 index 0c8bae05..00000000 --- a/packages/mindplot/src/components/DesignerKeyboard.js +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import $ from 'jquery'; -import { $assert } from '@wisemapping/core-js'; -import Keyboard from './Keyboard'; - -class DesignerKeyboard extends Keyboard { - constructor(designer) { - super(designer); - $assert(designer, 'designer can not be null'); - this._registerEvents(designer); - } - - _registerEvents(designer) { - // Try with the keyboard .. - const model = designer.getModel(); - this.addShortcut( - ['backspace'], (event) => { - event.preventDefault(); - event.stopPropagation(); - designer.deleteSelectedEntities(); - }, - ); - this.addShortcut( - ['space'], () => { - designer.shrinkSelectedBranch(); - }, - ); - this.addShortcut( - ['f2'], (event) => { - event.stopPropagation(); - event.preventDefault(); - const node = model.selectedTopic(); - if (node) { - node.showTextEditor(); - } - }, - ); - this.addShortcut( - ['del'], (event) => { - designer.deleteSelectedEntities(); - event.preventDefault(); - event.stopPropagation(); - }, - ); - this.addShortcut( - ['enter'], () => { - designer.createSiblingForSelectedNode(); - }, - ); - this.addShortcut( - ['insert'], (event) => { - designer.createChildForSelectedNode(); - event.preventDefault(); - event.stopPropagation(); - }, - ); - this.addShortcut( - ['tab'], (event) => { - designer.createChildForSelectedNode(); - event.preventDefault(); - event.stopPropagation(); - }, - ); - this.addShortcut( - ['meta+enter'], (event) => { - event.preventDefault(); - event.stopPropagation(); - designer.createChildForSelectedNode(); - }, - ); - this.addShortcut( - ['ctrl+z', 'meta+z'], (event) => { - event.preventDefault(event); - event.stopPropagation(); - designer.undo(); - }, - ); - this.addShortcut( - ['ctrl+c', 'meta+c'], (event) => { - event.preventDefault(event); - event.stopPropagation(); - designer.copyToClipboard(); - }, - ); - this.addShortcut( - ['ctrl+v', 'meta+v'], (event) => { - event.preventDefault(event); - event.stopPropagation(); - designer.pasteClipboard(); - }, - ); - this.addShortcut( - ['ctrl+shift+z', 'meta+shift+z', 'ctrl+y', 'meta+y'], (event) => { - event.preventDefault(); - event.stopPropagation(); - designer.redo(); - }, - ); - this.addShortcut( - ['ctrl+a', 'meta+a'], (event) => { - event.preventDefault(); - event.stopPropagation(); - designer.selectAll(); - }, - ); - this.addShortcut( - ['ctrl+b', 'meta+b'], (event) => { - event.preventDefault(); - event.stopPropagation(); - - designer.changeFontWeight(); - }, - ); - this.addShortcut( - ['ctrl+s', 'meta+s'], (event) => { - event.preventDefault(); - event.stopPropagation(); - $(document).find('#save').trigger('click'); - }, - ); - this.addShortcut( - ['ctrl+i', 'meta+i'], (event) => { - event.preventDefault(); - event.stopPropagation(); - - designer.changeFontStyle(); - }, - ); - this.addShortcut( - ['ctrl+shift+a', 'meta+shift+a'], (event) => { - event.preventDefault(); - event.stopPropagation(); - - designer.deselectAll(); - }, - ); - this.addShortcut( - ['meta+=', 'ctrl+='], (event) => { - event.preventDefault(); - event.stopPropagation(); - - designer.zoomIn(); - }, - ); - this.addShortcut( - ['meta+-', 'ctrl+-'], (event) => { - event.preventDefault(); - event.stopPropagation(); - - designer.zoomOut(); - }, - ); - const me = this; - this.addShortcut( - 'right', (event) => { - const node = model.selectedTopic(); - if (node) { - if (node.isCentralTopic()) { - me._goToSideChild(designer, node, 'RIGHT'); - } else if (node.getPosition().x < 0) { - me._goToParent(designer, node); - } else if (!node.areChildrenShrunken()) { - me._goToChild(designer, node); - } - } else { - const centralTopic = model.getCentralTopic(); - me._goToNode(designer, centralTopic); - } - event.preventDefault(); - event.stopPropagation(); - }, - ); - this.addShortcut( - 'left', (event) => { - const node = model.selectedTopic(); - if (node) { - if (node.isCentralTopic()) { - me._goToSideChild(designer, node, 'LEFT'); - } else if (node.getPosition().x > 0) { - me._goToParent(designer, node); - } else if (!node.areChildrenShrunken()) { - me._goToChild(designer, node); - } - } else { - const centralTopic = model.getCentralTopic(); - me._goToNode(designer, centralTopic); - } - event.preventDefault(); - event.stopPropagation(); - }, - ); - this.addShortcut( - 'up', (event) => { - const node = model.selectedTopic(); - if (node) { - if (!node.isCentralTopic()) { - me._goToBrother(designer, node, 'UP'); - } - } else { - const centralTopic = model.getCentralTopic(); - me._goToNode(designer, centralTopic); - } - event.preventDefault(); - event.stopPropagation(); - }, - ); - this.addShortcut( - 'down', (event) => { - const node = model.selectedTopic(); - if (node) { - if (!node.isCentralTopic()) { - me._goToBrother(designer, node, 'DOWN'); - } - } else { - const centralTopic = model.getCentralTopic(); - me._goToNode(designer, centralTopic); - } - event.preventDefault(); - event.stopPropagation(); - }, - ); - const excludes = ['esc', 'escape', 'f1', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12']; - - $(document).on('keypress', (event) => { - let keyCode; - // Firefox doesn't skip special keys for keypress event... - if (event.key && excludes.includes(event.key.toLowerCase())) { - return; - } - // Sometimes Firefox doesn't contain keyCode value - if (event.key && event.keyCode === 0) { - keyCode = event.charCode; - } else { - keyCode = event.keyCode; - } - - const specialKey = $.hotkeys.specialKeys[keyCode]; - if (['enter', 'capslock'].indexOf(specialKey) === -1 && !$.hotkeys.shiftNums[keyCode]) { - const nodes = designer.getModel().filterSelectedTopics(); - if (nodes.length > 0) { - // If a modifier is press, the key selected must be ignored. - const pressKey = String.fromCharCode(keyCode); - if (event.ctrlKey || event.altKey || event.metaKey) { - return; - } - nodes[0].showTextEditor(pressKey); - event.stopPropagation(); - } - } - }); - } - - _goToBrother(designer, node, direction) { - const parent = node.getParent(); - if (parent) { - const brothers = parent.getChildren(); - - let target = node; - const { y } = node.getPosition(); - const { x } = node.getPosition(); - let dist = null; - for (let i = 0; i < brothers.length; i++) { - const sameSide = (x * brothers[i].getPosition().x) >= 0; - if (brothers[i] !== node && sameSide) { - const brother = brothers[i]; - const brotherY = brother.getPosition().y; - if (direction === 'DOWN' && brotherY > y) { - let distancia = y - brotherY; - if (distancia < 0) { - distancia *= (-1); - } - if (dist == null || dist > distancia) { - dist = distancia; - target = brothers[i]; - } - } else if (direction === 'UP' && brotherY < y) { - let distance = y - brotherY; - if (distance < 0) { - distance *= (-1); - } - if (dist == null || dist > distance) { - dist = distance; - target = brothers[i]; - } - } - } - } - this._goToNode(designer, target); - } - } - - _goToSideChild(designer, node, side) { - const children = node.getChildren(); - if (children.length > 0) { - let target = children[0]; - let top = null; - for (let i = 0; i < children.length; i++) { - const child = children[i]; - const childY = child.getPosition().y; - if (side === 'LEFT' && child.getPosition().x < 0) { - if (top == null || childY < top) { - target = child; - top = childY; - } - } - if (side === 'RIGHT' && child.getPosition().x > 0) { - if (top == null || childY < top) { - target = child; - top = childY; - } - } - } - - this._goToNode(designer, target); - } - } - - _goToParent(designer, node) { - const parent = node.getParent(); - if (parent) { - this._goToNode(designer, parent); - } - } - - _goToChild(designer, node) { - const children = node.getChildren(); - if (children.length > 0) { - let target = children[0]; - let top = target.getPosition().y; - for (let i = 0; i < children.length; i++) { - const child = children[i]; - if (child.getPosition().y < top) { - top = child.getPosition().y; - target = child; - } - } - this._goToNode(designer, target); - } - } - - _goToNode(designer, node) { - // First deselect all the nodes ... - designer.deselectAll(); - - // Give focus to the selected node.... - node.setOnFocus(true); - } -} - -DesignerKeyboard.specialKeys = { - 8: 'backspace', - 9: 'tab', - 10: 'return', - 13: 'enter', - 16: 'shift', - 17: 'ctrl', - 18: 'alt', - 19: 'pause', - 20: 'capslock', - 27: 'esc', - 32: 'space', - 33: 'pageup', - 34: 'pagedown', - 35: 'end', - 36: 'home', - 37: 'left', - 38: 'up', - 39: 'right', - 40: 'down', - 45: 'insert', - 46: 'del', - 96: '0', - 97: '1', - 98: '2', - 99: '3', - 100: '4', - 101: '5', - 102: '6', - 103: '7', - 104: '8', - 105: '9', - 106: '*', - 107: '+', - 109: '-', - 110: '.', - 111: '/', - 112: 'f1', - 113: 'f2', - 114: 'f3', - 115: 'f4', - 116: 'f5', - 117: 'f6', - 118: 'f7', - 119: 'f8', - 120: 'f9', - 121: 'f10', - 122: 'f11', - 123: 'f12', - 144: 'numlock', - 145: 'scroll', - 186: ';', - 191: '/', - 220: '\\', - 222: "'", - 224: 'meta', -}; - -DesignerKeyboard.register = function register(designer) { - this._instance = new DesignerKeyboard(designer); -}; - -DesignerKeyboard.getInstance = function getInstance() { - return this._instance; -}; - -export default DesignerKeyboard; diff --git a/packages/mindplot/src/components/DesignerModel.js b/packages/mindplot/src/components/DesignerModel.js deleted file mode 100644 index cce4674a..00000000 --- a/packages/mindplot/src/components/DesignerModel.js +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import Events from './Events'; -import { $notify } from './widget/ToolbarNotifier'; - -class DesignerModel extends Events { - constructor(options) { - super(); - this._zoom = options.zoom; - this._topics = []; - this._relationships = []; - } - - /** @return {Number} zoom between 0.3 (largest text) and 1.9 */ - getZoom() { - return this._zoom; - } - - /** @param {Number} zoom number between 0.3 and 1.9 to set the zoom to */ - setZoom(zoom) { - this._zoom = zoom; - } - - /** @return {@link mindplot.Topic[]} all topics */ - getTopics() { - return this._topics; - } - - /** @return {mindplot.Relationship[]} all relationships */ - getRelationships() { - return this._relationships; - } - - /** @return {mindplot.CentralTopic} the central topic */ - getCentralTopic() { - const topics = this.getTopics(); - return topics[0]; - } - - /** @return {mindplot.Topic[]} selected topics */ - filterSelectedTopics() { - const result = []; - for (let i = 0; i < this._topics.length; i++) { - if (this._topics[i].isOnFocus()) { - result.push(this._topics[i]); - } - } - return result; - } - - /** - * @return {mindplot.Relationship[]} selected relationships - */ - filterSelectedRelationships() { - const result = []; - for (let i = 0; i < this._relationships.length; i++) { - if (this._relationships[i].isOnFocus()) { - result.push(this._relationships[i]); - } - } - return result; - } - - /** - * @return {Array.} all topics and relationships - */ - getEntities() { - let result = [].concat(this._topics); - result = result.concat(this._relationships); - return result; - } - - /** - * removes occurrences of the given topic from the topic array - * @param {mindplot.Topic} topic the topic to remove - */ - removeTopic(topic) { - $assert(topic, 'topic can not be null'); - this._topics = this._topics.filter((t) => t !== topic); - } - - /** - * removes occurrences of the given relationship from the relationship array - * @param {mindplot.Relationship} rel the relationship to remove - */ - removeRelationship(rel) { - $assert(rel, 'rel can not be null'); - this._relationships = this._relationships.filter((r) => r !== rel); - } - - /** - * adds the given topic to the topic array - * @param {mindplot.Topic} topic the topic to add - * @throws will throw an error if topic is null or undefined - * @throws will throw an error if the topic's id is not a number - */ - addTopic(topic) { - $assert(topic, 'topic can not be null'); - $assert(typeof topic.getId() === 'number', `id is not a number:${topic.getId()}`); - this._topics.push(topic); - } - - /** - * adds the given relationship to the relationship array - * @param {mindplot.Relationship} rel the relationship to add - * @throws will throw an error if rel is null or undefined - */ - addRelationship(rel) { - $assert(rel, 'rel can not be null'); - this._relationships.push(rel); - } - - /** - * @param {Function=} validate a function to validate nodes - * @param {String=} errorMsg an error message to display if the validation fails - * @return {String} returns an array of the selected (and, if applicable, valid) topics' ids - */ - filterTopicsIds(validate, errorMsg) { - const result = []; - const topics = this.filterSelectedTopics(); - - let isValid = true; - for (let i = 0; i < topics.length; i++) { - const selectedNode = topics[i]; - if ($defined(validate)) { - isValid = validate(selectedNode); - } - - // Add node only if it's valid. - if (isValid) { - result.push(selectedNode.getId()); - } else { - $notify(errorMsg); - } - } - return result; - } - - /** - * @return {mindplot.Topic} the first selected topic if one or more are found by the - * filterSelectedTopics function, null otherwise - */ - selectedTopic() { - const topics = this.filterSelectedTopics(); - return (topics.length > 0) ? topics[0] : null; - } - - /** - * @param {String} id the id of the topic to be retrieved - * @return {mindplot.Topic} the topic with the respective id - */ - findTopicById(id) { - let result = null; - for (let i = 0; i < this._topics.length; i++) { - const topic = this._topics[i]; - if (topic.getId() === id) { - result = topic; - break; - } - } - return result; - } -} - -export default DesignerModel; diff --git a/packages/mindplot/src/components/Events.js b/packages/mindplot/src/components/Events.js deleted file mode 100644 index ddd48836..00000000 --- a/packages/mindplot/src/components/Events.js +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -class Events { - constructor() { - this.$events = {}; - } - - static _removeOn(string) { - return string.replace(/^on([A-Z])/, (full, first) => first.toLowerCase()); - } - - addEvent(typeName, fn, internal) { - const type = Events._removeOn(typeName); - - // Add function had not been added yet - const funByType = this.$events[type] ? this.$events[type] : []; - if (!funByType.includes(fn)) { - funByType.push(fn); - this.$events[type] = funByType; - } - - // Mark reference ... - // eslint-disable-next-line no-param-reassign - fn.internal = Boolean(internal); - return this; - } - - fireEvent(typeName, eventArgs, delay) { - const type = Events._removeOn(typeName); - const events = this.$events[type]; - if (!events) return this; - - const args = Array.isArray(eventArgs) ? eventArgs : [eventArgs]; - events.forEach(((fn) => { - if (delay) { - fn.delay(delay, this, args); - } else { - fn.apply(this, args); - } - })); - return this; - } - - removeEvent(typeName, fn) { - const type = Events._removeOn(typeName); - const events = this.$events[type]; - if (events && !fn.internal) { - const index = events.indexOf(fn); - if (index !== -1) events.splice(index, 1); - } - return this; - } -} - -export default Events; diff --git a/packages/mindplot/src/components/Keyboard.js b/packages/mindplot/src/components/Keyboard.js deleted file mode 100644 index 30b97144..00000000 --- a/packages/mindplot/src/components/Keyboard.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import $ from 'jquery'; - -class Keyboard { - addShortcut(shortcuts, callback) { - const shortcutsArray = Array.isArray(shortcuts) ? shortcuts : [shortcuts]; - shortcutsArray.forEach((shortcut) => { - $(document).bind('keydown', shortcut, callback); - }); - } -} - -export default Keyboard; diff --git a/packages/mindplot/src/components/LocalStorageManager.js b/packages/mindplot/src/components/LocalStorageManager.js deleted file mode 100644 index ce8b28bb..00000000 --- a/packages/mindplot/src/components/LocalStorageManager.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import $ from 'jquery'; -import PersistenceManager from './PersistenceManager'; - -class LocalStorageManager extends PersistenceManager { - constructor(documentUrl, forceLoad) { - super(); - this.documentUrl = documentUrl; - this.forceLoad = forceLoad; - } - - saveMapXml(mapId, mapXml, pref, saveHistory, events) { - localStorage.setItem(`${mapId}-xml`, mapXml); - } - - discardChanges(mapId) { - localStorage.removeItem(`${mapId}-xml`); - } - - loadMapDom(mapId) { - let xml = localStorage.getItem(`${mapId}-xml`); - if (xml == null || this.forceLoad) { - $.ajax({ - url: this.documentUrl.replace('{id}', mapId), - headers: { 'Content-Type': 'text/plain', Accept: 'application/xml' }, - type: 'get', - dataType: 'text', - async: false, - success(response) { - xml = response; - }, - }); - // If I could not load it from a file, hard code one. - if (xml == null) { - throw new Error('Map could not be loaded'); - } - } - - return $.parseXML(xml); - } - - unlockMap(mindmap) { - // Ignore, no implementation required ... - } -} - -export default LocalStorageManager; diff --git a/packages/mindplot/src/components/MainTopic.js b/packages/mindplot/src/components/MainTopic.js deleted file mode 100644 index 12c3f37c..00000000 --- a/packages/mindplot/src/components/MainTopic.js +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import { Point, Group } from '@wisemapping/web2d'; - -import Topic from './Topic'; -import { TopicShape } from './model/INodeModel'; -import Shape from './util/Shape'; - -class MainTopic extends Topic { - /** - * @extends mindplot.Topic - * @constructs - * @param model - * @param options - */ - constructor(model, options) { - super(model, options); - this.INNER_RECT_ATTRIBUTES = { stroke: '0.5 solid #009900' }; - } - - _buildDragShape() { - const innerShape = this._buildShape(this.INNER_RECT_ATTRIBUTES, this.getShapeType()); - const size = this.getSize(); - innerShape.setSize(size.width, size.height); - innerShape.setPosition(0, 0); - innerShape.setOpacity(0.5); - innerShape.setCursor('default'); - innerShape.setVisibility(true); - - const brColor = this.getBorderColor(); - innerShape.setAttribute('strokeColor', brColor); - - const bgColor = this.getBackgroundColor(); - innerShape.setAttribute('fillColor', bgColor); - - // Create group ... - const groupAttributes = { - width: 100, - height: 100, - coordSizeWidth: 100, - coordSizeHeight: 100, - }; - const group = new Group(groupAttributes); - group.append(innerShape); - - // Add Text ... - if (this.getShapeType() !== TopicShape.IMAGE) { - const textShape = this._buildTextShape(true); - const text = this.getText(); - textShape.setText(text); - textShape.setOpacity(0.5); - group.append(textShape); - } - return group; - } - - /** */ - // eslint-disable-next-line no-unused-vars - updateTopicShape(targetTopic, workspace) { - // Change figure based on the connected topic ... - const model = this.getModel(); - let shapeType = model.getShapeType(); - if (!targetTopic.isCentralTopic()) { - if (!$defined(shapeType)) { - // Get the real shape type ... - shapeType = this.getShapeType(); - this._setShapeType(shapeType, false); - } - } - } - - /** */ - disconnect(workspace) { - super.disconnect(workspace); - const model = this.getModel(); - let shapeType = model.getShapeType(); - if (!$defined(shapeType)) { - // Change figure ... - shapeType = this.getShapeType(); - this._setShapeType(TopicShape.ROUNDED_RECT, false); - } - const innerShape = this.getInnerShape(); - innerShape.setVisibility(true); - } - - _updatePositionOnChangeSize(oldSize, newSize) { - const xOffset = Math.round((newSize.width - oldSize.width) / 2); - const pos = this.getPosition(); - if ($defined(pos)) { - if (pos.x > 0) { - pos.x += xOffset; - } else { - pos.x -= xOffset; - } - this.setPosition(pos); - } - } - - /** */ - workoutIncomingConnectionPoint(sourcePosition) { - return Shape.workoutIncomingConnectionPoint(this, sourcePosition); - } - - /** */ - workoutOutgoingConnectionPoint(targetPosition) { - $assert(targetPosition, 'targetPoint can not be null'); - const pos = this.getPosition(); - const isAtRight = Shape.isAtRight(targetPosition, pos); - const size = this.getSize(); - - let result; - if (this.getShapeType() === TopicShape.LINE) { - result = new Point(); - const groupPosition = this._elem2d.getPosition(); - const innerShareSize = this.getInnerShape().getSize(); - - if (innerShareSize) { - const magicCorrectionNumber = 0.3; - if (!isAtRight) { - result.x = groupPosition.x + innerShareSize.width - magicCorrectionNumber; - } else { - result.x = groupPosition.x + magicCorrectionNumber; - } - result.y = groupPosition.y + innerShareSize.height; - } else { - // Hack: When the size has not being defined. This is because the node has not being added. - // Try to do our best ... - if (!isAtRight) { - result.x = pos.x + size.width / 2; - } else { - result.x = pos.x - size.width / 2; - } - result.y = pos.y + size.height / 2; - } - } else { - result = Shape.calculateRectConnectionPoint(pos, size, isAtRight, true); - } - return result; - } -} - -export default MainTopic; diff --git a/packages/mindplot/src/components/NodeGraph.js b/packages/mindplot/src/components/NodeGraph.js deleted file mode 100644 index a57ede5a..00000000 --- a/packages/mindplot/src/components/NodeGraph.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert } from '@wisemapping/core-js'; -import TopicConfig from './TopicConfig'; -import DragTopic from './DragTopic'; - -class NodeGraph { - /** - * @constructs - * @param {mindplot.model.NodeModel} nodeModel - * @param {Object} options - * @throws will throw an error if nodeModel is null or undefined - */ - constructor(nodeModel, options) { - $assert(nodeModel, 'model can not be null'); - - this._options = options; - this._mouseEvents = true; - this.setModel(nodeModel); - this._onFocus = false; - this._size = { width: 50, height: 20 }; - } - - /** @return true if option is set to read-only */ - isReadOnly() { - return this._options.readOnly; - } - - /** @return model type */ - getType() { - const model = this.getModel(); - return model.getType(); - } - - /** - * @param {String} id - * @throws will throw an error if the topic id is not a number - */ - setId(id) { - $assert(typeof id === 'number', `id is not a number:${id}`); - this.getModel().setId(id); - } - - _set2DElement(elem2d) { - this._elem2d = elem2d; - } - - /** - * @return 2D element - * @throws will throw an error if the element is null or undefined within node graph - */ - get2DElement() { - $assert(this._elem2d, 'NodeGraph has not been initialized properly'); - return this._elem2d; - } - - /** @abstract */ - setPosition(point, fireEvent) { - throw new Error('Unsupported operation'); - } - - /** */ - addEvent(type, listener) { - const elem = this.get2DElement(); - elem.addEvent(type, listener); - } - - /** */ - removeEvent(type, listener) { - const elem = this.get2DElement(); - elem.removeEvent(type, listener); - } - - /** */ - fireEvent(type, event) { - const elem = this.get2DElement(); - elem.trigger(type, event); - } - - /** */ - setMouseEventsEnabled(isEnabled) { - this._mouseEvents = isEnabled; - } - - /** */ - isMouseEventsEnabled() { - return this._mouseEvents; - } - - /** @return {Object} size */ - getSize() { - return this._size; - } - - /** @param {Object} size */ - setSize(size) { - this._size.width = parseInt(size.width, 10); - this._size.height = parseInt(size.height, 10); - } - - /** - * @return {mindplot.model.NodeModel} the node model - */ - getModel() { - $assert(this._model, 'Model has not been initialized yet'); - return this._model; - } - - /** - * @param {mindplot.NodeModel} model the node model - * @throws will throw an error if model is null or undefined - */ - setModel(model) { - $assert(model, 'Model can not be null'); - this._model = model; - } - - /** */ - getId() { - return this._model.getId(); - } - - /** */ - setOnFocus(focus) { - if (this._onFocus !== focus) { - this._onFocus = focus; - const outerShape = this.getOuterShape(); - if (focus) { - outerShape.setFill(TopicConfig.OUTER_SHAPE_ATTRIBUTES_FOCUS.fillColor); - outerShape.setOpacity(1); - } else { - outerShape.setFill(TopicConfig.OUTER_SHAPE_ATTRIBUTES.fillColor); - outerShape.setOpacity(0); - } - this.setCursor('move'); - - // In any case, always try to hide the editor ... - this.closeEditors(); - - // Fire event ... - this.fireEvent(focus ? 'ontfocus' : 'ontblur', this); - } - } - - /** @return {Boolean} true if the node graph is on focus */ - isOnFocus() { - return this._onFocus; - } - - /** */ - dispose(workspace) { - this.setOnFocus(false); - workspace.removeChild(this); - } - - /** */ - createDragNode(layoutManager) { - const dragShape = this._buildDragShape(); - return new DragTopic(dragShape, this, layoutManager); - } - - _buildDragShape() { - $assert(false, '_buildDragShape must be implemented by all nodes.'); - } - - /** */ - getPosition() { - const model = this.getModel(); - return model.getPosition(); - } -} - -export default NodeGraph; diff --git a/packages/mindplot/src/components/PersistenceManager.js b/packages/mindplot/src/components/PersistenceManager.js deleted file mode 100644 index 8344a7b3..00000000 --- a/packages/mindplot/src/components/PersistenceManager.js +++ /dev/null @@ -1,80 +0,0 @@ -/* eslint-disable no-unused-vars */ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, innerXML } from '@wisemapping/core-js'; -import XMLSerializerFactory from './persistence/XMLSerializerFactory'; - -class PersistenceManager { - save(mindmap, editorProperties, saveHistory, events, sync) { - $assert(mindmap, 'mindmap can not be null'); - $assert(editorProperties, 'editorProperties can not be null'); - - const mapId = mindmap.getId(); - $assert(mapId, 'mapId can not be null'); - - const serializer = XMLSerializerFactory.getSerializerFromMindmap(mindmap); - const domMap = serializer.toXML(mindmap); - const mapXml = innerXML(domMap); - - const pref = JSON.stringify(editorProperties); - try { - this.saveMapXml(mapId, mapXml, pref, saveHistory, events, sync); - } catch (e) { - console.error(e); - events.onError(this._buildError()); - } - } - - load(mapId) { - $assert(mapId, 'mapId can not be null'); - const domDocument = this.loadMapDom(mapId); - return PersistenceManager.loadFromDom(mapId, domDocument); - } - - discardChanges(mapId) { - throw new Error('Method must be implemented'); - } - - loadMapDom(mapId) { - throw new Error('Method must be implemented'); - } - - saveMapXml(mapId, mapXml, pref, saveHistory, events, sync) { - throw new Error('Method must be implemented'); - } - - unlockMap(mindmap) { - throw new Error('Method must be implemented'); - } -} - -PersistenceManager.init = (instance) => { - PersistenceManager._instance = instance; -}; - -PersistenceManager.getInstance = () => PersistenceManager._instance; - -PersistenceManager.loadFromDom = function loadFromDom(mapId, mapDom) { - $assert(mapId, 'mapId can not be null'); - $assert(mapDom, 'mapDom can not be null'); - - const serializer = XMLSerializerFactory.getSerializerFromDocument(mapDom); - return serializer.loadFromDom(mapDom, mapId); -}; - -export default PersistenceManager; diff --git a/packages/mindplot/src/components/Relationship.js b/packages/mindplot/src/components/Relationship.js deleted file mode 100644 index 04c77472..00000000 --- a/packages/mindplot/src/components/Relationship.js +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Arrow, Point } from '@wisemapping/web2d'; -import { $assert, $defined } from '@wisemapping/core-js'; - -import ConnectionLine from './ConnectionLine'; -import ControlPoint from './ControlPoint'; - -import INodeModel from './model/INodeModel'; - -import Shape from './util/Shape'; - -class Relationship extends ConnectionLine { - constructor(sourceNode, targetNode, model) { - $assert(sourceNode, 'sourceNode can not be null'); - $assert(targetNode, 'targetNode can not be null'); - - super(sourceNode, targetNode, model.getLineType()); - this.setModel(model); - - const strokeColor = Relationship.getStrokeColor(); - - this._line2d.setIsSrcControlPointCustom(false); - this._line2d.setIsDestControlPointCustom(false); - this._line2d.setCursor('pointer'); - this._line2d.setStroke(1, 'solid', strokeColor); - this._line2d.setDashed(4, 2); - this._focusShape = this._createLine(this.getLineType(), ConnectionLine.SIMPLE_CURVED); - this._focusShape.setStroke(2, 'solid', '#3f96ff'); - - const ctrlPoints = this._line2d.getControlPoints(); - this._focusShape.setSrcControlPoint(ctrlPoints[0]); - this._focusShape.setDestControlPoint(ctrlPoints[1]); - this._focusShape.setVisibility(false); - this._onFocus = false; - this._isInWorkspace = false; - this._controlPointsController = new ControlPoint(); - - this._startArrow = new Arrow(); - this._startArrow.setStrokeColor(strokeColor); - this._startArrow.setStrokeWidth(2); - this.setShowStartArrow(true); - - // Share style is disable ... - if (this._showEndArrow) { - this._endArrow = new Arrow(); - this._endArrow.setStrokeColor(strokeColor); - this._endArrow.setStrokeWidth(2); - } - - // Position the line ... - if ($defined(model.getSrcCtrlPoint())) { - const srcPoint = { ...model.getSrcCtrlPoint() }; - this.setSrcControlPoint(srcPoint); - } - if ($defined(model.getDestCtrlPoint())) { - const destPoint = { ...model.getDestCtrlPoint() }; - this.setDestControlPoint(destPoint); - } - } - - setStroke(color, style, opacity) { - super.setStroke(color, style, opacity); - this._startArrow.setStrokeColor(color); - } - - redraw() { - const line2d = this._line2d; - const sourceTopic = this._sourceTopic; - const sourcePosition = sourceTopic.getPosition(); - - const targetTopic = this._targetTopic; - let targetPosition = targetTopic.getPosition(); - if (targetTopic.getType() === INodeModel.CENTRAL_TOPIC_TYPE) { - targetPosition = Shape.workoutIncomingConnectionPoint(targetTopic, sourcePosition); - } - - this._line2d.setStroke(2); - const ctrlPoints = this._line2d.getControlPoints(); - if (!this._line2d.isDestControlPointCustom() && !this._line2d.isSrcControlPointCustom()) { - const defaultPoints = Shape.calculateDefaultControlPoints( - sourcePosition, - targetPosition, - ); - ctrlPoints[0].x = defaultPoints[0].x; - ctrlPoints[0].y = defaultPoints[0].y; - - ctrlPoints[1].x = defaultPoints[1].x; - ctrlPoints[1].y = defaultPoints[1].y; - } - - const spoint = new Point(); - spoint.x = parseInt(ctrlPoints[0].x, 10) + parseInt(sourcePosition.x, 10); - spoint.y = parseInt(ctrlPoints[0].y, 10) + parseInt(sourcePosition.y, 10); - - const tpoint = new Point(); - tpoint.x = parseInt(ctrlPoints[1].x, 10) + parseInt(targetPosition.x, 10); - tpoint.y = parseInt(ctrlPoints[1].y, 10) + parseInt(targetPosition.y, 10); - - const sPos = Shape.calculateRelationShipPointCoordinates(sourceTopic, spoint); - const tPos = Shape.calculateRelationShipPointCoordinates(targetTopic, tpoint); - - line2d.setFrom(sPos.x, sPos.y); - line2d.setTo(tPos.x, tPos.y); - - line2d.moveToFront(); - - // Positionate Arrows - this._positionArrows(); - - // Add connector ... - this._positionateConnector(targetTopic); - - if (this.isOnFocus()) { - this._refreshShape(); - } - this._focusShape.moveToBack(); - this._controlPointsController.redraw(); - } - - _positionArrows() { - const tpos = this._line2d.getTo(); - const spos = this._line2d.getFrom(); - - this._startArrow.setFrom(spos.x, spos.y); - this._startArrow.moveToBack(); - - if (this._endArrow) { - this._endArrow.setFrom(tpos.x, tpos.y); - this._endArrow.moveToBack(); - } - - if (this._line2d.getType() === 'CurvedLine') { - const controlPoints = this._line2d.getControlPoints(); - this._startArrow.setControlPoint(controlPoints[0]); - if (this._endArrow) { - this._endArrow.setControlPoint(controlPoints[1]); - } - } else { - this._startArrow.setControlPoint(this._line2d.getTo()); - if (this._endArrow) { - this._endArrow.setControlPoint(this._line2d.getFrom()); - } - } - - if (this._showEndArrow) { - this._endArrow.setVisibility(this.isVisible()); - } - this._startArrow.setVisibility(this.isVisible() && this._showStartArrow); - } - - addToWorkspace(workspace) { - workspace.append(this._focusShape); - workspace.append(this._controlPointsController); - - this._controlPointControllerListener = this._initializeControlPointController.bind(this); - this._line2d.addEvent('click', this._controlPointControllerListener); - this._isInWorkspace = true; - - workspace.append(this._startArrow); - if (this._endArrow) workspace.append(this._endArrow); - - super.addToWorkspace(workspace); - this._positionArrows(); - this.redraw(); - } - - _initializeControlPointController() { - this.setOnFocus(true); - } - - removeFromWorkspace(workspace) { - workspace.removeChild(this._focusShape); - workspace.removeChild(this._controlPointsController); - this._line2d.removeEvent('click', this._controlPointControllerListener); - this._isInWorkspace = false; - workspace.removeChild(this._startArrow); - if (this._endArrow) workspace.removeChild(this._endArrow); - - super.removeFromWorkspace(workspace); - } - - // eslint-disable-next-line class-methods-use-this - getType() { - return Relationship.type; - } - - setOnFocus(focus) { - // Change focus shape - if (this.isOnFocus() !== focus) { - if (focus) { - this._refreshShape(); - this._controlPointsController.setLine(this); - } - this._focusShape.setVisibility(focus); - - this._controlPointsController.setVisibility(focus); - this._onFocus = focus; - this.fireEvent(focus ? 'ontfocus' : 'ontblur', this); - } - } - - _refreshShape() { - const sPos = this._line2d.getFrom(); - const tPos = this._line2d.getTo(); - const ctrlPoints = this._line2d.getControlPoints(); - this._focusShape.setFrom(sPos.x, sPos.y); - this._focusShape.setTo(tPos.x, tPos.y); - const shapeCtrlPoints = this._focusShape.getControlPoints(); - shapeCtrlPoints[0].x = ctrlPoints[0].x; - shapeCtrlPoints[0].y = ctrlPoints[0].y; - shapeCtrlPoints[1].x = ctrlPoints[1].x; - shapeCtrlPoints[1].y = ctrlPoints[1].y; - this._focusShape.updateLine(); - } - - addEvent(eventType, listener) { - let type = eventType; - // Translate to web 2d events ... - if (type === 'onfocus') { - type = 'mousedown'; - } - - const line = this._line2d; - line.addEvent(type, listener); - } - - isOnFocus() { - return this._onFocus; - } - - isInWorkspace() { - return this._isInWorkspace; - } - - setVisibility(value) { - super.setVisibility(value); - if (this._showEndArrow) this._endArrow.setVisibility(this._showEndArrow); - this._startArrow.setVisibility(this._showStartArrow && value); - } - - setOpacity(opacity) { - super.setOpacity(opacity); - if (this._showEndArrow) this._endArrow.setOpacity(opacity); - if (this._showStartArrow) this._startArrow.setOpacity(opacity); - } - - setShowEndArrow(visible) { - this._showEndArrow = visible; - if (this._isInWorkspace) this.redraw(); - } - - setShowStartArrow(visible) { - this._showStartArrow = visible; - if (this._isInWorkspace) this.redraw(); - } - - setFrom(x, y) { - $assert($defined(x), 'x must be defined'); - $assert($defined(y), 'y must be defined'); - - this._line2d.setFrom(x, y); - this._startArrow.setFrom(x, y); - } - - setTo(x, y) { - $assert($defined(x), 'x must be defined'); - $assert($defined(y), 'y must be defined'); - - this._line2d.setTo(x, y); - if (this._endArrow) this._endArrow.setFrom(x, y); - } - - setSrcControlPoint(control) { - this._line2d.setSrcControlPoint(control); - this._startArrow.setControlPoint(control); - } - - setDestControlPoint(control) { - this._line2d.setDestControlPoint(control); - if (this._showEndArrow) this._endArrow.setControlPoint(control); - } - - getControlPoints() { - return this._line2d.getControlPoints(); - } - - isSrcControlPointCustom() { - return this._line2d.isSrcControlPointCustom(); - } - - isDestControlPointCustom() { - return this._line2d.isDestControlPointCustom(); - } - - setIsSrcControlPointCustom(isCustom) { - this._line2d.setIsSrcControlPointCustom(isCustom); - } - - setIsDestControlPointCustom(isCustom) { - this._line2d.setIsDestControlPointCustom(isCustom); - } - - getId() { - return this._model.getId(); - } - - fireEvent(type, event) { - const elem = this._line2d; - elem.trigger(type, event); - } -} - -Relationship.getStrokeColor = function getStrokeColor() { - return '#9b74e6'; -}; - -Relationship.type = 'Relationship'; - -export default Relationship; diff --git a/packages/mindplot/src/components/RelationshipPivot.js b/packages/mindplot/src/components/RelationshipPivot.js deleted file mode 100644 index 70a35ec2..00000000 --- a/packages/mindplot/src/components/RelationshipPivot.js +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CurvedLine, Arrow, Point } from '@wisemapping/web2d'; -import { $assert } from '@wisemapping/core-js'; -import Relationship from './Relationship'; -import INodeModel from './model/INodeModel'; -import Shape from './util/Shape'; - -class RelationshipPivot { - constructor(workspace, designer) { - $assert(workspace, 'workspace can not be null'); - $assert(designer, 'designer can not be null'); - this._workspace = workspace; - this._designer = designer; - - // FIXME: the aim of the migration is remove .bind mootools method, please remove these! - this._mouseMoveEvent = this._mouseMove.bind(this); - this._onClickEvent = this._cleanOnMouseClick.bind(this); - this._onTopicClick = this._connectOnFocus.bind(this); - } - - start(sourceTopic, targetPos) { - $assert(sourceTopic, 'sourceTopic can not be null'); - $assert(targetPos, 'targetPos can not be null'); - - this.dispose(); - this._sourceTopic = sourceTopic; - if (sourceTopic != null) { - this._workspace.enableWorkspaceEvents(false); - - const sourcePos = sourceTopic.getPosition(); - const strokeColor = Relationship.getStrokeColor(); - - this._pivot = new CurvedLine(); - this._pivot.setStyle(CurvedLine.SIMPLE_LINE); - - const fromPos = this._calculateFromPosition(sourcePos); - this._pivot.setFrom(fromPos.x, fromPos.y); - - this._pivot.setTo(targetPos.x, targetPos.y); - this._pivot.setStroke(2, 'solid', strokeColor); - this._pivot.setDashed(4, 2); - - this._startArrow = new Arrow(); - this._startArrow.setStrokeColor(strokeColor); - this._startArrow.setStrokeWidth(2); - this._startArrow.setFrom(sourcePos.x, sourcePos.y); - - this._workspace.append(this._pivot); - this._workspace.append(this._startArrow); - - this._workspace.addEvent('mousemove', this._mouseMoveEvent); - this._workspace.addEvent('click', this._onClickEvent); - - // Register focus events on all topics ... - const model = this._designer.getModel(); - const topics = model.getTopics(); - topics.forEach((topic) => { - topic.addEvent('ontfocus', this._onTopicClick); - }); - } - } - - dispose() { - const workspace = this._workspace; - - if (this._isActive()) { - workspace.removeEvent('mousemove', this._mouseMoveEvent); - workspace.removeEvent('click', this._onClickEvent); - - const model = this._designer.getModel(); - const topics = model.getTopics(); - - topics.forEach(((topic) => { - topic.removeEvent('ontfocus', this._onTopicClick); - })); - - workspace.removeChild(this._pivot); - workspace.removeChild(this._startArrow); - workspace.enableWorkspaceEvents(true); - - this._sourceTopic = null; - this._pivot = null; - this._startArrow = null; - } - } - - _mouseMove(event) { - const screen = this._workspace.getScreenManager(); - const pos = screen.getWorkspaceMousePosition(event); - - // Leave the arrow a couple of pixels away from the cursor. - const sourcePosition = this._sourceTopic.getPosition(); - const gapDistance = Math.sign(pos.x - sourcePosition.x) * 5; - - const sPos = this._calculateFromPosition(pos); - this._pivot.setFrom(sPos.x, sPos.y); - - // Update target position ... - this._pivot.setTo(pos.x - gapDistance, pos.y); - - const controlPoints = this._pivot.getControlPoints(); - this._startArrow.setFrom(pos.x - gapDistance, pos.y); - this._startArrow.setControlPoint(controlPoints[1]); - - event.stopPropagation(); - return false; - } - - _cleanOnMouseClick(event) { - // The user clicks on a desktop on in other element that is not a node. - this.dispose(); - event.stopPropagation(); - } - - _calculateFromPosition(toPosition) { - // Calculate origin position ... - let sourcePosition = this._sourceTopic.getPosition(); - if (this._sourceTopic.getType() === INodeModel.CENTRAL_TOPIC_TYPE) { - sourcePosition = Shape.workoutIncomingConnectionPoint(this._sourceTopic, toPosition); - } - const controlPoint = Shape.calculateDefaultControlPoints(sourcePosition, toPosition); - - const spoint = new Point(); - spoint.x = parseInt(controlPoint[0].x, 10) + parseInt(sourcePosition.x, 10); - spoint.y = parseInt(controlPoint[0].y, 10) + parseInt(sourcePosition.y, 10); - return Shape.calculateRelationShipPointCoordinates(this._sourceTopic, spoint); - } - - _connectOnFocus(event, targetTopic) { - const sourceTopic = this._sourceTopic; - const mindmap = this._designer.getMindmap(); - - // Avoid circular connections ... - if (targetTopic.getId() !== sourceTopic.getId()) { - const relModel = mindmap.createRelationship(targetTopic.getId(), sourceTopic.getId()); - this._designer._actionDispatcher.addRelationship(relModel); - } - this.dispose(); - } - - _isActive() { - return this._pivot != null; - } -} - -export default RelationshipPivot; diff --git a/packages/mindplot/src/components/RestPersistenceManager.js b/packages/mindplot/src/components/RestPersistenceManager.js deleted file mode 100644 index a912369a..00000000 --- a/packages/mindplot/src/components/RestPersistenceManager.js +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert } from '@wisemapping/core-js'; -import $ from 'jquery'; -import { $msg } from './Messages'; -import PersistenceManager from './PersistenceManager'; - -class RESTPersistenceManager extends PersistenceManager { - constructor(options) { - $assert(options.documentUrl, 'documentUrl can not be null'); - $assert(options.revertUrl, 'revertUrl can not be null'); - $assert(options.lockUrl, 'lockUrl can not be null'); - $assert(options.session, 'session can not be null'); - $assert(options.timestamp, 'timestamp can not be null'); - super(); - - this.documentUrl = options.documentUrl; - this.revertUrl = options.revertUrl; - this.lockUrl = options.lockUrl; - this.timestamp = options.timestamp; - this.session = options.session; - } - - saveMapXml(mapId, mapXml, pref, saveHistory, events, sync) { - const data = { - id: mapId, - xml: mapXml, - properties: pref, - }; - - const persistence = this; - let query = `minor=${!saveHistory}`; - query = `${query}×tamp=${this.timestamp}`; - query = `${query}&session=${this.session}`; - - if (!persistence.onSave) { - // Mark save in process and fire a event unlocking the save ... - persistence.onSave = true; - persistence.clearTimeout = setTimeout(() => { - persistence.clearTimeout = null; - persistence.onSave = false; - }, 10000); - - $.ajax({ - url: `${this.documentUrl.replace('{id}', mapId)}?${query}`, - type: 'put', - dataType: 'json', - data: JSON.stringify(data), - contentType: 'application/json; charset=utf-8', - async: !sync, - - success(successData, textStatus, jqXHRresponseText) { - persistence.timestamp = successData; - events.onSuccess(); - }, - error(jqXHR, textStatus, errorThrown) { - events.onError(persistence._buildError()); - }, - complete() { - // Clear event timeout ... - if (persistence.clearTimeout) { - clearTimeout(persistence.clearTimeout); - } - persistence.onSave = false; - }, - fail(xhr, textStatus) { - const { responseText } = xhr; - let userMsg = { severity: 'SEVERE', message: $msg('SAVE_COULD_NOT_BE_COMPLETED') }; - - const contentType = xhr.getResponseHeader('Content-Type'); - if (contentType != null && contentType.indexOf('application/json') !== -1) { - let serverMsg = null; - try { - serverMsg = $.parseJSON(responseText); - serverMsg = serverMsg.globalSeverity ? serverMsg : null; - } catch (e) { - // Message could not be decoded ... - } - userMsg = persistence._buildError(serverMsg); - } else if (this.status === 405) { - userMsg = { severity: 'SEVERE', message: $msg('SESSION_EXPIRED') }; - } - events.onError(userMsg); - persistence.onSave = false; - }, - }); - } - } - - discardChanges(mapId) { - $.ajax({ - url: this.revertUrl.replace('{id}', mapId), - async: false, - method: 'post', - headers: { 'Content-Type': 'application/json; charset=utf-8', Accept: 'application/json' }, - }); - } - - unlockMap(mindmap) { - const mapId = mindmap.getId(); - $.ajax({ - url: this.lockUrl.replace('{id}', mapId), - async: false, - method: 'put', - headers: { 'Content-Type': 'text/plain' }, - data: 'false', - }); - } - - _buildError(jsonSeverResponse) { - let message = jsonSeverResponse ? jsonSeverResponse.globalErrors[0] : null; - let severity = jsonSeverResponse ? jsonSeverResponse.globalSeverity : null; - - if (!message) { - message = $msg('SAVE_COULD_NOT_BE_COMPLETED'); - } - - if (!severity) { - severity = 'INFO'; - } - return { severity, message }; - } - - loadMapDom(mapId) { - // Let's try to open one from the local directory ... - let xml; - $.ajax({ - url: `${this.documentUrl.replace('{id}', mapId)}/xml`, - method: 'get', - async: false, - headers: { 'Content-Type': 'text/plain', Accept: 'application/xml' }, - success(responseText) { - xml = responseText; - }, - }); - - // If I could not load it from a file, hard code one. - if (xml == null) { - throw new Error('Map could not be loaded'); - } - - return xml; - } -} - -export default RESTPersistenceManager; diff --git a/packages/mindplot/src/components/ScreenManager.js b/packages/mindplot/src/components/ScreenManager.js deleted file mode 100644 index bcc6eba3..00000000 --- a/packages/mindplot/src/components/ScreenManager.js +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert } from '@wisemapping/core-js'; -import { Point } from '@wisemapping/web2d'; - -class ScreenManager { - constructor(divElement) { - $assert(divElement, 'can not be null'); - this._divContainer = divElement; - this._padding = { x: 0, y: 0 }; - - // Ignore default click event propagation. Prevent 'click' event on drag. - this._clickEvents = []; - this._divContainer.bind('click', (event) => { - event.stopPropagation(); - }); - - this._divContainer.bind('dblclick', (event) => { - event.stopPropagation(); - event.preventDefault(); - }); - } - - setScale(scale) { - $assert(scale, 'Screen scale can not be null'); - this._scale = scale; - } - - addEvent(event, listener) { - if (event === 'click') this._clickEvents.push(listener); - else this._divContainer.bind(event, listener); - } - - removeEvent(event, listener) { - if (event === 'click') { - this._clickEvents.remove(listener); - } else { - this._divContainer.unbind(event, listener); - } - } - - fireEvent(type, event) { - if (type === 'click') { - this._clickEvents.forEach((listener) => { - listener(type, event); - }); - } else { - this._divContainer.trigger(type, event); - } - } - - _getElementPosition(elem) { - // Retrieve current element position. - const elementPosition = elem.getPosition(); - let { x } = elementPosition; - let { y } = elementPosition; - - // Add workspace offset. - x -= this._padding.x; - y -= this._padding.y; - - // Scale coordinate in order to be relative to the workspace. That's coord/size; - x /= this._scale; - y /= this._scale; - - // Remove decimal part.. - return { x, y }; - } - - getWorkspaceIconPosition(e) { - // Retrieve current icon position. - const image = e.getImage(); - const elementPosition = image.getPosition(); - const imageSize = e.getSize(); - - // Add group offset - const iconGroup = e.getGroup(); - const group = iconGroup.getNativeElement(); - const coordOrigin = group.getCoordOrigin(); - const groupSize = group.getSize(); - const coordSize = group.getCoordSize(); - - const scale = { - x: coordSize.width / parseInt(groupSize.width, 10), - y: coordSize.height / parseInt(groupSize.height, 10), - }; - - let x = (elementPosition.x - coordOrigin.x - parseInt(imageSize.width, 10) / 2) / scale.x; - let y = (elementPosition.y - coordOrigin.y - parseInt(imageSize.height, 10) / 2) / scale.y; - - // Retrieve iconGroup Position - const groupPosition = iconGroup.getPosition(); - x += groupPosition.x; - y += groupPosition.y; - - // Retrieve topic Position - const topic = iconGroup.getTopic(); - const topicPosition = this._getElementPosition(topic); - topicPosition.x -= parseInt(topic.getSize().width, 10) / 2; - - // Remove decimal part.. - return { x: x + topicPosition.x, y: y + topicPosition.y }; - } - - getWorkspaceMousePosition(event) { - // Retrieve current mouse position. - let x = event.clientX; - let y = event.clientY; - - // FIXME: paulo: why? Subtract div position. - /* var containerPosition = this.getContainer().position(); - x = x - containerPosition.x; - y = y - containerPosition.y; */ - - // Scale coordinate in order to be relative to the workspace. That's coordSize/size; - x *= this._scale; - y *= this._scale; - - // Add workspace offset. - x += this._padding.x; - y += this._padding.y; - - // Remove decimal part.. - return new Point(x, y); - } - - getContainer() { - return this._divContainer; - } - - setOffset(x, y) { - this._padding.x = x; - this._padding.y = y; - } -} - -export default ScreenManager; diff --git a/packages/mindplot/src/components/ShrinkConnector.js b/packages/mindplot/src/components/ShrinkConnector.js deleted file mode 100644 index 49be5e9c..00000000 --- a/packages/mindplot/src/components/ShrinkConnector.js +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Elipse } from '@wisemapping/web2d'; - -import TopicConfig from './TopicConfig'; -import ActionDispatcher from './ActionDispatcher'; - -class ShirinkConnector { - constructor(topic) { - const ellipse = new Elipse(TopicConfig.INNER_RECT_ATTRIBUTES); - this._ellipse = ellipse; - ellipse.setFill('rgb(62,118,179)'); - - ellipse.setSize(TopicConfig.CONNECTOR_WIDTH, TopicConfig.CONNECTOR_WIDTH); - ellipse.addEvent('click', (event) => { - const model = topic.getModel(); - const collapse = !model.areChildrenShrunken(); - - const topicId = topic.getId(); - const actionDispatcher = ActionDispatcher.getInstance(); - actionDispatcher.shrinkBranch([topicId], collapse); - - event.stopPropagation(); - }); - - ellipse.addEvent('mousedown', (event) => { - // Avoid node creation ... - event.stopPropagation(); - }); - - ellipse.addEvent('dblclick', (event) => { - // Avoid node creation ... - event.stopPropagation(); - }); - - ellipse.addEvent('mouseover', () => { - ellipse.setFill('rgb(153, 0, 255)'); - }); - const me = this; - ellipse.addEvent('mouseout', () => { - const color = topic.getBackgroundColor(); - me.setFill(color); - }); - - ellipse.setCursor('default'); - this._fillColor = '#f7f7f7'; - const model = topic.getModel(); - this.changeRender(model.areChildrenShrunken()); - } - - changeRender(isShrink) { - const elipse = this._ellipse; - if (isShrink) { - elipse.setStroke('2', 'solid'); - } else { - elipse.setStroke('1', 'solid'); - } - } - - setVisibility(value) { - this._ellipse.setVisibility(value); - } - - setOpacity(opacity) { - this._ellipse.setOpacity(opacity); - } - - setFill(color) { - this._fillColor = color; - this._ellipse.setFill(color); - } - - setAttribute(name, value) { - this._ellipse.setAttribute(name, value); - } - - addToWorkspace(group) { - group.append(this._ellipse); - } - - setPosition(x, y) { - this._ellipse.setPosition(x, y); - } - - moveToBack() { - this._ellipse.moveToBack(); - } - - moveToFront() { - this._ellipse.moveToFront(); - } -} - -export default ShirinkConnector; diff --git a/packages/mindplot/src/components/StandaloneActionDispatcher.js b/packages/mindplot/src/components/StandaloneActionDispatcher.js deleted file mode 100644 index 581d59f6..00000000 --- a/packages/mindplot/src/components/StandaloneActionDispatcher.js +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $defined, $assert } from '@wisemapping/core-js'; -import ActionDispatcher from './ActionDispatcher'; -import DesignerActionRunner from './DesignerActionRunner'; -import AddTopicCommand from './commands/AddTopicCommand'; -import AddRelationshipCommand from './commands/AddRelationshipCommand'; -import AddFeatureToTopicCommand from './commands/AddFeatureToTopicCommand'; -import DeleteCommand from './commands/DeleteCommand'; -import RemoveFeatureFromTopicCommand from './commands/RemoveFeatureFromTopicCommand'; -import DragTopicCommand from './commands/DragTopicCommand'; -import GenericFunctionCommand from './commands/GenericFunctionCommand'; -import MoveControlPointCommand from './commands/MoveControlPointCommand'; -import ChangeFeatureToTopicCommand from './commands/ChangeFeatureToTopicCommand'; -import EventBus from './layout/EventBus'; - -class StandaloneActionDispatcher extends ActionDispatcher { - constructor(commandContext) { - super(commandContext); - this._actionRunner = new DesignerActionRunner(commandContext, this); - } - - /** */ - addTopics(models, parentTopicsId) { - const command = new AddTopicCommand(models, parentTopicsId); - this.execute(command); - } - - /** */ - addRelationship(model) { - const command = new AddRelationshipCommand(model); - this.execute(command); - } - - /** */ - deleteEntities(topicsIds, relIds) { - const command = new DeleteCommand(topicsIds, relIds); - this.execute(command); - } - - /** */ - dragTopic(topicId, position, order, parentTopic) { - const command = new DragTopicCommand(topicId, position, order, parentTopic); - this.execute(command); - } - - /** */ - moveTopic(topicId, position) { - $assert($defined(topicId), 'topicsId can not be null'); - $assert($defined(position), 'position can not be null'); - - const commandFunc = (topic, value) => { - const result = topic.getPosition(); - EventBus.instance.fireEvent(EventBus.events.NodeMoveEvent, { - node: topic.getModel(), - position: value, - }); - return result; - }; - - const command = new GenericFunctionCommand(commandFunc, topicId, position); - this.execute(command); - } - - /** */ - moveControlPoint(ctrlPoint, point) { - const command = new MoveControlPointCommand(ctrlPoint, point); - this.execute(command); - } - - /** */ - changeFontStyleToTopic(topicsIds) { - const commandFunc = (topic) => { - const result = topic.getFontStyle(); - const style = result === 'italic' ? 'normal' : 'italic'; - topic.setFontStyle(style, true); - return result; - }; - const command = new GenericFunctionCommand(commandFunc, topicsIds); - this.execute(command); - } - - /** */ - changeTextToTopic(topicsIds, text) { - $assert($defined(topicsIds), 'topicsIds can not be null'); - - const commandFunc = (topic, value) => { - const result = topic.getText(); - topic.setText(value); - return result; - }; - commandFunc.commandType = 'changeTextToTopic'; - - const command = new GenericFunctionCommand(commandFunc, topicsIds, text); - this.execute(command); - } - - /** */ - changeFontFamilyToTopic(topicIds, fontFamily) { - $assert(topicIds, 'topicIds can not be null'); - $assert(fontFamily, 'fontFamily can not be null'); - - const commandFunc = (topic, commandFontFamily) => { - const result = topic.getFontFamily(); - topic.setFontFamily(commandFontFamily, true); - - topic._adjustShapes(); - return result; - }; - - const command = new GenericFunctionCommand(commandFunc, topicIds, fontFamily); - this.execute(command); - } - - /** */ - changeFontColorToTopic(topicsIds, color) { - $assert(topicsIds, 'topicIds can not be null'); - $assert(color, 'color can not be null'); - - const commandFunc = (topic, commandColor) => { - const result = topic.getFontColor(); - topic.setFontColor(commandColor, true); - return result; - }; - - const command = new GenericFunctionCommand(commandFunc, topicsIds, color); - command.discardDuplicated = 'fontColorCommandId'; - this.execute(command); - } - - /** */ - changeBackgroundColorToTopic(topicsIds, color) { - $assert(topicsIds, 'topicIds can not be null'); - $assert(color, 'color can not be null'); - - const commandFunc = (topic, commandColor) => { - const result = topic.getBackgroundColor(); - topic.setBackgroundColor(commandColor); - return result; - }; - - const command = new GenericFunctionCommand(commandFunc, topicsIds, color); - command.discardDuplicated = 'backColor'; - this.execute(command); - } - - /** */ - changeBorderColorToTopic(topicsIds, color) { - $assert(topicsIds, 'topicIds can not be null'); - $assert(color, 'topicIds can not be null'); - - const commandFunc = (topic, commandColor) => { - const result = topic.getBorderColor(); - topic.setBorderColor(commandColor); - return result; - }; - - const command = new GenericFunctionCommand(commandFunc, topicsIds, color); - command.discardDuplicated = 'borderColorCommandId'; - this.execute(command); - } - - /** */ - changeFontSizeToTopic(topicsIds, size) { - $assert(topicsIds, 'topicIds can not be null'); - $assert(size, 'size can not be null'); - - const commandFunc = (topic, commandSize) => { - const result = topic.getFontSize(); - topic.setFontSize(commandSize, true); - - topic._adjustShapes(); - return result; - }; - - const command = new GenericFunctionCommand(commandFunc, topicsIds, size); - this.execute(command); - } - - /** */ - changeShapeTypeToTopic(topicsIds, shapeType) { - $assert(topicsIds, 'topicsIds can not be null'); - $assert(shapeType, 'shapeType can not be null'); - - const commandFunc = (topic, commandShapeType) => { - const result = topic.getShapeType(); - topic.setShapeType(commandShapeType, true); - return result; - }; - - const command = new GenericFunctionCommand(commandFunc, topicsIds, shapeType); - this.execute(command); - } - - /** */ - changeFontWeightToTopic(topicsIds) { - $assert(topicsIds, 'topicsIds can not be null'); - - const commandFunc = (topic) => { - const result = topic.getFontWeight(); - const weight = result === 'bold' ? 'normal' : 'bold'; - topic.setFontWeight(weight, true); - - topic._adjustShapes(); - return result; - }; - - const command = new GenericFunctionCommand(commandFunc, topicsIds); - this.execute(command); - } - - /** */ - shrinkBranch(topicsIds, collapse) { - $assert(topicsIds, 'topicsIds can not be null'); - - const commandFunc = (topic, isShrink) => { - topic.setChildrenShrunken(isShrink); - return !isShrink; - }; - - const command = new GenericFunctionCommand(commandFunc, topicsIds, collapse); - this.execute(command, false); - } - - /** */ - addFeatureToTopic(topicId, featureType, attributes) { - const command = new AddFeatureToTopicCommand(topicId, featureType, attributes); - this.execute(command); - } - - /** */ - changeFeatureToTopic(topicId, featureId, attributes) { - const command = new ChangeFeatureToTopicCommand(topicId, featureId, attributes); - this.execute(command); - } - - /** */ - removeFeatureFromTopic(topicId, featureId) { - const command = new RemoveFeatureFromTopicCommand(topicId, featureId); - this.execute(command); - } - - /** */ - execute(command) { - this._actionRunner.execute(command); - } -} - -export default StandaloneActionDispatcher; diff --git a/packages/mindplot/src/components/Topic.js b/packages/mindplot/src/components/Topic.js deleted file mode 100644 index 3c17f3e5..00000000 --- a/packages/mindplot/src/components/Topic.js +++ /dev/null @@ -1,1338 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import $ from 'jquery'; -import { $assert, $defined } from '@wisemapping/core-js'; -import { - Rect, Image, Line, Text, Group, -} from '@wisemapping/web2d'; - -import NodeGraph from './NodeGraph'; -import TopicConfig from './TopicConfig'; -import TopicStyle from './TopicStyle'; -import TopicFeature from './TopicFeature'; -import ConnectionLine from './ConnectionLine'; -import IconGroup from './IconGroup'; -import FadeEffect from './util/FadeEffect'; -import EventBus from './layout/EventBus'; -import ShirinkConnector from './ShrinkConnector'; -import NoteEditor from './widget/NoteEditor'; -import ActionDispatcher from './ActionDispatcher'; -import LinkEditor from './widget/LinkEditor'; - -import TopicEventDispatcher, { TopicEvent } from './TopicEventDispatcher'; -import INodeModel, { TopicShape } from './model/INodeModel'; - -class Topic extends NodeGraph { - /** - * @extends mindplot.NodeGraph - * @constructs - * @param model - * @param options - */ - constructor(model, options) { - super(model, options); - this._children = []; - this._parent = null; - this._relationships = []; - this._isInWorkspace = false; - this._buildTopicShape(); - - // Position a topic .... - const pos = model.getPosition(); - if (pos != null && this.isCentralTopic()) { - this.setPosition(pos); - } - - // Register events for the topic ... - if (!this.isReadOnly()) { - this._registerEvents(); - } - } - - _registerEvents() { - this.setMouseEventsEnabled(true); - - // Prevent click on the topics being propagated ... - this.addEvent('click', (event) => { - event.stopPropagation(); - }); - const me = this; - this.addEvent('dblclick', (event) => { - me._getTopicEventDispatcher().show(me); - event.stopPropagation(); - }); - } - - /** - * @param {String} type the topic shape type - * @see {@link mindplot.model.INodeModel} - */ - setShapeType(type) { - this._setShapeType(type, true); - } - - /** @return {mindplot.Topic} parent topic */ - getParent() { - return this._parent; - } - - _setShapeType(type, updateModel) { - // Remove inner shape figure ... - const model = this.getModel(); - if ($defined(updateModel) && updateModel) { - model.setShapeType(type); - } - - const oldInnerShape = this.getInnerShape(); - if (oldInnerShape != null) { - this._removeInnerShape(); - - // Create a new one ... - const innerShape = this.getInnerShape(); - - // Update figure size ... - const size = this.getSize(); - this.setSize(size, true); - - const group = this.get2DElement(); - group.append(innerShape); - - // Move text to the front ... - const text = this.getTextShape(); - text.moveToFront(); - - // Move iconGroup to front ... - const iconGroup = this.getIconGroup(); - if ($defined(iconGroup)) { - iconGroup.moveToFront(); - } - - // Move connector to front - const connector = this.getShrinkConnector(); - if ($defined(connector)) { - connector.moveToFront(); - } - } - } - - /** @return {String} topic shape type */ - getShapeType() { - const model = this.getModel(); - let result = model.getShapeType(); - if (!$defined(result)) { - result = TopicStyle.defaultShapeType(this); - } - return result; - } - - _removeInnerShape() { - const group = this.get2DElement(); - const innerShape = this.getInnerShape(); - group.removeChild(innerShape); - this._innerShape = null; - return innerShape; - } - - getInnerShape() { - if (!$defined(this._innerShape)) { - // Create inner box. - this._innerShape = this._buildShape( - TopicConfig.INNER_RECT_ATTRIBUTES, - this.getShapeType(), - ); - - // Update bgcolor ... - const bgColor = this.getBackgroundColor(); - this._setBackgroundColor(bgColor, false); - - // Update border color ... - const brColor = this.getBorderColor(); - this._setBorderColor(brColor, false); - - // Define the pointer ... - if (!this.isCentralTopic() && !this.isReadOnly()) { - this._innerShape.setCursor('move'); - } else { - this._innerShape.setCursor('default'); - } - } - return this._innerShape; - } - - _buildShape(attributes, shapeType) { - $assert(attributes, 'attributes can not be null'); - $assert(shapeType, 'shapeType can not be null'); - - let result; - if (shapeType === TopicShape.RECTANGLE) { - result = new Rect(0, attributes); - } else if (shapeType === TopicShape.IMAGE) { - const model = this.getModel(); - const url = model.getImageUrl(); - const size = model.getImageSize(); - - result = new Image(); - result.setHref(url); - result.setSize(size.width, size.height); - - result.getSize = function getSize() { - return model.getImageSize(); - }; - - result.setPosition = function setPosition() { }; - } else if (shapeType === TopicShape.ELLIPSE) { - result = new Rect(0.9, attributes); - } else if (shapeType === TopicShape.ROUNDED_RECT) { - result = new Rect(0.3, attributes); - } else if (shapeType === TopicShape.LINE) { - result = new Line({ strokeColor: '#495879', strokeWidth: 1 }); - result.setSize = function setSize(width, height) { - this.size = { width, height }; - result.setFrom(0, height); - result.setTo(width, height); - - // Lines will have the same color of the default connection lines... - const stokeColor = ConnectionLine.getStrokeColor(); - result.setStroke(1, 'solid', stokeColor); - }; - - result.getSize = function getSize() { - return this.size; - }; - - result.setPosition = function setPosition() { }; - result.setFill = function setFill() { }; - result.setStroke = function setStroke() { }; - } else { - $assert(false, `Unsupported figure shapeType:${shapeType}`); - } - result.setPosition(0, 0); - return result; - } - - /** @param {String} type the cursor type, either 'pointer', 'default' or 'move' */ - setCursor(type) { - const innerShape = this.getInnerShape(); - innerShape.setCursor(type); - - const outerShape = this.getOuterShape(); - outerShape.setCursor(type); - - const textShape = this.getTextShape(); - textShape.setCursor(type); - } - - /** @return outer shape */ - getOuterShape() { - if (!$defined(this._outerShape)) { - const rect = this._buildShape( - TopicConfig.OUTER_SHAPE_ATTRIBUTES, - TopicShape.ROUNDED_RECT, - ); - rect.setPosition(-2, -3); - rect.setOpacity(0); - this._outerShape = rect; - } - - return this._outerShape; - } - - /** @return text shape */ - getTextShape() { - if (!$defined(this._text)) { - this._text = this._buildTextShape(false); - - // Set Text ... - const text = this.getText(); - this._setText(text, false); - } - - return this._text; - } - - /** @return icon group */ - getOrBuildIconGroup() { - if (!$defined(this._iconsGroup)) { - this._iconsGroup = this._buildIconGroup(); - const group = this.get2DElement(); - group.append(this._iconsGroup.getNativeElement()); - this._iconsGroup.moveToFront(); - } - return this._iconsGroup; - } - - /** */ - getIconGroup() { - return this._iconsGroup; - } - - _buildIconGroup() { - const textHeight = this.getTextShape().getFontHeight(); - const result = new IconGroup(this.getId(), textHeight); - const padding = TopicStyle.getInnerPadding(this); - result.setPosition(padding, padding); - - // Load topic features ... - const model = this.getModel(); - const featuresModel = model.getFeatures(); - for (let i = 0; i < featuresModel.length; i++) { - const featureModel = featuresModel[i]; - const icon = TopicFeature.createIcon(this, featureModel, this.isReadOnly()); - result.addIcon( - icon, - featureModel.getType() === TopicFeature.Icon.id && !this.isReadOnly(), - ); - } - - return result; - } - - /** - * assigns the new feature model to the topic's node model and adds the respective icon - * @param {mindplot.model.FeatureModel} featureModel - * @return {mindplot.Icon} the icon corresponding to the feature model - */ - addFeature(featureModel) { - const iconGroup = this.getOrBuildIconGroup(); - this.closeEditors(); - - // Update model ... - const model = this.getModel(); - model.addFeature(featureModel); - - const result = TopicFeature.createIcon(this, featureModel, this.isReadOnly()); - iconGroup.addIcon( - result, - featureModel.getType() === TopicFeature.Icon.id && !this.isReadOnly(), - ); - - this._adjustShapes(); - return result; - } - - /** */ - findFeatureById(id) { - const model = this.getModel(); - return model.findFeatureById(id); - } - - /** */ - removeFeature(featureModel) { - $assert(featureModel, 'featureModel could not be null'); - - // Removing the icon from MODEL - const model = this.getModel(); - model.removeFeature(featureModel); - - // Removing the icon from UI - const iconGroup = this.getIconGroup(); - if ($defined(iconGroup)) { - iconGroup.removeIconByModel(featureModel); - } - this._adjustShapes(); - } - - /** */ - addRelationship(relationship) { - this._relationships.push(relationship); - } - - /** */ - deleteRelationship(relationship) { - this._relationships = this._relationships.filter((r) => r !== relationship); - } - - /** */ - getRelationships() { - return this._relationships; - } - - _buildTextShape(readOnly) { - const result = new Text(); - const family = this.getFontFamily(); - const size = this.getFontSize(); - const weight = this.getFontWeight(); - const style = this.getFontStyle(); - result.setFont(family, size, style, weight); - - const color = this.getFontColor(); - result.setColor(color); - - if (!readOnly) { - // Propagate mouse events ... - if (!this.isCentralTopic()) { - result.setCursor('move'); - } else { - result.setCursor('default'); - } - } - - return result; - } - - /** */ - setFontFamily(value, updateModel) { - const textShape = this.getTextShape(); - textShape.setFontFamily(value); - if ($defined(updateModel) && updateModel) { - const model = this.getModel(); - model.setFontFamily(value); - } - this._adjustShapes(updateModel); - } - - /** */ - setFontSize(value, updateModel) { - const textShape = this.getTextShape(); - textShape.setSize(value); - - if ($defined(updateModel) && updateModel) { - const model = this.getModel(); - model.setFontSize(value); - } - this._adjustShapes(updateModel); - } - - /** */ - setFontStyle(value, updateModel) { - const textShape = this.getTextShape(); - textShape.setStyle(value); - if ($defined(updateModel) && updateModel) { - const model = this.getModel(); - model.setFontStyle(value); - } - this._adjustShapes(updateModel); - } - - /** */ - setFontWeight(value, updateModel) { - const textShape = this.getTextShape(); - textShape.setWeight(value); - if ($defined(updateModel) && updateModel) { - const model = this.getModel(); - model.setFontWeight(value); - } - this._adjustShapes(); - } - - /** */ - getFontWeight() { - const model = this.getModel(); - let result = model.getFontWeight(); - if (!$defined(result)) { - const font = TopicStyle.defaultFontStyle(this); - result = font.weight; - } - return result; - } - - /** */ - getFontFamily() { - const model = this.getModel(); - let result = model.getFontFamily(); - if (!$defined(result)) { - const font = TopicStyle.defaultFontStyle(this); - result = font.font; - } - return result; - } - - /** */ - getFontColor() { - const model = this.getModel(); - let result = model.getFontColor(); - if (!$defined(result)) { - const font = TopicStyle.defaultFontStyle(this); - result = font.color; - } - return result; - } - - /** */ - getFontStyle() { - const model = this.getModel(); - let result = model.getFontStyle(); - if (!$defined(result)) { - const font = TopicStyle.defaultFontStyle(this); - result = font.style; - } - return result; - } - - /** */ - getFontSize() { - const model = this.getModel(); - let result = model.getFontSize(); - if (!$defined(result)) { - const font = TopicStyle.defaultFontStyle(this); - result = font.size; - } - return result; - } - - /** */ - setFontColor(value, updateModel) { - const textShape = this.getTextShape(); - textShape.setColor(value); - if ($defined(updateModel) && updateModel) { - const model = this.getModel(); - model.setFontColor(value); - } - } - - _setText(text, updateModel) { - const textShape = this.getTextShape(); - textShape.setText(text == null ? TopicStyle.defaultText(this) : text); - - if ($defined(updateModel) && updateModel) { - const model = this.getModel(); - model.setText(text); - } - } - - /** */ - setText(text) { - // Avoid empty nodes ... - if (!text || $.trim(text).length === 0) { - this._setText(null, true); - } else { - this._setText(text, true); - } - - this._adjustShapes(); - } - - /** */ - getText() { - const model = this.getModel(); - let result = model.getText(); - if (!$defined(result)) { - result = TopicStyle.defaultText(this); - } - return result; - } - - /** */ - setBackgroundColor(color) { - this._setBackgroundColor(color, true); - } - - _setBackgroundColor(color, updateModel) { - const innerShape = this.getInnerShape(); - innerShape.setFill(color); - - const connector = this.getShrinkConnector(); - if (connector) { - connector.setFill(color); - } - - if ($defined(updateModel) && updateModel) { - const model = this.getModel(); - model.setBackgroundColor(color); - } - } - - /** */ - getBackgroundColor() { - const model = this.getModel(); - let result = model.getBackgroundColor(); - if (!$defined(result)) { - result = TopicStyle.defaultBackgroundColor(this); - } - return result; - } - - /** */ - setBorderColor(color) { - this._setBorderColor(color, true); - } - - _setBorderColor(color, updateModel) { - const innerShape = this.getInnerShape(); - innerShape.setAttribute('strokeColor', color); - - const connector = this.getShrinkConnector(); - if (connector) { - connector.setAttribute('strokeColor', color); - } - - if ($defined(updateModel) && updateModel) { - const model = this.getModel(); - model.setBorderColor(color); - } - } - - /** */ - getBorderColor() { - const model = this.getModel(); - let result = model.getBorderColor(); - if (!$defined(result)) { - result = TopicStyle.defaultBorderColor(this); - } - return result; - } - - _buildTopicShape() { - const groupAttributes = { - width: 100, - height: 100, - coordSizeWidth: 100, - coordSizeHeight: 100, - }; - const group = new Group(groupAttributes); - this._set2DElement(group); - - // Shape must be build based on the model width ... - const outerShape = this.getOuterShape(); - const innerShape = this.getInnerShape(); - const textShape = this.getTextShape(); - - // Add to the group ... - group.append(outerShape); - group.append(innerShape); - group.append(textShape); - - // Update figure size ... - const model = this.getModel(); - if (model.getFeatures().length !== 0) { - this.getOrBuildIconGroup(); - } - - const shrinkConnector = this.getShrinkConnector(); - if ($defined(shrinkConnector)) { - shrinkConnector.addToWorkspace(group); - } - - // Register listeners ... - this._registerDefaultListenersToElement(group, this); - } - - _registerDefaultListenersToElement(elem, topic) { - const mouseOver = function mouseOver(event) { - if (topic.isMouseEventsEnabled()) { - topic.handleMouseOver(event); - } - }; - elem.addEvent('mouseover', mouseOver); - - const outout = function outout(event) { - if (topic.isMouseEventsEnabled()) { - topic.handleMouseOut(event); - } - }; - elem.addEvent('mouseout', outout); - - const me = this; - // Focus events ... - elem.addEvent('mousedown', (event) => { - const isMac = window.navigator.platform.toUpperCase().indexOf('MAC') >= 0; - if (!me.isReadOnly()) { - // Disable topic selection of readOnly mode ... - let value = true; - if ((event.metaKey && isMac) || (event.ctrlKey && !isMac)) { - value = !me.isOnFocus(); - event.stopPropagation(); - event.preventDefault(); - } - topic.setOnFocus(value); - } - - const eventDispatcher = me._getTopicEventDispatcher(); - eventDispatcher.process(TopicEvent.CLICK, me); - event.stopPropagation(); - }); - } - - /** */ - areChildrenShrunken() { - const model = this.getModel(); - return model.areChildrenShrunken() && !this.isCentralTopic(); - } - - /** */ - isCollapsed() { - let result = false; - - let current = this.getParent(); - while (current && !result) { - result = current.areChildrenShrunken(); - current = current.getParent(); - } - return result; - } - - /** */ - setChildrenShrunken(value) { - // Update Model ... - const model = this.getModel(); - model.setChildrenShrunken(value); - - // Change render base on the state. - const shrinkConnector = this.getShrinkConnector(); - if ($defined(shrinkConnector)) { - shrinkConnector.changeRender(value); - } - - // Do some fancy animation .... - const elements = this._flatten2DElements(this); - const fade = new FadeEffect(elements, !value); - const me = this; - fade.addEvent('complete', () => { - // Set focus on the parent node ... - if (value) { - me.setOnFocus(true); - } - - // Set focus in false for all the children ... - elements.forEach((elem) => { - if (elem.setOnFocus) { - elem.setOnFocus(false); - } - }); - }); - fade.start(); - - EventBus.instance.fireEvent(EventBus.events.NodeShrinkEvent, model); - } - - /** */ - getShrinkConnector() { - let result = this._connector; - if (this._connector == null) { - this._connector = new ShirinkConnector(this); - this._connector.setVisibility(false); - result = this._connector; - } - return result; - } - - /** */ - handleMouseOver() { - const outerShape = this.getOuterShape(); - outerShape.setOpacity(1); - } - - /** */ - handleMouseOut() { - const outerShape = this.getOuterShape(); - if (!this.isOnFocus()) { - outerShape.setOpacity(0); - } - } - - /** */ - showTextEditor(text) { - this._getTopicEventDispatcher().show(this, { text }); - } - - /** */ - showNoteEditor() { - const topicId = this.getId(); - const model = this.getModel(); - const editorModel = { - getValue() { - const notes = model.findFeatureByType(TopicFeature.Note.id); - let result; - if (notes.length > 0) result = notes[0].getText(); - - return result; - }, - - setValue(value) { - const dispatcher = ActionDispatcher.getInstance(); - const notes = model.findFeatureByType(TopicFeature.Note.id); - if (!$defined(value)) { - const featureId = notes[0].getId(); - dispatcher.removeFeatureFromTopic(topicId, featureId); - } else if (notes.length > 0) { - dispatcher.changeFeatureToTopic(topicId, notes[0].getId(), { - text: value, - }); - } else { - dispatcher.addFeatureToTopic(topicId, TopicFeature.Note.id, { - text: value, - }); - } - }, - }; - const editor = new NoteEditor(editorModel); - this.closeEditors(); - editor.show(); - } - - /** opens a dialog where the user can enter or edit an existing link associated with this topic */ - showLinkEditor() { - const topicId = this.getId(); - const model = this.getModel(); - const editorModel = { - getValue() { - // @param {mindplot.model.LinkModel[]} links - const links = model.findFeatureByType(TopicFeature.Link.id); - let result; - if (links.length > 0) result = links[0].getUrl(); - - return result; - }, - - setValue(value) { - const dispatcher = ActionDispatcher.getInstance(); - const links = model.findFeatureByType(TopicFeature.Link.id); - if (!$defined(value)) { - const featureId = links[0].getId(); - dispatcher.removeFeatureFromTopic(topicId, featureId); - } else if (links.length > 0) { - dispatcher.changeFeatureToTopic(topicId, links[0].getId(), { - url: value, - }); - } else { - dispatcher.addFeatureToTopic(topicId, TopicFeature.Link.id, { - url: value, - }); - } - }, - }; - - this.closeEditors(); - const editor = new LinkEditor(editorModel); - editor.show(); - } - - /** */ - closeEditors() { - this._getTopicEventDispatcher().close(true); - } - - _getTopicEventDispatcher() { - return TopicEventDispatcher.getInstance(); - } - - /** - * Point: references the center of the rect shape.!!! - */ - setPosition(point) { - $assert(point, 'position can not be null'); - // allowed param reassign to avoid risks of existing code relying in this side-effect - // eslint-disable-next-line no-param-reassign - point.x = Math.ceil(point.x); - // eslint-disable-next-line no-param-reassign - point.y = Math.ceil(point.y); - - // Update model's position ... - const model = this.getModel(); - model.setPosition(point.x, point.y); - - // Elements are positioned in the center. - // All topic element must be positioned based on the innerShape. - const size = this.getSize(); - - const cx = point.x - size.width / 2; - const cy = point.y - size.height / 2; - - // Update visual position. - this._elem2d.setPosition(cx, cy); - - // Update connection lines ... - this._updateConnectionLines(); - - // Check object state. - this.invariant(); - } - - /** */ - getOutgoingLine() { - return this._outgoingLine; - } - - /** */ - getIncomingLines() { - const result = []; - const children = this.getChildren(); - for (let i = 0; i < children.length; i++) { - const node = children[i]; - const line = node.getOutgoingLine(); - if ($defined(line)) { - result.push(line); - } - } - return result; - } - - /** */ - getOutgoingConnectedTopic() { - let result = null; - const line = this.getOutgoingLine(); - if ($defined(line)) { - result = line.getTargetTopic(); - } - return result; - } - - _updateConnectionLines() { - // Update this to parent line ... - const outgoingLine = this.getOutgoingLine(); - if ($defined(outgoingLine)) { - outgoingLine.redraw(); - } - - // Update all the incoming lines ... - const incomingLines = this.getIncomingLines(); - for (let i = 0; i < incomingLines.length; i++) { - incomingLines[i].redraw(); - } - - // Update relationship lines - for (let j = 0; j < this._relationships.length; j++) { - this._relationships[j].redraw(); - } - } - - /** */ - setBranchVisibility(value) { - let current = this; - let parent = this; - while (parent != null && !parent.isCentralTopic()) { - current = parent; - parent = current.getParent(); - } - current.setVisibility(value); - } - - /** */ - setVisibility(value) { - this._setTopicVisibility(value); - - // Hide all children... - this._setChildrenVisibility(value); - - // If there there are connection to the node, topic must be hidden. - this._setRelationshipLinesVisibility(value); - - // If it's connected, the connection must be rendered. - const outgoingLine = this.getOutgoingLine(); - if (outgoingLine) { - outgoingLine.setVisibility(value); - } - } - - /** */ - moveToBack() { - // Update relationship lines - for (let j = 0; j < this._relationships.length; j++) { - this._relationships[j].moveToBack(); - } - const connector = this.getShrinkConnector(); - if ($defined(connector)) { - connector.moveToBack(); - } - - this.get2DElement().moveToBack(); - } - - /** */ - moveToFront() { - this.get2DElement().moveToFront(); - const connector = this.getShrinkConnector(); - if ($defined(connector)) { - connector.moveToFront(); - } - // Update relationship lines - for (let j = 0; j < this._relationships.length; j++) { - this._relationships[j].moveToFront(); - } - } - - /** */ - isVisible() { - const elem = this.get2DElement(); - return elem.isVisible(); - } - - _setRelationshipLinesVisibility(value) { - this._relationships.forEach((relationship) => { - const sourceTopic = relationship.getSourceTopic(); - const targetTopic = relationship.getTargetTopic(); - - const targetParent = targetTopic.getModel().getParent(); - const sourceParent = sourceTopic.getModel().getParent(); - relationship.setVisibility( - value - && (targetParent == null || !targetParent.areChildrenShrunken()) - && (sourceParent == null || !sourceParent.areChildrenShrunken()), - ); - }); - } - - _setTopicVisibility(value) { - const elem = this.get2DElement(); - elem.setVisibility(value); - - if (this.getIncomingLines().length > 0) { - const connector = this.getShrinkConnector(); - if ($defined(connector)) { - connector.setVisibility(value); - } - } - - const textShape = this.getTextShape(); - textShape.setVisibility(this.getShapeType() !== TopicShape.IMAGE ? value : false); - } - - /** */ - setOpacity(opacity) { - const elem = this.get2DElement(); - elem.setOpacity(opacity); - - const connector = this.getShrinkConnector(); - if ($defined(connector)) { - connector.setOpacity(opacity); - } - const textShape = this.getTextShape(); - textShape.setOpacity(opacity); - } - - _setChildrenVisibility(isVisible) { - // Hide all children. - const children = this.getChildren(); - const model = this.getModel(); - - const visibility = isVisible ? !model.areChildrenShrunken() : isVisible; - children.forEach((child) => { - child.setVisibility(visibility); - const outgoingLine = child.getOutgoingLine(); - outgoingLine.setVisibility(visibility); - }); - } - - /** */ - invariant() { - const line = this._outgoingLine; - const model = this.getModel(); - const isConnected = model.isConnected(); - - // Check consistency... - if ((isConnected && !line) || (!isConnected && line)) { - // $assert(false,'Illegal state exception.'); - } - } - - /** */ - setSize(size, force) { - $assert(size, 'size can not be null'); - $assert($defined(size.width), 'size seem not to be a valid element'); - const roundedSize = { width: Math.ceil(size.width), height: Math.ceil(size.height) }; - - const oldSize = this.getSize(); - const hasSizeChanged = oldSize.width !== roundedSize.width - || oldSize.height !== roundedSize.height; - if (hasSizeChanged || force) { - NodeGraph.prototype.setSize.call(this, roundedSize); - - const outerShape = this.getOuterShape(); - const innerShape = this.getInnerShape(); - - outerShape.setSize(roundedSize.width + 4, roundedSize.height + 6); - innerShape.setSize(roundedSize.width, roundedSize.height); - - // Update the figure position(ej: central topic must be centered) and children position. - this._updatePositionOnChangeSize(oldSize, roundedSize); - - if (hasSizeChanged) { - EventBus.instance.fireEvent(EventBus.events.NodeResizeEvent, { - node: this.getModel(), - size: roundedSize, - }); - } - } - } - - _updatePositionOnChangeSize() { - $assert(false, 'this method must be overwrited.'); - } - - /** */ - disconnect(workspace) { - const outgoingLine = this.getOutgoingLine(); - if ($defined(outgoingLine)) { - $assert(workspace, 'workspace can not be null'); - - this._outgoingLine = null; - - // Disconnect nodes ... - const targetTopic = outgoingLine.getTargetTopic(); - targetTopic.removeChild(this); - - // Update model ... - const childModel = this.getModel(); - childModel.disconnect(); - - this._parent = null; - - // Remove graphical element from the workspace... - outgoingLine.removeFromWorkspace(workspace); - - // Remove from workspace. - EventBus.instance.fireEvent(EventBus.events.NodeDisconnectEvent, this.getModel()); - - // Change text based on the current connection ... - const model = this.getModel(); - if (!model.getText()) { - const text = this.getText(); - this._setText(text, false); - } - if (!model.getFontSize()) { - const size = this.getFontSize(); - this.setFontSize(size, false); - } - - // Hide connection line?. - if (targetTopic.getChildren().length === 0) { - const connector = targetTopic.getShrinkConnector(); - if ($defined(connector)) { - connector.setVisibility(false); - } - } - } - } - - /** */ - getOrder() { - const model = this.getModel(); - return model.getOrder(); - } - - /** */ - setOrder(value) { - const model = this.getModel(); - model.setOrder(value); - } - - /** */ - connectTo(targetTopic, workspace) { - $assert(!this._outgoingLine, 'Could not connect an already connected node'); - $assert(targetTopic !== this, 'Circular connection are not allowed'); - $assert(targetTopic, 'Parent Graph can not be null'); - $assert(workspace, 'Workspace can not be null'); - - // Connect Graphical Nodes ... - targetTopic.append(this); - this._parent = targetTopic; - - // Update model ... - const targetModel = targetTopic.getModel(); - const childModel = this.getModel(); - childModel.connectTo(targetModel); - - // Create a connection line ... - const outgoingLine = new ConnectionLine(this, targetTopic); - outgoingLine.setVisibility(false); - - this._outgoingLine = outgoingLine; - workspace.append(outgoingLine); - - // Update figure is necessary. - this.updateTopicShape(targetTopic); - - // Change text based on the current connection ... - const model = this.getModel(); - if (!model.getText()) { - const text = this.getText(); - this._setText(text, false); - } - if (!model.getFontSize()) { - const size = this.getFontSize(); - this.setFontSize(size, false); - } - this.getTextShape(); - - // Display connection node... - const connector = targetTopic.getShrinkConnector(); - if ($defined(connector)) { - connector.setVisibility(true); - } - - // Redraw line ... - outgoingLine.redraw(); - - // Fire connection event ... - if (this.isInWorkspace()) { - EventBus.instance.fireEvent(EventBus.events.NodeConnectEvent, { - parentNode: targetTopic.getModel(), - childNode: this.getModel(), - }); - } - } - - /** */ - append(child) { - const children = this.getChildren(); - children.push(child); - } - - /** */ - removeChild(child) { - const children = this.getChildren(); - this._children = children.filter((c) => c !== child); - } - - /** */ - getChildren() { - let result = this._children; - if (!$defined(result)) { - this._children = []; - result = this._children; - } - return result; - } - - /** */ - removeFromWorkspace(workspace) { - const elem2d = this.get2DElement(); - workspace.removeChild(elem2d); - const line = this.getOutgoingLine(); - if ($defined(line)) { - workspace.removeChild(line); - } - this._isInWorkspace = false; - EventBus.instance.fireEvent(EventBus.events.NodeRemoved, this.getModel()); - } - - /** */ - addToWorkspace(workspace) { - const elem = this.get2DElement(); - workspace.append(elem); - if (!this.isInWorkspace()) { - if (!this.isCentralTopic()) { - EventBus.instance.fireEvent(EventBus.events.NodeAdded, this.getModel()); - } - - if (this.getModel().isConnected()) { - EventBus.instance.fireEvent(EventBus.events.NodeConnectEvent, { - parentNode: this.getOutgoingConnectedTopic().getModel(), - childNode: this.getModel(), - }); - } - } - this._isInWorkspace = true; - this._adjustShapes(); - } - - /** */ - isInWorkspace() { - return this._isInWorkspace; - } - - /** */ - createDragNode(layoutManager) { - const result = super.createDragNode(layoutManager); - - // Is the node already connected ? - const targetTopic = this.getOutgoingConnectedTopic(); - if ($defined(targetTopic)) { - result.connectTo(targetTopic); - result.setVisibility(false); - } - - // If a drag node is create for it, let's hide the editor. - this._getTopicEventDispatcher().close(); - - return result; - } - - _adjustShapes() { - if (this._isInWorkspace) { - const textShape = this.getTextShape(); - if (this.getShapeType() !== TopicShape.IMAGE) { - const textWidth = textShape.getWidth(); - - let textHeight = textShape.getHeight(); - textHeight = textHeight !== 0 ? textHeight : 20; - - const topicPadding = TopicStyle.getInnerPadding(this); - - // Adjust the icon size to the size of the text ... - const iconGroup = this.getOrBuildIconGroup(); - const fontHeight = this.getTextShape().getFontHeight(); - iconGroup.setPosition(topicPadding, topicPadding); - iconGroup.seIconSize(fontHeight, fontHeight); - - // Add a extra padding between the text and the icons - let iconsWidth = iconGroup.getSize().width; - if (iconsWidth !== 0) { - iconsWidth += textHeight / 4; - } - - const height = textHeight + topicPadding * 2; - const width = textWidth + iconsWidth + topicPadding * 2; - - this.setSize({ width, height }); - - // Position node ... - textShape.setPosition(topicPadding + iconsWidth, topicPadding); - } else { - // In case of images, the size if fixed ... - const size = this.getModel().getImageSize(); - this.setSize(size); - } - } - } - - _flatten2DElements(topic) { - let result = []; - - const children = topic.getChildren(); - children.forEach((child) => { - result.push(child); - result.push(child.getOutgoingLine()); - - const relationships = child.getRelationships(); - result = result.concat(relationships); - - if (!child.areChildrenShrunken()) { - const innerChilds = this._flatten2DElements(child); - result = result.concat(innerChilds); - } - }); - return result; - } - - /** - * @param childTopic - * @return {Boolean} true if childtopic is a child topic of this topic or the topic itself - */ - isChildTopic(childTopic) { - let result = this.getId() === childTopic.getId(); - if (!result) { - const children = this.getChildren(); - for (let i = 0; i < children.length; i++) { - const parent = children[i]; - result = parent.isChildTopic(childTopic); - if (result) { - break; - } - } - } - return result; - } - - /** @return {Boolean} true if the topic is the central topic of the map */ - isCentralTopic() { - return this.getModel().getType() === INodeModel.CENTRAL_TOPIC_TYPE; - } -} - -export default Topic; diff --git a/packages/mindplot/src/components/TopicConfig.js b/packages/mindplot/src/components/TopicConfig.js deleted file mode 100644 index d1a94b8f..00000000 --- a/packages/mindplot/src/components/TopicConfig.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @constant - * @type {Number} - * @default - */ -const CONNECTOR_WIDTH = 6; -/** - * @constant - * @type {Object} - * @default - */ -const OUTER_SHAPE_ATTRIBUTES = { - fillColor: 'rgb(252,235,192)', - stroke: '1 dot rgb(241,163,39)', - x: 0, - y: 0, -}; -/** - * @constant - * @type {Object} - * @default - */ -const OUTER_SHAPE_ATTRIBUTES_FOCUS = { fillColor: 'rgb(244,184,45)', x: 0, y: 0 }; -/** - * @constant - * @type {Object} - * @default - * */ -const INNER_RECT_ATTRIBUTES = { stroke: '2 solid' }; - -export default { - CONNECTOR_WIDTH, - OUTER_SHAPE_ATTRIBUTES, - OUTER_SHAPE_ATTRIBUTES_FOCUS, - INNER_RECT_ATTRIBUTES, -}; diff --git a/packages/mindplot/src/components/Workspace.js b/packages/mindplot/src/components/Workspace.js deleted file mode 100644 index 558a2c81..00000000 --- a/packages/mindplot/src/components/Workspace.js +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import { Workspace as Workspace2D, Toolkit } from '@wisemapping/web2d'; - -class Workspace { - constructor(screenManager, zoom) { - // Create a suitable container ... - $assert(screenManager, 'Div container can not be null'); - $assert(zoom, 'zoom container can not be null'); - - this._zoom = zoom; - this._screenManager = screenManager; - - const divContainer = screenManager.getContainer(); - this._screenWidth = parseInt(divContainer.css('width'), 10); - this._screenHeight = parseInt(divContainer.css('height'), 10); - - // Initialize web2d workspace. - const workspace = this._createWorkspace(); - this._workspace = workspace; - - // Append to the workspace... - workspace.addItAsChildTo(divContainer); - this.setZoom(zoom, true); - - // Register drag events ... - this._registerDragEvents(); - this._eventsEnabled = true; - } - - _createWorkspace() { - // Initialize workspace ... - const coordOriginX = -(this._screenWidth / 2); - const coordOriginY = -(this._screenHeight / 2); - - const workspaceProfile = { - width: `${this._screenWidth}px`, - height: `${this._screenHeight}px`, - coordSizeWidth: this._screenWidth, - coordSizeHeight: this._screenHeight, - coordOriginX, - coordOriginY, - fillColor: 'transparent', - strokeWidth: 0, - }; - Toolkit.init(); - return new Workspace2D(workspaceProfile); - } - - append(shape) { - if ($defined(shape.addToWorkspace)) { - shape.addToWorkspace(this); - } else { - this._workspace.append(shape); - } - } - - removeChild(shape) { - // Element is a node, not a web2d element? - if ($defined(shape.removeFromWorkspace)) { - shape.removeFromWorkspace(this); - } else { - this._workspace.removeChild(shape); - } - } - - addEvent(type, listener) { - this._workspace.addEvent(type, listener); - } - - removeEvent(type, listener) { - $assert(type, 'type can not be null'); - $assert(listener, 'listener can not be null'); - this._workspace.removeEvent(type, listener); - } - - getSize() { - return this._workspace.getCoordSize(); - } - - setZoom(zoom, center) { - this._zoom = zoom; - const workspace = this._workspace; - - // Update coord scale... - const coordWidth = zoom * this._screenWidth; - const coordHeight = zoom * this._screenHeight; - workspace.setCoordSize(coordWidth, coordHeight); - - // View port coords ... - if (this._viewPort) { - this._viewPort.width *= zoom; - this._viewPort.height *= zoom; - } - - // Center topic.... - let coordOriginX; - let coordOriginY; - - if (center) { - if (this._viewPort) { - coordOriginX = -(this._viewPort.width / 2); - coordOriginY = -(this._viewPort.height / 2); - } else { - coordOriginX = -(coordWidth / 2); - coordOriginY = -(coordHeight / 2); - } - } else { - const coordOrigin = workspace.getCoordOrigin(); - coordOriginX = coordOrigin.x; - coordOriginY = coordOrigin.y; - } - - workspace.setCoordOrigin(coordOriginX, coordOriginY); - - // Update screen. - this._screenManager.setOffset(coordOriginX, coordOriginY); - this._screenManager.setScale(zoom); - - // Some changes in the screen. Let's fire an update event... - this._screenManager.fireEvent('update'); - } - - getScreenManager() { - return this._screenManager; - } - - enableWorkspaceEvents(value) { - this._eventsEnabled = value; - } - - isWorkspaceEventsEnabled() { - return this._eventsEnabled; - } - - dumpNativeChart() { - return this._workspace.dumpNativeChart(); - } - - _registerDragEvents() { - const workspace = this._workspace; - const screenManager = this._screenManager; - const mWorkspace = this; - const mouseDownListener = function mouseDownListener(event) { - if (!$defined(workspace._mouseMoveListener)) { - if (mWorkspace.isWorkspaceEventsEnabled()) { - mWorkspace.enableWorkspaceEvents(false); - - const mouseDownPosition = screenManager.getWorkspaceMousePosition(event); - const originalCoordOrigin = workspace.getCoordOrigin(); - - let wasDragged = false; - workspace._mouseMoveListener = (mouseMoveEvent) => { - const currentMousePosition = screenManager.getWorkspaceMousePosition(mouseMoveEvent); - - const offsetX = currentMousePosition.x - mouseDownPosition.x; - const coordOriginX = -offsetX + originalCoordOrigin.x; - - const offsetY = currentMousePosition.y - mouseDownPosition.y; - const coordOriginY = -offsetY + originalCoordOrigin.y; - - workspace.setCoordOrigin(coordOriginX, coordOriginY); - - // Change cursor. - window.document.body.style.cursor = 'move'; - mouseMoveEvent.preventDefault(); - - // Fire drag event ... - screenManager.fireEvent('update'); - wasDragged = true; - }; - screenManager.addEvent('mousemove', workspace._mouseMoveListener); - - // Register mouse up listeners ... - workspace._mouseUpListener = () => { - screenManager.removeEvent('mousemove', workspace._mouseMoveListener); - screenManager.removeEvent('mouseup', workspace._mouseUpListener); - workspace._mouseUpListener = null; - workspace._mouseMoveListener = null; - window.document.body.style.cursor = 'default'; - - // Update screen manager offset. - const coordOrigin = workspace.getCoordOrigin(); - screenManager.setOffset(coordOrigin.x, coordOrigin.y); - mWorkspace.enableWorkspaceEvents(true); - - if (!wasDragged) { - screenManager.fireEvent('click'); - } - }; - screenManager.addEvent('mouseup', workspace._mouseUpListener); - } - } else { - workspace._mouseUpListener(); - } - }; - screenManager.addEvent('mousedown', mouseDownListener); - } - - setViewPort(size) { - this._viewPort = size; - } -} - -export default Workspace; diff --git a/packages/mindplot/src/components/commands/AddFeatureToTopicCommand.js b/packages/mindplot/src/components/commands/AddFeatureToTopicCommand.js deleted file mode 100644 index 2bc75758..00000000 --- a/packages/mindplot/src/components/commands/AddFeatureToTopicCommand.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import Command from '../Command'; - -class AddFeatureToTopicCommand extends Command { - /* - * @classdesc This command class handles do/undo of adding features to topics, e.g. an - * icon or a note. For a reference of existing features, refer to {@link mindplot.TopicFeature} - * @constructs - * @param {String} topicId the id of the topic - * @param {String} featureType the id of the feature type to add, e.g. "icon" - * @param {Object} attributes the attribute(s) of the respective feature model - * @extends mindplot.Command - * @see mindplot.model.FeatureModel and subclasses - */ - constructor(topicId, featureType, attributes) { - $assert($defined(topicId), 'topicId can not be null'); - $assert(featureType, 'featureType can not be null'); - $assert(attributes, 'attributes can not be null'); - - super(); - this._topicId = topicId; - this._featureType = featureType; - this._attributes = attributes; - this._featureModel = null; - } - - /** - * Overrides abstract parent method - */ - execute(commandContext) { - const topic = commandContext.findTopics(this._topicId)[0]; - - // Feature must be created only one time. - if (!this._featureModel) { - const model = topic.getModel(); - this._featureModel = model.createFeature(this._featureType, this._attributes); - } - topic.addFeature(this._featureModel); - } - - /** - * Overrides abstract parent method - * @see {@link mindplot.Command.undoExecute} - */ - undoExecute(commandContext) { - const topic = commandContext.findTopics(this._topicId)[0]; - topic.removeFeature(this._featureModel); - } -} - -export default AddFeatureToTopicCommand; diff --git a/packages/mindplot/src/components/commands/AddRelationshipCommand.js b/packages/mindplot/src/components/commands/AddRelationshipCommand.js deleted file mode 100644 index df914d92..00000000 --- a/packages/mindplot/src/components/commands/AddRelationshipCommand.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert } from '@wisemapping/core-js'; -import Command from '../Command'; - -class AddRelationshipCommand extends Command { - /** - * @classdesc This command class handles do/undo of adding a relationship to a topic. - * @constructs - * @param {XMLDOM} model - * @extends mindplot.Command - */ - constructor(model) { - $assert(model, 'Relationship model can not be null'); - - super(); - this._model = model; - } - - /** - * Overrides abstract parent method - */ - execute(commandContext) { - const relationship = commandContext.addRelationship(this._model); - relationship.setOnFocus(true); - } - - /** - * Overrides abstract parent method - * @see {@link mindplot.Command.undoExecute} - */ - undoExecute(commandContext) { - const rel = commandContext.findRelationships(this._model.getId()); - commandContext.deleteRelationship(rel[0]); - } -} - -export default AddRelationshipCommand; diff --git a/packages/mindplot/src/components/commands/AddTopicCommand.js b/packages/mindplot/src/components/commands/AddTopicCommand.js deleted file mode 100644 index 7df5907a..00000000 --- a/packages/mindplot/src/components/commands/AddTopicCommand.js +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import Command from '../Command'; - -class AddTopicCommand extends Command { - /** - * @classdesc This command class handles do/undo of adding one or multiple topics to - * the mindmap. - * @constructs - * @param {Array} models one or multiple models - * @param {Array} parentTopicsId ids of the parent topics to add the children to, or null - * when attaching a dragged node or a node/branch from clipboard - * @extends mindplot.Command - */ - constructor(models, parentTopicsId) { - $assert(models, 'models can not be null'); - $assert(parentTopicsId == null || parentTopicsId.length === models.length, 'parents and models must have the same size'); - - super(); - this._models = models; - this._parentsIds = parentTopicsId; - } - - /** - * Overrides abstract parent method - */ - execute(commandContext) { - const me = this; - this._models.forEach((model, index) => { - // Add a new topic ... - const topic = commandContext.createTopic(model); - - // Connect to topic ... - if (me._parentsIds) { - const parentId = me._parentsIds[index]; - if ($defined(parentId)) { - const parentTopic = commandContext.findTopics(parentId)[0]; - commandContext.connect(topic, parentTopic); - } - } else { - commandContext.addTopic(topic); - } - - // Select just created node ... - const designer = commandContext._designer; - designer.onObjectFocusEvent(topic); - topic.setOnFocus(true); - - // Render node ... - topic.setVisibility(true); - }); - } - - /** - * Overrides abstract parent method - * @see {@link mindplot.Command.undoExecute} - */ - undoExecute(commandContext) { - // Delete disconnected the nodes. Create a copy of the topics ... - const clonedModel = []; - this._models.forEach((model) => { - clonedModel.push(model.clone()); - }); - - // Finally, remove the nodes ... - this._models.forEach((model) => { - const topicId = model.getId(); - const topic = commandContext.findTopics(topicId)[0]; - commandContext.deleteTopic(topic); - }); - - this._models = clonedModel; - } -} - -export default AddTopicCommand; diff --git a/packages/mindplot/src/components/commands/ChangeFeatureToTopicCommand.js b/packages/mindplot/src/components/commands/ChangeFeatureToTopicCommand.js deleted file mode 100644 index 2ef6bbee..00000000 --- a/packages/mindplot/src/components/commands/ChangeFeatureToTopicCommand.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import Command from '../Command'; - -class ChangeFeatureToTopicCommand extends Command { - /** - * @extends mindplot.Command - * @constructs - * @param topicId - * @param featureId - * @param attributes - * @throws will throw an error if topicId is null or undefined - * @throws will throw an error if featureId is null or undefined - * @throws will throw an error if attributes is null or undefined - */ - constructor(topicId, featureId, attributes) { - $assert($defined(topicId), 'topicId can not be null'); - $assert($defined(featureId), 'featureId can not be null'); - $assert($defined(attributes), 'attributes can not be null'); - - super(); - this._topicId = topicId; - this._featureId = featureId; - this._attributes = attributes; - } - - /** - * Overrides abstract parent method - */ - execute(commandContext) { - const topic = commandContext.findTopics(this._topicId)[0]; - const feature = topic.findFeatureById(this._featureId); - - const oldAttributes = feature.getAttributes(); - feature.setAttributes(this._attributes); - this._attributes = oldAttributes; - } - - /** - * Overrides abstract parent method - * @see {@link mindplot.Command.undoExecute} - */ - undoExecute(commandContext) { - this.execute(commandContext); - } -} - -export default ChangeFeatureToTopicCommand; diff --git a/packages/mindplot/src/components/commands/DeleteCommand.js b/packages/mindplot/src/components/commands/DeleteCommand.js deleted file mode 100644 index a868336a..00000000 --- a/packages/mindplot/src/components/commands/DeleteCommand.js +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import Command from '../Command'; - -class DeleteCommand extends Command { - /** - * @classdesc This command class handles do/undo of deleting a topic. - * @constructs - * @param {Array} topicIds ids of the topics to delete - * @param {Array} relIds ids of the relationships connected to the topics - * @extends mindplot.Command - */ - constructor(topicIds, relIds) { - $assert($defined(relIds), 'topicIds can not be null'); - - super(); - this._relIds = relIds; - this._topicIds = topicIds; - this._deletedTopicModels = []; - this._deletedRelModel = []; - this._parentTopicIds = []; - } - - /** - * Overrides abstract parent method - */ - execute(commandContext) { - // If a parent has been selected for deletion, the children must be excluded from the delete ... - const topics = this._filterChildren(this._topicIds, commandContext); - - if (topics.length > 0) { - topics.forEach(((topic) => { - // In case that it's editing text node, force close without update ... - topic.closeEditors(); - - const model = topic.getModel(); - - // Delete relationships - const relationships = this._collectInDepthRelationships(topic); - this._deletedRelModel = this._deletedRelModel.concat( - relationships.map((rel) => rel.getModel().clone()), - ); - - relationships.forEach((relationship) => { - commandContext.deleteRelationship(relationship); - }); - - // Store information for undo ... - const clonedModel = model.clone(); - this._deletedTopicModels.push(clonedModel); - const outTopic = topic.getOutgoingConnectedTopic(); - let outTopicId = null; - if (outTopic != null) { - outTopicId = outTopic.getId(); - } - this._parentTopicIds.push(outTopicId); - - // Finally, delete the topic from the workspace... - commandContext.deleteTopic(topic); - })); - } - - const rels = commandContext.findRelationships(this._relIds); - if (rels.length > 0) { - rels.forEach(((rel) => { - this._deletedRelModel.push(rel.getModel().clone()); - commandContext.deleteRelationship(rel); - })); - } - } - - /** - * Overrides abstract parent method - * @see {@link mindplot.Command.undoExecute} - */ - undoExecute(commandContext) { - // Add all the topics ... - this._deletedTopicModels.forEach((model) => { - commandContext.createTopic(model); - }); - - // Do they need to be connected ? - this._deletedTopicModels.forEach(((topicModel, index) => { - const topics = commandContext.findTopics(topicModel.getId()); - - const parentId = this._parentTopicIds[index]; - if (parentId) { - const parentTopics = commandContext.findTopics(parentId); - commandContext.connect(topics[0], parentTopics[0]); - } - })); - - // Add rebuild relationships ... - this._deletedRelModel.forEach((model) => { - commandContext.addRelationship(model); - }); - - // Finally display the topics ... - this._deletedTopicModels.forEach((topicModel) => { - const topics = commandContext.findTopics(topicModel.getId()); - topics[0].setBranchVisibility(true); - }); - - // Focus on last recovered topic .. - if (this._deletedTopicModels.length > 0) { - const firstTopic = this._deletedTopicModels[0]; - const topic = commandContext.findTopics(firstTopic.getId())[0]; - topic.setOnFocus(true); - } - - this._deletedTopicModels = []; - this._parentTopicIds = []; - this._deletedRelModel = []; - } - - _filterChildren(topicIds, commandContext) { - const topics = commandContext.findTopics(topicIds); - - const result = []; - topics.forEach((topic) => { - let parent = topic.getParent(); - let found = false; - while (parent != null && !found) { - found = topicIds.includes(parent.getId()); - if (found) { - break; - } - parent = parent.getParent(); - } - - if (!found) { - result.push(topic); - } - }); - - return result; - } - - _collectInDepthRelationships(topic) { - let result = []; - result = result.concat(topic.getRelationships()); - - const children = topic.getChildren(); - const rels = children.map(((t) => this._collectInDepthRelationships(t))); - result = result.concat(rels.flat()); - - if (result.length > 0) { - // Filter for unique ... - result = result.sort((a, b) => a.getModel().getId() - b.getModel().getId()); - const ret = [result[0]]; - // start loop at 1 as element 0 can never be a duplicate - for (let i = 1; i < result.length; i++) { - if (result[i - 1] !== result[i]) { - ret.push(result[i]); - } - } - result = ret; - } - return result; - } -} - -export default DeleteCommand; diff --git a/packages/mindplot/src/components/commands/DragTopicCommand.js b/packages/mindplot/src/components/commands/DragTopicCommand.js deleted file mode 100644 index 0bdeede3..00000000 --- a/packages/mindplot/src/components/commands/DragTopicCommand.js +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import Command from '../Command'; - -class DragTopicCommand extends Command { - /** - * @classdesc This command class handles do/undo of dragging a topic to a new position. - * @constructs - * @param {String} topicId id of the topic to drag - * @param {Object} position - * @param {Number} order the order property (children are displayed in order from 0 to n) - * @param {mindplot.Topic} parentTopic the topic to be made the dragged topic's new parent - * @extends mindplot.Command - */ - constructor(topicId, position, order, parentTopic) { - $assert(topicId, 'topicId must be defined'); - super(); - - this._topicsId = topicId; - if ($defined(parentTopic)) { - this._parentId = parentTopic.getId(); - } - - this._position = position; - this._order = order; - } - - /** - * Overrides abstract parent method - */ - execute(commandContext) { - const topic = commandContext.findTopics(this._topicsId)[0]; - topic.setVisibility(false); - - // Save old position ... - const origParentTopic = topic.getOutgoingConnectedTopic(); - - // In this case, topics are positioned using order ... - const origOrder = topic.getOrder(); - const origPosition = topic.getPosition(); - - // Disconnect topic .. - if ($defined(origParentTopic) && origParentTopic !== this._parentId) { - commandContext.disconnect(topic); - } - - // Set topic order ... - if (this._order != null) { - topic.setOrder(this._order); - } else if (this._position != null) { - commandContext.moveTopic(topic, this._position); - } else { - $assert('Illegal command state exception.'); - } - - // Finally, connect topic ... - if (origParentTopic !== this._parentId) { - if ($defined(this._parentId)) { - const parentTopic = commandContext.findTopics(this._parentId)[0]; - commandContext.connect(topic, parentTopic); - } - - // Backup old parent id ... - this._parentId = null; - if ($defined(origParentTopic)) { - this._parentId = origParentTopic.getId(); - } - } - topic.setVisibility(true); - - // Store for undo ... - this._order = origOrder; - this._position = origPosition; - } - - /** - * Overrides abstract parent method - * @see {@link mindplot.Command.undoExecute} - */ - undoExecute(commandContext) { - this.execute(commandContext); - } -} - -export default DragTopicCommand; diff --git a/packages/mindplot/src/components/commands/GenericFunctionCommand.js b/packages/mindplot/src/components/commands/GenericFunctionCommand.js deleted file mode 100644 index 98a9f8c0..00000000 --- a/packages/mindplot/src/components/commands/GenericFunctionCommand.js +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import Command from '../Command'; - -class GenericFunctionCommand extends Command { - /** - * @classdesc This command handles do/undo of different actions, e.g. moving topics to - * a different position, changing text or font,... (for full reference check the - * StandaloneActionDispatcher i.e. the ActionDispatcher subclass in use) - * @constructs - * @param {Function} commandFunc the function the command shall execute - * @param {String|Array} topicsIds the ids of the topics affected - * @param {Object} [value] value arbitrary value necessary for the execution of the function, - * e.g. color, font family or text - * @extends mindplot.Command - */ - constructor(commandFunc, topicsIds, value) { - $assert(commandFunc, 'commandFunc must be defined'); - $assert($defined(topicsIds), 'topicsIds must be defined'); - - super(); - this._value = value; - this._topicsId = topicsIds; - this._commandFunc = commandFunc; - this._oldValues = []; - } - - /** - * Overrides abstract parent method - */ - execute(commandContext) { - if (!this.applied) { - let topics = null; - try { - topics = commandContext.findTopics(this._topicsId); - } catch (e) { - if (this._commandFunc.commandType !== 'changeTextToTopic') { - // Workaround: For some reason, there is a combination of events that involves - // making some modification and firing out of focus event. This is causing - // that a remove node try to be removed. - // In some other life, I will come with the solution. Almost aways occurs with IE9. - // I could be related with some change of order in sets o something similar. - throw e; - } - } - - if (topics != null) { - const me = this; - topics.forEach((topic) => { - const oldValue = me._commandFunc(topic, me._value); - me._oldValues.push(oldValue); - }); - } - this.applied = true; - } else { - throw new Error('Command can not be applied two times in a row.'); - } - } - - /** - * Overrides abstract parent method - * @see {@link mindplot.Command.undoExecute} - */ - undoExecute(commandContext) { - if (this.applied) { - const topics = commandContext.findTopics(this._topicsId); - - topics.forEach(((topic, index) => { - this._commandFunc(topic, this._oldValues[index]); - })); - - this.applied = false; - this._oldValues = []; - } else { - throw new Error('undo can not be applied.'); - } - } -} - -export default GenericFunctionCommand; diff --git a/packages/mindplot/src/components/commands/MoveControlPointCommand.js b/packages/mindplot/src/components/commands/MoveControlPointCommand.js deleted file mode 100644 index 28ca20a2..00000000 --- a/packages/mindplot/src/components/commands/MoveControlPointCommand.js +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import Command from '../Command'; - -class MoveControlPointCommand extends Command { - /** - * @classdesc This command handles do/undo of changing the control points of a relationship - * arrow. These are the two points that appear when the relationship is on focus. They - * influence how the arrow is drawn (not the source or the destination topic nor the arrow - * direction) - * @constructs - * @param {ControlPoint} ctrlPointController - * @param {Number} point 0 for the destination control point, 1 for the source control point - * @param ctrlPointController {ControlPoint} - * @param point {Number} 0 for the destination control point, 1 for the source control point - */ - constructor(ctrlPointController, point) { - $assert(ctrlPointController, 'line can not be null'); - $assert($defined(point), 'point can not be null'); - - super(); - this._ctrlPointControler = ctrlPointController; - this._line = ctrlPointController._line; - this._controlPoint = { ...this._ctrlPointControler.getControlPoint(point) }; - this._oldControlPoint = { ...this._ctrlPointControler.getOriginalCtrlPoint(point) }; - this._originalEndPoint = this._ctrlPointControler.getOriginalEndPoint(point); - switch (point) { - case 0: - this._wasCustom = this._line.getLine().isSrcControlPointCustom(); - this._endPoint = { ...this._line.getLine().getFrom() }; - break; - case 1: - this._wasCustom = this._line.getLine().isDestControlPointCustom(); - this._endPoint = { ...this._line.getLine().getTo() }; - break; - default: - break; - } - this._point = point; - } - - /** - * Overrides abstract parent method - */ - execute() { - const model = this._line.getModel(); - switch (this._point) { - case 0: - model.setSrcCtrlPoint({ ...this._controlPoint }); - this._line.setFrom(this._endPoint.x, this._endPoint.y); - this._line.setIsSrcControlPointCustom(true); - this._line.setSrcControlPoint({ ...this._controlPoint }); - break; - case 1: - model.setDestCtrlPoint({ ...this._controlPoint }); - this._wasCustom = this._line.getLine().isDestControlPointCustom(); - this._line.setTo(this._endPoint.x, this._endPoint.y); - this._line.setIsDestControlPointCustom(true); - this._line.setDestControlPoint({ ...this._controlPoint }); - break; - default: - break; - } - if (this._line.isOnFocus()) { - this._line._refreshShape(); - this._ctrlPointControler.setLine(this._line); - } - this._line.getLine().updateLine(this._point); - } - - /** - * Overrides abstract parent method - * @see {@link mindplot.Command.undoExecute} - */ - undoExecute() { - const line = this._line; - const model = line.getModel(); - switch (this._point) { - case 0: - if ($defined(this._oldControlPoint)) { - line.setFrom(this._originalEndPoint.x, this._originalEndPoint.y); - model.setSrcCtrlPoint({ ...this._oldControlPoint }); - line.setSrcControlPoint({ ...this._oldControlPoint }); - line.setIsSrcControlPointCustom(this._wasCustom); - } - break; - case 1: - if ($defined(this._oldControlPoint)) { - line.setTo(this._originalEndPoint.x, this._originalEndPoint.y); - model.setDestCtrlPoint({ ...this._oldControlPoint }); - line.setDestControlPoint({ ...this._oldControlPoint }); - line.setIsDestControlPointCustom(this._wasCustom); - } - break; - default: - break; - } - this._line.getLine().updateLine(this._point); - if (this._line.isOnFocus()) { - this._ctrlPointControler.setLine(line); - line._refreshShape(); - } - } -} - -export default MoveControlPointCommand; diff --git a/packages/mindplot/src/components/commands/RemoveFeatureFromTopicCommand.js b/packages/mindplot/src/components/commands/RemoveFeatureFromTopicCommand.js deleted file mode 100644 index bfec8ae2..00000000 --- a/packages/mindplot/src/components/commands/RemoveFeatureFromTopicCommand.js +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { $assert, $defined } from '@wisemapping/core-js'; -import Command from '../Command'; - -class RemoveFeatureFromTopicCommand extends Command { - /** - * @classdesc This command handles do/undo of removing a feature from a topic, e.g. an icon or - * a note. For a reference of existing features, refer to {@link mindplot.TopicFeature}. - * @constructs - * @param {String} topicId id of the topic to remove the feature from - * @param {String} featureId id of the feature to remove - * @extends mindplot.Command - */ - constructor(topicId, featureId) { - $assert($defined(topicId), 'topicId can not be null'); - $assert(featureId, 'iconModel can not be null'); - - super(); - this._topicId = topicId; - this._featureId = featureId; - this._oldFeature = null; - } - - /** - * Overrides abstract parent method - */ - execute(commandContext) { - const topic = commandContext.findTopics(this._topicId)[0]; - const feature = topic.findFeatureById(this._featureId); - topic.removeFeature(feature); - this._oldFeature = feature; - } - - /** - * Overrides abstract parent method - * @see {@link mindplot.Command.undoExecute} - */ - undoExecute(commandContext) { - const topic = commandContext.findTopics(this._topicId)[0]; - topic.addFeature(this._oldFeature); - this._oldFeature = null; - } -} - -export default RemoveFeatureFromTopicCommand; diff --git a/packages/mindplot/src/components/footer.js b/packages/mindplot/src/components/footer.js deleted file mode 100644 index 0d30003a..00000000 --- a/packages/mindplot/src/components/footer.js +++ /dev/null @@ -1,7 +0,0 @@ -import $ from 'jquery'; - -try { - $(document).trigger('loadcomplete', 'mind'); -} catch (e) { - console.error(e.stack); -} diff --git a/packages/mindplot/src/components/lang/ca.js b/packages/mindplot/src/components/lang/ca.js deleted file mode 100644 index 5682d468..00000000 --- a/packages/mindplot/src/components/lang/ca.js +++ /dev/null @@ -1,61 +0,0 @@ -const CA = { - DISCARD_CHANGES: 'Descartar els canvis', - SAVE: 'Desar', - INSERT: 'Inserir', - ZOOM_IN: 'Apropar', - ZOOM_OUT: 'Allunyar', - TOPIC_BORDER_COLOR: 'Color del bord', - TOPIC_SHAPE: 'Forma del Tòpic', - TOPIC_ADD: 'Afegir Tòpic', - TOPIC_DELETE: 'Esborrar Tòpic', - TOPIC_ICON: 'Afegir Icona', - TOPIC_LINK: 'Afegir Enllaç', - TOPIC_NOTE: 'Afegir Nota', - TOPIC_COLOR: 'Color del Tòpic', - TOPIC_RELATIONSHIP: 'Relació', - FONT_FAMILY: 'Tipus de font', - FONT_SIZE: 'Mida del text', - FONT_BOLD: 'Negreta', - FONT_ITALIC: 'Itàlica', - FONT_COLOR: 'Color del Text', - UNDO: 'Refer', - NOTE: 'Nota', - LOADING: 'Carregant ...', - PRINT: 'Imprimir', - PUBLISH: 'Publicar', - REDO: 'Desfer', - ADD_TOPIC: 'Afegir Tòpic', - COLLABORATE: 'Compartir', - EXPORT: 'Exportar', - HISTORY: 'Història', - SAVE_COMPLETE: 'Desat completat', - SAVING: 'Gravant ...', - ONE_TOPIC_MUST_BE_SELECTED: 'No ha estat possible crear un nou tòpic. Com a mínim ha de seleccionar un tòpic.', - ONLY_ONE_TOPIC_MUST_BE_SELECTED: "No ha estar possible crear un nou tòpic. Només un tòpic ha d'estar seleccionat.", - SAVE_COULD_NOT_BE_COMPLETED: "No s'ha pogut desar. Provi més tard.", - UNEXPECTED_ERROR_LOADING: "Ho sentim, un error ha esdevingut inesperadament. Provi recarregant l'editor, si el problema continua contacti a support@wisemapping.com.", - ZOOM_ERROR: 'No es pot fer més zoom.', - ZOOM_IN_ERROR: 'El zoom és massa creixent.', - MAIN_TOPIC: 'Tòpic principal', - SUB_TOPIC: 'Tòpic secundari', - ISOLATED_TOPIC: 'Tòpic aïllat', - CENTRAL_TOPIC: 'Tòpic central', - ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE: "Els tòpics fills no es poden col·lapsar. Només un tòpic ha d'estar seleccionat.", - SHORTCUTS: 'Accessos directes', - ENTITIES_COULD_NOT_BE_DELETED: 'El tòpic o la relució no poden ser esborrats. Com a mínim ha de seleccionar un.', - AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED: 'Com a mínim ha de seleccionar un tòpic.', - CLIPBOARD_IS_EMPTY: 'Res a copiar.', - CENTRAL_TOPIC_CAN_NOT_BE_DELETED: 'El tòpic central no pot esborrar-se.', - RELATIONSHIP_COULD_NOT_BE_CREATED: "La relució no s'ha pout drear. Primer has de seleccionar una relució pare.", - SELECTION_COPIED_TO_CLIPBOARD: 'Tòpics copiats', - WRITE_YOUR_TEXT_HERE: 'Escriu aquí la teva nota ...', - REMOVE: 'Esborrar', - ACCEPT: 'Acceptar', - CANCEL: 'Cancel·lar', - LINK: 'Enllaç', - OPEN_LINK: 'Obrir Enllaç', - SESSION_EXPIRED: 'La seva sessió ha finalitzat. Si us plau, torni a connectar-se.', - DUMMY: '', -}; - -export default CA; diff --git a/packages/mindplot/src/components/lang/pt_BR.js b/packages/mindplot/src/components/lang/pt_BR.js deleted file mode 100644 index c35819bc..00000000 --- a/packages/mindplot/src/components/lang/pt_BR.js +++ /dev/null @@ -1,53 +0,0 @@ -const PT_BR = { - ZOOM_IN: 'Ampliar', - ZOOM_OUT: 'Reduzir', - TOPIC_SHAPE: 'Forma do T\u00f3pico', - TOPIC_ADD: 'Adicionar T\u00f3pico', - TOPIC_DELETE: 'Deletar T\u00f3pico', - TOPIC_ICON: 'Adicionar \u00cdcone', - TOPIC_LINK: 'Adicionar Link', - TOPIC_RELATIONSHIP: 'Relacionamento', - TOPIC_COLOR: 'Cor do T\u00f3pico', - TOPIC_BORDER_COLOR: 'Cor da Borda do T\u00f3pico', - TOPIC_NOTE: 'Adicionar Nota', - FONT_FAMILY: 'Tipo de Fonte', - FONT_SIZE: 'Tamanho da Fonte', - FONT_BOLD: 'Fonte Negrito', - FONT_ITALIC: 'Fonte It\u00e1lico', - UNDO: 'Desfazer', - REDO: 'Refazer', - INSERT: 'Inserir', - SAVE: 'Salvar', - NOTE: 'Nota', - ADD_TOPIC: 'Adicionar T\u00f3pico', - LOADING: 'Carregando ...', - EXPORT: 'Exportar', - PRINT: 'Imprimir', - PUBLISH: 'Publicar', - COLLABORATE: 'Colaborar', - HISTORY: 'Hist\u00f3ria', - DISCARD_CHANGES: 'Descartar Altera\u00e7\u00f5es', - FONT_COLOR: 'Cor da Fonte', - SAVING: 'Salvando ...', - SAVE_COMPLETE: 'Salvamento Completo', - ZOOM_IN_ERROR: 'Zoom excessivo.', - ZOOM_ERROR: 'N\u00e3o \u00e9 poss\u00edvel aplicar mais zoom.', - ONLY_ONE_TOPIC_MUST_BE_SELECTED: 'N\u00e3o foi poss\u00edvel criar t\u00f3pico. Apenas um t\u00f3pico deve ser selecionado.', - ONE_TOPIC_MUST_BE_SELECTED: 'N\u00e3o foi poss\u00edvel criar t\u00f3pico. Um t\u00f3pico deve ser selecionado.', - SAVE_COULD_NOT_BE_COMPLETED: 'Salvamento n\u00e3o pode ser completado. Tente novamente mais tarde.', - UNEXPECTED_ERROR_LOADING: 'Ocorreu um erro inesperado.\nTente recarregar novamente o editor. Se o problema persistir, contacte-nos em support@wisemapping.com.', - MAIN_TOPIC: 'T\u00f3pico Principal', - SUB_TOPIC: 'Sub T\u00f3pico', - ISOLATED_TOPIC: 'T\u00f3pico Isolado', - CENTRAL_TOPIC: 'T\u00f3pico Central', - SHORTCUTS: 'Atalho', - ENTITIES_COULD_NOT_BE_DELETED: 'O tópico ou a relação não pode ser apagado. Seleccionar pelo menos um.', - AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED: 'Pelo menos um tópico deve ser selecionado', - CLIPBOARD_IS_EMPTY: 'Nada para copiar. Clipboard está vazio.', - CENTRAL_TOPIC_CAN_NOT_BE_DELETED: 'O tópico central não pode ser apagado.', - RELATIONSHIP_COULD_NOT_BE_CREATED: 'A relação não pode ser criada. Uma relação pai deve ser selecionada primeiro.', - SELECTION_COPIED_TO_CLIPBOARD: 'Tópicos copiados ao clipboard.', - ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE: 'Tópicos filhos não podem ser colapsados. Só um tópico deve ser selecionado.', -}; - -export default PT_BR; diff --git a/packages/mindplot/src/components/lang/zh_CN.js b/packages/mindplot/src/components/lang/zh_CN.js deleted file mode 100644 index 5d056929..00000000 --- a/packages/mindplot/src/components/lang/zh_CN.js +++ /dev/null @@ -1,53 +0,0 @@ -const ZH_CN = { - ZOOM_IN: '放大', - ZOOM_OUT: '缩小', - TOPIC_SHAPE: '节点外形', - TOPIC_ADD: '添加节点', - TOPIC_DELETE: '删除节点', - TOPIC_ICON: '加入图标', - TOPIC_LINK: '添加链接', - TOPIC_RELATIONSHIP: '关系', - TOPIC_COLOR: '节点颜色', - TOPIC_BORDER_COLOR: '边框颜色', - TOPIC_NOTE: '添加注释', - FONT_FAMILY: '字体', - FONT_SIZE: '文字大小', - FONT_BOLD: '粗体', - FONT_ITALIC: '斜体', - UNDO: '撤销', - REDO: '重做', - INSERT: '插入', - SAVE: '保存', - NOTE: '注释', - ADD_TOPIC: '添加节点', - LOADING: '载入中……', - EXPORT: '导出', - PRINT: '打印', - PUBLISH: '公开', - COLLABORATE: '共享', - HISTORY: '历史', - DISCARD_CHANGES: '清除改变', - FONT_COLOR: '文本颜色', - SAVING: '保存中……', - SAVE_COMPLETE: '完成保存', - ZOOM_IN_ERROR: '缩放过多。', - ZOOM_ERROR: '不能再缩放。', - ONLY_ONE_TOPIC_MUST_BE_SELECTED: '不能创建节点。仅能选择一个节点。', - ONE_TOPIC_MUST_BE_SELECTED: '不能创建节点。必须选择一个节点。', - ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE: '子节点不能折叠。必须选择一个节点。', - SAVE_COULD_NOT_BE_COMPLETED: '保存未完成。稍后再试。', - UNEXPECTED_ERROR_LOADING: '抱歉,突遭错误,我们无法处理你的请求。\n尝试重新装载编辑器。如果问题依然存在请联系support@wisemapping.com。', - MAIN_TOPIC: '主节点', - SUB_TOPIC: '子节点', - ISOLATED_TOPIC: '独立节点', - CENTRAL_TOPIC: '中心节点', - SHORTCUTS: '快捷键', - ENTITIES_COULD_NOT_BE_DELETED: '不能删除节点或者关系。至少应选择一个对象。', - AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED: '至少应选择一个节点。', - CLIPBOARD_IS_EMPTY: '无法拷贝。 粘贴板是空的。', - CENTRAL_TOPIC_CAN_NOT_BE_DELETED: '不能删除根节点。', - RELATIONSHIP_COULD_NOT_BE_CREATED: '不能创建关系。 应先选择创建关系的一对上级节点。', - SELECTION_COPIED_TO_CLIPBOARD: '节点已拷贝到粘贴板。', -}; - -export default ZH_CN; diff --git a/packages/mindplot/src/components/lang/zh_TW.js b/packages/mindplot/src/components/lang/zh_TW.js deleted file mode 100644 index 9f899171..00000000 --- a/packages/mindplot/src/components/lang/zh_TW.js +++ /dev/null @@ -1,53 +0,0 @@ -const ZH_TW = { - ZOOM_IN: '放大', - ZOOM_OUT: '縮小', - TOPIC_SHAPE: '節點外形', - TOPIC_ADD: '添加節點', - TOPIC_DELETE: '刪除節點', - TOPIC_ICON: '加入圖示', - TOPIC_LINK: '添加鏈接', - TOPIC_RELATIONSHIP: '關係', - TOPIC_COLOR: '節點顏色', - TOPIC_BORDER_COLOR: '邊框顏色', - TOPIC_NOTE: '添加注釋', - FONT_FAMILY: '字體', - FONT_SIZE: '文字大小', - FONT_BOLD: '粗體', - FONT_ITALIC: '斜體', - UNDO: '撤銷', - REDO: '重做', - INSERT: '插入', - SAVE: '保存', - NOTE: '注釋', - ADD_TOPIC: '添加節點', - LOADING: '載入中……', - EXPORT: '導出', - PRINT: '列印', - PUBLISH: '公開', - COLLABORATE: '共用', - HISTORY: '歷史', - DISCARD_CHANGES: '清除改變', - FONT_COLOR: '文本顏色', - SAVING: '保存中……', - SAVE_COMPLETE: '完成保存', - ZOOM_IN_ERROR: '縮放過多。', - ZOOM_ERROR: '不能再縮放。', - ONLY_ONE_TOPIC_MUST_BE_SELECTED: '不能創建節點。僅能選擇一個節點。', - ONE_TOPIC_MUST_BE_SELECTED: '不能創建節點。必須選擇一個節點。', - ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE: '子節點不能折疊。必須選擇一個節點。', - SAVE_COULD_NOT_BE_COMPLETED: '保存未完成。稍後再試。', - UNEXPECTED_ERROR_LOADING: '抱歉,突遭錯誤,我們無法處理你的請求。\n嘗試重新裝載編輯器。如果問題依然存在請聯繫support@wisemapping.com。', - MAIN_TOPIC: '主節點', - SUB_TOPIC: '子節點', - ISOLATED_TOPIC: '獨立節點', - CENTRAL_TOPIC: '中心節點', - SHORTCUTS: '快捷鍵', - ENTITIES_COULD_NOT_BE_DELETED: '不能刪除節點或者關係。至少應選擇一個對象。', - AT_LEAST_ONE_TOPIC_MUST_BE_SELECTED: '至少應選擇一個節點。', - CLIPBOARD_IS_EMPTY: '無法拷貝。 粘貼板是空的。', - CENTRAL_TOPIC_CAN_NOT_BE_DELETED: '不能刪除根節點。', - RELATIONSHIP_COULD_NOT_BE_CREATED: '不能創建關係。 應先選擇創建關係的一對上級節點。', - SELECTION_COPIED_TO_CLIPBOARD: '節點已拷貝到粘貼板。', -}; - -export default ZH_TW; diff --git a/packages/mindplot/src/components/layout/ChildrenSorterStrategy.js b/packages/mindplot/src/components/layout/ChildrenSorterStrategy.js deleted file mode 100644 index 4053d4f3..00000000 --- a/packages/mindplot/src/components/layout/ChildrenSorterStrategy.js +++ /dev/null @@ -1,61 +0,0 @@ -/* eslint-disable no-unused-vars */ -/* eslint-disable class-methods-use-this */ -/* - * Copyright [2015] [wisemapping] - * - * Licensed under WiseMapping Public License, Version 1.0 (the "License"). - * It is basically the Apache License, Version 2.0 (the "License") plus the - * "powered by wisemapping" text requirement on every single page; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the license at - * - * http://www.wisemapping.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -class ChildrenSorterStrategy { - computeChildrenIdByHeights(treeSet, node) { - throw new Error('Method must be implemented'); - } - - /** @abstract */ - computeOffsets(treeSet, node) { - throw new Error('Method must be implemented'); - } - - /** @abstract */ - insert(treeSet, parent, child, order) { - throw new Error('Method must be implemented'); - } - - /** @abstract */ - detach(treeSet, node) { - throw new Error('Method must be implemented'); - } - - /** @abstract */ - predict(treeSet, parent, node, position, free) { - throw new Error('Method must be implemented'); - } - - /** @abstract */ - verify(treeSet, node) { - throw new Error('Method must be implemented'); - } - - /** @abstract */ - getChildDirection(treeSet, node) { - throw new Error('Method must be implemented'); - } - - /** @abstract */ - toString() { - throw new Error('Method must be implemented: print name'); - } -} - -export default ChildrenSorterStrategy; diff --git a/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-colorpicker.css b/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-colorpicker.css deleted file mode 100644 index 28d2bca7..00000000 --- a/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-colorpicker.css +++ /dev/null @@ -1,214 +0,0 @@ -/*! - * Bootstrap Colorpicker - * http://mjolnic.github.io/bootstrap-colorpicker/ - * - * Originally written by (c) 2012 Stefan Petre - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0.txt - * - */ - -.colorpicker-saturation { - float: left; - width: 100px; - height: 100px; - cursor: crosshair; - background-image: url("../img/bootstrap-colorpicker/saturation.png"); -} - -.colorpicker-saturation i { - position: absolute; - top: 0; - left: 0; - display: block; - width: 5px; - height: 5px; - margin: -4px 0 0 -4px; - border: 1px solid #000; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.colorpicker-saturation i b { - display: block; - width: 5px; - height: 5px; - border: 1px solid #fff; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.colorpicker-hue, -.colorpicker-alpha { - float: left; - width: 15px; - height: 100px; - margin-bottom: 4px; - margin-left: 4px; - cursor: row-resize; -} - -.colorpicker-hue i, -.colorpicker-alpha i { - position: absolute; - top: 0; - left: 0; - display: block; - width: 100%; - height: 1px; - margin-top: -1px; - background: #000; - border-top: 1px solid #fff; -} - -.colorpicker-hue { - background-image: url("../img/bootstrap-colorpicker/hue.png"); -} - -.colorpicker-alpha { - display: none; - background-image: url("../img/bootstrap-colorpicker/alpha.png"); -} - -.colorpicker { - top: 0; - left: 0; - z-index: 2500; - min-width: 130px; - padding: 4px; - margin-top: 1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *zoom: 1; -} - -.colorpicker:before, -.colorpicker:after { - display: table; - line-height: 0; - content: ""; -} - -.colorpicker:after { - clear: both; -} - -.colorpicker:before { - position: absolute; - top: -7px; - left: 6px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.colorpicker:after { - position: absolute; - top: -6px; - left: 7px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.colorpicker div { - position: relative; -} - -.colorpicker.colorpicker-with-alpha { - min-width: 140px; -} - -.colorpicker.colorpicker-with-alpha .colorpicker-alpha { - display: block; -} - -.colorpicker-color { - height: 10px; - margin-top: 5px; - clear: both; - background-image: url("../img/bootstrap-colorpicker/alpha.png"); - background-position: 0 100%; -} - -.colorpicker-color div { - height: 10px; -} - -.colorpicker-element .input-group-addon i { - display: block; - width: 16px; - height: 16px; - cursor: pointer; -} - -.colorpicker.colorpicker-inline { - position: relative; - display: inline-block; - float: none; -} - -.colorpicker.colorpicker-horizontal { - width: 110px; - height: auto; - min-width: 110px; -} - -.colorpicker.colorpicker-horizontal .colorpicker-saturation { - margin-bottom: 4px; -} - -.colorpicker.colorpicker-horizontal .colorpicker-color { - width: 100px; -} - -.colorpicker.colorpicker-horizontal .colorpicker-hue, -.colorpicker.colorpicker-horizontal .colorpicker-alpha { - float: left; - width: 100px; - height: 15px; - margin-bottom: 4px; - margin-left: 0; - cursor: col-resize; -} - -.colorpicker.colorpicker-horizontal .colorpicker-hue i, -.colorpicker.colorpicker-horizontal .colorpicker-alpha i { - position: absolute; - top: 0; - left: 0; - display: block; - width: 1px; - height: 15px; - margin-top: 0; - background: #ffffff; - border: none; -} - -.colorpicker.colorpicker-horizontal .colorpicker-hue { - background-image: url("../img/bootstrap-colorpicker/hue-horizontal.png"); -} - -.colorpicker.colorpicker-horizontal .colorpicker-alpha { - background-image: url("../img/bootstrap-colorpicker/alpha-horizontal.png"); -} - -.colorpicker.colorpicker-hidden { - display: none; -} - -.colorpicker.colorpicker-visible { - display: block; -} - -.colorpicker-inline.colorpicker-visible { - display: inline-block; -} \ No newline at end of file diff --git a/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-colorpicker.min.css b/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-colorpicker.min.css deleted file mode 100644 index d48417fa..00000000 --- a/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-colorpicker.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap Colorpicker - * http://mjolnic.github.io/bootstrap-colorpicker/ - * - * Originally written by (c) 2012 Stefan Petre - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0.txt - * - */.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url("../img/bootstrap-colorpicker/saturation.png")}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-hue,.colorpicker-alpha{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-hue i,.colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue.png")}.colorpicker-alpha{display:none;background-image:url("../img/bootstrap-colorpicker/alpha.png")}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:before,.colorpicker:after{display:table;line-height:0;content:""}.colorpicker:after{clear:both}.colorpicker:before{position:absolute;top:-7px;left:6px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.colorpicker:after{position:absolute;top:-6px;left:7px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url("../img/bootstrap-colorpicker/alpha.png");background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-element .input-group-addon i{display:block;width:16px;height:16px;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue-horizontal.png")}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url("../img/bootstrap-colorpicker/alpha-horizontal.png")}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block} \ No newline at end of file diff --git a/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-theme.css b/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-theme.css deleted file mode 100644 index a4069929..00000000 --- a/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-theme.css +++ /dev/null @@ -1,347 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); -} -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn:active, -.btn.active { - background-image: none; -} -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} -.btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #2b669a; -} -.btn-primary:hover, -.btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; -} -.btn-primary:active, -.btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; -} -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #3e8f3e; -} -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #28a4c9; -} -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #e38d13; -} -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #b92c28; -} -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.navbar-default { - background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); -} -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); -} -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, .25); -} -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; -} -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); - background-image: linear-gradient(to bottom, #222 0%, #282828 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); -} -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); -} -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); -} -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); - background-repeat: repeat-x; - border-color: #b2dba1; -} -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); - background-repeat: repeat-x; - border-color: #9acfea; -} -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); - background-repeat: repeat-x; - border-color: #f5e79e; -} -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); - background-repeat: repeat-x; - border-color: #dca7a7; -} -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); - background-repeat: repeat-x; -} -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); - background-repeat: repeat-x; - border-color: #3278b3; -} -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: 0 1px 2px rgba(0, 0, 0, .05); -} -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); - background-repeat: repeat-x; -} -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); - background-repeat: repeat-x; -} -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); - background-repeat: repeat-x; -} -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); - background-repeat: repeat-x; -} -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; - border-color: #dcdcdc; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); -} -/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-theme.css.map b/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-theme.css.map deleted file mode 100644 index b36fc9a4..00000000 --- a/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap-theme.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["less/theme.less","less/mixins.less"],"names":[],"mappings":"AAeA;AACA;AACA;AACA;AACA;AACA;EACE,wCAAA;ECoGA,2FAAA;EACQ,mFAAA;;ADhGR,YAAC;AAAD,YAAC;AAAD,YAAC;AAAD,SAAC;AAAD,YAAC;AAAD,WAAC;AACD,YAAC;AAAD,YAAC;AAAD,YAAC;AAAD,SAAC;AAAD,YAAC;AAAD,WAAC;EC8FD,wDAAA;EACQ,gDAAA;;ADnER,IAAC;AACD,IAAC;EACC,sBAAA;;AAKJ;EC4PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;EAyB2C,yBAAA;EAA2B,kBAAA;;AAvBtE,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAeJ;EC2PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAgBJ;EC0PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAiBJ;ECyPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,SAAC;AACD,SAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,SAAC;AACD,SAAC;EACC,yBAAA;EACA,qBAAA;;AAkBJ;ECwPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAmBJ;ECuPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,WAAC;AACD,WAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,WAAC;AACD,WAAC;EACC,yBAAA;EACA,qBAAA;;AA2BJ;AACA;EC6CE,kDAAA;EACQ,0CAAA;;ADpCV,cAAe,KAAK,IAAG;AACvB,cAAe,KAAK,IAAG;ECmOnB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EDpOF,yBAAA;;AAEF,cAAe,UAAU;AACzB,cAAe,UAAU,IAAG;AAC5B,cAAe,UAAU,IAAG;EC6NxB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED9NF,yBAAA;;AAUF;ECiNI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EAoCF,mEAAA;EDrPA,kBAAA;ECaA,2FAAA;EACQ,mFAAA;;ADjBV,eAOE,YAAY,UAAU;EC0MpB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EApMF,wDAAA;EACQ,gDAAA;;ADLV;AACA,WAAY,KAAK;EACf,8CAAA;;AAIF;EC+LI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EAoCF,mEAAA;;ADtOF,eAIE,YAAY,UAAU;EC2LpB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EApMF,uDAAA;EACQ,+CAAA;;ADCV,eASE;AATF,eAUE,YAAY,KAAK;EACf,yCAAA;;AAKJ;AACA;AACA;EACE,gBAAA;;AAUF;EACE,6CAAA;EChCA,0FAAA;EACQ,kFAAA;;AD2CV;ECqJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAKF;ECoJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAMF;ECmJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAOF;ECkJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAgBF;ECyII,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADlIJ;EC+HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADjIJ;EC8HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADhIJ;EC6HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD/HJ;EC4HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD9HJ;EC2HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADtHJ;EACE,kBAAA;EC/EA,kDAAA;EACQ,0CAAA;;ADiFV,gBAAgB;AAChB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;EACrB,6BAAA;EC4GE,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED7GF,qBAAA;;AAUF;ECjGE,iDAAA;EACQ,yCAAA;;AD0GV,cAAe;ECsFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADxFJ,cAAe;ECqFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADvFJ,cAAe;ECoFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADtFJ,WAAY;ECmFR,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADrFJ,cAAe;ECkFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADpFJ,aAAc;ECiFV,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD5EJ;ECyEI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED1EF,qBAAA;EC1HA,yFAAA;EACQ,iFAAA","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clearfix\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n\n// WebKit-style focus\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n\n// Center-align a block level element\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n// Sizing shortcuts\n.size(@width; @height) {\n width: @width;\n height: @height;\n}\n.square(@size) {\n .size(@size; @size);\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Text overflow\n// Requires inline-block or block for proper styling\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note\n// that we cannot chain the mixins together in Less, so they are repeated.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Single side border-radius\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support the\n// standard `box-shadow` property.\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n -webkit-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n transform: rotate(@degrees);\n}\n.scale(@ratio; @ratio-y...) {\n -webkit-transform: scale(@ratio, @ratio-y);\n -ms-transform: scale(@ratio, @ratio-y); // IE9 only\n transform: scale(@ratio, @ratio-y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n transform: translate(@x, @y);\n}\n.skew(@x; @y) {\n -webkit-transform: skew(@x, @y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n transform: skew(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n resize: @direction; // Options: horizontal, vertical, both\n overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n\n\n\n// GRADIENTS\n// --------------------------------------------------\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n\n// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// Retina images\n//\n// Short retina mixin for setting background-image and -size\n\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n\n// Panels\n// -------------------------\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse .panel-body {\n border-top-color: @border;\n }\n }\n & > .panel-footer {\n + .panel-collapse .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n\n// Alerts\n// -------------------------\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n\n// Tables\n// -------------------------\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n\n// List Groups\n// -------------------------\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading { color: inherit; }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n\n// Button variants\n// -------------------------\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 8%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n// -------------------------\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n\n// Pagination\n// -------------------------\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n\n// Labels\n// -------------------------\n.label-variant(@color) {\n background-color: @color;\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n\n// Contextual backgrounds\n// -------------------------\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n\n// Typography\n// -------------------------\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n\n// Progress bars\n// -------------------------\n.progress-bar-variant(@color) {\n background-color: @color;\n .progress-striped & {\n #gradient > .striped();\n }\n}\n\n// Responsive utilities\n// -------------------------\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n @media (min-width: @screen-xs-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-push(@columns) {\n @media (min-width: @screen-xs-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-pull(@columns) {\n @media (min-width: @screen-xs-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-focus-border` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. ``\n// element gets special love because it's special, and that's a fact!\n\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-darker: lighten(#000, 13.5%); // #222\n@gray-dark: lighten(#000, 20%); // #333\n@gray: lighten(#000, 33.5%); // #555\n@gray-light: lighten(#000, 60%); // #999\n@gray-lighter: lighten(#000, 93.5%); // #eee\n\n@brand-primary: #428bca;\n@brand-success: #5cb85c;\n@brand-info: #5bc0de;\n@brand-warning: #f0ad4e;\n@brand-danger: #d9534f;\n\n\n//== Scaffolding\n//\n// ## Settings for some of the most global styles.\n\n//** Background color for ``.\n@body-bg: #fff;\n//** Global text color on ``.\n@text-color: @gray-dark;\n\n//** Global textual link color.\n@link-color: @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color: darken(@link-color, 15%);\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif: Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for ``, ``, and `
`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          13px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the ``.\n@headings-font-family:    inherit;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//-- Iconography\n//\n//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n@icon-font-path:          \"../fonts/\";\n@icon-font-name:          \"glyphicons-halflings-regular\";\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     6px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    10px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.33;\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ``s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                #f5f5f5;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `` background color\n@input-bg:                       #fff;\n//** `` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for ``s\n@input-color:                    @gray;\n//** `` border color\n@input-border:                   #ccc;\n//** `` border radius\n@input-border-radius:            @border-radius-base;\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        @gray-light;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n// Note: Deprecated @dropdown-caret-color as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1010;\n@zindex-tooltip:           1030;\n@zindex-navbar-fixed:      1030;\n@zindex-modal-background:  1040;\n@zindex-modal:             1050;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1\n@screen-xs:                  480px;\n@screen-xs-min:              @screen-xs;\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             ((720px + @grid-gutter-width));\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            ((940px + @grid-gutter-width));\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      ((1140px + @grid-gutter-width));\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #888;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      @gray-light;\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 @gray-light;\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n@nav-open-link-hover-color:                 #fff;\n\n//== Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     @link-color;\n@pagination-bg:                        #fff;\n@pagination-border:                    #ddd;\n\n@pagination-hover-color:               @link-hover-color;\n@pagination-hover-bg:                  @gray-lighter;\n@pagination-hover-border:              #ddd;\n\n@pagination-active-color:              #fff;\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-border:             @brand-primary;\n\n@pagination-disabled-color:            @gray-light;\n@pagination-disabled-bg:               #fff;\n@pagination-disabled-border:           #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #3c763d;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #fff;\n//** Tooltip background color\n@tooltip-bg:                  #000;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          #fff;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 #fff;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @gray-light;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #fff;\n//** Default text color of a linked label\n@label-link-hover-color:      #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         20px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             #fff;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 #f5f5f5;\n//** Progress bar text color\n@progress-bar-color:          #fff;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 #fff;\n//** `.list-group-item` border color\n@list-group-border:             #ddd;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list elements on hover\n@list-group-hover-bg:           #f5f5f5;\n//** Text color of active list elements\n@list-group-active-color:       @component-active-color;\n//** Background color of active list elements\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n@list-group-link-color:         #555;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    #fff;\n@panel-body-padding:          15px;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          #ddd;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     #f5f5f5;\n@well-border:                 darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    @gray-lighter;\n\n\n//== Miscellaneous\n//\n//##\n\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev { display: block; }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: none;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    margin-left: -10px;\n    font-family: serif;\n  }\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      margin-left: -15px;\n      font-size: 30px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 200;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: 14px base font * 85% = about 12px\nsmall,\n.small  { font-size: 85%; }\n\n// Undo browser default styling\ncite    { font-style: normal; }\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// --------------------------------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n@media (min-width: @grid-float-breakpoint) {\n  .dl-horizontal {\n    dt {\n      float: left;\n      width: (@component-offset-horizontal - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @component-offset-horizontal;\n      &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n    }\n  }\n}\n\n// MISC\n// ----\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  white-space: nowrap;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  max-width: 100%;\n  background-color: @table-bg;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-child(odd) {\n    > td,\n    > th {\n      background-color: @table-bg-accent;\n    }\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    > td,\n    > th {\n      background-color: @table-bg-hover;\n    }\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n@media (max-width: @screen-xs-max) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    overflow-x: scroll;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n    -webkit-overflow-scrolling: touch;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; /* IE8-9 */\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS date input\n//\n// In Mobile Safari, date inputs require a pixel line-height that matches the\n// given height of the input.\n\ninput[type=\"date\"] {\n  line-height: @input-height-base;\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: @line-height-computed; // clear the floating input if there is no label text\n  margin-top: 10px;\n  margin-bottom: 10px;\n  padding-left: 20px;\n  label {\n    display: inline;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"],\n.radio,\n.radio-inline,\n.checkbox,\n.checkbox-inline {\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n\n  // Feedback icon (requires .glyphicon classes)\n  .form-control-feedback {\n    position: absolute;\n    top: (@line-height-computed + 5); // Height of the `label` and its margin\n    right: 0;\n    display: block;\n    width: @input-height-base;\n    height: @input-height-base;\n    line-height: @input-height-base;\n    text-align: center;\n  }\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  margin-bottom: 0; // Remove default margin from `p`\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      padding-left: 0;\n      vertical-align: middle;\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      float: none;\n      margin-left: 0;\n    }\n\n    // Validation states\n    //\n    // Reposition the icon because it's now within a grid column and columns have\n    // `position: relative;` on them. Also accounts for the grid gutter padding.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of labels, radios, and checkboxes\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  .form-control-static {\n    padding-top: (@padding-base-vertical + 1);\n  }\n\n  // Only right align form labels here when the columns stop stacking\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    top: 0;\n    right: (@grid-gutter-width / 2);\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n    &:focus {\n      // Remove focus outline when dropdown JS adds it after closing the menu\n      outline: none;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n}\n\n\n// Checkbox and radio options\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n  &.in {\n    display: block;\n  }\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition(height .35s ease);\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n//  Star\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: ~\"url('@{icon-font-path}@{icon-font-name}.eot')\";\n  src: ~\"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.woff') format('woff')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg')\";\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro                   { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: not-allowed;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn { .input-lg(); }\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn { .input-sm(); }\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n     > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  max-height: @navbar-collapse-max-height;\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: none;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: 0;\n    }\n  }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: not-allowed;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: not-allowed;\n    }\n  }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  &[href] {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base classes\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n  .btn-xs & {\n    top: 0;\n    padding: 1px 5px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: @badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Account for counters in navs\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: @badge-active-color;\n  background-color: @badge-active-bg;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding;\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  .container & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding-top:    (@jumbotron-padding * 1.6);\n    padding-bottom: (@jumbotron-padding * 1.6);\n\n    .container & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissable alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable {\n padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n.progress-striped .progress-bar {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n.progress.active .progress-bar {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n  display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n  > .pull-left {\n    margin-right: 10px;\n  }\n  > .pull-right {\n    margin-left: 10px;\n  }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on 
    ,
      , or
      .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Align badges within list items\n > .badge {\n float: right;\n }\n > .badge + .badge {\n margin-right: 5px;\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @list-group-hover-bg;\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: 10px 15px;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table {\n margin-bottom: 0;\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n overflow: hidden; // crop contents when collapsed\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n + .panel-collapse .panel-body {\n border-top: 1px solid @panel-inner-border;\n }\n }\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: auto;\n overflow-y: scroll;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0)}\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: none;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n margin-top: 15px;\n padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n font-size: @font-size-small;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n text-align: left; // Reset given new insertion method\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 18px;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#browsers\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n"]} \ No newline at end of file diff --git a/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap.min.css b/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap.min.css deleted file mode 100644 index 07f12ea8..00000000 --- a/packages/mindplot/src/components/libraries/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:9px;margin-bottom:9px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:33px}h2,.h2{font-size:27px}h3,.h3{font-size:23px}h4,.h4{font-size:17px}h5,.h5{font-size:13px}h6,.h6{font-size:12px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:14px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:9px 18px;margin:0 0 18px;font-size:16.25px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:18px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:18px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:19.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:13px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:13px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:32px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:18px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.has-feedback .form-control-feedback{position:absolute;top:23px;right:0;display:block;width:32px;height:32px;line-height:32px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:13px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:17px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:17px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:13px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:18px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:16px 15px;font-size:17px;line-height:18px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:8px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:16px;padding-bottom:16px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:9px;margin-bottom:9px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:9px;margin-bottom:9px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:16px;margin-bottom:16px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:18px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:18px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:58.5px}}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:18px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:19.5px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:4px 6px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.eot b/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 4a4ca865..00000000 Binary files a/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.eot and /dev/null differ diff --git a/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.svg b/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index e3e2dc73..00000000 --- a/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.ttf b/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 67fa00bf..00000000 Binary files a/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.ttf and /dev/null differ diff --git a/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.woff b/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 8c54182a..00000000 Binary files a/packages/mindplot/src/components/libraries/bootstrap/fonts/glyphicons-halflings-regular.woff and /dev/null differ diff --git a/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/alpha-horizontal.png b/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/alpha-horizontal.png deleted file mode 100644 index d0a65c08..00000000 Binary files a/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/alpha-horizontal.png and /dev/null differ diff --git a/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/alpha.png b/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/alpha.png deleted file mode 100644 index 38043f1c..00000000 Binary files a/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/alpha.png and /dev/null differ diff --git a/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/hue-horizontal.png b/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/hue-horizontal.png deleted file mode 100644 index a0d9add8..00000000 Binary files a/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/hue-horizontal.png and /dev/null differ diff --git a/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/hue.png b/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/hue.png deleted file mode 100644 index d89560e9..00000000 Binary files a/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/hue.png and /dev/null differ diff --git a/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/saturation.png b/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/saturation.png deleted file mode 100644 index 594ae50e..00000000 Binary files a/packages/mindplot/src/components/libraries/bootstrap/img/bootstrap-colorpicker/saturation.png and /dev/null differ diff --git a/packages/mindplot/src/components/libraries/bootstrap/img/glyphicons-halflings-blue.png b/packages/mindplot/src/components/libraries/bootstrap/img/glyphicons-halflings-blue.png deleted file mode 100644 index a8dca0fc..00000000 Binary files a/packages/mindplot/src/components/libraries/bootstrap/img/glyphicons-halflings-blue.png and /dev/null differ diff --git a/packages/mindplot/src/components/libraries/bootstrap/js/bootstrap-colorpicker.js b/packages/mindplot/src/components/libraries/bootstrap/js/bootstrap-colorpicker.js deleted file mode 100644 index f723b1fd..00000000 --- a/packages/mindplot/src/components/libraries/bootstrap/js/bootstrap-colorpicker.js +++ /dev/null @@ -1,947 +0,0 @@ -/*! - * Bootstrap Colorpicker - * http://mjolnic.github.io/bootstrap-colorpicker/ - * - * Originally written by (c) 2012 Stefan Petre - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0.txt - * - * @todo Update DOCS - */ -(function ($) { - // Color object - const Color = function (val) { - this.value = { - h: 0, - s: 0, - b: 0, - a: 1, - }; - this.origFormat = null; // original string format - if (val) { - if (val.toLowerCase !== undefined) { - this.setColor(val); - } else if (val.h !== undefined) { - this.value = val; - } - } - }; - - Color.prototype = { - constructor: Color, - _sanitizeNumber(val) { - if (typeof val === 'number') { - return val; - } - if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) { - return 1; - } - if (val.toLowerCase !== undefined) { - return parseFloat(val); - } - return 1; - }, - // parse a string to HSB - setColor(strVal) { - strVal = strVal.toLowerCase(); - this.value = this.stringToHSB(strVal) ||  { - h: 0, - s: 0, - b: 0, - a: 1, - }; - }, - stringToHSB(strVal) { - strVal = strVal.toLowerCase(); - const that = this; - let result = false; - $.each(this.stringParsers, (i, parser) => { - const match = parser.re.exec(strVal); - const values = match && parser.parse.apply(that, [match]); - const format = parser.format || 'rgba'; - if (values) { - if (format.match(/hsla?/)) { - result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values)); - } else { - result = that.RGBtoHSB.apply(that, values); - } - that.origFormat = format; - return false; - } - return true; - }); - return result; - }, - setHue(h) { - this.value.h = 1 - h; - }, - setSaturation(s) { - this.value.s = s; - }, - setBrightness(b) { - this.value.b = 1 - b; - }, - setAlpha(a) { - this.value.a = parseInt((1 - a) * 100, 10) / 100; - }, - toRGB(h, s, v, a) { - h = h || this.value.h; - s = s || this.value.s; - v = v || this.value.b; - a = a || this.value.a; - - let r; let g; let b; let i; let f; let p; let q; let - t; - if (h && s === undefined && v === undefined) { - s = h.s, v = h.v, h = h.h; - } - i = Math.floor(h * 6); - f = h * 6 - i; - p = v * (1 - s); - q = v * (1 - f * s); - t = v * (1 - (1 - f) * s); - switch (i % 6) { - case 0: - r = v, g = t, b = p; - break; - case 1: - r = q, g = v, b = p; - break; - case 2: - r = p, g = v, b = t; - break; - case 3: - r = p, g = q, b = v; - break; - case 4: - r = t, g = p, b = v; - break; - case 5: - r = v, g = p, b = q; - break; - } - return { - r: Math.floor(r * 255), - g: Math.floor(g * 255), - b: Math.floor(b * 255), - a, - }; - }, - toHex(h, s, b, a) { - const rgb = this.toRGB(h, s, b, a); - return `#${((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1)}`; - }, - toHSL(h, s, b, a) { - h = h || this.value.h; - s = s || this.value.s; - b = b || this.value.b; - a = a || this.value.a; - - const H = h; - let L = (2 - s) * b; - let S = s * b; - if (L > 0 && L <= 1) { - S /= L; - } else { - S /= 2 - L; - } - L /= 2; - if (S > 1) { - S = 1; - } - return { - h: isNaN(H) ? 0 : H, - s: isNaN(S) ? 0 : S, - l: isNaN(L) ? 0 : L, - a: isNaN(a) ? 0 : a, - }; - }, - RGBtoHSB(r, g, b, a) { - r /= 255; - g /= 255; - b /= 255; - - let H; let S; let V; let - C; - V = Math.max(r, g, b); - C = V - Math.min(r, g, b); - H = (C === 0 ? null - : V === r ? (g - b) / C - : V === g ? (b - r) / C + 2 - : (r - g) / C + 4 - ); - H = ((H + 360) % 6) * 60 / 360; - S = C === 0 ? 0 : C / V; - return { - h: this._sanitizeNumber(H), - s: S, - b: V, - a: this._sanitizeNumber(a), - }; - }, - HueToRGB(p, q, h) { - if (h < 0) { - h += 1; - } else if (h > 1) { - h -= 1; - } - if ((h * 6) < 1) { - return p + (q - p) * h * 6; - } if ((h * 2) < 1) { - return q; - } if ((h * 3) < 2) { - return p + (q - p) * ((2 / 3) - h) * 6; - } - return p; - }, - HSLtoRGB(h, s, l, a) { - if (s < 0) { - s = 0; - } - let q; - if (l <= 0.5) { - q = l * (1 + s); - } else { - q = l + s - (l * s); - } - - const p = 2 * l - q; - - const tr = h + (1 / 3); - const tg = h; - const tb = h - (1 / 3); - - const r = Math.round(this.HueToRGB(p, q, tr) * 255); - const g = Math.round(this.HueToRGB(p, q, tg) * 255); - const b = Math.round(this.HueToRGB(p, q, tb) * 255); - return [r, g, b, this._sanitizeNumber(a)]; - }, - toString(format) { - format = format ||  'rgba'; - switch (format) { - case 'rgb': - { - var rgb = this.toRGB(); - return `rgb(${rgb.r},${rgb.g},${rgb.b})`; - } - break; - case 'rgba': - { - var rgb = this.toRGB(); - return `rgba(${rgb.r},${rgb.g},${rgb.b},${rgb.a})`; - } - break; - case 'hsl': - { - var hsl = this.toHSL(); - return `hsl(${Math.round(hsl.h * 360)},${Math.round(hsl.s * 100)}%,${Math.round(hsl.l * 100)}%)`; - } - break; - case 'hsla': - { - var hsl = this.toHSL(); - return `hsla(${Math.round(hsl.h * 360)},${Math.round(hsl.s * 100)}%,${Math.round(hsl.l * 100)}%,${hsl.a})`; - } - break; - case 'hex': - { - return this.toHex(); - } - break; - default: - { - return false; - } - break; - } - }, - // a set of RE's that can match strings and generate color tuples. - // from John Resig color plugin - // https://github.com/jquery/jquery-color/ - stringParsers: [{ - re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, - format: 'hex', - parse(execResult) { - return [ - parseInt(execResult[1], 16), - parseInt(execResult[2], 16), - parseInt(execResult[3], 16), - 1, - ]; - }, - }, { - re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/, - format: 'hex', - parse(execResult) { - return [ - parseInt(execResult[1] + execResult[1], 16), - parseInt(execResult[2] + execResult[2], 16), - parseInt(execResult[3] + execResult[3], 16), - 1, - ]; - }, - }, { - re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/, - format: 'rgb', - parse(execResult) { - return [ - execResult[1], - execResult[2], - execResult[3], - 1, - ]; - }, - }, { - re: /rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/, - format: 'rgb', - parse(execResult) { - return [ - 2.55 * execResult[1], - 2.55 * execResult[2], - 2.55 * execResult[3], - 1, - ]; - }, - }, { - re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, - format: 'rgba', - parse(execResult) { - return [ - execResult[1], - execResult[2], - execResult[3], - execResult[4], - ]; - }, - }, { - re: /rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, - format: 'rgba', - parse(execResult) { - return [ - 2.55 * execResult[1], - 2.55 * execResult[2], - 2.55 * execResult[3], - execResult[4], - ]; - }, - }, { - re: /hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/, - format: 'hsl', - parse(execResult) { - return [ - execResult[1] / 360, - execResult[2] / 100, - execResult[3] / 100, - execResult[4], - ]; - }, - }, { - re: /hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, - format: 'hsla', - parse(execResult) { - return [ - execResult[1] / 360, - execResult[2] / 100, - execResult[3] / 100, - execResult[4], - ]; - }, - }, { - // predefined color name - re: /^([a-z]{3,})$/, - format: 'alias', - parse(execResult) { - const hexval = this.colorNameToHex(execResult[0]) ||  '#000000'; - const match = this.stringParsers[0].re.exec(hexval); - const values = match && this.stringParsers[0].parse.apply(this, [match]); - return values; - }, - }], - colorNameToHex(name) { - // 140 predefined colors from the HTML Colors spec - const colors = { - aliceblue: '#f0f8ff', - antiquewhite: '#faebd7', - aqua: '#00ffff', - aquamarine: '#7fffd4', - azure: '#f0ffff', - beige: '#f5f5dc', - bisque: '#ffe4c4', - black: '#000000', - blanchedalmond: '#ffebcd', - blue: '#0000ff', - blueviolet: '#8a2be2', - brown: '#a52a2a', - burlywood: '#deb887', - cadetblue: '#5f9ea0', - chartreuse: '#7fff00', - chocolate: '#d2691e', - coral: '#ff7f50', - cornflowerblue: '#6495ed', - cornsilk: '#fff8dc', - crimson: '#dc143c', - cyan: '#00ffff', - darkblue: '#00008b', - darkcyan: '#008b8b', - darkgoldenrod: '#b8860b', - darkgray: '#a9a9a9', - darkgreen: '#006400', - darkkhaki: '#bdb76b', - darkmagenta: '#8b008b', - darkolivegreen: '#556b2f', - darkorange: '#ff8c00', - darkorchid: '#9932cc', - darkred: '#8b0000', - darksalmon: '#e9967a', - darkseagreen: '#8fbc8f', - darkslateblue: '#483d8b', - darkslategray: '#2f4f4f', - darkturquoise: '#00ced1', - darkviolet: '#9400d3', - deeppink: '#ff1493', - deepskyblue: '#00bfff', - dimgray: '#696969', - dodgerblue: '#1e90ff', - firebrick: '#b22222', - floralwhite: '#fffaf0', - forestgreen: '#228b22', - fuchsia: '#ff00ff', - gainsboro: '#dcdcdc', - ghostwhite: '#f8f8ff', - gold: '#ffd700', - goldenrod: '#daa520', - gray: '#808080', - green: '#008000', - greenyellow: '#adff2f', - honeydew: '#f0fff0', - hotpink: '#ff69b4', - 'indianred ': '#cd5c5c', - 'indigo ': '#4b0082', - ivory: '#fffff0', - khaki: '#f0e68c', - lavender: '#e6e6fa', - lavenderblush: '#fff0f5', - lawngreen: '#7cfc00', - lemonchiffon: '#fffacd', - lightblue: '#add8e6', - lightcoral: '#f08080', - lightcyan: '#e0ffff', - lightgoldenrodyellow: '#fafad2', - lightgrey: '#d3d3d3', - lightgreen: '#90ee90', - lightpink: '#ffb6c1', - lightsalmon: '#ffa07a', - lightseagreen: '#20b2aa', - lightskyblue: '#87cefa', - lightslategray: '#778899', - lightsteelblue: '#b0c4de', - lightyellow: '#ffffe0', - lime: '#00ff00', - limegreen: '#32cd32', - linen: '#faf0e6', - magenta: '#ff00ff', - maroon: '#800000', - mediumaquamarine: '#66cdaa', - mediumblue: '#0000cd', - mediumorchid: '#ba55d3', - mediumpurple: '#9370d8', - mediumseagreen: '#3cb371', - mediumslateblue: '#7b68ee', - mediumspringgreen: '#00fa9a', - mediumturquoise: '#48d1cc', - mediumvioletred: '#c71585', - midnightblue: '#191970', - mintcream: '#f5fffa', - mistyrose: '#ffe4e1', - moccasin: '#ffe4b5', - navajowhite: '#ffdead', - navy: '#000080', - oldlace: '#fdf5e6', - olive: '#808000', - olivedrab: '#6b8e23', - orange: '#ffa500', - orangered: '#ff4500', - orchid: '#da70d6', - palegoldenrod: '#eee8aa', - palegreen: '#98fb98', - paleturquoise: '#afeeee', - palevioletred: '#d87093', - papayawhip: '#ffefd5', - peachpuff: '#ffdab9', - peru: '#cd853f', - pink: '#ffc0cb', - plum: '#dda0dd', - powderblue: '#b0e0e6', - purple: '#800080', - red: '#ff0000', - rosybrown: '#bc8f8f', - royalblue: '#4169e1', - saddlebrown: '#8b4513', - salmon: '#fa8072', - sandybrown: '#f4a460', - seagreen: '#2e8b57', - seashell: '#fff5ee', - sienna: '#a0522d', - silver: '#c0c0c0', - skyblue: '#87ceeb', - slateblue: '#6a5acd', - slategray: '#708090', - snow: '#fffafa', - springgreen: '#00ff7f', - steelblue: '#4682b4', - tan: '#d2b48c', - teal: '#008080', - thistle: '#d8bfd8', - tomato: '#ff6347', - turquoise: '#40e0d0', - violet: '#ee82ee', - wheat: '#f5deb3', - white: '#ffffff', - whitesmoke: '#f5f5f5', - yellow: '#ffff00', - yellowgreen: '#9acd32', - }; - - if (typeof colors[name.toLowerCase()] !== 'undefined') { - return colors[name.toLowerCase()]; - } - return false; - }, - }; - - const defaults = { - horizontal: false, // horizontal mode layout ? - inline: false, // forces to show the colorpicker as an inline element - color: false, // forces a color - format: false, // forces a format - input: 'input', // children input selector - container: false, // container selector - component: '.add-on, .input-group-addon', // children component selector - sliders: { - saturation: { - maxLeft: 100, - maxTop: 100, - callLeft: 'setSaturation', - callTop: 'setBrightness', - }, - hue: { - maxLeft: 0, - maxTop: 100, - callLeft: false, - callTop: 'setHue', - }, - alpha: { - maxLeft: 0, - maxTop: 100, - callLeft: false, - callTop: 'setAlpha', - }, - }, - slidersHorz: { - saturation: { - maxLeft: 100, - maxTop: 100, - callLeft: 'setSaturation', - callTop: 'setBrightness', - }, - hue: { - maxLeft: 100, - maxTop: 0, - callLeft: 'setHue', - callTop: false, - }, - alpha: { - maxLeft: 100, - maxTop: 0, - callLeft: 'setAlpha', - callTop: false, - }, - }, - template: '