diff --git a/addons/rose/addon/components/rose/checkbox.js b/addons/rose/addon/components/rose/checkbox.js
index c07ab19d7..498f01042 100644
--- a/addons/rose/addon/components/rose/checkbox.js
+++ b/addons/rose/addon/components/rose/checkbox.js
@@ -2,16 +2,18 @@ import Component from '@ember/component';
import layout from '../../templates/components/rose/checkbox';
/**
- A simple HTML ` ` element wrapped in ``.
+ A simple ember input ` ` element with associated `label`.
@example
- Label
+ Label
+ Name
+ Form
+ Value
Error
Checked
Disabled
Disabled + Checked
-
**/
export default Component.extend({
diff --git a/addons/rose/addon/styles/rose/components/_checkbox.scss b/addons/rose/addon/styles/rose/components/_checkbox.scss
index 376b50e9a..34c4c36c7 100644
--- a/addons/rose/addon/styles/rose/components/_checkbox.scss
+++ b/addons/rose/addon/styles/rose/components/_checkbox.scss
@@ -1,26 +1,78 @@
-@use '../utilities/checkbox';
+@use '../utilities/type' as typography;
-@include checkbox.checkbox-style(
- 'default',
- (
- color: var(--stark),
- border-color: var(--ui-border),
- background-color: var(--subtle),
- ),
- (
- border-color: var(--ui-gray),
- ),
- (
- border-color: var(--info),
- ),
- (
- border-color: var(--failure),
- ),
- (
- border-color: var(--info),
- ),
- (
- border-color: var(--ui-border),
- background-color: var(--ui-gray-subtler-4),
- )
-);
+.rose-checkbox {
+ color: var(--stark);
+ background-color: var(--subtle);
+
+ .rose-checkbox-input {
+ -webkit-appearance: none;
+ appearance: none;
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ margin: 0;
+ border: 1px solid var(--ui-border);
+ border-radius: 2px;
+ width: 16px;
+ height: 16px;
+ vertical-align: -1px;
+ background-color: var(--subtle);
+
+ &::before {
+ content: '';
+ position: absolute;
+ left: 4px;
+ top: 1px;
+ width: 3px;
+ height: 8px;
+ border: solid;
+ border-width: 0 2px 2px 0;
+ border-color: var(--info);
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+ visibility: hidden;
+ }
+
+ &:checked {
+ border-color: var(--info);
+ }
+
+ &:disabled {
+ cursor: not-allowed;
+ border-color: var(--ui-border);
+ background-color: var(--ui-gray-subtler-4);
+
+ &::before {
+ border-color: var(--ui-border);
+ }
+ }
+
+ &:checked::before {
+ visibility: visible;
+ }
+
+ &:focus {
+ outline: none;
+ border-color: var(--info);
+ }
+
+ &:hover {
+ border-color: var(--ui-gray);
+ }
+ }
+
+ &.error {
+ .rose-checkbox-input {
+ border-color: var(--failure);
+
+ &:focus {
+ outline: none;
+ border-color: var(--info);
+ }
+
+ &:disabled {
+ border-color: var(--ui-border);
+ }
+ }
+ }
+}
diff --git a/addons/rose/addon/styles/rose/utilities/_checkbox.scss b/addons/rose/addon/styles/rose/utilities/_checkbox.scss
deleted file mode 100644
index 4c91255ed..000000000
--- a/addons/rose/addon/styles/rose/utilities/_checkbox.scss
+++ /dev/null
@@ -1,130 +0,0 @@
-@use 'sass:map';
-
-@mixin checkbox {
- color: var(--stark);
- margin: 0;
- padding: 0;
-
- input[type='checkbox'] {
- -webkit-appearance: none;
- appearance: none;
- }
-
- input[type='checkbox'] {
- display: inline-block;
- position: relative;
- padding: 0;
- margin: 0;
- margin-right: 10px;
- border: 1px solid;
- border-radius: 2px;
- width: 16px;
- height: 16px;
- background: var(--subtle);
- vertical-align: -1px;
- }
-
- input[type='checkbox']::before {
- content: '';
- position: absolute;
- top: 4px;
- left: 1px;
- border-left: 2px solid;
- border-bottom: 2px solid;
- height: 3px;
- width: 10px;
- transform: rotate(-45deg);
- visibility: hidden;
- border-color: black;
- }
-
- input[type='checkbox']:checked::before {
- visibility: visible;
- }
-
- input[type='checkbox']:focus {
- outline: none;
- }
-}
-
-@mixin checkbox-style(
- $name,
- $default,
- $hover: &,
- $focus: &,
- $error: &,
- $checked: &,
- $disabled: &
-) {
- input[type='checkbox'] {
- -webkit-appearance: none;
- appearance: none;
- }
-
- .rose-checkbox-#{$name} {
- @include checkbox;
- border-color: map.get($default, border-color);
- color: map.get($default, color);
-
- & input[type='checkbox'] {
- border-color: map.get($default, border-color);
- background-color: map.get($default, background-color);
- }
-
- & input[type='checkbox']:hover {
- @if map.get($hover, 'border-color') {
- border-color: map.get($hover, 'border-color');
- }
- }
-
- & input[type='checkbox']:focus {
- @if map.get($focus, 'border-color') {
- border-color: map.get($focus, 'border-color');
- }
- }
-
- @if $checked {
- & input[type='checkbox']:checked {
- @if map.get($checked, 'border-color') {
- border-color: map.get($checked, 'border-color');
- }
- }
-
- & input[type='checkbox']:checked::before {
- @if map.get($checked, 'border-color') {
- border-color: map.get($checked, 'border-color');
- }
- }
- }
-
- & input[type='checkbox']:disabled {
- cursor: not-allowed;
- @if map.get($disabled, 'border-color') {
- border-color: map.get($disabled, 'border-color');
- }
- @if map.get($disabled, 'background-color') {
- background-color: map.get($disabled, 'background-color');
- }
-
- &:checked {
- @if map.get($disabled, 'border-color') {
- border-color: map.get($disabled, 'border-color');
- }
- }
-
- &:checked::before {
- @if map.get($disabled, 'border-color') {
- border-color: map.get($disabled, 'border-color');
- }
- }
- }
-
- @if $error {
- & input[type='checkbox'].error {
- @if map.get($error, 'border-color') {
- border-color: map.get($error, 'border-color');
- }
- }
- }
- }
-}
diff --git a/addons/rose/addon/templates/components/rose/checkbox.hbs b/addons/rose/addon/templates/components/rose/checkbox.hbs
index f6788646a..3037e7218 100644
--- a/addons/rose/addon/templates/components/rose/checkbox.hbs
+++ b/addons/rose/addon/templates/components/rose/checkbox.hbs
@@ -1,9 +1,15 @@
-
-
+
- {{yield}}
-
+ name={{@name}}
+ disabled={{@disabled}}
+ form={{@form}}
+ class="rose-checkbox-input"
+ value={{@value}}
+ @checked={{@checked}} />
+
+
+ {{yield}}
+
+
diff --git a/addons/rose/app/templates/index.hbs b/addons/rose/app/templates/index.hbs
index 51547ff3c..75133ab19 100644
--- a/addons/rose/app/templates/index.hbs
+++ b/addons/rose/app/templates/index.hbs
@@ -1,5 +1,4 @@
-Dummy app index template
-
+Button
Primary
Primary
@@ -63,11 +62,9 @@ Dummy app index template
disabled={{true}}
/>
-Checkbox
-
-Label
+Checkbox
+Label
Error
Checked
Disabled
Disabled + Checked
-Default style
diff --git a/addons/rose/stories/checkbox.stories.js b/addons/rose/stories/checkbox.stories.js
index d77ee1df6..32a978225 100644
--- a/addons/rose/stories/checkbox.stories.js
+++ b/addons/rose/stories/checkbox.stories.js
@@ -1,5 +1,5 @@
import { hbs } from 'ember-cli-htmlbars';
-import { text, boolean, select } from '@storybook/addon-knobs';
+import { text, boolean } from '@storybook/addon-knobs';
export default {
title: 'Rose::Checkbox',
@@ -8,19 +8,23 @@ export default {
export const Normal = () => ({
template: hbs`
- {{text}}
+ {{label}}
`,
context: {
- text: text('text', 'Checkbox 🛎'),
+ label: text('text', 'Checkbox 🛎'),
+ id: text('text', 'Identifier'),
+ name: text('text', 'name'),
+ form: text('text', 'form'),
checked: boolean('checked', false),
disabled: boolean('disabled', false),
- error: boolean('error', false),
- style: select('style', { default: 'default'}, 'default')
+ error: boolean('error', false)
},
});
diff --git a/addons/rose/tests/integration/components/rose/checkbox-test.js b/addons/rose/tests/integration/components/rose/checkbox-test.js
index 7ecb3f6fe..44b5b895c 100644
--- a/addons/rose/tests/integration/components/rose/checkbox-test.js
+++ b/addons/rose/tests/integration/components/rose/checkbox-test.js
@@ -9,7 +9,6 @@ module('Integration | Component | rose/checkbox', function (hooks) {
test('it renders without label', async function (assert) {
await render(hbs` `);
assert.equal(this.element.textContent.trim(), '');
- assert.equal(this.element.querySelector('input').type, 'checkbox');
});
test('it renders a checkbox', async function (assert) {
@@ -22,6 +21,21 @@ module('Integration | Component | rose/checkbox', function (hooks) {
assert.equal(this.element.textContent.trim(), 'Label');
});
+ test('it renders in a div wrapper', async function (assert) {
+ await render(hbs` `);
+ assert.ok(this.element.querySelector('div.rose-checkbox'));
+ });
+
+ test('it renders a checkbox class', async function (assert) {
+ await render(hbs` `);
+ assert.ok(this.element.querySelector('input.rose-checkbox-input'));
+ });
+
+ test('it renders a label class', async function (assert) {
+ await render(hbs` `);
+ assert.ok(this.element.querySelector('label.rose-checkbox-label'));
+ });
+
test('it is not checked', async function (assert) {
await render(hbs` `);
assert.equal(this.element.querySelector('input').checked, false);
@@ -32,11 +46,6 @@ module('Integration | Component | rose/checkbox', function (hooks) {
assert.equal(this.element.querySelector('input').disabled, false);
});
- test('it renders with default style', async function (assert) {
- await render(hbs` `);
- assert.equal(this.element.querySelector('label').className, 'rose-checkbox-default');
- });
-
test('it is checked when @checked={{true}}', async function (assert) {
await render(hbs` `);
assert.equal(this.element.querySelector('input').checked, true);
@@ -44,7 +53,7 @@ module('Integration | Component | rose/checkbox', function (hooks) {
test('it marks error when @error={{true}}', async function (assert) {
await render(hbs` `);
- assert.equal(this.element.querySelector('input').className, 'error');
+ assert.ok(this.element.querySelector('div.error'));
});
test('it is disabled when @disabled={{true}}', async function (assert) {
@@ -59,9 +68,4 @@ module('Integration | Component | rose/checkbox', function (hooks) {
assert.equal(this.element.querySelector('input').checked, true);
assert.equal(this.element.querySelector('input').disabled, true);
});
-
- test('it adds a style class when @style defines it', async function (assert) {
- await render(hbs` `);
- assert.equal(this.element.querySelector('label').className, 'rose-checkbox-primary');
- });
});