• Как юридически оформить стартап, если сооснователи граждане разных стран?

    sokolov_nsk
    @sokolov_nsk
    IT-Аудит в Новосибирске
    Вы в России находитесь?)
    Если да, то не слишком сложно. В ООО участником вполне может быть гражданин другой страны, и по идее нужны те же документы, что и для резидента России. На практике не сталкивался, наверняка возможны проволочки. И нужно будет личное присутствие человека, что может создать вам некоторые проблемы)
    Лучше всего будет обратиться к юристам, они все сделают за вас. Регистрация ООО в среднем стоит 2-3 тысячи, это немного.

    Насчет защиты собственных наработок все гораздо сложнее. Теоретически, у вас есть все права на эти наработки с момента их создания. Практически, если ваш партнер их использует без вашего ведома - устанете судиться. Простой вариант - отправить копии заказным письмом самому себе и не забирать до возникновения проблем. Или положить в ячейку в банке, предварительно заверив у нотариуса, естественно с датой заверения.
    Ответ написан
    3 комментария
  • Угроза заказчика, стоит ли бояться?

    mixail_fet
    @mixail_fet
    Дизайнер веб-интерфейсов
    За 6 лет, такое было уже 4 - 5 раза. Причем это случалась из-за вкуса заказчика, которому не понравился мой макет. Каждый раз угрожая судом, они просто исчезали и ничего не делали.
    Ответ написан
    3 комментария
  • Необычный loader?

    politon
    @politon
    HTML5,CSS3,JS,PHP,SQL,API,canvas,animation...
    Как вариант svg mask
    Ответ написан
    Комментировать
  • Как нарисовать иконку в illustrator с один path?

    Nekto_Habr
    @Nekto_Habr
    Чат дизайнеров: https://t.me/figma_life
    выделяешь формы и жмешь ctrl+8, превращая формы в единую compound path
    Ответ написан
    1 комментарий
  • Как нарисовать иконку в illustrator с один path?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg
    илюстратор не работает с svg, он умеет импортировать в него. Чувствуете разницу?
    Для svg есть inkscape (он бесплатный). Так что если удобно рисовать в иллюстраторе, потом открывайте в inkscape (если не ошибаюсь он прямо может файлы иллюстратора открывать), там доводите до ума, оптимизируйте. Потом сохраняйте, открывайте в блокноте и там еще оптимизируйте.
    Есть и онлайн инструменты для оптимизации svg, но не всегда адекватно работают. Вот, на мой взгляд, лучший: https://jakearchibald.github.io/svgomg/

    Кстати если Вам нужно просто разные размеры, то не надо 3 path делать, в svg есть <use> для этого.

    Ну и такие вещи проще вообще ручками писать. Там же 6 точек всего. Открыл блокнот, накидал, сохранил - получил оптимальный svg.
    Ответ написан
    6 комментариев
  • Где собирать отзывы?

    1. Сделать сайт с портфолио, чем более он будет качественным и качественнее работы, тем больше вероятность, что отзывы вам и не потребуются
    2. 1.5 года как забил на эти отзывы. клиентов это не интересует. важны такие параметры: качество работы твоей, цена за эту работу, подтверждение твоего уровня (портфолио)
    Ответ написан
    3 комментария
  • Как сравнить два массива и вывести расхождения?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const a = [ 'a', 'b', 'c', 'd' ];
    const b = [ 'a', 'b', 'x', 'y', 'z' ];
    
    const c = a.filter(n => b.indexOf(n) === -1);
    // или
    const c = a.filter(n => !b.includes(n));

    Или, можно решить задачу в более общем виде. Элементы массивов не обязательно являются примитивными значениями, а под равенством может подразумеваться не непосредственное равенство, а равенство некоторых производных значений:

    const diff = (arr1, arr2, key = n => n) =>
      arr1.filter(function(n) {
        return !this.has(key(n));
      }, new Set(arr2.map(key)));
    
    
    const a = [
      { id: 1 },
      { id: 2 },
      { id: 3 },
    ];
    
    const b = [
      { id: 1 },
      { id: 3 },
    ];
    
    const c = diff(a, b, n => n.id); // [{id: 2}]
    Ответ написан
  • Как сделать один обработчик для всех менюшек?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Добавляем делегированный обработчик клика, где делаем следующие проверки:

    1. Если клик был за пределами какого-либо выпадающего меню - закрываем их все
    2. Если клик был по кнопке открытия - открываем соответствующее ей меню

    const cardSelector = '.post';
    const buttonSelector = '.post > img';
    const menuSelector = '.post-info';
    const activeClass = 'active';
    
    document.addEventListener('click', function(e) {
      if (!e.target.closest(menuSelector)) {
        document.querySelectorAll(menuSelector).forEach(n => n.classList.remove(activeClass));
      }
    
      if (e.target.matches(buttonSelector)) {
        e.target.closest(cardSelector).querySelector(menuSelector).classList.add(activeClass);
      }
    });
    Ответ написан
    2 комментария
  • Как отметить и предыдущие чекбоксы?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Свойство checked сделать массивом, который будет содержать состояния чекбоксов. Сами чекбоксы на основе этого массива и создавать, через v-for. Слушать событие change, по которому выставлять состояния предыдущих чекбоксов (относительно того, на котором событие случилось) в true, следующих в false:

    data: () => ({
      checked: [ 0, 0, 0, 0, 0 ],
    }),
    methods: {
      onChange(e, index) {
        const checked = e.target.checked;
    
        this.checked = [
          ...Array(index + checked).fill(1),
          ...Array(this.checked.length - index - checked).fill(0),
        ];
      },
    },

    <li v-for="(n, i) in checked">
      <label>
        <input
          type="checkbox"
          :checked="n"
          @change="onChange($event, i)"
        >
        {{ i + 1 }}
      </label>
    </li>

    UPD. Вынесено из комментариев:

    а если несколько таких списков будет

    Очевидно, нужен отдельный массив checked для каждого списка (если только вы не хотите, чтобы все списке выглядели одинаково). Что касается функции onChange, то надо будет добавить ей дополнительный параметр - чтобы была возможность указывать, с каким именно списком в данный момент идёт работа.

    https://jsfiddle.net/9ba682w4/
    Ответ написан
  • Есть ли русские аналоги Montserrat Alternates font?

    Nekto_Habr
    @Nekto_Habr
    Чат дизайнеров: https://t.me/figma_life
    UPD: свершилось! Монцерат и его альтернативы наконец-то доступны с кириллицей! Бежим на гугл-фонтс и скачиваем.

    ---

    старый ответ:

    Именно Alternates - хз
    А на оригинальный Montserrat похожи Raleway (на гугле раньше было с кириллицей, щас почему-то нет - но наверняка в сети найдется), Proxima Nova, Museo Sans
    Ответ написан
    2 комментария
  • Можно ли в одном классе сослаться на другой?

    sim3x
    @sim3x
    В шаблонизаторах - да
    В чистом цсс, сейчас - нет

    Используйте
    .class1, .class2{
    Ответ написан
    4 комментария
  • Смена активного класса при клике с помощью vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сложить пары "текст кнопки / имя класса" в объекты, объекты в массив, массив сделать свойством компонента:

    data: () => ({
      items: [
        { buttonText: '+', className: 'container' },
        { buttonText: '-', className: 'container-fluid' },
      ],
      ...
    }),

    На основе этого массива создавать кнопки:

    <button
      v-for="n in items"
      v-text="n.buttonText"
      :class="{ active : active === n.className }"
      @click="active = n.className"
    ></button>

    Похоже на то, к чему вы стремились?
    Ответ написан
    1 комментарий
  • Смена активного класса при клике с помощью vue.js?

    dubr
    @dubr
    пыхарь
    Я бы сделал так

    1) item и active - плохие названия для переменных, хранящих класс, makeActive - плохое название метода, его меняющего. Называем все по-людски.
    data: {
        activeClass: 'container'
        ...
    },
    methods: {
        setActiveClass: function(className) { ... }
    }


    2) Хардкодить повторяющиеся штуки - это плохо, поэтому выносим список кнопок и связанных с ними классов в data, а в шаблоне ходим циклом:

    data: {
        activeClass: 'container',
        buttons: [
          ['+', 'container'],
          ['-', 'container-fluid']
        ]
    }
    <button  v-for="[label, className] in buttons">...</button>


    3) Собственно, теперь у нас есть все данные, чтобы выделить нужную кнопку. Кнопка активна, если текущий класс равен привязанному к ней классу, хранить отдельно состояние кнопки в data нет необходимости.
    Дописываем шаблон:

    <button 
             v-for="[label, className] in buttons"
             v-on:click="setActiveClass(className)"
             v-bind:class="{ active: className === activeClass }">
            {{label}}
          </button>
    Ответ написан
    Комментировать
  • Замена класса на новый с помощью vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    <div :class="isActive ? 'newClass' : 'menu-contain'">
    Ответ написан
    1 комментарий
  • Как реализовать кастомный горизонтальный скролл с animate.css?

    lazalu68
    @lazalu68
    Salmon
    Не знаю насчет настройки и других плагинов, но мне кажется проще будет на элементы вешать класс wow во время их появления во вьюпорте, эффект тот же будет. Можно опираться на этот алгоритм. Еще как вариант можно форкнуть WOW и переписать его чуть-чуть, делов на несколько минут.

    Кстати, whileScrolling это как раз то что нужно, разве что вы неправильно его используете - он вызывается постоянно при скролле, wow не нужно инициализировать каждую десятую долю секунды.

    UPD: вешать класс wow не получилось, новые элементы почему-то не подхватываются. Если вас устроит независимость от wow, то можете объявить CSS класс horizontal-wow:

    .horizontal-wow {
        visibility: hidden;
        animation-name: null;
    }


    Соответственно, в разметке надо будет использовать его вместо wow. Скрипт получился некрасивый:

    Без WOW, только animate.css
    jQuery.fn.extend({
        custom_onAppearanceApply: function( f, container ) {
            var $container = $( container ),
                container_width = $container.width(),
                array_of_$elements = [];
            this.each(function(i,el) {
                array_of_$elements.push($( el ));
            })
            scrollHandler();
    
            function watchProcessedElements(array_of_indexes) {
                var l, i;
                for (l = array_of_indexes.length, i = l - 1; i > -1; --i) {
                    array_of_$elements.splice(array_of_indexes[i], 1);
                }
            }
            function scrollHandler() {
                var i, l, processed = [];
                for ( l = array_of_$elements.length, i = 0; i < l; ++i ) {
    
                    if (-container.mcs.left + container_width > array_of_$elements[i].position().left) {
                        f.call( array_of_$elements[i] );
                        processed.push(i); 
                    }
                }
                if (processed.length) {
                    watchProcessedElements(processed);
                }
            }
    
            return {
                scrollHandler: scrollHandler
            };
        }
    })
    
    $(window).load(function() {
        if ($(".js-page-scroll").length) {
            var scrollHandler = $.noop,
                scrollHandlerWrapper = function() {
                    scrollHandler();
                };
    
            $(".js-page-scroll").mCustomScrollbar({
                axis: "x",
                theme: "dark-3",
                advanced: { autoExpandHorizontalScroll: true },
                callbacks: {
                    onInit: function() {
                        scrollHandler = $('.horizontal-wow').custom_onAppearanceApply(function () {
                            var old_animation = this.css('animation-name'),
                                $this = this;
    
                            $this.css('animation-name', 'clear').addClass('animated');
    
                            setTimeout(function() {
                                $this.css({
                                    'visibility': 'visible',
                                    'animation-name': ''
                                }); 
                            })
    
                        }, this).scrollHandler;
                    },
                    whileScrolling: scrollHandlerWrapper
                }
            });
        }
    });
    Ответ написан
    1 комментарий
  • Не работает скайп?

    Eridani
    @Eridani
    Мимо проходил
    Смените в настройках скайпа порт с 80 (скорее всего он) на что-то другое.
    Ответ написан
    3 комментария
  • Есть ли видеокурсы jQuery для более опытных?

    @grmnshphrd
    Бери и делай, видеокурсы здесь незачем.
    Ответ написан
    Комментировать
  • Для чего нужен Node.js конкретно?

    sim3x
    @sim3x
    Он нужен для написания серверного кода на js
    Ответ написан
    Комментировать
  • Можно ли сделать горизонтальный скорлл колесиком?

    @dr_gosh
    Для примера
    https://jsfiddle.net/8nxLgaaj/4/
    Ответ написан
    Комментировать
  • Какой есть нормальный SVG редактор на Windows?

    tivikovv
    @tivikovv
    Мимо прохожу
    Adobe Illustrator, Inkscape
    Ответ написан
    Комментировать