@rolemodel/optics 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.eslintrc.json +14 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  4. package/.github/pull_request_template.md +30 -0
  5. package/.github/workflows/linting.yml +38 -0
  6. package/.github/workflows/publish-storybook.yml +26 -0
  7. package/.github/workflows/release-package.yml +33 -0
  8. package/.prettierignore +0 -0
  9. package/.prettierrc.json +8 -0
  10. package/.storybook/ModeSwitcher.jsx +98 -0
  11. package/.storybook/documentation.scss +65 -0
  12. package/.storybook/main.js +10 -0
  13. package/.storybook/manager.js +22 -0
  14. package/.storybook/preview.js +12 -0
  15. package/.storybook/rolemodelTheme.js +10 -0
  16. package/.stylelintrc.json +15 -0
  17. package/LICENSE +21 -0
  18. package/README.md +57 -0
  19. package/build_token_json.js +149 -0
  20. package/dist/css/optics.css +2586 -0
  21. package/dist/css/optics.css.map +1 -0
  22. package/dist/scss/addons/rails-modal-and-panel/index.scss +2 -0
  23. package/dist/scss/addons/rails-modal-and-panel/modal.scss +86 -0
  24. package/dist/scss/addons/rails-modal-and-panel/panel.scss +36 -0
  25. package/dist/scss/addons/tom-select.scss +77 -0
  26. package/dist/scss/components/alert.scss +158 -0
  27. package/dist/scss/components/badge.scss +80 -0
  28. package/dist/scss/components/button.scss +235 -0
  29. package/dist/scss/components/button_group.scss +35 -0
  30. package/dist/scss/components/card.scss +65 -0
  31. package/dist/scss/components/flash.scss +58 -0
  32. package/dist/scss/components/form.scss +178 -0
  33. package/dist/scss/components/icon.scss +109 -0
  34. package/dist/scss/components/index.scss +10 -0
  35. package/dist/scss/components/sidebar.scss +255 -0
  36. package/dist/scss/components/table.scss +132 -0
  37. package/dist/scss/core/base.scss +95 -0
  38. package/dist/scss/core/layout.scss +36 -0
  39. package/dist/scss/core/tokens/base_tokens.scss +251 -0
  40. package/dist/scss/core/tokens/dark_mode_tokens.scss +324 -0
  41. package/dist/scss/core/tokens/index.scss +3 -0
  42. package/dist/scss/core/tokens/scale_color_tokens.scss +303 -0
  43. package/dist/scss/core/utilities.scss +548 -0
  44. package/dist/scss/optics.scss +13 -0
  45. package/dist/scss/recipes/16six-sidebar.scss +97 -0
  46. package/dist/scss/recipes/domains-sidebar.scss +60 -0
  47. package/dist/tokens/tokens.json +391 -0
  48. package/package.json +80 -0
