Библиотеки SwifWeb: материализация CSS

Библиотеки SwifWeb: материализация CSS

22 марта 2023 г.

Веб-разработка без готовых библиотек пользовательского интерфейса не была бы такой быстрой и эффективной. Вы можете утверждать, что вы ниндзя HTML/CSS, и я верю вам, потому что я тоже. Тем не менее, использовать предопределенные стильные компоненты по-прежнему здорово, поэтому мы ищем красивые библиотеки пользовательского интерфейса.

Меня зовут Михаил Исаев, я автор фреймворка SwifWeb. Сегодня я расскажу вам о структуре MaterializeCSS и о том, как ее использовать с SwifWeb. Начнем!

Что это?

MaterializeCSS — это современная адаптивная инфраструктура внешнего интерфейса с открытым исходным кодом, основанная на Material Design, созданный Google, чтобы объединить классические принципы успешного дизайна с инновациями и технологиями. Мне понравилось писать обертку для этого фреймворка, потому что он очень прост в использовании!

Как установить?

Если вы новичок в SwifWeb, вам необходимо создать новый проект с помощью инструмента Webber CLI.

В проекте откройте Package.swift и отредактируйте раздел dependencies, чтобы он выглядел следующим образом:

dependencies: [
    // the rest of the other dependencies incuding swifweb/web
    .package(url: "https://github.com/swifweb/materialize", from: "1.0.0"),
]

Затем отредактируйте executableTarget, чтобы он выглядел следующим образом:

.executableTarget(name: "App", dependencies: [
    .product(name: "Web", package: "web"),
    .product(name: "Materialize", package: "materialize")
]),

Затем откройте App.swift и настройте Materialize в методе didFinishLaunching следующим образом:

Lifecycle.didFinishLaunching {
    Materialize.configure()
}

:::подсказка Вы столкнетесь с отсутствием стилей, если забудете его настроить :upside_down_face:

:::

Пользовательская тема:

Если вы создали собственный стиль Materialize из SCSS, настройте его следующим образом:

Lifecycle.didFinishLaunching { app in
    Materialize.configure(avoidStyles: true)
    app.addStylesheet("/css/custom-materialize.min.css")
}

Добавьте свой собственный стиль в /Sources/App/css/custom-materialize.min.css

откройте Package.swift и объявите ресурсы в executableTarget следующим образом:

.executableTarget(name: "App", dependencies: [
    .product(name: "Web", package: "web"),
    .product(name: "Materialize", package: "materialize")
], resources: [
    .copy("css/custom-materialize.min.css"),
    .copy("css")
]),

Теперь вы готовы приступить к созданию пользовательского интерфейса!

Компоненты

Я красиво обернул все компоненты в Swift, но статья была бы слишком длинной, если бы я описывал их все.

Позвольте мне рассмотреть некоторые из них здесь, а остальные вы можете найти в readme на GitHub.

Кнопки

Вы можете сделать любой элемент материальной кнопкой, просто вызвав метод .materialButton(...).

Элемент A можно использовать для ссылок, а Div или другие элементы можно использовать с обработчиком onClick.

Div("My Button")
    .materialButton(type: .raised)
    .onClick {}
A("My Link")
    .href("https://google.com")
    .materialButton(type: .raised)

Оба элемента будут выглядеть одинаково, с той лишь разницей, что A является ссылкой и будет действовать как ссылка.

Метод .materialButton имеет несколько вариантов:

type может быть приподнятым, плавающим, плавающим HalfWay, плоским

size может быть маленький, большой

волны могут быть светлыми, красными, желтыми, оранжевыми, фиолетовыми, зелеными, бирюзовыми или произвольными, светлыми по умолчанию

disabled — это просто флаг, помечающий кнопку как отключенную. Передайте здесь значение @State, чтобы изменить его на лету

Также вы можете добавить к нему значок материала, просто вызвав .addMaterialIcon(...)

