diff --git a/.gitignore b/.gitignore index 9f5f100..782b450 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ node_modules/ .idea/ dist/ +storybook-static/ .DS_Store *.iml - diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 0000000..de466b1 --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,24 @@ +import type { StorybookConfig } from '@storybook/react-vite'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const configDir = dirname(fileURLToPath(import.meta.url)); + +const config: StorybookConfig = { + stories: ['../src/**/*.stories.@(ts|tsx)'], + addons: ['@storybook/addon-docs'], + framework: { + name: '@storybook/react-vite', + options: {}, + }, + viteFinal: async (viteConfig) => { + viteConfig.resolve = viteConfig.resolve || {}; + viteConfig.resolve.alias = { + ...(viteConfig.resolve.alias || {}), + '@': resolve(configDir, '../src'), + }; + return viteConfig; + }, +}; + +export default config; diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html new file mode 100644 index 0000000..77f036e --- /dev/null +++ b/.storybook/preview-head.html @@ -0,0 +1,4 @@ + + diff --git a/.storybook/preview.ts b/.storybook/preview.ts new file mode 100644 index 0000000..057d88b --- /dev/null +++ b/.storybook/preview.ts @@ -0,0 +1,16 @@ +import type { Preview } from '@storybook/react-vite'; +import '../src/app/styles.css'; + +const preview: Preview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + layout: 'fullscreen', + }, +}; + +export default preview; diff --git a/README.md b/README.md index 96b218e..ee22ca4 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,12 @@ Run unit tests: npm test ``` +Run Storybook for isolated UI development: + +```sh +npm run storybook +``` + ## Documentation Additional documentation is available in the [`docs/`](docs/) directory: diff --git a/docs/assets/index-Ca8yA5D4.css b/docs/assets/index-Bu-CVJUF.css similarity index 97% rename from docs/assets/index-Ca8yA5D4.css rename to docs/assets/index-Bu-CVJUF.css index e21a248..57263c0 100644 --- a/docs/assets/index-Ca8yA5D4.css +++ b/docs/assets/index-Bu-CVJUF.css @@ -1 +1 @@ -*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media (width>=640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (width>=768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (width>=1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (width>=1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (width>=1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.ows-app{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;height:100vh;min-height:100vh;color:rgb(17 24 39/var(--tw-text-opacity,1));flex-direction:column;font-size:.875rem;line-height:1.25rem;display:flex}.ows-ribbon{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);flex-direction:column;display:flex}.ows-tabs{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));width:100%}.ows-tabs-list{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1));--tw-text-opacity:1;height:2.5rem;color:rgb(107 114 128/var(--tw-text-opacity,1));border-radius:.5rem;justify-content:center;align-items:center;margin-top:.75rem;margin-left:.75rem;margin-right:.75rem;padding:.25rem;display:inline-flex}.ows-tabs-trigger{white-space:nowrap;--tw-ring-offset-color:#fff;border-radius:.375rem;justify-content:center;align-items:center;padding:.375rem .75rem;font-size:.875rem;font-weight:500;line-height:1.25rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-flex}.ows-tabs-trigger:focus-visible{outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(0 69 77/var(--tw-ring-opacity,1));--tw-ring-offset-width:2px;outline:2px solid #0000}.ows-tabs-trigger:disabled{pointer-events:none;opacity:.5}.ows-tabs-trigger[data-state=active]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1));--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.ows-tabs-content{--tw-ring-offset-color:#fff;margin-top:.75rem}.ows-tabs-content:focus-visible{outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(0 69 77/var(--tw-ring-opacity,1));--tw-ring-offset-width:2px;outline:2px solid #0000}.ows-ribbon-panel{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));align-items:stretch;gap:.75rem;min-height:7rem;padding:0 .75rem .75rem;display:flex;overflow-x:auto}.ows-control-group{--tw-border-opacity:1;border-width:1px;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);min-width:7rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);border-radius:.5rem;flex-direction:column;display:flex}.ows-control-group-wide{flex:1}.ows-control-content{flex:1;justify-content:center;align-items:center;padding-bottom:.75rem;padding-left:.75rem;padding-right:.75rem;display:flex}.ows-control-label{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));padding:.5rem .75rem;font-size:.75rem;font-weight:500;line-height:1rem}.ows-button-row{align-items:center;gap:.25rem;display:flex}.ows-layout-controls,.ows-stack{flex-direction:column;gap:.5rem;display:flex}.ows-button{--tw-border-opacity:1;border-width:1px;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;min-width:2rem;height:2rem;color:rgb(55 65 81/var(--tw-text-opacity,1));--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);border-radius:.375rem;justify-content:center;align-items:center;gap:.25rem;padding-left:.625rem;padding-right:.625rem;font-size:.75rem;font-weight:500;line-height:1rem;display:inline-flex}.ows-button:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1))}.ows-button:focus-visible{outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(0 69 77/var(--tw-ring-opacity,1));outline:2px solid #0000}.ows-button-active{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.ows-button-active:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.ows-field{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));align-items:center;gap:.25rem;font-size:.75rem;line-height:1rem;display:flex}.ows-field select,.ows-field input{--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;height:1.75rem;color:rgb(17 24 39/var(--tw-text-opacity,1));border-radius:.125rem}.ows-formula-bar{--tw-border-opacity:1;border-top-width:1px;border-bottom-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));align-items:center;display:flex}.ows-cell-name{text-align:center;--tw-text-opacity:1;width:5rem;height:2rem;color:rgb(75 85 99/var(--tw-text-opacity,1));border-width:0;font-size:.75rem;line-height:1rem}.ows-formula-actions{--tw-border-opacity:1;border-left-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity,1));--tw-text-opacity:1;height:2rem;color:rgb(107 114 128/var(--tw-text-opacity,1));align-items:center;gap:.5rem;padding-left:.75rem;padding-right:.75rem;display:flex}.ows-formula-actions button{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));font-size:.75rem;line-height:1rem}.ows-formula-active .ows-formula-actions button:first-child{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.ows-formula-active .ows-formula-actions button:nth-child(2){--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.ows-formula-input{--tw-border-opacity:1;border-left-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity,1));outline-offset:2px;outline:2px solid #0000;flex:1;height:1.75rem;margin-left:.25rem;margin-right:.25rem;padding-left:.5rem;padding-right:.5rem}.ows-sheet-surface{flex:1;min-height:0;position:relative}.ows-status-bar{--tw-border-opacity:1;border-top-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1));--tw-text-opacity:1;height:1.5rem;color:rgb(107 114 128/var(--tw-text-opacity,1));padding-left:.75rem;padding-right:.75rem;font-size:.75rem;line-height:1.5rem}.ows-muted{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));font-size:.75rem;font-weight:500;line-height:1rem}.ows-about{flex-direction:column;gap:.25rem;font-size:.75rem;line-height:1rem;display:flex}.ows-large-icon{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1));font-size:1.5rem;line-height:2rem}.ows-tab-label{align-items:center;gap:.5rem;display:inline-flex}.ows-border-grid{grid-template-columns:repeat(5,minmax(0,1fr));gap:.25rem;width:10rem;display:grid}.ows-border-tile{--tw-border-opacity:1;border-width:1px;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));border-radius:.125rem;grid-template-columns:repeat(2,minmax(0,1fr));width:1.75rem;height:1.75rem;padding:.25rem;display:grid}.ows-border-tile:hover{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.ows-border-tile span{--tw-border-opacity:1;border-style:dotted;border-width:1px;border-color:rgb(31 41 55/var(--tw-border-opacity,1));display:block}.ows-border-tile span:nth-child(2),.ows-border-tile span:nth-child(4){border-left:0!important}.ows-border-tile span:nth-child(3),.ows-border-tile span:nth-child(4){border-top:0!important}.visible{visibility:visible}.static{position:static}.absolute{position:absolute}.block{display:block}.hidden{display:none}.resize{resize:both}.border{border-width:1px}.italic{font-style:italic}.underline{text-decoration-line:underline} +*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media (width>=640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (width>=768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (width>=1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (width>=1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (width>=1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.ows-app{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;height:100vh;min-height:100vh;color:rgb(17 24 39/var(--tw-text-opacity,1));flex-direction:column;font-size:.875rem;line-height:1.25rem;display:flex}.ows-ribbon{--tw-border-opacity:1;border-bottom-width:1px;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);flex-direction:column;display:flex}.ows-tabs{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));width:100%}.ows-tabs-list{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1));--tw-text-opacity:1;height:2.5rem;color:rgb(107 114 128/var(--tw-text-opacity,1));border-radius:.5rem;justify-content:center;align-items:center;margin-top:.75rem;margin-left:.75rem;margin-right:.75rem;padding:.25rem;display:inline-flex}.ows-tabs-trigger{white-space:nowrap;--tw-ring-offset-color:#fff;border-radius:.375rem;justify-content:center;align-items:center;padding:.375rem .75rem;font-size:.875rem;font-weight:500;line-height:1.25rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-flex}.ows-tabs-trigger:focus-visible{outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(0 69 77/var(--tw-ring-opacity,1));--tw-ring-offset-width:2px;outline:2px solid #0000}.ows-tabs-trigger:disabled{pointer-events:none;opacity:.5}.ows-tabs-trigger[data-state=active]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1));--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.ows-tabs-content{--tw-ring-offset-color:#fff;margin-top:.75rem}.ows-tabs-content:focus-visible{outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(0 69 77/var(--tw-ring-opacity,1));--tw-ring-offset-width:2px;outline:2px solid #0000}.ows-ribbon-panel{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));align-items:stretch;gap:.75rem;min-height:7rem;padding:0 .75rem .75rem;display:flex;overflow-x:auto}.ows-control-group{--tw-border-opacity:1;border-width:1px;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);min-width:7rem;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);border-radius:.5rem;flex-direction:column;display:flex}.ows-control-group-wide{flex:1}.ows-control-content{flex:1;justify-content:center;align-items:center;padding-bottom:.75rem;padding-left:.75rem;padding-right:.75rem;display:flex}.ows-control-label{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));padding:.5rem .75rem;font-size:.75rem;font-weight:500;line-height:1rem}.ows-button-row{align-items:center;gap:.25rem;display:flex}.ows-layout-controls,.ows-stack{flex-direction:column;gap:.5rem;display:flex}.ows-button{--tw-border-opacity:1;border-width:1px;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;min-width:2rem;height:2rem;color:rgb(55 65 81/var(--tw-text-opacity,1));--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow);border-radius:.375rem;justify-content:center;align-items:center;gap:.25rem;padding-left:.625rem;padding-right:.625rem;font-size:.75rem;font-weight:500;line-height:1rem;display:inline-flex}.ows-button:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1))}.ows-button:focus-visible{outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(0 69 77/var(--tw-ring-opacity,1));outline:2px solid #0000}.ows-button-active{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.ows-button-active:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.ows-field{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));align-items:center;gap:.25rem;font-size:.75rem;line-height:1rem;display:flex}.ows-field select,.ows-field input{--tw-border-opacity:1;border-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;height:1.75rem;color:rgb(17 24 39/var(--tw-text-opacity,1));border-radius:.125rem}.ows-formula-bar{--tw-border-opacity:1;border-top-width:1px;border-bottom-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));align-items:center;display:flex}.ows-cell-name{text-align:center;--tw-text-opacity:1;width:5rem;height:2rem;color:rgb(75 85 99/var(--tw-text-opacity,1));border-width:0;font-size:.75rem;line-height:1rem}.ows-formula-actions{--tw-border-opacity:1;border-left-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity,1));--tw-text-opacity:1;height:2rem;color:rgb(107 114 128/var(--tw-text-opacity,1));align-items:center;gap:.5rem;padding-left:.75rem;padding-right:.75rem;display:flex}.ows-formula-actions button{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));font-size:.75rem;line-height:1rem}.ows-formula-active .ows-formula-actions button:first-child{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.ows-formula-active .ows-formula-actions button:nth-child(2){--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.ows-formula-input{--tw-border-opacity:1;border-left-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity,1));outline-offset:2px;outline:2px solid #0000;flex:1;height:1.75rem;margin-left:.25rem;margin-right:.25rem;padding-left:.5rem;padding-right:.5rem}.ows-sheet-surface{flex:1;min-height:0;position:relative}.ows-status-bar{--tw-border-opacity:1;border-top-width:1px;border-color:rgb(209 213 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1));--tw-text-opacity:1;height:1.5rem;color:rgb(107 114 128/var(--tw-text-opacity,1));padding-left:.75rem;padding-right:.75rem;font-size:.75rem;line-height:1.5rem}.ows-muted{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));font-size:.75rem;font-weight:500;line-height:1rem}.ows-about{flex-direction:column;gap:.25rem;font-size:.75rem;line-height:1rem;display:flex}.ows-large-icon{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1));font-size:1.5rem;line-height:2rem}.ows-tab-label{align-items:center;gap:.5rem;display:inline-flex}.ows-border-grid{grid-template-columns:repeat(5,minmax(0,1fr));gap:.25rem;width:10rem;display:grid}.ows-border-tile{--tw-border-opacity:1;border-width:1px;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));border-radius:.125rem;grid-template-columns:repeat(2,minmax(0,1fr));width:1.75rem;height:1.75rem;padding:.25rem;display:grid}.ows-border-tile:hover{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.ows-border-tile span{--tw-border-opacity:1;border-style:dotted;border-width:1px;border-color:rgb(31 41 55/var(--tw-border-opacity,1));display:block}.ows-border-tile span:nth-child(2),.ows-border-tile span:nth-child(4){border-left:0!important}.ows-border-tile span:nth-child(3),.ows-border-tile span:nth-child(4){border-top:0!important}.visible{visibility:visible}.static{position:static}.absolute{position:absolute}.block{display:block}.flex{display:flex}.hidden{display:none}.resize{resize:both}.gap-3{gap:.75rem}.border{border-width:1px}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.p-6{padding:1.5rem}.italic{font-style:italic}.underline{text-decoration-line:underline} diff --git a/docs/assets/index-DGmfnYFC.js b/docs/assets/index-Vds5Mw57.js similarity index 100% rename from docs/assets/index-DGmfnYFC.js rename to docs/assets/index-Vds5Mw57.js diff --git a/docs/development.md b/docs/development.md index 146a824..97dc1c0 100644 --- a/docs/development.md +++ b/docs/development.md @@ -49,9 +49,26 @@ npm run typecheck - `npm run dev`: start the local Vite server. - `npm run build`: create the production build in `docs/`. - `npm run preview`: preview the production build locally. +- `npm run storybook`: start Storybook on port 6006. +- `npm run build-storybook`: build static Storybook output. - `npm test`: run Vitest once. - `npm run typecheck`: run TypeScript without emitting files. +## Storybook + +Storybook documents the React UI layer in isolation. Start it with: + +```bash +npm run storybook +``` + +Initial stories live beside the UI components they document: + +- `src/shared/ui/*.stories.tsx` +- `src/features/ribbon/*.stories.tsx` + +Use Storybook for component states, visual review, and UI experiments that do not require the spreadsheet canvas. + ## Contribution Workflow 1. Create an issue. diff --git a/docs/index.html b/docs/index.html index 5b80ec7..bf4ec55 100644 --- a/docs/index.html +++ b/docs/index.html @@ -10,8 +10,8 @@ crossorigin="anonymous"> Open web sheet - - + +