@@ -0,0 +1,132 @@
1
+ // TODO: When we get a pagination component, add it to the table styles and docs for within a table footer
2
+
3
+ %table-global {
4
+ // Public API
5
+ // Cells (for padding, the appropriate variable is used when using the density modifiers)
6
+ --_rm-table-cell-padding-default: var(--rm-space-small) var(--rm-space-x-small);
7
+ --_rm-table-cell-padding-comfortable: var(--rm-space-medium) var(--rm-space-small);
8
+ --_rm-table-cell-padding-compact: var(--rm-space-x-small) var(--rm-space-2x-small);
9
+
10
+ // Private API
11
+ // These allow for overriding specific padding versions easier.
12
+ --__rm-table-cell-padding: var(--_rm-table-cell-padding-default);
13
+
14
+ width: 100%;
15
+ border-radius: var(--rm-radius-medium);
16
+ border-collapse: collapse;
17
+ box-shadow: var(--rm-border-all) var(--rm-border-color);
18
+ contain: paint;
19
+ table-layout: auto;
20
+
21
+ thead {
22
+ background-color: var(--rm-color-neutral-plus-four);
23
+ color: var(--rm-color-neutral-on-plus-four);
24
+ }
25
+
26
+ th {
27
+ font-weight: var(--rm-font-weight-normal);
28
+ text-align: left;
29
+ text-transform: uppercase;
30
+ }
31
+
32
+ tbody,
33
+ tfoot {
34
+ background-color: var(--rm-color-background);
35
+ color: var(--rm-color-on-background);
36
+ }
37
+
38
+ th,
39
+ td {
40
+ padding: var(--__rm-table-cell-padding);
41
+ font-size: var(--rm-font-small);
42
+ }
43
+
44
+ tr:not(:last-child) {
45
+ box-shadow: inset var(--rm-border-top) var(--rm-border-color);
46
+ }
47
+
48
+ tfoot tr {
49
+ box-shadow: var(--rm-border-top) var(--rm-border-color);
50
+ }
51
+
52
+ // Layout Modifiers
53
+ &.table--auto-layout {
54
+ table-layout: auto;
55
+ }
56
+
57
+ &.table--fixed-layout {
58
+ table-layout: fixed;
59
+ }
60
+
61
+ // Table Density Modifiers
62
+ &.table--default-density {
63
+ --__rm-table-cell-padding: var(--_rm-table-cell-padding-default);
64
+ }
65
+
66
+ &.table--comfortable-density {
67
+ --__rm-table-cell-padding: var(--_rm-table-cell-padding-comfortable);
68
+ }
69
+
70
+ &.table--compact-density {
71
+ --__rm-table-cell-padding: var(--_rm-table-cell-padding-compact);
72
+ }
73
+
74
+ // Striped Modifiers
75
+ &.table--even-striped {
76
+ tbody tr:nth-child(even) {
77
+ background-color: var(--rm-color-neutral-plus-seven);
78
+ color: var(--rm-color-neutral-on-plus-seven);
79
+ }
80
+ }
81
+
82
+ &.table--odd-striped {
83
+ tbody tr:nth-child(odd) {
84
+ background-color: var(--rm-color-neutral-plus-seven);
85
+ color: var(--rm-color-neutral-on-plus-seven);
86
+ }
87
+ }
88
+
89
+ // Sticky Header Row Modifier
90
+ &.table--sticky-header thead {
91
+ position: sticky;
92
+ top: 0;
93
+ }
94
+
95
+ // Sticky Footer Row Modifier
96
+ &.table--sticky-footer tfoot {
97
+ position: sticky;
98
+ bottom: 0;
99
+ }
100
+ }
101
+
102
+ // Default Table
103
+ .table {
104
+ @extend %table-global;
105
+ }
106
+
107
+ // Primary Table
108
+ .table-primary {
109
+ @extend %table-global;
110
+
111
+ thead {
112
+ background-color: var(--rm-color-primary-plus-seven);
113
+ color: var(--rm-color-primary-on-plus-seven);
114
+ }
115
+ }
116
+
117
+ // Danger Table
118
+ .table-danger {
119
+ @extend %table-global;
120
+
121
+ thead {
122
+ background-color: var(--rm-color-alerts-danger-plus-seven);
123
+ color: var(--rm-color-alerts-danger-on-plus-seven);
124
+ }
125
+ }
126
+
127
+ // Sticky Header / Footer Table Container
128
+ .table-container {
129
+ @extend %table-global;
130
+
131
+ overflow-y: auto;
132
+ }
@@ -0,0 +1,95 @@
1
+ // After a reset, introduce base element styles specific to this system
2
+
3
+ html {
4
+ overflow: hidden; // Needed to prevent flash messages and panels from causing overflow
5
+ font-family: var(--rm-font-family);
6
+ font-size: 62.5%; // 1rem = 10px
7
+ }
8
+
9
+ body {
10
+ overflow: auto;
11
+ height: 100vh;
12
+ background: var(--rm-color-background);
13
+ color: var(--rm-color-on-background);
14
+ font-size: var(--rm-font-medium);
15
+ }
16
+
17
+ button {
18
+ background: none;
19
+ cursor: pointer;
20
+ }
21
+
22
+ button,
23
+ input[type='submit'] {
24
+ border: 0;
25
+ }
26
+
27
+ label {
28
+ display: inline-block;
29
+
30
+ &:hover {
31
+ cursor: pointer;
32
+ }
33
+ }
34
+
35
+ a {
36
+ color: var(--rm-color-primary-original);
37
+ }
38
+
39
+ blockquote,
40
+ dl,
41
+ dd,
42
+ h1,
43
+ h2,
44
+ h3,
45
+ h4,
46
+ h5,
47
+ h6,
48
+ figure,
49
+ pre {
50
+ margin: 0;
51
+ }
52
+
53
+ h1,
54
+ h2,
55
+ h3,
56
+ h4,
57
+ h5,
58
+ h6 {
59
+ margin-top: 0;
60
+ margin-bottom: var(--rm-space-small);
61
+ font-weight: var(--rm-font-weight-normal);
62
+ }
63
+
64
+ h1 {
65
+ font-size: var(--rm-font-2x-large);
66
+ }
67
+
68
+ h2 {
69
+ font-size: var(--rm-font-x-large);
70
+ }
71
+
72
+ h3 {
73
+ font-size: var(--rm-font-large);
74
+ }
75
+
76
+ h4 {
77
+ font-size: var(--rm-font-medium);
78
+ }
79
+
80
+ h5 {
81
+ font-size: var(--rm-font-small);
82
+ }
83
+
84
+ h6 {
85
+ font-size: var(--rm-font-x-small);
86
+ }
87
+
88
+ p {
89
+ margin-bottom: var(--rm-space-small);
90
+ font-size: var(--rm-font-medium);
91
+ }
92
+
93
+ small {
94
+ font-size: var(--rm-font-small);
95
+ }
@@ -0,0 +1,36 @@
1
+ .app-wrapper {
2
+ display: grid;
3
+ width: 100%;
4
+ height: 100vh;
5
+ grid-template-columns: auto 1fr auto;
6
+ }
7
+
8
+ .app__main {
9
+ display: flex;
10
+ overflow: auto;
11
+ flex-direction: column;
12
+ }
13
+
14
+ .page__header {
15
+ position: sticky;
16
+ z-index: var(--rm-z-index-header);
17
+ top: 0;
18
+ flex-grow: 0;
19
+ flex-shrink: 0;
20
+ }
21
+
22
+ .page__content {
23
+ width: 100%;
24
+ max-width: $breakpoint-medium;
25
+ flex-grow: 1;
26
+ padding: 0 var(--rm-space-large);
27
+ margin: 0 auto;
28
+ }
29
+
30
+ .page__footer {
31
+ position: sticky;
32
+ z-index: var(--rm-z-index-footer);
33
+ bottom: 0;
34
+ flex-grow: 0;
35
+ flex-shrink: 0;
36
+ }
@@ -0,0 +1,251 @@
1
+ @import 'https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap';
2
+ @import 'https://fonts.googleapis.com/css2?family=Noto+Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap';
3
+
4
+ // Using Mixins allows us to include them at a component level
5
+ // as needed and override them.
6
+
7
+ // A theme comprised of a primary, neutral, warning, danger, info, and notice colors.
8
+ @mixin color-varieties {
9
+ // Basic Colors
10
+ --rm-color-white: hsl(0deg 100% 100%);
11
+ --rm-color-black: hsl(0deg 0% 0%);
12
+
13
+ // Primary HSL
14
+ --rm-color-primary-h: 216;
15
+ --rm-color-primary-s: 58%;
16
+ --rm-color-primary-l: 48%;
17
+
18
+ // Neutral HSL
19
+ --rm-color-neutral-h: var(--rm-color-primary-h);
20
+ --rm-color-neutral-s: 4%;
21
+ --rm-color-neutral-l: var(--rm-color-primary-l);
22
+
23
+ // Alerts Warning HSL
24
+ --rm-color-alerts-warning-h: 47;
25
+ --rm-color-alerts-warning-s: 100%;
26
+ --rm-color-alerts-warning-l: 61%;
27
+
28
+ // Alerts Danger HSL
29
+ --rm-color-alerts-danger-h: 0;
30
+ --rm-color-alerts-danger-s: 99%;
31
+ --rm-color-alerts-danger-l: 76%;
32
+
33
+ // Alerts Info HSL
34
+ --rm-color-alerts-info-h: 216;
35
+ --rm-color-alerts-info-s: 58%;
36
+ --rm-color-alerts-info-l: 48%;
37
+
38
+ // Alerts Notice HSL
39
+ --rm-color-alerts-notice-h: 130;
40
+ --rm-color-alerts-notice-s: 61%;
41
+ --rm-color-alerts-notice-l: 64%;
42
+ }
43
+
44
+ @mixin border-radius {
45
+ --rm-radius-small: 2px;
46
+ --rm-radius-medium: 4px;
47
+ --rm-radius-large: 8px;
48
+ --rm-radius-x-large: 16px;
49
+ --rm-radius-circle: 50%;
50
+ --rm-radius-pill: 9999px;
51
+ }
52
+
53
+ @mixin border-widths {
54
+ --rm-border-width: 1px;
55
+ --rm-border-width-large: 2px;
56
+ --rm-border-width-x-large: 4px;
57
+ }
58
+
59
+ @mixin border-colors {
60
+ --rm-border-color: var(--rm-color-neutral-plus-three);
61
+ }
62
+
63
+ @mixin box-shadows {
64
+ // E.G. box-shadow: var(--rm-border-top) var(--rm-border-color);
65
+ --rm-border-none: 0 0 0 0;
66
+ --rm-border-all: 0 0 0 var(--rm-border-width);
67
+ --rm-border-top: 0 calc(-1 * var(--rm-border-width)) 0 0;
68
+ --rm-border-right: var(--rm-border-width) 0 0 0;
69
+ --rm-border-bottom: 0 var(--rm-border-width) 0 0;
70
+ --rm-border-left: calc(-1 * var(--rm-border-width)) 0 0 0;
71
+ --rm-border-y: var(--rm-border-top) var(--rm-border-color), var(--rm-border-bottom) var(--rm-border-color);
72
+ --rm-border-x: var(--rm-border-left) var(--rm-border-color), var(--rm-border-right) var(--rm-border-color);
73
+ }
74
+
75
+ @mixin font-scales {
76
+ --rm-font-scale-unit: 1rem; // 10px;
77
+ --rm-font-x-small: calc(var(--rm-font-scale-unit) * 1.2); // 12px
78
+ --rm-font-small: calc(var(--rm-font-scale-unit) * 1.4); // 14px
79
+ --rm-font-medium: calc(var(--rm-font-scale-unit) * 1.6); // 16px
80
+ --rm-font-large: calc(var(--rm-font-scale-unit) * 1.8); // 18px
81
+ --rm-font-x-large: calc(var(--rm-font-scale-unit) * 2.4); // 24px
82
+ --rm-font-2x-large: calc(var(--rm-font-scale-unit) * 2.8); // 28px
83
+ --rm-font-3x-large: calc(var(--rm-font-scale-unit) * 3.2); // 32px
84
+ --rm-font-4x-large: calc(var(--rm-font-scale-unit) * 3.6); // 36px
85
+ --rm-font-5x-large: calc(var(--rm-font-scale-unit) * 4.8); // 48px
86
+ }
87
+
88
+ @mixin font-weights {
89
+ --rm-font-weight-thin: 100;
90
+ --rm-font-weight-extra-light: 200;
91
+ --rm-font-weight-light: 300;
92
+ --rm-font-weight-normal: 400;
93
+ --rm-font-weight-medium: 500;
94
+ --rm-font-weight-semi-bold: 600;
95
+ --rm-font-weight-bold: 700;
96
+ --rm-font-weight-extra-bold: 800;
97
+ --rm-font-weight-black: 900;
98
+ }
99
+
100
+ @mixin line-heights {
101
+ --rm-line-height-none: 0;
102
+ --rm-line-height-densest: 1;
103
+ --rm-line-height-denser: 1.15;
104
+ --rm-line-height-dense: 1.3;
105
+ --rm-line-height-base: 1.5;
106
+ --rm-line-height-loose: 1.6;
107
+ --rm-line-height-looser: 1.7;
108
+ --rm-line-height-loosest: 1.8;
109
+ }
110
+
111
+ @mixin letter-spacing {
112
+ --rm-letter-spacing-navigation: 0.01rem;
113
+ --rm-letter-spacing-label: 0.04rem;
114
+ }
115
+
116
+ @mixin transitions {
117
+ --rm-transition-input: 120ms;
118
+ --rm-transition-navigation: 200ms;
119
+ --rm-transition-sidebar: 300ms;
120
+ --rm-transition-modal: 300ms;
121
+ --rm-transition-panel: 400ms;
122
+ --rm-transition-flash: 5s;
123
+ }
124
+
125
+ @mixin encoded-images {
126
+ --rm-form-dropdown-arrow-width: 1rem; // No way to string interpolate
127
+ --rm-form-dropdown-arrow: url("data:image/svg+xml,%3Csvg viewBox='0 0 10 7' version='1.1' xmlns='http://www.w3.org/2000/svg' width='10' height='7'%3E%3Cg transform='matrix(0.983953,0,0,1.00934,-9.22679,-3.65885)'%3E%3Cpath fill='%23d1d1d1' d='M9.37727 3.625l5.08154 6.93523L19.54036 3.625'/%3E%3C/g%3E%3C/svg%3E%0A");
128
+ }
129
+
130
+ @mixin fonts {
131
+ --rm-font-family: 'Noto Sans', 'Noto Serif', sans-serif;
132
+ }
133
+
134
+ @mixin spacing-scales {
135
+ --rm-space-scale-unit: 1rem; // 10px;
136
+ --rm-space-3x-small: calc(var(--rm-space-scale-unit) * 0.2); // 2px
137
+ --rm-space-2x-small: calc(var(--rm-space-scale-unit) * 0.4); // 4px
138
+ --rm-space-x-small: calc(var(--rm-space-scale-unit) * 0.8); // 8px
139
+ --rm-space-small: calc(var(--rm-space-scale-unit) * 1.2); // 12px
140
+ --rm-space-medium: calc(var(--rm-space-scale-unit) * 1.6); // 16px
141
+ --rm-space-large: calc(var(--rm-space-scale-unit) * 2); // 20px
142
+ --rm-space-x-large: calc(var(--rm-space-scale-unit) * 2.4); // 24px
143
+ --rm-space-2x-large: calc(var(--rm-space-scale-unit) * 2.8); // 28px
144
+ --rm-space-3x-large: calc(var(--rm-space-scale-unit) * 4); // 40px
145
+ --rm-space-4x-large: calc(var(--rm-space-scale-unit) * 8); // 80px
146
+ }
147
+
148
+ @mixin shadows {
149
+ --rm-shadow-x-small: 0 1px 2px hsl(0deg 0% 0% / 3%), 0 1px 3px hsl(0deg 0% 0% / 15%);
150
+ --rm-shadow-small: 0 1px 2px hsl(0deg 0% 0% / 3%), 0 2px 6px hsl(0deg 0% 0% / 15%);
151
+ --rm-shadow-medium: 0 4px 8px hsl(0deg 0% 0% / 15%), 0 1px 3px hsl(0deg 0% 0% / 3%);
152
+ --rm-shadow-large: 0 6px 10px hsl(0deg 0% 0% / 15%), 0 2px 3px hsl(0deg 0% 0% / 3%);
153
+ --rm-shadow-x-large: 0 8px 12px hsl(0deg 0% 0% / 15%), 0 4px 4px hsl(0deg 0% 0% / 3%);
154
+ }
155
+
156
+ @mixin z-indexes {
157
+ --rm-z-index-header: 500;
158
+ --rm-z-index-footer: 500;
159
+ --rm-z-index-drawer: 700;
160
+ --rm-z-index-dialog: 800;
161
+ --rm-z-index-dialog-backdrop: 801;
162
+ --rm-z-index-dialog-content: 802;
163
+ --rm-z-index-dropdown: 900;
164
+ --rm-z-index-alert-group: 950;
165
+ --rm-z-index-tooltip: 1000;
166
+ }
167
+
168
+ @mixin inputs {
169
+ // This should follow multiples of 4
170
+ // https: //uxdesign.cc/baseline-grids-design-systems-ae23b5af8cec See example 8
171
+ --rm-input-height-small: 2.4rem; // 24px
172
+ --rm-input-height-medium: 3.2rem; // 32px
173
+ --rm-input-height-large: 4.4rem; // 44px
174
+ --rm-input-height-x-large: 5.6rem; // 56px
175
+ --rm-input-outer-focus: 0 0 0 var(--rm-border-width-large) var(--rm-color-primary-plus-four);
176
+ --rm-input-inner-focus: inset var(--rm-border-all) var(--rm-color-primary-minus-three);
177
+ --rm-input-focus: var(--rm-input-inner-focus), var(--rm-input-outer-focus);
178
+ }
179
+
180
+ // We use SCSS variables outside the root since support for custom properties / css variables
181
+ // is not yet available
182
+ // https://drafts.csswg.org/css-env-1/
183
+ // https://bholmes.dev/blog/alternative-to-css-variable-media-queries/
184
+
185
+ $breakpoint-x-small: 512px; // vertical phone
186
+ $breakpoint-small: 768px; // vertical ipad
187
+ $breakpoint-medium: 1024px; // landscape ipad
188
+ $breakpoint-large: 1280px; // small laptop
189
+ $breakpoint-x-large: 1440px; // medium laptop
190
+
191
+ :root {
192
+ // Color HSLs
193
+ @include color-varieties;
194
+
195
+ // Border
196
+ @include border-radius;
197
+ @include border-widths;
198
+ @include border-colors;
199
+ @include box-shadows;
200
+
201
+ // Font
202
+ @include font-scales;
203
+ @include font-weights;
204
+ @include fonts;
205
+
206
+ // Text
207
+ @include line-heights;
208
+ @include letter-spacing;
209
+
210
+ // Transitions
211
+ @include transitions;
212
+
213
+ // Encoded Images
214
+ @include encoded-images;
215
+
216
+ // Spacing
217
+ @include spacing-scales;
218
+
219
+ // Shadows
220
+ @include shadows;
221
+
222
+ // Z Index
223
+ @include z-indexes;
224
+
225
+ // Inputs
226
+ @include inputs;
227
+ }
228
+
229
+ // Animations
230
+ @keyframes rm-slide-in-out-flash {
231
+ // If an duration of 5s is set:
232
+ // Start off the Screen
233
+ 0% {
234
+ right: -100%;
235
+ }
236
+
237
+ // Animate onto the screen for 0.5s
238
+ 10% {
239
+ right: var(--rm-space-large);
240
+ }
241
+
242
+ // Stay on the screen for 3s
243
+ 70% {
244
+ right: var(--rm-space-large);
245
+ }
246
+
247
+ // Animate off the screen for 1.5s
248
+ 100% {
249
+ right: -100%;
250
+ }
251
+ }