From 24e0c7ba5324414c092ff066819fea3dfbd97b38 Mon Sep 17 00:00:00 2001 From: Scott Clampet <110618242+scottkicks@users.noreply.github.com> Date: Mon, 11 Sep 2023 09:04:32 -0600 Subject: [PATCH] [MBL-952] Design System Demo Page (Dark Mode) (#1849) * add new Beta Tools row that navigates to a new SystemDesignViewController updates BetaToolsViewController Snapshot as well * package.resolved update * add Alerts and Primary buttons * add controls, inputs, and first couple progress indicators * add shimmer loading, dropdown, and typography * add new color assets and turn off light mode override in info.plist * add SystemDesignColors file with color loading helper * apply adaptive color versions of exisiting component styles * put light mode override back * formatting * remove plist key. didn't mean to add that * rename: SystemDesign -> Design System * test goToDesignSystem signal * remove button title feedback * Build view controller programmatically and remove storyboard * update current color scheme with actual dark mode colors from design team these are in a draft, but are close to be finalized at least for the web * add Alerts section * update BetaToolsViewController snapshot * adjust icon sizing * update input padding and icons * last of the initial pr feedback mostly file organization * Update MessageBannerViewController.xib revert changes * oops missed the footer label --- .../Assets.xcassets/colors/Contents.json | 6 + .../colors/alert.colorset/Contents.json | 38 ++ .../colors/black.colorset/Contents.json | 38 ++ .../celebrate100.colorset/Contents.json | 38 ++ .../celebrate300.colorset/Contents.json | 38 ++ .../celebrate500.colorset/Contents.json | 38 ++ .../celebrate700.colorset/Contents.json | 38 ++ .../cellSeparator.colorset/Contents.json | 38 ++ .../colors/create100.colorset/Contents.json | 38 ++ .../colors/create300.colorset/Contents.json | 38 ++ .../colors/create500.colorset/Contents.json | 38 ++ .../colors/create700.colorset/Contents.json | 38 ++ .../facebookBlue.colorset/Contents.json | 38 ++ .../colors/inform.colorset/Contents.json | 38 ++ .../colors/support100.colorset/Contents.json | 38 ++ .../colors/support200.colorset/Contents.json | 38 ++ .../colors/support300.colorset/Contents.json | 38 ++ .../colors/support400.colorset/Contents.json | 38 ++ .../colors/support500.colorset/Contents.json | 38 ++ .../colors/support700.colorset/Contents.json | 38 ++ .../colors/trust100.colorset/Contents.json | 38 ++ .../colors/trust300.colorset/Contents.json | 38 ++ .../colors/trust500.colorset/Contents.json | 38 ++ .../colors/trust700.colorset/Contents.json | 38 ++ .../colors/warn.colorset/Contents.json | 38 ++ .../colors/white.colorset/Contents.json | 38 ++ .../Controller/BetaToolsViewController.swift | 12 + .../testBetaToolsViewController.1.png | Bin 72005 -> 76463 bytes .../Colors/DesignSystemColors.swift | 222 ++++++ .../DesignSystemViewController.swift | 645 ++++++++++++++++++ .../Views/DemoCTAContainerView.swift | 207 ++++++ .../Views/DemoShimmerLoadingView.swift | 69 ++ Kickstarter.xcodeproj/project.pbxproj | 48 ++ .../xcshareddata/swiftpm/Package.resolved | 4 +- Library/ViewModels/BetaToolsViewModel.swift | 11 +- .../ViewModels/BetaToolsViewModelTests.swift | 12 + 36 files changed, 2183 insertions(+), 3 deletions(-) create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/alert.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/black.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/celebrate100.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/celebrate300.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/celebrate500.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/celebrate700.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/cellSeparator.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/create100.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/create300.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/create500.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/create700.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/facebookBlue.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/inform.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/support100.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/support200.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/support300.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/support400.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/support500.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/support700.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/trust100.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/trust300.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/trust500.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/trust700.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/warn.colorset/Contents.json create mode 100644 Kickstarter-iOS/Assets.xcassets/colors/white.colorset/Contents.json create mode 100644 Kickstarter-iOS/Features/DesignSystem/Colors/DesignSystemColors.swift create mode 100644 Kickstarter-iOS/Features/DesignSystem/Controller/DesignSystemViewController.swift create mode 100644 Kickstarter-iOS/Features/DesignSystem/Views/DemoCTAContainerView.swift create mode 100644 Kickstarter-iOS/Features/DesignSystem/Views/DemoShimmerLoadingView.swift diff --git a/Kickstarter-iOS/Assets.xcassets/colors/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/alert.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/alert.colorset/Contents.json new file mode 100644 index 0000000000..5d5d8fc149 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/alert.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.153", + "green" : "0.122", + "red" : "0.627" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.384", + "green" : "0.482", + "red" : "0.976" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/black.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/black.colorset/Contents.json new file mode 100644 index 0000000000..a83a61e3f3 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/black.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.118", + "green" : "0.118", + "red" : "0.118" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/celebrate100.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/celebrate100.colorset/Contents.json new file mode 100644 index 0000000000..7df80058f6 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/celebrate100.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.925", + "green" : "0.949", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.239", + "green" : "0.314", + "red" : "0.847" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/celebrate300.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/celebrate300.colorset/Contents.json new file mode 100644 index 0000000000..f149d3cd8f --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/celebrate300.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.702", + "green" : "0.800", + "red" : "0.996" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.384", + "green" : "0.482", + "red" : "0.976" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/celebrate500.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/celebrate500.colorset/Contents.json new file mode 100644 index 0000000000..566936013d --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/celebrate500.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.384", + "green" : "0.482", + "red" : "0.976" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.702", + "green" : "0.800", + "red" : "0.996" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/celebrate700.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/celebrate700.colorset/Contents.json new file mode 100644 index 0000000000..47364df360 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/celebrate700.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.239", + "green" : "0.314", + "red" : "0.847" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.925", + "green" : "0.949", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/cellSeparator.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/cellSeparator.colorset/Contents.json new file mode 100644 index 0000000000..2be182317d --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/cellSeparator.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.867", + "green" : "0.871", + "red" : "0.863" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "0.988" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/create100.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/create100.colorset/Contents.json new file mode 100644 index 0000000000..19d09e0c75 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/create100.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.945", + "green" : "0.980", + "red" : "0.902" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.345", + "green" : "0.533", + "red" : "0.008" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/create300.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/create300.colorset/Contents.json new file mode 100644 index 0000000000..117c534c67 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/create300.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.788", + "green" : "0.922", + "red" : "0.608" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.471", + "green" : "0.808", + "red" : "0.020" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/create500.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/create500.colorset/Contents.json new file mode 100644 index 0000000000..45a4bce696 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/create500.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.471", + "green" : "0.808", + "red" : "0.020" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.788", + "green" : "0.922", + "red" : "0.608" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/create700.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/create700.colorset/Contents.json new file mode 100644 index 0000000000..a10e05bbea --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/create700.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.345", + "green" : "0.533", + "red" : "0.008" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.945", + "green" : "0.980", + "red" : "0.902" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/facebookBlue.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/facebookBlue.colorset/Contents.json new file mode 100644 index 0000000000..aa20c6ae2d --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/facebookBlue.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.949", + "green" : "0.467", + "red" : "0.094" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.949", + "green" : "0.467", + "red" : "0.094" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/inform.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/inform.colorset/Contents.json new file mode 100644 index 0000000000..d0b564eed6 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/inform.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.882", + "green" : "0.851", + "red" : "0.714" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.882", + "green" : "0.851", + "red" : "0.714" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/support100.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/support100.colorset/Contents.json new file mode 100644 index 0000000000..900a55bf86 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/support100.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.953", + "green" : "0.953", + "red" : "0.953" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.133", + "green" : "0.133", + "red" : "0.133" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/support200.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/support200.colorset/Contents.json new file mode 100644 index 0000000000..2c4dda97e2 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/support200.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.902", + "green" : "0.902", + "red" : "0.902" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.275", + "green" : "0.275", + "red" : "0.275" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/support300.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/support300.colorset/Contents.json new file mode 100644 index 0000000000..90d271f0d3 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/support300.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.820", + "green" : "0.820", + "red" : "0.820" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.412", + "green" : "0.412", + "red" : "0.412" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/support400.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/support400.colorset/Contents.json new file mode 100644 index 0000000000..b2f51ae19c --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/support400.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.412", + "green" : "0.412", + "red" : "0.412" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.820", + "green" : "0.820", + "red" : "0.820" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/support500.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/support500.colorset/Contents.json new file mode 100644 index 0000000000..6a5a1aeecf --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/support500.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.275", + "green" : "0.275", + "red" : "0.275" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.902", + "green" : "0.902", + "red" : "0.902" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/support700.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/support700.colorset/Contents.json new file mode 100644 index 0000000000..d1ddb313f9 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/support700.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.133", + "green" : "0.133", + "red" : "0.133" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.953", + "green" : "0.953", + "red" : "0.953" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/trust100.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/trust100.colorset/Contents.json new file mode 100644 index 0000000000..262b2e1557 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/trust100.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.906", + "red" : "0.859" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.490", + "green" : "0.000", + "red" : "0.039" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/trust300.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/trust300.colorset/Contents.json new file mode 100644 index 0000000000..e52ef39b86 --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/trust300.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.627", + "red" : "0.443" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.333", + "red" : "0.333" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/trust500.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/trust500.colorset/Contents.json new file mode 100644 index 0000000000..c5b8ae1d4d --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/trust500.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.333", + "red" : "0.333" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.627", + "red" : "0.443" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/trust700.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/trust700.colorset/Contents.json new file mode 100644 index 0000000000..aa03cf485d --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/trust700.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.490", + "green" : "0.000", + "red" : "0.039" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "0.906", + "red" : "0.859" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/warn.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/warn.colorset/Contents.json new file mode 100644 index 0000000000..5dc78752cc --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/warn.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.427", + "green" : "0.839", + "red" : "0.976" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.427", + "green" : "0.839", + "red" : "0.976" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Assets.xcassets/colors/white.colorset/Contents.json b/Kickstarter-iOS/Assets.xcassets/colors/white.colorset/Contents.json new file mode 100644 index 0000000000..c779eda1cd --- /dev/null +++ b/Kickstarter-iOS/Assets.xcassets/colors/white.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.137", + "green" : "0.137", + "red" : "0.137" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift b/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift index f3a5a344ca..e4809006d9 100644 --- a/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift +++ b/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift @@ -76,6 +76,12 @@ internal final class BetaToolsViewController: UITableViewController { self?.goToRemoteConfigFeatureFlagTools() } + self.viewModel.outputs.goToDesignSystem + .observeForControllerAction() + .observeValues { [weak self] in + self?.goToDesignSystem() + } + self.viewModel.outputs.goToBetaFeedback .observeForControllerAction() .observeValues { [weak self] in @@ -171,6 +177,12 @@ internal final class BetaToolsViewController: UITableViewController { self.navigationController?.pushViewController(viewController, animated: true) } + private func goToDesignSystem() { + let viewController = DesignSystemViewController.instantiate() + + self.navigationController?.pushViewController(viewController, animated: true) + } + private func showLanguageActionSheet(sourceViewIndex: Int) { guard let sourceView = self.tableView .cellForRow(at: IndexPath(row: sourceViewIndex, section: 0))?.detailTextLabel else { diff --git a/Kickstarter-iOS/Features/BetaTools/Controller/__Snapshots__/BetaToolsViewControllerTests/testBetaToolsViewController.1.png b/Kickstarter-iOS/Features/BetaTools/Controller/__Snapshots__/BetaToolsViewControllerTests/testBetaToolsViewController.1.png index 871439182dd14a76b1ddfa2a5caa809583691c3e..69fc6c0cbe6b593ec29ad94b496268573b482753 100644 GIT binary patch literal 76463 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

6W-Xy(>{^taUx&$a2_kQ0t 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 FO#n-hHw^#) diff --git a/Kickstarter-iOS/Features/DesignSystem/Colors/DesignSystemColors.swift b/Kickstarter-iOS/Features/DesignSystem/Colors/DesignSystemColors.swift new file mode 100644 index 0000000000..c0cbe5060e --- /dev/null +++ b/Kickstarter-iOS/Features/DesignSystem/Colors/DesignSystemColors.swift @@ -0,0 +1,222 @@ +import Prelude +import Prelude_UIKit +import UIKit + +public enum DesignSystemColors: String { + // MARK: - Greens + + case create100 + case create300 + case create500 + case create700 + + // MARK: - Greys + + case black + case support100 + case support200 + case support300 + case support400 + case support500 + case support700 + case white + + // MARK: - Blues + + case trust100 + case trust300 + case trust500 + case trust700 + + // MARK: - Corals + + case celebrate100 + case celebrate300 + case celebrate500 + case celebrate700 + + // MARK: - Functional + + case alert + case cellSeparator + case facebookBlue + case inform + case warn +} + +extension DesignSystemColors { + public func load() -> UIColor { + UIColor(named: self.rawValue) ?? .white + } +} + +public func adaptiveColor(_ style: DesignSystemColors) -> UIColor { + style.load() +} + +public let verticalComponentStackViewStyle: StackViewStyle = { (stackView: UIStackView) in + stackView + |> verticalStackViewStyle + |> \.alignment .~ .leading + |> \.spacing .~ 8 + |> \.distribution .~ .fill + |> UIStackView.lens.spacing .~ Styles.grid(2) +} + +// MARK: - Alert StackView + +public let alertStackViewStyle: StackViewStyle = { (stackView: UIStackView) in + stackView + |> \.axis .~ NSLayoutConstraint.Axis.horizontal + |> \.distribution .~ .fill + |> \.layoutMargins .~ UIEdgeInsets.init(topBottom: 8, leftRight: 12) + |> \.isLayoutMarginsRelativeArrangement .~ true + |> \.spacing .~ 12 + |> \.tintColor .~ .white + |> \.layer.cornerRadius .~ 6 +} + +// MARK: - Buttons + +public let adaptiveGreenButtonStyle = baseButtonStyle + <> UIButton.lens.titleColor(for: .normal) .~ adaptiveColor(.white) + <> UIButton.lens.backgroundColor(for: .normal) .~ adaptiveColor(.create700) + <> UIButton.lens.titleColor(for: .highlighted) .~ adaptiveColor(.white) + <> UIButton.lens.backgroundColor(for: .highlighted) .~ adaptiveColor(.create700).mixDarker(0.36) + <> UIButton.lens.backgroundColor(for: .disabled) .~ adaptiveColor(.create700).mixLighter(0.36) + +public let adaptiveBlueButtonStyle = baseButtonStyle + <> UIButton.lens.titleColor(for: .normal) .~ adaptiveColor(.white) + <> UIButton.lens.backgroundColor(for: .normal) .~ adaptiveColor(.trust500) + <> UIButton.lens.titleColor(for: .highlighted) .~ adaptiveColor(.white) + <> UIButton.lens.backgroundColor(for: .highlighted) .~ adaptiveColor(.trust500).mixDarker(0.36) + <> UIButton.lens.backgroundColor(for: .disabled) .~ adaptiveColor(.trust500).mixLighter(0.36) + +public let adaptiveGreyButtonStyle = baseButtonStyle + <> UIButton.lens.titleColor(for: .normal) .~ adaptiveColor(.support700) + <> UIButton.lens.backgroundColor(for: .normal) .~ adaptiveColor(.support300) + <> UIButton.lens.titleColor(for: .highlighted) .~ adaptiveColor(.support700) + <> UIButton.lens.titleColor(for: .disabled) .~ adaptiveColor(.support400) + <> UIButton.lens.backgroundColor(for: .highlighted) .~ adaptiveColor(.support300).mixDarker(0.36) + <> UIButton.lens.backgroundColor(for: .disabled) .~ adaptiveColor(.support300).mixLighter(0.12) + +public let adaptiveBlackButtonStyle = baseButtonStyle + <> UIButton.lens.titleColor(for: .normal) .~ adaptiveColor(.white) + <> UIButton.lens.titleColor(for: .highlighted) .~ adaptiveColor(.white) + <> UIButton.lens.titleColor(for: .disabled) .~ adaptiveColor(.support100) + <> UIButton.lens.backgroundColor(for: .normal) .~ adaptiveColor(.support700) + <> UIButton.lens.backgroundColor(for: .highlighted) .~ adaptiveColor(.support700).mixDarker(0.66) + <> UIButton.lens.backgroundColor(for: .disabled) .~ adaptiveColor(.support700).mixLighter(0.36) + <> UIButton.lens.backgroundColor(for: .selected) .~ adaptiveColor(.support700).mixLighter(0.46) + +public let adaptiveRedButtonStyle = baseButtonStyle + <> UIButton.lens.titleColor(for: .normal) .~ adaptiveColor(.white) + <> UIButton.lens.backgroundColor(for: .normal) .~ adaptiveColor(.alert) + <> UIButton.lens.backgroundColor(for: .highlighted) .~ adaptiveColor(.alert).mixDarker(0.12) + <> UIButton.lens.backgroundColor(for: .disabled) .~ adaptiveColor(.alert).mixLighter(0.36) + +public let adaptiveFacebookButtonStyle = baseButtonStyle + <> UIButton.lens.backgroundColor(for: .normal) .~ adaptiveColor(.facebookBlue) + <> UIButton.lens.titleColor(for: .normal) .~ .white + <> UIButton.lens.titleColor(for: .highlighted) .~ .white + <> UIButton.lens.backgroundColor(for: .highlighted) .~ adaptiveColor(.facebookBlue).mixDarker(0.36) + <> UIButton.lens.backgroundColor(for: .disabled) .~ adaptiveColor(.facebookBlue).mixLighter(0.36) + <> UIButton.lens.tintColor .~ adaptiveColor(.white) + <> UIButton.lens.imageEdgeInsets .~ .init(top: 0, left: 0, bottom: 0, right: 18.0) + <> UIButton.lens.contentEdgeInsets %~~ { _, button in + button.traitCollection.verticalSizeClass == .compact + ? .init(topBottom: 10.0, leftRight: 12.0) + : .init(topBottom: 12.0, leftRight: 16.0) + } + + <> UIButton.lens.image(for: .normal) %~ { _ in image(named: "fb-logo-white") } + +// MARK: - Icons + +public let adaptiveIconImageViewStyle: ImageViewStyle = { imageView in + imageView + |> \.contentMode .~ .scaleAspectFit + |> \.translatesAutoresizingMaskIntoConstraints .~ false +} + +// MARK: - Switch Control + +public let adaptiveSwitchControlStyle: SwitchControlStyle = { switchControl in + switchControl + |> \.onTintColor .~ adaptiveColor(.create700) + |> \.tintColor .~ adaptiveColor(.support100) +} + +// MARK: - Drop Down + +public let adaptiveDropDownButtonStyle: ButtonStyle = { (button: UIButton) in + button + |> UIButton.lens.contentEdgeInsets .~ UIEdgeInsets( + top: Styles.gridHalf(3), left: Styles.grid(2), bottom: Styles.gridHalf(3), right: Styles.grid(5) + ) + |> UIButton.lens.titleLabel.font .~ UIFont.ksr_body().bolded + |> UIButton.lens.titleColor(for: .normal) .~ adaptiveColor(.create500) + |> UIButton.lens.titleColor(for: .highlighted) .~ adaptiveColor(.create500) + |> UIButton.lens.image(for: .normal) .~ Library.image(named: "icon-dropdown-small") + |> UIButton.lens.semanticContentAttribute .~ .forceRightToLeft + |> UIButton.lens.imageEdgeInsets .~ UIEdgeInsets(top: 0, left: Styles.grid(6), bottom: 0, right: 0) + |> UIButton.lens.layer.shadowColor .~ adaptiveColor(.black).cgColor +} + +// MARK: - Form + +public let adaptiveFormFieldStyle: TextFieldStyle = { (textField: UITextField) in + textField + |> formTextInputStyle + |> \.backgroundColor .~ .clear + |> \.font .~ .ksr_body() + |> \.textColor .~ adaptiveColor(.black) +} + +// MARK: - Text Field + +public let adaptiveEmailFieldStyle = adaptiveFormFieldStyle + <> UITextField.lens.keyboardType .~ .emailAddress + +public func adaptiveAttributedPlaceholder(_ string: String) -> NSAttributedString { + return NSAttributedString( + string: string, + attributes: [NSAttributedString.Key.foregroundColor: adaptiveColor(.support400)] + ) +} + +private let adaptiveEmailTextFieldPlaceholderStyle: TextFieldStyle = { (textField: UITextField) in + textField + |> \.returnKeyType .~ UIReturnKeyType.next + |> \.attributedPlaceholder %~ { _ in + adaptiveAttributedPlaceholder(Strings.login_placeholder_email()) + } +} + +// MARK: - Activity Indicator + +public func adaptiveActivityIndicatorStyle(indicator: UIActivityIndicatorView) -> UIActivityIndicatorView { + return indicator + |> UIActivityIndicatorView.lens.hidesWhenStopped .~ true + |> UIActivityIndicatorView.lens.style .~ .medium + |> UIActivityIndicatorView.lens.color .~ adaptiveColor(.support700) +} + +// MARK: - Links + +public let adaptiveTappableLinksViewStyle: TextViewStyle = { (textView: UITextView) -> UITextView in + _ = textView + |> \.isScrollEnabled .~ false + |> \.isEditable .~ false + |> \.isUserInteractionEnabled .~ true + |> \.adjustsFontForContentSizeCategory .~ true + + _ = textView + |> \.textContainerInset .~ UIEdgeInsets.zero + |> \.textContainer.lineFragmentPadding .~ 0 + |> \.linkTextAttributes .~ [ + .foregroundColor: adaptiveColor(.create700) + ] + + return textView +} diff --git a/Kickstarter-iOS/Features/DesignSystem/Controller/DesignSystemViewController.swift b/Kickstarter-iOS/Features/DesignSystem/Controller/DesignSystemViewController.swift new file mode 100644 index 0000000000..6cb140b0b3 --- /dev/null +++ b/Kickstarter-iOS/Features/DesignSystem/Controller/DesignSystemViewController.swift @@ -0,0 +1,645 @@ +import Foundation +import KsApi +import Library +import PassKit +import Prelude +import UIKit + +final class DesignSystemViewController: UIViewController { + private lazy var scrollView = { UIScrollView(frame: .zero) }() + private lazy var rootStackView = { UIStackView(frame: .zero) }() + + // MARK: - Alerts + + private let alertsLabel = UILabel() + private let alertsStackView: UIStackView = { UIStackView(frame: .zero) }() + private let errorSnackbarStackView: UIStackView = { UIStackView(frame: .zero) }() + private let errorSnackbarIcon = { UIImageView(frame: .zero) }() + private let errorSnackbarLabel = UILabel() + private let confirmationSnackbarStackView: UIStackView = { UIStackView(frame: .zero) }() + private let confirmationSnackbarIcon = { UIImageView(frame: .zero) }() + private let confirmationSnackbarLabel = UILabel() + + // MARK: - Buttons + + private let buttonsLabel = UILabel() + private let buttonsStackView: UIStackView = { UIStackView(frame: .zero) }() + private let primaryGreenButton = UIButton(type: .custom) + private let primaryBlueButton = UIButton(type: .custom) + private let primaryBlackButton = UIButton(type: .custom) + private let secondaryGreyButton = UIButton(type: .custom) + private let secondaryRedButton = UIButton(type: .custom) + private let secondaryDisabledButton = UIButton(type: .custom) + private let facebookButton = UIButton(type: .custom) + private let applePayButton: PKPaymentButton = { PKPaymentButton() }() + + // MARK: - Icons + + private let iconsLabel = UILabel() + private let iconsStackView: UIStackView = { UIStackView(frame: .zero) }() + private let logoIcon = { UIImageView(frame: .zero) }() + private let arrowDownIcon = { UIImageView(frame: .zero) }() + private let bookmarkIcon = { UIImageView(frame: .zero) }() + private let heartIcon = { UIImageView(frame: .zero) }() + + // MARK: - Controls + + private let controlsLabel = UILabel() + private let controlsStackView: UIStackView = { UIStackView(frame: .zero) }() + private let switchControlEnabled = UISwitch(frame: .zero) + private let switchControlDisabled = UISwitch(frame: .zero) + private let stepper: UIStepper = { UIStepper(frame: .zero) }() + private let dropdownButton: UIButton = { UIButton(frame: .zero) }() + + // MARK: - Inputs + + private let inputsLabel = UILabel() + private let inputsStackView: UIStackView = { UIStackView(frame: .zero) }() + private let emailTextField: UITextField = { UITextField(frame: .zero) }() + private let passwordTextField: UITextField = { UITextField(frame: .zero) }() + + // MARK: - Progress Indicators + + private let progressLabel = UILabel() + private let progressStackView: UIStackView = { UIStackView(frame: .zero) }() + private let loadingIndicator = UIActivityIndicatorView() + private let pullToRefreshImageView = UIImageView(image: image(named: "icon--refresh-small")) + private let shimmerLoadingView = DemoShimmerLoadingView(frame: .zero) + + // MARK: - Footers + + private let footersLabel = UILabel() + private let footersStackView: UIStackView = { UIStackView(frame: .zero) }() + private lazy var demoCTAContainerView: DemoCTAContainerView = { + DemoCTAContainerView(frame: .zero) + |> \.translatesAutoresizingMaskIntoConstraints .~ false + }() + + // MARK: - Typography + + private let typesLabel = UILabel() + private let typeStackView: UIStackView = { UIStackView(frame: .zero) }() + private let title1Label = UILabel() + private let title1LabelBold = UILabel() + private let title2Label = UILabel() + private let title2LabelBold = UILabel() + private let title3Label = UILabel() + private let title3LabelBold = UILabel() + private let headlineLabel = UILabel() + private let bodyLabel = UILabel() + private let calloutLabel = UILabel() + private let calloutLabelBold = UILabel() + private let subheadlineLabel = UILabel() + private let subheadlineLabelBold = UILabel() + private let footnoteLabel = UILabel() + private let footnoteLabelBold = UILabel() + private let caption1Label = UILabel() + private let caption1LabelBold = UILabel() + private let caption2Label = UILabel() + private let caption2LabelBold = UILabel() + + // MARK: - Lifecycle + + override func viewDidLoad() { + super.viewDidLoad() + + _ = self + |> \.title .~ "System Design" + + self.dropdownButton.setTitle("United States", for: .normal) + + let emailTextFieldpaddingView = UIView(frame: CGRectMake(0, 0, 15, self.emailTextField.frame.height)) + let passTextFieldpaddingView = UIView(frame: CGRectMake(0, 0, 15, self.passwordTextField.frame.height)) + self.emailTextField.leftView = emailTextFieldpaddingView + self.emailTextField.leftViewMode = .always + self.passwordTextField.leftView = passTextFieldpaddingView + self.passwordTextField.leftViewMode = .always + + self.configureViews() + } + + // MARK: - Configuration + + private func configureViews() { + _ = (self.scrollView, self.view) + |> ksr_addSubviewToParent() + |> ksr_constrainViewToEdgesInParent() + + _ = (self.rootStackView, self.scrollView) + |> ksr_addSubviewToParent() + |> ksr_constrainViewToEdgesInParent() + + _ = ( + [ + self.alertsLabel, + self.alertsStackView, + self.buttonsLabel, + self.buttonsStackView, + self.iconsLabel, + self.iconsStackView, + self.controlsLabel, + self.controlsStackView, + self.inputsLabel, + self.inputsStackView, + self.progressLabel, + self.progressStackView, + self.footersLabel, + self.footersStackView, + self.typesLabel, + self.typeStackView + ], self.rootStackView + ) + |> ksr_addArrangedSubviewsToStackView() + + // MARK: - Alerts Stack + + _ = ([self.errorSnackbarIcon, self.errorSnackbarLabel], self.errorSnackbarStackView) + |> ksr_addArrangedSubviewsToStackView() + + _ = ( + [self.confirmationSnackbarIcon, self.confirmationSnackbarLabel], + self.confirmationSnackbarStackView + ) + |> ksr_addArrangedSubviewsToStackView() + + _ = ( + [self.errorSnackbarStackView, self.confirmationSnackbarStackView], + self.alertsStackView + ) + |> ksr_addArrangedSubviewsToStackView() + + // MARK: - Button Stack + + _ = ( + [ + self.primaryGreenButton, + self.primaryBlueButton, + self.primaryBlackButton, + self.secondaryGreyButton, + self.secondaryDisabledButton, + self.secondaryRedButton, + self.facebookButton, + self.applePayButton + ], self.buttonsStackView + ) + |> ksr_addArrangedSubviewsToStackView() + + // MARK: - Icons Stack + + _ = ( + [ + self.arrowDownIcon, + self.bookmarkIcon, + self.heartIcon, + self.logoIcon + ], self.iconsStackView + ) + |> ksr_addArrangedSubviewsToStackView() + + // MARK: - Controls Stack + + _ = ( + [ + self.switchControlEnabled, + self.switchControlDisabled, + self.stepper, + self.dropdownButton + ], self.controlsStackView + ) + |> ksr_addArrangedSubviewsToStackView() + + // MARK: - Inputs + + _ = ( + [ + self.emailTextField, + self.passwordTextField + ], self.inputsStackView + ) + |> ksr_addArrangedSubviewsToStackView() + + // MARK: - Progress Indicators Stack + + _ = ( + [ + self.loadingIndicator, + self.pullToRefreshImageView, + self.shimmerLoadingView + ], self.progressStackView + ) + |> ksr_addArrangedSubviewsToStackView() + + // MARK: - Footers Stack + + _ = ([self.demoCTAContainerView], self.footersStackView) + |> ksr_addArrangedSubviewsToStackView() + + // MARK: - Typography Stack + + _ = ( + [ + self.title1Label, + self.title1LabelBold, + self.title2Label, + self.title2LabelBold, + self.title3Label, + self.title3LabelBold, + self.headlineLabel, + self.bodyLabel, + self.calloutLabel, + self.calloutLabelBold, + self.subheadlineLabel, + self.subheadlineLabelBold, + self.footnoteLabel, + self.footnoteLabelBold, + self.caption1Label, + self.caption1Label, + self.caption2Label, + self.caption2LabelBold + ], self.typeStackView + ) + |> ksr_addArrangedSubviewsToStackView() + + NSLayoutConstraint.activate([ + self.rootStackView.widthAnchor.constraint(equalTo: self.view.widthAnchor, constant: -4), + + self.errorSnackbarStackView.heightAnchor.constraint(equalToConstant: 64), + self.errorSnackbarStackView.widthAnchor.constraint(equalToConstant: 351), + self.confirmationSnackbarStackView.heightAnchor.constraint(equalToConstant: 64), + self.confirmationSnackbarStackView.widthAnchor.constraint(equalToConstant: 351), + self.errorSnackbarIcon.widthAnchor.constraint(equalToConstant: 20), + self.errorSnackbarIcon.heightAnchor.constraint(equalToConstant: 20), + self.confirmationSnackbarIcon.widthAnchor.constraint(equalToConstant: 20), + self.confirmationSnackbarIcon.heightAnchor.constraint(equalToConstant: 20), + + self.primaryGreenButton.widthAnchor.constraint(equalTo: self.buttonsStackView.widthAnchor), + self.primaryBlueButton.widthAnchor.constraint(equalTo: self.buttonsStackView.widthAnchor), + self.primaryBlackButton.widthAnchor.constraint(equalTo: self.buttonsStackView.widthAnchor), + self.secondaryGreyButton.widthAnchor.constraint(equalTo: self.buttonsStackView.widthAnchor), + self.secondaryRedButton.widthAnchor.constraint(equalTo: self.buttonsStackView.widthAnchor), + self.secondaryDisabledButton.widthAnchor.constraint(equalTo: self.buttonsStackView.widthAnchor), + self.facebookButton.widthAnchor.constraint(equalTo: self.buttonsStackView.widthAnchor), + self.applePayButton.heightAnchor.constraint(equalToConstant: 48), + self.applePayButton.widthAnchor.constraint(equalTo: self.buttonsStackView.widthAnchor), + + self.heartIcon.widthAnchor.constraint(equalToConstant: 20), + self.heartIcon.heightAnchor.constraint(equalToConstant: 20), + self.bookmarkIcon.widthAnchor.constraint(equalToConstant: 20), + self.bookmarkIcon.heightAnchor.constraint(equalToConstant: 20), + self.arrowDownIcon.widthAnchor.constraint(equalToConstant: 20), + self.arrowDownIcon.heightAnchor.constraint(equalToConstant: 20), + self.dropdownButton.widthAnchor.constraint(equalToConstant: 175), + + self.emailTextField.heightAnchor.constraint(equalToConstant: 48), + self.emailTextField.widthAnchor.constraint(equalTo: self.inputsStackView.widthAnchor), + self.passwordTextField.heightAnchor.constraint(equalToConstant: 48), + self.passwordTextField.widthAnchor.constraint(equalTo: self.inputsStackView.widthAnchor), + + self.shimmerLoadingView.leftAnchor.constraint(equalTo: self.progressStackView.leftAnchor), + self.shimmerLoadingView.rightAnchor.constraint(equalTo: self.progressStackView.rightAnchor), + self.pullToRefreshImageView.widthAnchor.constraint(equalToConstant: 25), + + self.demoCTAContainerView.leftAnchor.constraint(equalTo: self.footersStackView.leftAnchor), + self.demoCTAContainerView.rightAnchor.constraint(equalTo: self.footersStackView.rightAnchor), + self.demoCTAContainerView.bottomAnchor.constraint(equalTo: self.footersStackView.bottomAnchor) + ]) + } + + // MARK: - Styles + + override func bindStyles() { + super.bindStyles() + + _ = self.view + |> \.backgroundColor .~ adaptiveColor(.white) + + _ = self.scrollView + |> \.alwaysBounceVertical .~ true + |> \.showsVerticalScrollIndicator .~ false + + _ = self.rootStackView + |> verticalStackViewStyle + |> \.translatesAutoresizingMaskIntoConstraints .~ false + |> \.isLayoutMarginsRelativeArrangement .~ true + |> \.layoutMargins .~ UIEdgeInsets(topBottom: Styles.grid(3), leftRight: Styles.grid(4)) + |> \.spacing .~ 20 + + // MARK: - Alert Styles + + _ = self.errorSnackbarStackView + |> alertStackViewStyle + |> \.backgroundColor .~ adaptiveColor(.alert) + + _ = self.confirmationSnackbarStackView + |> alertStackViewStyle + |> \.backgroundColor .~ adaptiveColor(.trust500) + + _ = self.alertsLabel + |> \.font .~ .ksr_title1().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Alerts" + + _ = self.alertsStackView + |> verticalComponentStackViewStyle + + _ = self.errorSnackbarIcon + |> adaptiveIconImageViewStyle + |> \.tintColor .~ adaptiveColor(.white) + |> UIImageView.lens.image .~ UIImage(named: "fix-icon")?.withRenderingMode(.alwaysTemplate) + + _ = self.errorSnackbarLabel + |> \.font .~ .ksr_subhead() + |> \.textColor .~ adaptiveColor(.white) + |> \.text .~ "Vestibulum id ligula porta felis euismod semper. Etiam porta sem malesuada." + |> \.lineBreakMode .~ .byWordWrapping + |> \.numberOfLines .~ 2 + + _ = self.confirmationSnackbarIcon + |> adaptiveIconImageViewStyle + |> \.tintColor .~ adaptiveColor(.white) + |> UIImageView.lens.image .~ UIImage(named: "icon--confirmation")?.withRenderingMode(.alwaysTemplate) + + _ = self.confirmationSnackbarLabel + |> \.font .~ .ksr_subhead() + |> \.textColor .~ adaptiveColor(.white) + |> \.text .~ "Vestibulum id ligula porta felis euismod semper. Etiam porta sem malesuada." + |> \.lineBreakMode .~ .byWordWrapping + |> \.numberOfLines .~ 2 + + // MARK: - Button Styles + + _ = self.buttonsLabel + |> \.font .~ .ksr_title1().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Buttons" + + _ = self.buttonsStackView + |> verticalComponentStackViewStyle + + _ = self.primaryGreenButton + |> adaptiveGreenButtonStyle + |> UIButton.lens.title(for: .normal) .~ "Primary Green Button" + + _ = self.primaryBlueButton + |> adaptiveBlueButtonStyle + |> UIButton.lens.title(for: .normal) .~ "Primary Blue Button" + + _ = self.primaryBlackButton + |> adaptiveBlackButtonStyle + |> UIButton.lens.title(for: .normal) .~ "Primary Black Button" + + _ = self.secondaryGreyButton + |> adaptiveGreyButtonStyle + |> UIButton.lens.title(for: .normal) .~ "Secondary Grey Button" + + _ = self.secondaryDisabledButton + |> adaptiveGreyButtonStyle + |> UIButton.lens.title(for: .normal) .~ "Secondary Disabled Button" + |> UIButton.lens.isEnabled .~ false + + _ = self.secondaryRedButton + |> adaptiveRedButtonStyle + |> UIButton.lens.title(for: .normal) .~ "Secondary Red Button" + + _ = self.facebookButton + |> adaptiveFacebookButtonStyle + |> UIButton.lens.title(for: .normal) .~ " \(Strings.Continue_with_Facebook())" + + _ = self.applePayButton + |> applePayButtonStyle + + // MARK: - Icon Styles + + _ = self.iconsLabel + |> \.font .~ .ksr_title1().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Icons" + + _ = self.iconsStackView + |> verticalComponentStackViewStyle + + _ = self.logoIcon + |> adaptiveIconImageViewStyle + |> \.tintColor .~ adaptiveColor(.create500) + |> UIImageView.lens.image .~ UIImage(named: "kickstarter-logo")?.withRenderingMode(.alwaysTemplate) + + _ = self.arrowDownIcon + |> adaptiveIconImageViewStyle + |> \.tintColor .~ adaptiveColor(.create500) + |> UIImageView.lens.image .~ UIImage(named: "arrow-down-large")?.withRenderingMode(.alwaysTemplate) + + _ = self.heartIcon + |> adaptiveIconImageViewStyle + |> \.tintColor .~ adaptiveColor(.support400) + |> UIImageView.lens.image .~ UIImage(named: "heart-icon")?.withRenderingMode(.alwaysTemplate) + + _ = self.bookmarkIcon + |> adaptiveIconImageViewStyle + |> \.tintColor .~ adaptiveColor(.create700) + |> UIImageView.lens.image .~ UIImage(named: "icon--bookmark")?.withRenderingMode(.alwaysTemplate) + + // MARK: - Control Styles + + _ = self.controlsLabel + |> \.font .~ .ksr_title1().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Controls" + + _ = self.controlsStackView + |> verticalStackViewStyle + |> \.alignment .~ .leading + |> \.spacing .~ Styles.grid(1) + + _ = self.controlsStackView + |> verticalComponentStackViewStyle + + _ = self.switchControlEnabled + |> adaptiveSwitchControlStyle + |> \.isOn .~ true + + _ = self.switchControlDisabled + |> adaptiveSwitchControlStyle + |> \.isOn .~ false + self.switchControlDisabled.isEnabled = false + + _ = self.stepper + |> checkoutStepperStyle + + _ = self.dropdownButton + |> adaptiveDropDownButtonStyle + |> checkoutWhiteBackgroundStyle + |> checkoutRoundedCornersStyle + + // MARK: - Input Styles + + _ = self.inputsLabel + |> \.font .~ .ksr_title1().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Inputs" + + _ = self.inputsStackView + |> verticalComponentStackViewStyle + + _ = self.emailTextField + |> adaptiveEmailFieldStyle + |> \.layer.borderColor .~ adaptiveColor(.support500).cgColor + |> \.layer.borderWidth .~ 1 + |> \.layer.cornerRadius .~ 6 + |> \.attributedPlaceholder %~ { _ in + adaptiveAttributedPlaceholder(Strings.login_placeholder_email()) + } + _ = self.passwordTextField + |> adaptiveEmailFieldStyle + |> \.layer.borderColor .~ adaptiveColor(.support500).cgColor + |> \.layer.borderWidth .~ 1 + |> \.layer.cornerRadius .~ 6 + |> UITextField.lens.secureTextEntry .~ true + |> \.attributedPlaceholder %~ { _ in + adaptiveAttributedPlaceholder(Strings.login_placeholder_password()) + } + + // MARK: - Progress Styles + + _ = self.progressLabel + |> \.font .~ .ksr_title1().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Progress Indicators" + + _ = self.progressStackView + |> verticalComponentStackViewStyle + + _ = self.loadingIndicator + |> adaptiveActivityIndicatorStyle + |> \.translatesAutoresizingMaskIntoConstraints .~ false + |> UIActivityIndicatorView.lens.animating .~ true + + _ = self.pullToRefreshImageView + |> UIImageView.lens.contentMode .~ .scaleAspectFit + |> \.translatesAutoresizingMaskIntoConstraints .~ false + + // MARK: - Footer Styles + + _ = self.footersLabel + |> \.font .~ .ksr_title1().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Footers" + + // MARK: - Typography Styles + + _ = self.typesLabel + |> \.font .~ .ksr_title1().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Typography" + + _ = self.typeStackView + |> verticalComponentStackViewStyle + + _ = self.title1Label + |> \.font .~ .ksr_title1() + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Title 1" + + _ = self.title1LabelBold + |> \.font .~ .ksr_title1().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Title 1 Bold" + + _ = self.title2Label + |> \.font .~ .ksr_title2() + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Title 2" + + _ = self.title2LabelBold + |> \.font .~ .ksr_title2().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Title 2 Bold" + + _ = self.title3Label + |> \.font .~ .ksr_title3() + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Title 3" + + _ = self.title3LabelBold + |> \.font .~ .ksr_title3().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Title 3 Bold" + + _ = self.headlineLabel + |> \.font .~ .ksr_headline() + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Headline Bold" + + _ = self.bodyLabel + |> \.font .~ .ksr_body() + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Body" + + _ = self.calloutLabel + |> \.font .~ .ksr_callout() + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Callout" + + _ = self.calloutLabelBold + |> \.font .~ .ksr_callout().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Callout Bold" + + _ = self.subheadlineLabel + |> \.font .~ .ksr_subhead() + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Subheadline" + + _ = self.subheadlineLabelBold + |> \.font .~ .ksr_subhead().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Subheadline Bold" + + _ = self.footnoteLabel + |> \.font .~ .ksr_footnote() + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Footnote" + + _ = self.footnoteLabelBold + |> \.font .~ .ksr_footnote().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Footnote Bold" + + _ = self.caption1Label + |> \.font .~ .ksr_caption1() + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Caption 1" + + _ = self.caption1LabelBold + |> \.font .~ .ksr_caption1().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Caption 1 Bold" + + _ = self.caption2Label + |> \.font .~ .ksr_caption2() + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Caption 2" + + _ = self.caption2LabelBold + |> \.font .~ .ksr_caption2().bolded + |> \.textColor .~ adaptiveColor(.black) + |> \.text .~ "Caption 2 Bold" + } +} + +private func attributedTermsText() -> NSAttributedString? { + let baseUrl = AppEnvironment.current.apiService.serverConfig.webBaseUrl + + guard + let termsOfUseLink = HelpType.terms.url(withBaseUrl: baseUrl)?.absoluteString, + let privacyPolicyLink = HelpType.privacy.url(withBaseUrl: baseUrl)?.absoluteString, + let cookiePolicyLink = HelpType.cookie.url(withBaseUrl: baseUrl)?.absoluteString + else { return nil } + + let string = Strings.By_pledging_you_agree_to_Kickstarters_Terms_of_Use_Privacy_Policy_and_Cookie_Policy( + terms_of_use_link: termsOfUseLink, + privacy_policy_link: privacyPolicyLink, + cookie_policy_link: cookiePolicyLink + ) + + return checkoutAttributedLink(with: string) +} diff --git a/Kickstarter-iOS/Features/DesignSystem/Views/DemoCTAContainerView.swift b/Kickstarter-iOS/Features/DesignSystem/Views/DemoCTAContainerView.swift new file mode 100644 index 0000000000..b017f371fe --- /dev/null +++ b/Kickstarter-iOS/Features/DesignSystem/Views/DemoCTAContainerView.swift @@ -0,0 +1,207 @@ +import KsApi +import Library +import PassKit +import Prelude +import UIKit + +// Just a copy of PledgeViewCTAContainerView to demonstrate Dark Mode differences in SystemSettingsViewController + +private enum Layout { + enum Button { + static let minHeight: CGFloat = 48.0 + } +} + +final class DemoCTAContainerView: UIView { + // MARK: - Properties + + private lazy var applePayButton: PKPaymentButton = { PKPaymentButton() }() + + private lazy var ctaStackView: UIStackView = { + UIStackView(frame: .zero) + |> \.translatesAutoresizingMaskIntoConstraints .~ false + }() + + private lazy var termsTextView: UITextView = { UITextView(frame: .zero) }() + + private lazy var disclaimerStackView: UIStackView = { + UIStackView(frame: .zero) + |> \.translatesAutoresizingMaskIntoConstraints .~ false + }() + + private lazy var continueButton: UIButton = { + UIButton(frame: .zero) + |> \.translatesAutoresizingMaskIntoConstraints .~ false + }() + + private lazy var submitButton: UIButton = { + UIButton(frame: .zero) + |> \.translatesAutoresizingMaskIntoConstraints .~ false + }() + + private lazy var rootStackView: UIStackView = { + UIStackView(frame: .zero) + |> \.translatesAutoresizingMaskIntoConstraints .~ false + }() + + private let viewModel: PledgeViewCTAContainerViewModelType = PledgeViewCTAContainerViewModel() + + // MARK: - Lifecycle + + override init(frame: CGRect) { + super.init(frame: frame) + + self.configureSubviews() + self.setupConstraints() + self.bindViewModel() + } + + required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Styles + + override func bindStyles() { + super.bindStyles() + + _ = self + |> \.layoutMargins .~ .init(all: Styles.grid(3)) + + _ = self.applePayButton + |> applePayButtonStyle + + _ = self.ctaStackView + |> ctaStackViewStyle + + _ = self.termsTextView + |> termsTextViewStyle + + _ = self.disclaimerStackView + |> disclaimerStackViewStyle + + _ = self.layer + |> layerStyle + + _ = self.continueButton + |> greenButtonStyle + |> UIButton.lens.title(for: .normal) %~ { _ in Strings.Continue() } + + _ = self.submitButton + |> greenButtonStyle + |> UIButton.lens.title(for: .normal) %~ { _ in Strings.two_factor_buttons_submit() } + + _ = self.rootStackView + |> rootStackViewStyle + } + + // MARK: - View Model + + override func bindViewModel() { + super.bindViewModel() + + self.submitButton.rac.title = self.viewModel.outputs.submitButtonTitle + } + + // MARK: Functions + + private func configureSubviews() { + _ = (self.rootStackView, self) + |> ksr_addSubviewToParent() + |> ksr_constrainViewToEdgesInParent() + + _ = ([self.continueButton, self.submitButton, self.applePayButton], self.ctaStackView) + |> ksr_addArrangedSubviewsToStackView() + + _ = ([self.termsTextView], self.disclaimerStackView) + |> ksr_addArrangedSubviewsToStackView() + + _ = ([self.ctaStackView, self.disclaimerStackView], self.rootStackView) + |> ksr_addArrangedSubviewsToStackView() + } + + private func setupConstraints() { + NSLayoutConstraint.activate([ + self.submitButton.heightAnchor.constraint(greaterThanOrEqualToConstant: Layout.Button.minHeight), + self.applePayButton.heightAnchor.constraint(greaterThanOrEqualToConstant: Layout.Button.minHeight) + ]) + } +} + +// MARK: - Styles + +private let rootStackViewStyle: StackViewStyle = { stackView in + stackView + |> \.axis .~ NSLayoutConstraint.Axis.vertical + |> \.isLayoutMarginsRelativeArrangement .~ true + |> \.layoutMargins .~ UIEdgeInsets.init( + top: Styles.grid(2), + left: Styles.grid(3), + bottom: Styles.grid(0), + right: Styles.grid(3) + ) + |> \.spacing .~ Styles.grid(1) +} + +private let ctaStackViewStyle: StackViewStyle = { stackView in + stackView + |> \.axis .~ .horizontal + |> \.distribution .~ .fillEqually + |> \.spacing .~ Styles.grid(2) + |> \.layoutMargins .~ UIEdgeInsets.init(topBottom: Styles.grid(2), leftRight: Styles.grid(0)) + |> \.isLayoutMarginsRelativeArrangement .~ true +} + +private let disclaimerStackViewStyle: StackViewStyle = { stackView in + stackView + |> \.axis .~ .horizontal + |> \.layoutMargins .~ UIEdgeInsets.init( + top: Styles.grid(0), + left: Styles.grid(5), + bottom: Styles.grid(1), + right: Styles.grid(5) + ) + |> \.isLayoutMarginsRelativeArrangement .~ true +} + +private let layerStyle: LayerStyle = { layer in + layer + |> checkoutLayerCardRoundedStyle + |> \.backgroundColor .~ adaptiveColor(.white).cgColor + |> \.shadowColor .~ adaptiveColor(.black).cgColor + |> \.shadowOpacity .~ 0.12 + |> \.shadowOffset .~ CGSize(width: 0, height: -1.0) + |> \.shadowRadius .~ CGFloat(1.0) + |> \.maskedCorners .~ [ + CACornerMask.layerMaxXMinYCorner, + CACornerMask.layerMinXMinYCorner + ] +} + +private let termsTextViewStyle: TextViewStyle = { (textView: UITextView) -> UITextView in + _ = textView + |> adaptiveTappableLinksViewStyle + |> \.attributedText .~ attributedTermsText() + |> \.accessibilityTraits .~ [.staticText] + |> \.textAlignment .~ .center + + return textView +} + +private func attributedTermsText() -> NSAttributedString? { + let baseUrl = AppEnvironment.current.apiService.serverConfig.webBaseUrl + + guard + let termsOfUseLink = HelpType.terms.url(withBaseUrl: baseUrl)?.absoluteString, + let privacyPolicyLink = HelpType.privacy.url(withBaseUrl: baseUrl)?.absoluteString, + let cookiePolicyLink = HelpType.cookie.url(withBaseUrl: baseUrl)?.absoluteString + else { return nil } + + let string = Strings.By_pledging_you_agree_to_Kickstarters_Terms_of_Use_Privacy_Policy_and_Cookie_Policy( + terms_of_use_link: termsOfUseLink, + privacy_policy_link: privacyPolicyLink, + cookie_policy_link: cookiePolicyLink + ) + + return checkoutAttributedLink(with: string) +} diff --git a/Kickstarter-iOS/Features/DesignSystem/Views/DemoShimmerLoadingView.swift b/Kickstarter-iOS/Features/DesignSystem/Views/DemoShimmerLoadingView.swift new file mode 100644 index 0000000000..344d799a63 --- /dev/null +++ b/Kickstarter-iOS/Features/DesignSystem/Views/DemoShimmerLoadingView.swift @@ -0,0 +1,69 @@ +import Foundation +import Library +import Prelude +import UIKit + +final class DemoShimmerLoadingView: UIView { + // MARK: - Properties + + private lazy var buttonPlaceholder: UIView = { UIView(frame: .zero) }() + private lazy var rootStackView: UIStackView = { UIStackView(frame: .zero) }() + + // MARK: - Lifecycle + + override init(frame: CGRect) { + super.init(frame: frame) + + self.configureViews() + self.setupConstraints() + + self.startLoading() + } + + required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + + self.layoutGradientLayers() + } + + override func bindStyles() { + super.bindStyles() + + _ = self.rootStackView + |> \.isLayoutMarginsRelativeArrangement .~ true + |> \.layoutMargins .~ .init(topBottom: Styles.grid(1)) + + _ = self.buttonPlaceholder + |> roundedStyle(cornerRadius: Styles.gridHalf(3)) + } + + // MARK: - Subviews + + private func configureViews() { + _ = (self.rootStackView, self) + |> ksr_addSubviewToParent() + |> ksr_constrainViewToEdgesInParent() + + _ = ([self.buttonPlaceholder], self.rootStackView) + |> ksr_addArrangedSubviewsToStackView() + } + + private func setupConstraints() { + NSLayoutConstraint.activate([ + self.buttonPlaceholder.heightAnchor.constraint(equalToConstant: Styles.grid(3)), + self.buttonPlaceholder.widthAnchor.constraint(equalTo: self.widthAnchor) + ]) + } +} + +// MARK: - ShimmerLoading + +extension DemoShimmerLoadingView: ShimmerLoading { + func shimmerViews() -> [UIView] { + return [self.buttonPlaceholder] + } +} diff --git a/Kickstarter.xcodeproj/project.pbxproj b/Kickstarter.xcodeproj/project.pbxproj index 580b151320..ee08b62dd7 100644 --- a/Kickstarter.xcodeproj/project.pbxproj +++ b/Kickstarter.xcodeproj/project.pbxproj @@ -480,6 +480,10 @@ 6008633F29BF750700B87B39 /* MockAppTrackingTransparency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6008633E29BF750700B87B39 /* MockAppTrackingTransparency.swift */; }; 6018626629A9194600EA2842 /* AppTrackingTransparency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6018626529A9194600EA2842 /* AppTrackingTransparency.swift */; }; 6018626829A91B8C00EA2842 /* ThirdPartyEventInputName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6018626729A91B8C00EA2842 /* ThirdPartyEventInputName.swift */; }; + 6049D0112A9CF6840015BB0D /* DesignSystemViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6049D0102A9CF6840015BB0D /* DesignSystemViewController.swift */; }; + 6049D01C2AA0ECAC0015BB0D /* DemoShimmerLoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6049D01A2AA0EC700015BB0D /* DemoShimmerLoadingView.swift */; }; + 6049D0202AA776B40015BB0D /* DesignSystemColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6049D01E2AA774130015BB0D /* DesignSystemColors.swift */; }; + 6049D0242AA7940E0015BB0D /* DemoCTAContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6049D0232AA7940E0015BB0D /* DemoCTAContainerView.swift */; }; 606754BD28CF91D60033CD5E /* FacebookCore in Frameworks */ = {isa = PBXBuildFile; productRef = 606754BC28CF91D60033CD5E /* FacebookCore */; }; 606754BF28CF91DD0033CD5E /* FacebookLogin in Frameworks */ = {isa = PBXBuildFile; productRef = 606754BE28CF91DD0033CD5E /* FacebookLogin */; }; 6067BCE9293E49AC0036ABB1 /* FacebookResetPasswordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6067BCE7293E48140036ABB1 /* FacebookResetPasswordViewController.swift */; }; @@ -2058,6 +2062,10 @@ 6008633E29BF750700B87B39 /* MockAppTrackingTransparency.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockAppTrackingTransparency.swift; sourceTree = ""; }; 6018626529A9194600EA2842 /* AppTrackingTransparency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTrackingTransparency.swift; sourceTree = ""; }; 6018626729A91B8C00EA2842 /* ThirdPartyEventInputName.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdPartyEventInputName.swift; sourceTree = ""; }; + 6049D0102A9CF6840015BB0D /* DesignSystemViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesignSystemViewController.swift; sourceTree = ""; }; + 6049D01A2AA0EC700015BB0D /* DemoShimmerLoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoShimmerLoadingView.swift; sourceTree = ""; }; + 6049D01E2AA774130015BB0D /* DesignSystemColors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesignSystemColors.swift; sourceTree = ""; }; + 6049D0232AA7940E0015BB0D /* DemoCTAContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoCTAContainerView.swift; sourceTree = ""; }; 6067BCE7293E48140036ABB1 /* FacebookResetPasswordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FacebookResetPasswordViewController.swift; sourceTree = ""; }; 6067BCEA293E49CB0036ABB1 /* FacebookResetPasswordViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FacebookResetPasswordViewModel.swift; sourceTree = ""; }; 6067BCEF293FC10E0036ABB1 /* FacebookResetPasswordViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FacebookResetPasswordViewModelTests.swift; sourceTree = ""; }; @@ -4703,6 +4711,7 @@ 19A97CFD28C7E6460031B857 /* DashboardProjects */, 60DF50952A434E30002C771F /* DashboardDeprecationBanner */, 1937A6E228C92BD400DD732D /* DebugPushNotifications */, + 6049D00E2A9CF6530015BB0D /* DesignSystem */, 19A97D0328C7E7350031B857 /* DiscoveryFilters */, 19A97D0928C7EA450031B857 /* Discovery */, 1937A6E328C92C0100DD732D /* EmptyStates */, @@ -5727,6 +5736,41 @@ path = Layouts; sourceTree = ""; }; + 6049D00E2A9CF6530015BB0D /* DesignSystem */ = { + isa = PBXGroup; + children = ( + 6049D01D2AA774030015BB0D /* Colors */, + 6049D00F2A9CF6610015BB0D /* Controller */, + 6049D0192AA0EC5E0015BB0D /* Views */, + ); + path = DesignSystem; + sourceTree = ""; + }; + 6049D00F2A9CF6610015BB0D /* Controller */ = { + isa = PBXGroup; + children = ( + 6049D0102A9CF6840015BB0D /* DesignSystemViewController.swift */, + ); + path = Controller; + sourceTree = ""; + }; + 6049D0192AA0EC5E0015BB0D /* Views */ = { + isa = PBXGroup; + children = ( + 6049D0232AA7940E0015BB0D /* DemoCTAContainerView.swift */, + 6049D01A2AA0EC700015BB0D /* DemoShimmerLoadingView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 6049D01D2AA774030015BB0D /* Colors */ = { + isa = PBXGroup; + children = ( + 6049D01E2AA774130015BB0D /* DesignSystemColors.swift */, + ); + path = Colors; + sourceTree = ""; + }; 6067BCE5293E47D50036ABB1 /* FacebookResetPasswordViewController */ = { isa = PBXGroup; children = ( @@ -7798,6 +7842,7 @@ A7F441E51D005A9400FE6FC5 /* SearchViewModel.swift in Sources */, 370F527A2254267900F159B9 /* UIApplicationType.swift in Sources */, A75C81171D210BD700B5AD03 /* ShareViewModel.swift in Sources */, + 6049D0202AA776B40015BB0D /* DesignSystemColors.swift in Sources */, A757EAF01D1ABE7400A5C978 /* ActivitySurveyResponseCellViewModel.swift in Sources */, A7CC13D91D00E6CF00035C52 /* FindFriendsStatsCellViewModel.swift in Sources */, D08CD1FF21913166009F89F0 /* WatchProjectViewModel.swift in Sources */, @@ -8207,6 +8252,7 @@ 7793B16D21077AEB007857C0 /* SettingsHeaderView.swift in Sources */, 8A8099EB22E213F100373E66 /* RewardCardView.swift in Sources */, 77FA6C7120F3DD6C00809E31 /* SettingsDataSource.swift in Sources */, + 6049D01C2AA0ECAC0015BB0D /* DemoShimmerLoadingView.swift in Sources */, 06EB4E3227B5D39D00D8BFCC /* OverlayView.swift in Sources */, 014D63011E721D500033D2BD /* BackerDashboardProjectCell.swift in Sources */, 8A788F0D263B6E5800A89DAE /* BrazeTypes.swift in Sources */, @@ -8347,6 +8393,7 @@ 0634C2F727CFEE40003A6D6E /* ExternalSourceViewElementCell.swift in Sources */, 47F95ED72672C594001365B2 /* ViewRepliesView.swift in Sources */, 37CA16AD23300376006044F9 /* ManageViewPledgeRewardReceivedViewController.swift in Sources */, + 6049D0242AA7940E0015BB0D /* DemoCTAContainerView.swift in Sources */, 778CCC5222822B5D00FB8D35 /* SheetOverlayTransitionAnimator.swift in Sources */, D04F48D41E0313FB00EDC98A /* ActivityProjectStatusCell.swift in Sources */, 0616458E26696847007D8D96 /* CommentRepliesDataSource.swift in Sources */, @@ -8453,6 +8500,7 @@ 8A32FE0424D2336E00F79C72 /* EmpyStateView.swift in Sources */, 379CFFFB2242DADB00F6F0C2 /* MFMailComposeViewController.swift in Sources */, D63BBCF9217F666B007E01F0 /* PaymentMethodsDataSource.swift in Sources */, + 6049D0112A9CF6840015BB0D /* DesignSystemViewController.swift in Sources */, 0160E5101EFAD7B2004F61D6 /* MessagesEmptyStateCell.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Kickstarter.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Kickstarter.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 93a4527a77..0f67e4467d 100644 --- a/Kickstarter.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Kickstarter.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -221,8 +221,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/PerimeterX/px-iOS-Framework", "state" : { - "revision" : "e02362af109f8d78dcd5588f96be3846982cbfcd", - "version" : "3.0.4" + "revision" : "9618a64b64307f3e70abcde6bf16cf205e9d80f6", + "version" : "3.0.5" } }, { diff --git a/Library/ViewModels/BetaToolsViewModel.swift b/Library/ViewModels/BetaToolsViewModel.swift index f198167132..5f3841b702 100644 --- a/Library/ViewModels/BetaToolsViewModel.swift +++ b/Library/ViewModels/BetaToolsViewModel.swift @@ -8,6 +8,7 @@ public enum BetaToolsRow: Int, CaseIterable { case debugConfigFeatureFlags case debugRemoteConfigFeatureFlags case debugPushNotifications + case designSystem case changeEnvironment case changeLanguage @@ -30,6 +31,7 @@ public enum BetaToolsRow: Int, CaseIterable { case .debugConfigFeatureFlags: return "Config Feature Flags" case .debugRemoteConfigFeatureFlags: return "Remote Config Feature Flags" case .debugPushNotifications: return "Debug Push Notifications" + case .designSystem: return "Design System" case .changeEnvironment: return "Change Environment" case .changeLanguage: return "Change Language" } @@ -38,7 +40,7 @@ public enum BetaToolsRow: Int, CaseIterable { public var rightIconImageName: String? { switch self { case .debugConfigFeatureFlags, .debugRemoteConfigFeatureFlags, - .debugPushNotifications: return "chevron-right" + .debugPushNotifications, .designSystem: return "chevron-right" default: return nil } } @@ -68,6 +70,7 @@ public protocol BetaToolsViewModelOutputs { var goToConfigFeatureFlagTools: Signal<(), Never> { get } var goToRemoteConfigFeatureFlagTools: Signal<(), Never> { get } var goToPushNotificationTools: Signal<(), Never> { get } + var goToDesignSystem: Signal<(), Never> { get } var logoutWithParams: Signal { get } var reloadWithData: Signal { get } var showChangeEnvironmentSheetWithSourceViewIndex: Signal { get } @@ -148,6 +151,11 @@ public final class BetaToolsViewModel: BetaToolsViewModelType, .filter { $0 == BetaToolsRow.debugRemoteConfigFeatureFlags } .ignoreValues() + self.goToDesignSystem = self.didSelectBetaToolsRowProperty.signal + .skipNil() + .filter { $0 == BetaToolsRow.designSystem } + .ignoreValues() + self.showChangeEnvironmentSheetWithSourceViewIndex = self.didSelectBetaToolsRowProperty.signal .skipNil() .filter { $0 == BetaToolsRow.changeEnvironment } @@ -200,6 +208,7 @@ public final class BetaToolsViewModel: BetaToolsViewModelType, public let goToConfigFeatureFlagTools: Signal<(), Never> public let goToRemoteConfigFeatureFlagTools: Signal<(), Never> public let goToPushNotificationTools: Signal<(), Never> + public let goToDesignSystem: Signal<(), Never> public let updateLanguage: Signal public let updateEnvironment: Signal public let logoutWithParams: Signal diff --git a/Library/ViewModels/BetaToolsViewModelTests.swift b/Library/ViewModels/BetaToolsViewModelTests.swift index 1bc85456a7..d4d3e1a51a 100644 --- a/Library/ViewModels/BetaToolsViewModelTests.swift +++ b/Library/ViewModels/BetaToolsViewModelTests.swift @@ -13,6 +13,7 @@ final class BetaToolsViewModelTests: TestCase { private let goToFeatureFlagTools = TestObserver<(), Never>() private let goToRemoteConfigFeatureFlagTools = TestObserver<(), Never>() private let goToPushNotificationTools = TestObserver<(), Never>() + private let goToDesignSystem = TestObserver<(), Never>() private let logoutWithParams = TestObserver() private let reloadWithDataCurrentLanguage = TestObserver() private let reloadWithDataCurrentEnvironment = TestObserver() @@ -29,6 +30,7 @@ final class BetaToolsViewModelTests: TestCase { self.vm.outputs.goToConfigFeatureFlagTools.observe(self.goToFeatureFlagTools.observer) self.vm.outputs.goToRemoteConfigFeatureFlagTools.observe(self.goToRemoteConfigFeatureFlagTools.observer) self.vm.outputs.goToPushNotificationTools.observe(self.goToPushNotificationTools.observer) + self.vm.outputs.goToDesignSystem.observe(self.goToDesignSystem.observer) self.vm.outputs.logoutWithParams.observe(self.logoutWithParams.observer) self.vm.outputs.reloadWithData.map { $0.0 }.observe(self.reloadWithDataCurrentLanguage.observer) self.vm.outputs.reloadWithData.map { $0.1 }.observe(self.reloadWithDataCurrentEnvironment.observer) @@ -152,4 +154,14 @@ final class BetaToolsViewModelTests: TestCase { self.goToFeatureFlagTools.assertValueCount(1) } + + func testGoToDesignSystem() { + self.vm.inputs.viewDidLoad() + + self.goToDesignSystem.assertDidNotEmitValue() + + self.vm.inputs.didSelectBetaToolsRow(.designSystem) + + self.goToDesignSystem.assertValueCount(1) + } }