.addMaterialIcon("announcement")
// or optionally
.addMaterialIcon("announcement".size(.tiny).side(.right))

Узнайте больше о значке материала ниже.

Плавающая кнопка действия

Это фиксированная плавающая кнопка с несколькими действиями. Подробнее об этом читайте в официальной документации.

FloatingActionButton(icon: "add", color: .pink)
    .item(icon: "public", color: .red)
    .item(icon: "adb", color: .purple)
    .item(icon: "announcement", color: .blue) {
        Toast.show("Announcement!")
    }

Необязательные аргументы

size может быть большой и маленький, по умолчанию большой

волны могут быть светлыми, красными, желтыми, оранжевыми, фиолетовыми, зелеными, бирюзовыми или произвольными, светлыми по умолчанию

направление может быть сверху, справа, снизу, слева, по умолчанию это сверху

mode может быть hover, click, toolbar, по умолчанию hover

Программное управление:

lazy var fab = FloatingActionButton(...)
fab.open() // to show the menu/toolbar
fab.close() // to show the menu/toolbar
fab.isOpen // the check if it is open

Значки

Вы можете добавить значок куда угодно, инициализировав объект MaterialIcon.

Этот объект принимает значок type в качестве аргумента инициализатора. Список типов значков доступен здесь.

MaterialIcon("announcement")

Вы можете позже изменить тип значка на лету, вызвав для него метод .type(...).

Необязательные методы

.size(...) принимает маленький, маленький, средний, большой

.side(...) принимает влево, вправо

Все методы могут принимать реактивное значение @State, поэтому вы можете менять значок и его свойства на лету.

Цвета

Доступны все цвета, перечисленные в официальной документации, включая их модификаторы.

Цвет текста

Span("Hello").textColor(.red)          // just red color
Span("Hello").textColor(.red.lighten3) // red color with lighten-3 modifier
Span("Hello").textColor(.red.darken4)  // red color with darken-4 modifier

Цвет фона

Div().materialBackground(.red) // just red color
Div().textColor(.red.lighten3) // red color with lighten-3 modifier
Div().textColor(.red.darken4)  // red color with darken-4 modifier
// or
Div().red()
Div().red(.lighten3)
Div().red(.darken4)

Сетка

Главным в сетке является столбец, который имеет свою ширину и необязательные модификаторы offest, push, pull.

Container {
    Row {
        Column(.small(.one)) { "1" }  // <div class="col s1">1</div>
        Column(.small(.one)) { "2" }  // <div class="col s1">2</div>
        Column(.small(.one)) { "3" }  // <div class="col s1">3</div>
        Column(.small(.one)) { "4" }  // <div class="col s1">4</div>
        Column(.small(.one)) { "5" }  // <div class="col s1">5</div>
        Column(.small(.one)) { "6" }  // <div class="col s1">6</div>
        Column(.small(.one)) { "7" }  // <div class="col s1">7</div>
        Column(.small(.one)) { "8" }  // <div class="col s1">8</div>
        Column(.small(.one)) { "9" }  // <div class="col s1">9</div>
        Column(.small(.one)) { "10" } // <div class="col s1">10</div>
        Column(.small(.one)) { "11" } // <div class="col s1">11</div>
        Column(.small(.one)) { "12" } // <div class="col s1">12</div>
    }
    Divider()
    Row {
        Column(.small(.twelve)) { "screen-wide" }
        Column(.small(.six)) { "one-half" }
        Column(.small(.six)) { "one-half" }
    }
    Divider()
    Row {
        Column(.small(.twelve)) { "12-columns" }
        Column(.small(.six, offset: .six)) { "6-columns at the right" }
    }
    Divider()
    Row {
        Column(.small(.seven, push: .five)) { "7-columns pushed to the right" }
        Column(.small(.five, pull: .seven)) { "5-columns pulled to the left" }
    }
}

Примеры выше 1:1, как и в официальной документации, так что вы можете просто сравнить.

