@rolemodel/optics 0.3.1 → 0.4.1

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 (37) hide show
  1. package/.babelrc.json +14 -0
  2. package/.github/pull_request_template.md +1 -0
  3. package/.github/workflows/publish-storybook.yml +1 -1
  4. package/.prettierignore +2 -0
  5. package/README.md +10 -14
  6. package/dist/css/optics.css +961 -446
  7. package/dist/css/optics.css.map +1 -1
  8. package/dist/scss/addons/tom-select.scss +1 -4
  9. package/dist/scss/components/alert.scss +56 -38
  10. package/dist/scss/components/avatar.scss +96 -0
  11. package/dist/scss/components/badge.scss +8 -3
  12. package/dist/scss/components/button.scss +168 -97
  13. package/dist/scss/components/button_group.scss +23 -5
  14. package/dist/scss/components/confirm-dialog.scss +88 -0
  15. package/dist/scss/components/divider.scss +59 -0
  16. package/dist/scss/components/form.scss +180 -49
  17. package/dist/scss/components/index.scss +6 -1
  18. package/dist/scss/components/modal.scss +156 -0
  19. package/dist/scss/components/pagination.scss +28 -0
  20. package/dist/scss/components/sidebar.scss +83 -159
  21. package/dist/scss/components/table.scss +22 -17
  22. package/dist/scss/components/tooltip.scss +136 -0
  23. package/dist/scss/core/tokens/base_tokens.scss +10 -5
  24. package/dist/scss/recipes/16six-sidebar.scss +32 -61
  25. package/dist/scss/recipes/domains-sidebar.scss +24 -44
  26. package/dist/tokens/tokens.json +9 -8
  27. package/package.json +30 -24
  28. package/.storybook/ModeSwitcher.jsx +0 -98
  29. package/.storybook/documentation.scss +0 -93
  30. package/.storybook/main.js +0 -11
  31. package/.storybook/manager.js +0 -22
  32. package/.storybook/preview.js +0 -12
  33. package/.storybook/rolemodelTheme.js +0 -10
  34. package/dist/scss/addons/rails-modal-and-panel/index.scss +0 -2
  35. package/dist/scss/addons/rails-modal-and-panel/modal.scss +0 -111
  36. package/dist/scss/components/flash.scss +0 -58
  37. /package/dist/scss/addons/{rails-modal-and-panel/panel.scss → panel.scss} +0 -0
@@ -1,10 +1,15 @@
1
1
  // 16Six Sidebar Example
2
- @mixin sidebar-16six-rail-global {
2
+ .icon--rotated-135 {
3
+ rotate: 135deg;
4
+ }
5
+
6
+ .icon--rotated-90 {
7
+ rotate: 90deg;
8
+ }
9
+
10
+ @mixin sidebar-rail-global {
3
11
  .sidebar__brand {
4
- svg {
5
- width: 100%;
6
- padding: 0 var(--op-space-small);
7
- }
12
+ justify-content: center;
8
13
 
9
14
  .sidebar__brand-label {
10
15
  display: none;
@@ -12,86 +17,52 @@
12
17
  }
13
18
  }
14
19
 
15
- @mixin sidebar-16six-drawer-global {
16
- .sidebar__item {
17
- border-radius: var(--op-radius-large);
18
- font-size: var(--op-font-small);
19
- }
20
- }
21
-
22
20
  .sidebar-16six {
23
21
  @extend %sidebar-global;
24
22
 
25
- --_op-sidebar-spacing: var(--op-space-x-small);
26
-
27
- // Normal
28
- --_op-sidebar-background-color: var(--op-color-primary-minus-five);
29
- --_op-sidebar-text-color: var(--op-color-primary-on-minus-five);
30
-
31
- // Active
32
- --_op-sidebar-icon-background-active-color: var(--op-color-primary-minus-three);
33
- --_op-sidebar-icon-text-active-color: var(--op-color-primary-on-minus-three);
34
-
35
- // Hover
36
- --_op-sidebar-icon-background-hover-color: var(--op-color-primary-minus-three);
37
- --_op-sidebar-icon-text-hover-color: var(--op-color-primary-on-minus-three);
38
-
39
- gap: var(--op-space-x-large);
23
+ --_op-sidebar-background-color: hsl(256deg 66% 15%);
24
+ --_op-sidebar-text-color: hsl(26deg 100% 95%);
25
+ --_op-sidebar-border-color: hsl(26deg 100% 95%);
26
+ --_op-sidebar-rail-width: 6.4rem;
27
+ --_op-sidebar-drawer-width: 22.4rem;
28
+ --_op-sidebar-drawer-brand-width: calc(var(--op-space-3x-large) + (2 * var(--op-space-medium)));
29
+ --_op-sidebar-brand-spacing: var(--op-space-medium) var(--op-space-x-small);
30
+ --_op-sidebar-content-item-spacing: var(--op-space-x-small);
31
+ --_op-sidebar-spacing: 0 0 var(--op-space-x-small);
40
32
 
41
33
  .sidebar__brand {
42
34
  display: flex;
35
+ margin: 0;
43
36
  color: inherit;
44
- gap: var(--op-space-small);
37
+ gap: var(--op-space-medium);
45
38
  text-decoration: none;
46
39
 
47
40
  svg {
48
41
  width: var(--op-space-3x-large);
42
+ height: var(--op-space-3x-large);
49
43
  }
50
44
 
51
45
  .sidebar__brand-label {
52
46
  display: flex;
53
47
  flex-direction: column;
54
- gap: var(--op-space-4x-small);
48
+ font-size: var(--op-font-small);
55
49
  }
56
50
  }
57
51
 
58
- .sidebar__content {
59
- gap: var(--op-space-x-small);
60
- }
61
-
62
- .sidebar__item {
63
- .sidebar__item-icon {
64
- border-radius: var(--op-radius-large);
65
-
66
- &.sidebar__item-icon--rotated {
67
- rotate: 90deg;
68
- }
69
- }
52
+ .btn {
53
+ &.btn--no-border {
54
+ background-color: transparent;
55
+ box-shadow: none;
56
+ color: var(--_op-sidebar-text-color);
70
57
 
71
- &:hover,
72
- &.active {
73
- .sidebar__item-icon {
74
- --op-mso-weight: var(--op-font-weight-medium);
58
+ &.btn--active,
59
+ &:hover {
60
+ background-color: hsl(256deg 23% 32%);
75
61
  }
76
62
  }
77
63
  }
78
64
 
79
- // Modifiers
80
- &.sidebar--drawer:not(.sidebar--responsive) {
81
- @include sidebar-16six-drawer-global;
82
- }
83
-
84
- &.sidebar--drawer.sidebar--responsive {
85
- @media (width > $breakpoint-medium) {
86
- @include sidebar-16six-drawer-global;
87
- }
88
-
89
- @media (width <= $breakpoint-medium) {
90
- @include sidebar-16six-rail-global;
91
- }
92
- }
93
-
94
65
  &.sidebar--rail {
95
- @include sidebar-16six-rail-global;
66
+ @include sidebar-rail-global;
96
67
  }
97
68
  }
@@ -1,60 +1,40 @@
1
1
  // Domains Sidebar Example
2
- @mixin sidebar-domains-rail-global {
3
- .sidebar__brand {
4
- padding: 0 var(--_op-sidebar-spacing);
5
- }
6
- }
7
-
8
- @mixin sidebar-domains-drawer-global {
9
- .sidebar__content {
10
- padding: 0;
11
- }
12
-
13
- .sidebar__item {
14
- border-bottom-left-radius: 0;
15
- border-top-left-radius: 0;
16
- }
17
-
18
- .sidebar__section-divider {
19
- margin: var(--op-space-small) 0;
2
+ %btn-global {
3
+ &.btn--pill-right {
4
+ border-radius: 0 var(--op-radius-pill) var(--op-radius-pill) 0;
20
5
  }
21
6
  }
22
7
 
23
8
  .sidebar-domains {
24
9
  @extend %sidebar-global;
25
10
 
26
- // Normal
27
- --_op-sidebar-background-color: var(--op-color-background);
28
- --_op-sidebar-text-color: var(--op-color-on-background);
29
-
30
- // Active
31
- --_op-sidebar-icon-background-active-color: var(--op-color-primary-plus-seven);
32
- --_op-sidebar-icon-text-active-color: var(--op-color-primary-on-plus-seven);
33
-
34
- // Hover
35
- --_op-sidebar-icon-background-hover-color: var(--op-color-neutral-plus-seven);
36
- --_op-sidebar-icon-text-hover-color: var(--op-color-neutral-on-plus-seven);
11
+ --_op-sidebar-drawer-width: 28rem;
12
+ --_op-sidebar-content-spacing: 0;
13
+ --_op-sidebar-content-item-spacing: 0;
37
14
 
38
- .sidebar__brand {
39
- padding: 0 var(--op-space-4x-large);
40
- }
15
+ box-shadow: none;
41
16
 
42
- // Modifiers
43
- &.sidebar--drawer:not(.sidebar--responsive) {
44
- @include sidebar-domains-drawer-global;
45
- }
17
+ .btn {
18
+ &.btn--no-border {
19
+ box-shadow: none;
46
20
 
47
- &.sidebar--drawer.sidebar--responsive {
48
- @media (width > $breakpoint-medium) {
49
- @include sidebar-domains-drawer-global;
50
- }
21
+ &.btn--active {
22
+ background-color: var(--op-color-primary-plus-five);
23
+ color: var(--op-color-primary-on-plus-five);
24
+ }
51
25
 
52
- @media (width <= $breakpoint-medium) {
53
- @include sidebar-domains-rail-global;
26
+ &:hover:not(.btn--active) {
27
+ background-color: var(--op-color-neutral-plus-six);
28
+ box-shadow: none;
29
+ color: var(--op-color-neutral-on-plus-six);
30
+ }
54
31
  }
55
32
  }
56
33
 
57
- &.sidebar--rail {
58
- @include sidebar-domains-rail-global;
34
+ .sidebar__footer {
35
+ display: flex;
36
+ align-items: center;
37
+ padding-left: var(--op-space-large);
38
+ gap: var(--op-space-small);
59
39
  }
60
40
  }
@@ -627,9 +627,11 @@
627
627
  "animation": {
628
628
  "flash": "rm-slide-in-out-flash 5s normal forwards"
629
629
  },
630
- "form": {
631
- "dropdown": {
632
- "arrow": "url(\"data"
630
+ "encoded": {
631
+ "images": {
632
+ "dropdown": {
633
+ "arrow": "url(\"data"
634
+ }
633
635
  }
634
636
  },
635
637
  "space": {
@@ -670,13 +672,12 @@
670
672
  "x-large": "8.4rem"
671
673
  },
672
674
  "input": {
673
- "outer": {
674
- "focus": "0 0 0 var(--op-border-width-large) var(--op-color-primary-plus-four)"
675
- },
676
675
  "inner": {
677
- "focus": "inset var(--op-border-all) var(--op-color-primary-minus-three)"
676
+ "focus": "inset 0 0 0 var(--op-border-width-large)"
678
677
  },
679
- "focus": "var(--op-input-inner-focus), var(--op-input-outer-focus)"
678
+ "outer": {
679
+ "focus": "0 0 0 var(--op-border-width-x-large)"
680
+ }
680
681
  }
681
682
  }
682
683
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rolemodel/optics",
3
- "version": "0.3.1",
3
+ "version": "0.4.1",
4
4
  "description": "Optics is an scss package that provides base styles and components that can be integrated and customized in a variety of projects.",
5
5
  "main": "dist/scss/optics.scss",
6
6
  "scripts": {
@@ -9,15 +9,16 @@
9
9
  "build:css": "sass src/optics.scss dist/css/optics.css --load-path=node_modules/",
10
10
  "build:scss": "rsync -a src/ dist/scss --exclude stories",
11
11
  "build:tokens": "node build_token_json --source=src/core/tokens --output=dist/tokens/tokens.json",
12
- "storybook": "start-storybook -p 6006",
13
- "build-storybook": "build-storybook -o docs-build",
12
+ "storybook": "storybook dev -p 6006",
13
+ "build-storybook": "storybook build",
14
14
  "lint": "npm run lint:js && npm run lint:css",
15
15
  "lint-fix": "npm run lint:js --fix && npm run lint:css --fix",
16
16
  "lint:js": "eslint 'src/stories/**/*.js'",
17
17
  "lint:css": "stylelint 'src/**/*.(scss|css)'",
18
18
  "prettier": "prettier -w .",
19
19
  "prettier-check": "prettier -c .",
20
- "sanity-check": "npm run lint && npm run prettier && npm run build && npm run build-storybook && rm -rf ./dist && rm -rf ./docs-build"
20
+ "sanity-check": "npm run lint && npm run prettier && npm run build && npm run build-storybook && rm -rf ./dist && rm -rf ./storybook-static",
21
+ "generate": "node ./tools/generate.js"
21
22
  },
22
23
  "repository": {
23
24
  "type": "git",
@@ -41,36 +42,33 @@
41
42
  "@RoleModel:registry": "https://npm.pkg.github.com"
42
43
  },
43
44
  "dependencies": {
44
- "modern-css-reset": "^1.4.0",
45
- "tom-select": "^2.0.0"
45
+ "modern-css-reset": "^1.4.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@babel/core": "^7.18.9",
49
- "@storybook/addon-actions": "^6.5.9",
50
- "@storybook/addon-docs": "^6.5.9",
51
- "@storybook/addon-essentials": "^6.5.9",
52
- "@storybook/addon-interactions": "^6.5.9",
53
- "@storybook/addon-links": "^6.5.9",
54
- "@storybook/addons": "^6.5.9",
55
- "@storybook/builder-webpack4": "^6.5.9",
56
- "@storybook/html": "^6.5.9",
57
- "@storybook/manager-webpack4": "^6.5.9",
58
- "@storybook/preset-scss": "^1.0.3",
59
- "@storybook/testing-library": "^0.0.13",
60
- "@storybook/theming": "^6.5.9",
61
- "babel-loader": "^8.2.5",
62
- "css-loader": "^5.2.7",
48
+ "@babel/preset-env": "^7.21.5",
49
+ "@storybook/addon-essentials": "^7.0.9",
50
+ "@storybook/addon-links": "^7.0.9",
51
+ "@storybook/addon-styling": "^1.0.6",
52
+ "@storybook/blocks": "^7.0.9",
53
+ "@storybook/html": "^7.0.9",
54
+ "@storybook/html-webpack5": "^7.0.9",
55
+ "@storybook/testing-library": "^0.0.14-next.2",
63
56
  "eslint": "^8.29.0",
64
57
  "eslint-config-prettier": "^8.5.0",
65
58
  "eslint-config-standard": "^17.0.0",
66
59
  "eslint-plugin-import": "^2.26.0",
67
60
  "eslint-plugin-n": "^15.6.0",
68
61
  "eslint-plugin-promise": "^6.1.1",
62
+ "eslint-plugin-storybook": "^0.6.12",
63
+ "generate-template-files": "^3.2.1",
69
64
  "postcss-scss": "^4.0.6",
70
65
  "prettier": "^2.8.1",
71
- "sass": "^1.53.0",
72
- "sass-loader": "^10.1.1",
73
- "storybook-design-token": "^2.9.0",
66
+ "react": "^18.2.0",
67
+ "react-dom": "^18.2.0",
68
+ "sass": "^1.62.1",
69
+ "sass-loader": "^13.2.2",
70
+ "storybook": "^7.0.9",
71
+ "storybook-design-token": "^3.0.0-beta.3",
74
72
  "style-loader": "^2.0.0",
75
73
  "stylelint": "^14.16.0",
76
74
  "stylelint-config-idiomatic-order": "^9.0.0",
@@ -78,5 +76,13 @@
78
76
  "stylelint-config-standard-scss": "^6.1.0",
79
77
  "stylelint-prettier": "^2.0.0",
80
78
  "stylelint-scss": "^4.3.0"
79
+ },
80
+ "peerDependencies": {
81
+ "tom-select": "^2.0.0"
82
+ },
83
+ "peerDependenciesMeta": {
84
+ "tom-select": {
85
+ "optional": true
86
+ }
81
87
  }
82
88
  }
@@ -1,98 +0,0 @@
1
- import React, { useState } from 'react'
2
- import { Button } from '@storybook/components'
3
-
4
- import { useGlobals } from '@storybook/api'
5
-
6
- // Destructuring like:
7
- // const [globals, setGlobals] = useGlobals()
8
- // or
9
- // setGlobals({ ...globals, themeMode: mode })
10
- // is not working so I had to work around it.
11
-
12
- const ModeButton = ({ children, mode, currentThemeMode, updateThemeMode }) => {
13
- const hoverState = useState(false)
14
- const hover = hoverState[0]
15
- const setHover = hoverState[1]
16
-
17
- const backgroundColor = () => {
18
- if (hover) {
19
- return 'rgba(30, 167, 253, 0.12)'
20
- }
21
- return currentThemeMode === mode ? 'rgba(30,167,253,0.07)' : 'transparent'
22
- }
23
-
24
- const textColor = () => {
25
- if (hover) {
26
- return '#1EA7FD'
27
- }
28
- return currentThemeMode === mode ? '#1EA7FD' : '#999'
29
- }
30
-
31
- const buttonStyles = (mode) => {
32
- return {
33
- borderRadius: 0,
34
- padding: 8,
35
- color: textColor(),
36
- backgroundColor: backgroundColor(),
37
- }
38
- }
39
-
40
- return (
41
- <Button
42
- onMouseEnter={() => setHover(true)}
43
- onMouseLeave={() => setHover(false)}
44
- style={buttonStyles(mode)}
45
- onClick={() => updateThemeMode(mode)}
46
- title={`Set canvas to ${mode} mode`}
47
- >
48
- {children}
49
- </Button>
50
- )
51
- }
52
-
53
- const ModeSwitcher = () => {
54
- const globalState = useGlobals()
55
- const globals = globalState[0]
56
- const setGlobals = globalState[1]
57
-
58
- const setCanvasDocumentThemeMode = (mode) => {
59
- const frame = document.getElementById('storybook-preview-iframe')
60
-
61
- if (frame) {
62
- const frameDocument = frame.contentWindow.document
63
- frameDocument.children[0].dataset.themeMode = mode
64
- }
65
- }
66
-
67
- const updateThemeMode = (mode) => {
68
- setCanvasDocumentThemeMode(mode)
69
- globals.themeMode = mode
70
- setGlobals(globals)
71
- }
72
-
73
- if (!globals.themeMode) {
74
- updateThemeMode('light')
75
- }
76
-
77
- const containerStyles = () => {
78
- return {
79
- border: '1px solid rgb(0 0 0 / 10%)',
80
- margin: 5,
81
- borderRadius: '3em',
82
- overflow: 'hidden',
83
- }
84
- }
85
-
86
- return (
87
- <div style={containerStyles()}>
88
- <ModeButton mode="light" currentThemeMode={globals.themeMode} updateThemeMode={updateThemeMode}>
89
- Light
90
- </ModeButton>
91
- <ModeButton mode="dark" currentThemeMode={globals.themeMode} updateThemeMode={updateThemeMode}>
92
- Dark
93
- </ModeButton>
94
- </div>
95
- )
96
- }
97
-
98
- export default ModeSwitcher
@@ -1,93 +0,0 @@
1
- @import './src/optics.scss';
2
-
3
- @import './src/recipes/domains-sidebar.scss';
4
- @import './src/recipes/16six-sidebar.scss';
5
-
6
- @import 'https://fonts.googleapis.com/css2?family=Tilt+Neon&display=swap';
7
-
8
- .transition-demo {
9
- display: inline-block;
10
- padding: var(--op-space-medium);
11
- background-color: var(--op-color-primary-base);
12
- color: var(--op-color-primary-on-base);
13
- transition: var(--op-transition-input);
14
-
15
- &:hover {
16
- background-color: var(--op-color-neutral-base);
17
- color: var(--op-color-neutral-on-base);
18
- }
19
- }
20
-
21
- .transition-demo--input {
22
- transition: var(--op-transition-input);
23
- }
24
-
25
- .transition-demo--sidebar {
26
- transition: var(--op-transition-sidebar);
27
- }
28
-
29
- .transition-demo--modal {
30
- transition: var(--op-transition-modal);
31
- }
32
-
33
- .transition-demo--panel {
34
- transition: var(--op-transition-panel);
35
- transition-property: all;
36
- }
37
-
38
- .flash--demo {
39
- position: relative;
40
- top: 0;
41
- right: 0;
42
- animation: none;
43
- }
44
-
45
- .background-primary-plus-four {
46
- background-color: var(--op-color-primary-plus-four);
47
- color: var(--op-color-primary-on-plus-four);
48
- }
49
-
50
- .background-primary-plus-seven {
51
- background-color: var(--op-color-primary-plus-seven);
52
- color: var(--op-color-primary-on-plus-seven);
53
- }
54
-
55
- .font-family-demo--alternative {
56
- --op-font-family: 'Tilt Neon', sans-serif;
57
-
58
- font-family: var(--op-font-family);
59
- }
60
-
61
- .design-token-container {
62
- .design-token-card {
63
- table {
64
- td:nth-of-type(1),
65
- th:nth-of-type(1) {
66
- flex-basis: 40%;
67
- }
68
-
69
- td:nth-of-type(2),
70
- th:nth-of-type(2) {
71
- flex-basis: 35%;
72
- }
73
-
74
- td:nth-of-type(3),
75
- th:nth-of-type(3) {
76
- flex-basis: 25%;
77
- }
78
- }
79
- }
80
- }
81
-
82
- .input-height-tokens {
83
- .design-token-container {
84
- div:nth-child(2) {
85
- div {
86
- div:last-child {
87
- margin: var(--op-space-x-large);
88
- transform: rotate(90deg);
89
- }
90
- }
91
- }
92
- }
93
- }
@@ -1,11 +0,0 @@
1
- module.exports = {
2
- stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
3
- addons: [
4
- '@storybook/addon-links',
5
- '@storybook/addon-essentials',
6
- '@storybook/addon-interactions',
7
- '@storybook/preset-scss',
8
- { name: 'storybook-design-token', options: { preserveCSSVars: true } },
9
- ],
10
- framework: '@storybook/html',
11
- }
@@ -1,22 +0,0 @@
1
- import React from 'react'
2
- import { addons, types } from '@storybook/addons'
3
- import rolemodelTheme from './rolemodelTheme'
4
-
5
- import { useGlobals } from '@storybook/api' // For some reason this is needed here. ModeSwitcher won't work without it.
6
-
7
- import ModeSwitcher from './ModeSwitcher'
8
-
9
- addons.register('rolemodel/toolbar', () => {
10
- addons.add('rolemodel-toolbar-addon/toolbar', {
11
- title: 'Control to switch theme mode',
12
- //👇 Sets the type of UI element in Storybook
13
- type: types.TOOL,
14
- //👇 Shows the Toolbar UI element if either the Canvas or Docs tab is active
15
- match: ({ viewMode }) => !!(viewMode && viewMode.match(/^(story|docs)$/)),
16
- render: () => <ModeSwitcher />,
17
- })
18
- })
19
-
20
- addons.setConfig({
21
- theme: rolemodelTheme,
22
- })
@@ -1,12 +0,0 @@
1
- export const parameters = {
2
- actions: { argTypesRegex: '^on[A-Z].*' },
3
- controls: {
4
- matchers: {
5
- color: /(background|color)$/i,
6
- date: /Date$/,
7
- },
8
- },
9
- }
10
-
11
- import '!style-loader!css-loader!sass-loader!../src/optics.scss'
12
- import '!style-loader!css-loader!sass-loader!./documentation.scss'
@@ -1,10 +0,0 @@
1
- import { create } from '@storybook/theming'
2
-
3
- export default create({
4
- base: 'light',
5
- brandTitle: 'Optics, a RoleModel Design System',
6
- brandUrl: 'https://docs.optics.rolemodel.design/',
7
- brandImage:
8
- 'https://rolemodelsoftware.com/assets/rolemodel-logo--blue-5b7cee4303f5b115050586117bad8960640884812d1d51ee4b58817598c896da.svg',
9
- brandTarget: '_self',
10
- })
@@ -1,2 +0,0 @@
1
- @import 'modal';
2
- @import 'panel';