@acusti/uikit-docs 0.1.0

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 (45) hide show
  1. package/.storybook/main.ts +28 -0
  2. package/.storybook/manager.ts +8 -0
  3. package/.storybook/preview.ts +19 -0
  4. package/README.md +6 -0
  5. package/package.json +26 -0
  6. package/stories/Button.stories.ts +50 -0
  7. package/stories/Button.tsx +48 -0
  8. package/stories/CSSValueInput.css +38 -0
  9. package/stories/CSSValueInput.stories.tsx +171 -0
  10. package/stories/DatePicker.css +3 -0
  11. package/stories/DatePicker.stories.tsx +99 -0
  12. package/stories/Dropdown.css +149 -0
  13. package/stories/Dropdown.stories.tsx +446 -0
  14. package/stories/Header.stories.ts +27 -0
  15. package/stories/Header.tsx +66 -0
  16. package/stories/InputText.css +15 -0
  17. package/stories/InputText.stories.tsx +152 -0
  18. package/stories/Introduction.mdx +388 -0
  19. package/stories/MonthCalendar.css +3 -0
  20. package/stories/MonthCalendar.stories.ts +57 -0
  21. package/stories/Page.stories.ts +29 -0
  22. package/stories/Page.tsx +91 -0
  23. package/stories/assets/accessibility.png +0 -0
  24. package/stories/assets/accessibility.svg +5 -0
  25. package/stories/assets/addon-library.png +0 -0
  26. package/stories/assets/assets.png +0 -0
  27. package/stories/assets/context.png +0 -0
  28. package/stories/assets/discord.svg +15 -0
  29. package/stories/assets/docs.png +0 -0
  30. package/stories/assets/figma-plugin.png +0 -0
  31. package/stories/assets/github.svg +3 -0
  32. package/stories/assets/share.png +0 -0
  33. package/stories/assets/styling.png +0 -0
  34. package/stories/assets/testing.png +0 -0
  35. package/stories/assets/theming.png +0 -0
  36. package/stories/assets/tutorials.svg +12 -0
  37. package/stories/assets/youtube.svg +4 -0
  38. package/stories/button.css +30 -0
  39. package/stories/header.css +32 -0
  40. package/stories/page.css +69 -0
  41. package/stories/useIsOutOfBounds.css +16 -0
  42. package/stories/useIsOutOfBounds.stories.tsx +164 -0
  43. package/stories/useKeyboardEvents.css +19 -0
  44. package/stories/useKeyboardEvents.stories.tsx +104 -0
  45. package/tsconfig.json +3 -0
@@ -0,0 +1,28 @@
1
+ import { dirname, join } from 'path';
2
+
3
+ import type { StorybookConfig } from '@storybook/react-vite';
4
+
5
+ /**
6
+ * This function is used to resolve the absolute path of a package.
7
+ * It is needed in projects that use Yarn PnP or are set up within a monorepo.
8
+ */
9
+ function getAbsolutePath(value: string): any {
10
+ return dirname(require.resolve(join(value, 'package.json')));
11
+ }
12
+
13
+ const config: StorybookConfig = {
14
+ addons: [getAbsolutePath('@storybook/addon-essentials')],
15
+ docs: { autodocs: 'tag' },
16
+ framework: {
17
+ name: getAbsolutePath('@storybook/react-vite'),
18
+ options: {},
19
+ },
20
+ stories: ['../stories/Introduction.mdx', '../stories/**/*.stories.@(js|jsx|ts|tsx)'],
21
+ typescript: {
22
+ check: false,
23
+ reactDocgen: 'react-docgen',
24
+ skipBabel: true,
25
+ },
26
+ };
27
+
28
+ export default config;
@@ -0,0 +1,8 @@
1
+ import { addons } from '@storybook/manager-api';
2
+
3
+ addons.setConfig({
4
+ enableShortcuts: false,
5
+ sidebar: {
6
+ collapsedRoots: ['example'],
7
+ },
8
+ });
@@ -0,0 +1,19 @@
1
+ import type { Preview } from '@storybook/react';
2
+
3
+ const preview: Preview = {
4
+ parameters: {
5
+ actions: { argTypesRegex: '^on[A-Z].*' },
6
+ controls: {
7
+ matchers: {
8
+ color: /(background|color)$/i,
9
+ date: /Date$/,
10
+ },
11
+ },
12
+ previewTabs: {
13
+ 'storybook/docs/panel': { index: -1 }, // move “Docs” tab before “Canvas”
14
+ },
15
+ viewMode: 'docs',
16
+ },
17
+ };
18
+
19
+ export default preview;
package/README.md ADDED
@@ -0,0 +1,6 @@
1
+ # @acusti/uikit-docs
2
+
3
+ #### [:blue_book: Storybook instance](https://acusti-uikit.netlify.app/)
4
+
5
+ This is where the storybook-based documentation and examples live for
6
+ test-driving the components and libraries in UIKit
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@acusti/uikit-docs",
3
+ "version": "0.1.0",
4
+ "engines": {
5
+ "node": ">=14"
6
+ },
7
+ "scripts": {
8
+ "build": "storybook build -o dist",
9
+ "storybook": "storybook dev -p 6006"
10
+ },
11
+ "devDependencies": {
12
+ "@storybook/addon-essentials": "^8.4.7",
13
+ "@storybook/blocks": "^8.4.7",
14
+ "@storybook/manager-api": "^8.4.7",
15
+ "@storybook/react": "^8.4.7",
16
+ "@storybook/react-vite": "^8.4.7",
17
+ "@storybook/test": "^8.4.7",
18
+ "@types/react": "^19.0.2",
19
+ "core-js": "^3.38.1",
20
+ "react": "^19.0.0",
21
+ "react-dom": "^19.0.0",
22
+ "storybook": "^8.4.7",
23
+ "typescript": "5.7.3",
24
+ "vite": "^5.4.1"
25
+ }
26
+ }
@@ -0,0 +1,50 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+
3
+ import { Button } from './Button';
4
+
5
+ // More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
6
+ const meta = {
7
+ title: 'Example/Button',
8
+ component: Button,
9
+ parameters: {
10
+ // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/react/configure/story-layout
11
+ layout: 'centered',
12
+ },
13
+ // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/react/writing-docs/autodocs
14
+ tags: ['autodocs'],
15
+ // More on argTypes: https://storybook.js.org/docs/react/api/argtypes
16
+ argTypes: {
17
+ backgroundColor: { control: 'color' },
18
+ },
19
+ } satisfies Meta<typeof Button>;
20
+
21
+ export default meta;
22
+ type Story = StoryObj<typeof meta>;
23
+
24
+ // More on writing stories with args: https://storybook.js.org/docs/react/writing-stories/args
25
+ export const Primary: Story = {
26
+ args: {
27
+ primary: true,
28
+ label: 'Button',
29
+ },
30
+ };
31
+
32
+ export const Secondary: Story = {
33
+ args: {
34
+ label: 'Button',
35
+ },
36
+ };
37
+
38
+ export const Large: Story = {
39
+ args: {
40
+ size: 'large',
41
+ label: 'Button',
42
+ },
43
+ };
44
+
45
+ export const Small: Story = {
46
+ args: {
47
+ size: 'small',
48
+ label: 'Button',
49
+ },
50
+ };
@@ -0,0 +1,48 @@
1
+ import React from 'react';
2
+ import './button.css';
3
+
4
+ interface ButtonProps {
5
+ /**
6
+ * Is this the principal call to action on the page?
7
+ */
8
+ primary?: boolean;
9
+ /**
10
+ * What background color to use
11
+ */
12
+ backgroundColor?: string;
13
+ /**
14
+ * How large should the button be?
15
+ */
16
+ size?: 'small' | 'medium' | 'large';
17
+ /**
18
+ * Button contents
19
+ */
20
+ label: string;
21
+ /**
22
+ * Optional click handler
23
+ */
24
+ onClick?: () => void;
25
+ }
26
+
27
+ /**
28
+ * Primary UI component for user interaction
29
+ */
30
+ export const Button = ({
31
+ primary = false,
32
+ size = 'medium',
33
+ backgroundColor,
34
+ label,
35
+ ...props
36
+ }: ButtonProps) => {
37
+ const mode = primary ? 'storybook-button--primary' : 'storybook-button--secondary';
38
+ return (
39
+ <button
40
+ type="button"
41
+ className={['storybook-button', `storybook-button--${size}`, mode].join(' ')}
42
+ style={{ backgroundColor }}
43
+ {...props}
44
+ >
45
+ {label}
46
+ </button>
47
+ );
48
+ };
@@ -0,0 +1,38 @@
1
+ .cssvalueinput {
2
+ display: flex;
3
+ align-items: center;
4
+ border-radius: 4px;
5
+ padding: 10px 14px;
6
+ }
7
+
8
+ .innerZoomElementWrapper .cssvalueinput {
9
+ background-color: rgb(30 167 253 / 25%);
10
+ }
11
+
12
+ .cssvalueinput-icon {
13
+ width: 20px;
14
+ height: 20px;
15
+ margin-right: 8px;
16
+ }
17
+
18
+ .cssvalueinput-icon svg {
19
+ width: 100%;
20
+ height: 100%;
21
+ }
22
+
23
+ .cssvalueinput-label {
24
+ padding-right: 10px;
25
+ }
26
+
27
+ .cssvalueinput-label-text {
28
+ font-family: system-ui;
29
+ font-size: 14px;
30
+ margin: 0;
31
+ }
32
+
33
+ .cssvalueinput-value input {
34
+ width: 65px;
35
+ padding: 3px 6px;
36
+ font-size: 13px;
37
+ line-height: 13px;
38
+ }
@@ -0,0 +1,171 @@
1
+ import * as React from 'react';
2
+
3
+ import CSSValueInput from '../../css-value-input/src/CSSValueInput.js';
4
+
5
+ import './CSSValueInput.css';
6
+ import './InputText.css';
7
+
8
+ import type { Meta, StoryObj } from '@storybook/react';
9
+
10
+ const meta: Meta<typeof CSSValueInput> = {
11
+ component: CSSValueInput,
12
+ parameters: {
13
+ docs: {
14
+ description: {
15
+ component:
16
+ '`CSSValueInput` is a React component that renders a text input that can take and update a CSS value of a particular type with a default unit. The input’s behavior is similar to those in design applications such as Adobe Illustrator or XD.',
17
+ },
18
+ },
19
+ },
20
+ //https://storybook.js.org/docs/react/writing-docs/autodocs#setup-automated-documentation
21
+ tags: ['autodocs'],
22
+ title: 'UIKit/Controls/CSSValueInput',
23
+ };
24
+
25
+ export default meta;
26
+
27
+ type Story = StoryObj<typeof CSSValueInput>;
28
+
29
+ export const Length: Story = {
30
+ args: {
31
+ className: 'my-special-input',
32
+ cssValueType: 'length',
33
+ label: 'Font size',
34
+ name: 'fontsize',
35
+ placeholder: '1rem',
36
+ tabIndex: 1,
37
+ unit: 'rem',
38
+ validator:
39
+ /^(xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large|inherit)$/,
40
+ value: '24px',
41
+ },
42
+ };
43
+
44
+ export const Time: Story = {
45
+ args: {
46
+ className: 'my-panel-input',
47
+ cssValueType: 'time',
48
+ label: 'Duration',
49
+ max: 20,
50
+ min: 0,
51
+ name: 'duration',
52
+ placeholder: '0.25s',
53
+ step: 0.1,
54
+ unit: 's',
55
+ },
56
+ };
57
+
58
+ export const Angle: Story = {
59
+ args: {
60
+ className: 'flex-item-example',
61
+ cssValueType: 'angle',
62
+ icon: (
63
+ <svg
64
+ width="100px"
65
+ height="100px"
66
+ viewBox="0 0 100 100"
67
+ version="1.1"
68
+ xmlns="http://www.w3.org/2000/svg"
69
+ >
70
+ <g stroke="none" strokeWidth="1" fill="none">
71
+ <g transform="translate(2, 2)" stroke="#222F3E" strokeWidth="4">
72
+ <path
73
+ d="M56.5106952,10.5464071 C60.8135865,11.5200327 64.8423906,13.2161538 68.4628809,15.5005439 L76.8618891,8.97963811 L87.0203619,19.1381109 L80.4994561,27.5371191 C82.7838462,31.1576094 84.4799673,35.1864135 85.4535929,39.4893048 L96,40.816875 L96,55.183125 L85.4535929,56.5106952 C84.4799673,60.8135865 82.7838462,64.8423906 80.4994561,68.4628809 L87.0203619,76.8618891 L76.8618891,87.0203619 L68.4628809,80.4994561 C64.8423906,82.7838462 60.8135865,84.4799673 56.5106952,85.4535929 L55.183125,96 L40.816875,96 L39.4893048,85.4535929 C35.1864135,84.4799673 31.1576094,82.7838462 27.5371191,80.4994561 L19.1381109,87.0203619 L8.97963811,76.8618891 L15.5005439,68.4628809 C13.2161538,64.8423906 11.5200327,60.8135865 10.5464071,56.5106952 L0,55.183125 L0,40.816875 L10.5464071,39.4893048 C11.5200327,35.1864135 13.2161538,31.1576094 15.5005439,27.5371191 L8.97963811,19.1381109 L19.1381109,8.97963811 L27.5371191,15.5005439 C31.1576094,13.2161538 35.1864135,11.5200327 39.4893048,10.5464071 L40.816875,0 L55.183125,0 L56.5106952,10.5464071 Z"
74
+ id="Layer-1"
75
+ ></path>
76
+ <circle cx="48" cy="48" r="14.4"></circle>
77
+ </g>
78
+ </g>
79
+ </svg>
80
+ ),
81
+ label: 'Rotate Z',
82
+ name: 'rotatez',
83
+ placeholder: '0deg',
84
+ step: 45,
85
+ unit: 'deg',
86
+ value: '90deg',
87
+ },
88
+ };
89
+
90
+ export const Percent: Story = {
91
+ args: {
92
+ cssValueType: 'percent',
93
+ label: 'Width',
94
+ min: 0,
95
+ name: 'width',
96
+ placeholder: '100%',
97
+ step: 10,
98
+ unit: '%',
99
+ value: '30%',
100
+ },
101
+ };
102
+
103
+ export const LabelLess: Story = {
104
+ args: {
105
+ className: 'my-special-input',
106
+ cssValueType: 'length',
107
+ name: 'labelless',
108
+ placeholder: '1rem',
109
+ title: 'No label',
110
+ unit: 'rem',
111
+ value: '24px',
112
+ },
113
+ };
114
+
115
+ export const CustomGetValueAsNumber: Story = {
116
+ args: {
117
+ className: 'letter-spacing',
118
+ getValueAsNumber: (value) => {
119
+ if (typeof value === 'number') return value;
120
+ // “normal” for letter-spacing is effectively equivalent to 0
121
+ if (typeof value === 'string' && value.toLowerCase() === 'normal') {
122
+ return 0;
123
+ }
124
+ return parseFloat(value);
125
+ },
126
+ label: 'Letter spacing',
127
+ name: 'letterspacing',
128
+ placeholder: 'normal',
129
+ tabIndex: 2,
130
+ },
131
+ };
132
+
133
+ export const BackgroundSize: Story = {
134
+ args: {
135
+ className: 'background-size',
136
+ label: 'Background Size',
137
+ name: 'backgroundsize',
138
+ unit: '%',
139
+ validator: /^(auto|contain|cover)$/,
140
+ value: 'cover',
141
+ },
142
+ };
143
+
144
+ export const ZIndex: Story = {
145
+ args: {
146
+ cssValueType: 'integer',
147
+ label: 'z-index',
148
+ name: 'zindex',
149
+ value: '0',
150
+ },
151
+ };
152
+
153
+ export const NumberValue: Story = {
154
+ args: {
155
+ cssValueType: 'integer',
156
+ label: 'opacity',
157
+ name: 'opacity',
158
+ value: 0,
159
+ },
160
+ };
161
+
162
+ export const LineHeight: Story = {
163
+ args: {
164
+ cssValueType: 'length',
165
+ label: 'line height',
166
+ name: 'line-height',
167
+ step: 0.1,
168
+ unit: '',
169
+ value: 1.4,
170
+ },
171
+ };
@@ -0,0 +1,3 @@
1
+ .uktmonthcalendar {
2
+ font-family: system-ui, sans-serif;
3
+ }
@@ -0,0 +1,99 @@
1
+ import { DatePicker, getMonthFromDate } from '../../date-picker/src/index.js';
2
+ import * as React from 'react';
3
+
4
+ import './DatePicker.css';
5
+
6
+ import type { Meta, StoryObj } from '@storybook/react';
7
+
8
+ const { useState } = React;
9
+
10
+ const meta: Meta<typeof DatePicker> = {
11
+ argTypes: {
12
+ dateEnd: {
13
+ control: 'date',
14
+ description: '(optional) end date of current date range',
15
+ },
16
+ dateStart: {
17
+ control: 'date',
18
+ description: '(optional) start date of current date range',
19
+ },
20
+ },
21
+ component: DatePicker,
22
+ parameters: {
23
+ docs: {
24
+ description: {
25
+ component:
26
+ '`DatePicker` is a React component that renders a calendar-based date picker UI with support for date ranges.',
27
+ },
28
+ },
29
+ },
30
+ //https://storybook.js.org/docs/react/writing-docs/autodocs#setup-automated-documentation
31
+ tags: ['autodocs'],
32
+ title: 'UIKit/Controls/DatePicker/DatePicker',
33
+ };
34
+
35
+ export default meta;
36
+
37
+ type Story = StoryObj<typeof DatePicker>;
38
+
39
+ export const DefaultDatePicker: Story = {
40
+ args: {
41
+ className: 'default-date-picker-story',
42
+ },
43
+ };
44
+
45
+ export const TwoUpDatePicker: Story = {
46
+ args: {
47
+ className: 'two-up-date-picker-story',
48
+ isTwoUp: true,
49
+ },
50
+ };
51
+
52
+ const DATE_RANGE_NAVIDAD_DIA_DE_LOS_REYES_PROPS = {
53
+ className: 'date-range-date-picker-story',
54
+ dateEnd: new Date(2024, 0, 6).toISOString(),
55
+ dateStart: new Date(2023, 11, 25).toISOString(),
56
+ isTwoUp: true,
57
+ };
58
+
59
+ export const DateRangeNavidadDiaDeLosReyesDatePicker: Story = {
60
+ args: DATE_RANGE_NAVIDAD_DIA_DE_LOS_REYES_PROPS,
61
+ render() {
62
+ const [dateStart, setDateStart] = useState(
63
+ DATE_RANGE_NAVIDAD_DIA_DE_LOS_REYES_PROPS.dateStart,
64
+ );
65
+ const [dateEnd, setDateEnd] = useState(
66
+ DATE_RANGE_NAVIDAD_DIA_DE_LOS_REYES_PROPS.dateEnd,
67
+ );
68
+
69
+ return (
70
+ <DatePicker
71
+ {...DATE_RANGE_NAVIDAD_DIA_DE_LOS_REYES_PROPS}
72
+ dateEnd={dateEnd}
73
+ dateStart={dateStart}
74
+ onChange={(update) => {
75
+ if (update.dateEnd != null) setDateEnd(update.dateEnd);
76
+ if (update.dateStart != null) setDateStart(update.dateStart);
77
+ }}
78
+ />
79
+ );
80
+ },
81
+ };
82
+
83
+ export const NoFutureTwoUpDatePicker: Story = {
84
+ args: {
85
+ className: 'no-future-two-up-date-picker-story',
86
+ isTwoUp: true,
87
+ monthLimitLast: getMonthFromDate(new Date()),
88
+ },
89
+ };
90
+
91
+ export const ShowEndInitiallyDatePicker: Story = {
92
+ args: {
93
+ className: 'no-future-two-up-date-picker-story',
94
+ dateEnd: new Date(1234, 0, 1).toISOString(),
95
+ dateStart: new Date(1233, 0, 1).toISOString(),
96
+ isTwoUp: true,
97
+ showEndInitially: true,
98
+ },
99
+ };
@@ -0,0 +1,149 @@
1
+ .sb-story {
2
+ min-height: 180px;
3
+ }
4
+ .uktdropdown input {
5
+ box-sizing: border-box;
6
+ width: 110px;
7
+ }
8
+ .uktdropdown-body ul {
9
+ text-align: left;
10
+ list-style-type: none;
11
+ padding-left: 0px;
12
+ margin: 0px;
13
+ }
14
+ .uktdropdown-body li {
15
+ padding: 4px 8px;
16
+ margin: 4px 0;
17
+ white-space: nowrap;
18
+ }
19
+
20
+ .uktdropdown-body .heading {
21
+ color: #aaa;
22
+ font-size: 12px;
23
+ text-transform: uppercase;
24
+ letter-spacing: 1px;
25
+ font-weight: 700;
26
+ margin: 0.75rem 0 0.5rem;
27
+ }
28
+
29
+ .uktdropdown-body .heading:first-child {
30
+ margin-top: 0.25rem;
31
+ }
32
+
33
+ .no-trigger-text .uktdropdown-trigger {
34
+ position: relative;
35
+ margin-left: 3px;
36
+ width: 27px;
37
+ height: 21px;
38
+ vertical-align: top;
39
+ }
40
+ .no-trigger-text .uktdropdown-trigger:before {
41
+ content: "";
42
+ display: block;
43
+ position: absolute;
44
+ width: 9px;
45
+ height: 2px;
46
+ top: 10px;
47
+ left: 4px;
48
+ border-radius: 2px 0 0 3px;
49
+ background-color: #666;
50
+ transform: rotateZ(38deg);
51
+ }
52
+ .no-trigger-text .uktdropdown-trigger:after {
53
+ content: "";
54
+ display: block;
55
+ position: absolute;
56
+ width: 9px;
57
+ height: 2px;
58
+ top: 10px;
59
+ right: 4px;
60
+ border-radius: 0 2px 2px 0;
61
+ background-color: #666;
62
+ transform: rotateZ(-38deg);
63
+ }
64
+
65
+ .font-weight {
66
+ font-size: 13px;
67
+ }
68
+ .font-weight .item-title {
69
+ color: #ababab;
70
+ }
71
+ .font-weight [data-ukt-active] .item-title {
72
+ color: #fff;
73
+ }
74
+
75
+ .searchable-with-label input,
76
+ .searchable-with-label .uktdropdown-body {
77
+ min-width: 0px;
78
+ width: 85px;
79
+ }
80
+
81
+ .dropdown-without-items .uktdropdown-body {
82
+ width: 300px;
83
+ }
84
+
85
+ .css-value-input-trigger .uktdropdown-label-text {
86
+ display: flex;
87
+ align-self: center;
88
+ }
89
+
90
+ .textarea-trigger .uktdropdown-body {
91
+ width: 400px;
92
+ font-size: 13px;
93
+ }
94
+
95
+ .checkboxes .uktdropdown-body {
96
+ width: 150px;
97
+ }
98
+
99
+ .checkboxes input[type="checkbox"] {
100
+ width: auto;
101
+ }
102
+
103
+ .overlapping-dropdown .uktdropdown-body {
104
+ top: -5px;
105
+ left: -5px;
106
+ width: 250px;
107
+ min-height: 200px;
108
+ }
109
+
110
+ .out-of-bounds-example.uktdropdown {
111
+ position: absolute;
112
+ bottom: 50px;
113
+ }
114
+ .out-of-bounds-example input {
115
+ width: 150px;
116
+ }
117
+
118
+ .out-of-bounds-example .uktdropdown-body {
119
+ width: 250px;
120
+ }
121
+
122
+ .position-right.uktdropdown {
123
+ position: absolute;
124
+ right: 65px;
125
+ }
126
+
127
+ .out-of-bounds-example.no-direction-change.uktdropdown {
128
+ position: relative;
129
+ margin-top: 220px;
130
+ }
131
+
132
+ .out-of-bounds-example.no-direction-change .uktdropdown-trigger {
133
+ width: 255px;
134
+ }
135
+
136
+ .out-of-bounds-example.no-direction-change.uktdropdown .uktdropdown-body {
137
+ top: 100%;
138
+ }
139
+
140
+ #anchor--uikit-controls-dropdown--out-of-bounds-with-no-direction-change
141
+ .innerZoomElementWrapper
142
+ > * {
143
+ overflow: auto;
144
+ height: 200px;
145
+ }
146
+
147
+ #anchor--uikit-controls-dropdown--out-of-bounds-with-no-direction-change .sb-story {
148
+ height: 230px;
149
+ }