Вы можете установить более одного класса размера для Столбца:

Column(.extraLarge(.twelve), .large(.ten), .medium(.eight), .small(.six))

Выравнивание

Выровнять по вертикали

VAlignWrapper {
    H5("This should be vertically aligned")
}

Выравнивание текста

H5("This should be left aligned").leftAlign()
H5("This should be right aligned").rightAlign()
H5("This should be center aligned").centerAlign()

Быстрые поплавки

Div().floatLeft()   // Quickly float things to left
Div().floatRight()  // Quickly float things to right
Div().floatCenter() // Quickly float things to center

Скрытие/отображение контента

Div().hideOnSmallOnly()     // Hidden for Mobile Only
Div().hideOnMedOnly()       // Hidden for Tablet Only
Div().hideOnMedAndDown()    // Hidden for Tablet and Below
Div().hideOnMedAndUp()      // Hidden for Tablet and Above
Div().hideOnLargeOnly()     // Hidden for Desktop Only
Div().showOnSmall()         // Show for Mobile Only
Div().showOnMedium()        // Show for Tablet Only
Div().showOnLarge()         // Show for Desktop Only
Div().showOnMediumAndUp()   // Show for Tablet and Above
Div().showOnMediumAndDown() // Show for Tablet and Below
Div().pinned()              // Pins element

Форматирование

Усечение

H4("This is an extremely long title").truncate() // also with @State

Наведите

Эта функция добавляет анимацию тени при наведении курсора.

Card().hoverable() // also with @State

Настройки браузера по умолчанию

Вы можете вернуть стили элементов в исходное состояние.

Ul().browserDefault()

Изображения

Адаптивные изображения

Img().src("cool_pic.jpg").responsive() // resizes responsively to page width

Круглые изображения

Img().src("images/yuna.jpg").circle() // square image that appears circular

Видео

Адаптивные встраивания

Div {
    IFrame(...)
}.videoContainer()

Адаптивные видео

Video {
    Source().src("movie.mp4").type("video/mp4")
}.responsive()

Панель навигации

Navbar {
    A("Logo")
        .floatLeft()   // align left
        .floatRight()  // align right
        .floatCenter() // align center
}
.deepPurple(.lighten4) // background
.left()                // left aligned links
.right()               // right aligned links
.item("Sass", href: "/sass")
.item("Components", href: "/badges")
.item("JavaScript", active: true, href: "/collapsible") // as active
// dropdown menu
.dropdownItem("More", background: .white, hover: false) {
    DropdownItem("Dropdown 1", color: .red) { Toast.show("Hi") }
    DropdownItem("Dropdown 2", href: "")
}

Карточки

Card("Card Title")
    .blueGrey(.darken1)
    .textColor(.white)
    .message("""I am a very simple card.
    I am good at containing small bits of information.
    I am convenient because I require little markup to use effectively.
    """)
    .action("THIS IS A BUTTON") {}
    .action("THIS IS A LINK", href: "#")

Предварительный загрузчик

Круговой

PreloaderCircular(colors: .blue, .red, .green, .yellow).active()

Неопределенный

PreloaderLinearIndeterminate()

Определить

@State var value: Double = 20 // change it to update the progress
PreloaderLinearDeterminate($value)

Разбивка на страницы

Pagination()
    .back(disabled: true, icon: "chevron_left") {}
    .item(1, href: "#1")
    .item(2, href: "#2")
    .item(3) { Toast.show("Going to 3!") }
    .forward() { Toast.show("Going forward!", rounded: true) }

Вот и все

Хорошо, я описал примерно 20% фреймворка.

Если вы знакомы с Materialize CSS, вы можете заметить, что его представление Swift намного проще в использовании!

Хотите узнать больше? Следите за новыми статьями!

:::подсказка Не стесняйтесь задавать любые вопросы в нашем Discord и не стесняйтесь вносить свой вклад!

:::


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE