├── .github
├── CODEOWNERS
├── release_template.md
├── workflows
│ ├── next_major.yml
│ ├── release_canary.yml
│ ├── stale.yml
│ ├── release.yml
│ ├── deploy_production.yml
│ ├── axe.yml
│ ├── ci.yml
│ ├── deploy_preview.yml
│ └── release_candidate.yml
├── ISSUE_TEMPLATE
│ ├── primer-feature-request.md
│ ├── style-guide-bug-report.md
│ └── primer-bug-report.md
├── dependabot.yml
└── pull_request_template.md
├── .npmrc
├── src
├── table-object
│ ├── index.scss
│ └── table-object.scss
├── header
│ ├── index.scss
│ ├── README.md
│ └── header.scss
├── toasts
│ ├── index.scss
│ └── README.md
├── dropdown
│ ├── index.scss
│ └── README.md
├── loaders
│ ├── index.scss
│ ├── loaders.scss
│ └── README.md
├── marketing
│ ├── utilities
│ │ ├── filters.scss
│ │ ├── borders.scss
│ │ ├── index.scss
│ │ ├── animations.scss
│ │ └── layout.scss
│ ├── support
│ │ └── index.scss
│ ├── links
│ │ ├── index.scss
│ │ └── link.scss
│ ├── buttons
│ │ └── index.scss
│ ├── type
│ │ └── index.scss
│ ├── index.scss
│ └── README.md
├── overlay
│ ├── index.scss
│ └── README.md
├── tooltips
│ ├── index.scss
│ └── README.md
├── truncate
│ ├── index.scss
│ ├── README.md
│ └── truncate.scss
├── blankslate
│ ├── index.scss
│ ├── README.md
│ └── blankslate.scss
├── timeline
│ ├── index.scss
│ └── README.md
├── toggle-switch
│ └── index.scss
├── alerts
│ ├── index.scss
│ └── README.md
├── links
│ ├── index.scss
│ ├── README.md
│ └── link.scss
├── popover
│ ├── index.scss
│ └── README.md
├── progress
│ ├── index.scss
│ ├── progress.scss
│ └── README.md
├── subhead
│ ├── index.scss
│ ├── README.md
│ └── subhead.scss
├── box
│ ├── index.scss
│ ├── README.md
│ └── box-overlay.scss
├── branch-name
│ ├── index.scss
│ ├── README.md
│ └── branch-name.scss
├── breadcrumb
│ ├── index.scss
│ ├── README.md
│ └── breadcrumb.scss
├── pagination
│ ├── index.scss
│ └── README.md
├── select-menu
│ ├── index.scss
│ └── README.md
├── autocomplete
│ ├── index.scss
│ └── README.md
├── buttons
│ ├── index.scss
│ ├── README.md
│ └── button-group.scss
├── base
│ ├── octicons.scss
│ ├── index.scss
│ ├── README.md
│ ├── kbd.scss
│ └── typography-base.scss
├── color-modes
│ ├── themes
│ │ ├── dark.scss
│ │ ├── light.scss
│ │ ├── dark_dimmed.scss
│ │ ├── dark_colorblind.scss
│ │ ├── dark_tritanopia.scss
│ │ ├── light_colorblind.scss
│ │ ├── light_tritanopia.scss
│ │ ├── dark_high_contrast.scss
│ │ └── light_high_contrast.scss
│ ├── index.scss
│ └── native.scss
├── avatars
│ ├── index.scss
│ ├── avatar-parent-child.scss
│ ├── README.md
│ ├── circle-badge.scss
│ └── avatar.scss
├── labels
│ ├── index.scss
│ ├── issue-labels.scss
│ ├── README.md
│ ├── mixins.scss
│ ├── counters.scss
│ ├── diffstat.scss
│ ├── states.scss
│ └── labels.scss
├── layout
│ ├── index.scss
│ ├── container.scss
│ ├── README.md
│ └── grid-offset.scss
├── actionlist
│ ├── index.scss
│ ├── action-list-variables.scss
│ ├── action-list-item-divider.scss
│ └── action-list.scss
├── navigation
│ ├── index.scss
│ ├── README.md
│ └── filter-list.scss
├── markdown
│ ├── index.scss
│ ├── README.md
│ ├── blob-csv.scss
│ ├── tables.scss
│ ├── footnotes.scss
│ ├── code.scss
│ ├── lists.scss
│ └── headings.scss
├── forms
│ ├── index.scss
│ ├── README.md
│ ├── radio-group.scss
│ ├── input-group.scss
│ └── form-select.scss
├── support
│ ├── index.scss
│ ├── variables
│ │ ├── misc.scss
│ │ └── typography.scss
│ ├── README.md
│ └── mixins
│ │ ├── layout.scss
│ │ └── typography.scss
├── docs.scss
├── index.scss
├── utilities
│ ├── index.scss
│ ├── box-shadow.scss
│ ├── README.md
│ └── padding.scss
├── core
│ ├── README.md
│ └── index.scss
├── product
│ ├── README.md
│ └── index.scss
└── primitives
│ └── index.scss
├── prettier.config.cjs
├── .vercelignore
├── script
├── .eslintrc.json
├── pretest
├── prepublish
├── primer-css-compiler.js
├── build-docs
└── selector-diff-report
├── docs
├── src
│ ├── readme.png
│ ├── typography-image.png
│ ├── stories
│ │ ├── helpers
│ │ │ ├── useToggle.jsx
│ │ │ ├── ConditionalWrapper.jsx
│ │ │ ├── storybook-styles.scss
│ │ │ ├── code-snippet-html-helper.js
│ │ │ ├── ColorBlock.jsx
│ │ │ └── pageLayoutBehavior.jsx
│ │ ├── components
│ │ │ ├── ActionList
│ │ │ │ ├── ActionListFeatures.stories.jsx
│ │ │ │ ├── ActionListDividerFeatures.stories.jsx
│ │ │ │ ├── ActionListDivider.stories.jsx
│ │ │ │ └── ActionList.stories.jsx
│ │ │ ├── Forms
│ │ │ │ ├── Radio.stories.jsx
│ │ │ │ └── Fieldset.stories.jsx
│ │ │ ├── NavigationList
│ │ │ │ ├── NavigationListFeatures.stories.jsx
│ │ │ │ ├── NavigationListDividerFeatures.stories.jsx
│ │ │ │ └── NavigationListDivider.stories.jsx
│ │ │ ├── TreeView
│ │ │ │ └── TreeView.stories.jsx
│ │ │ ├── Navigation
│ │ │ │ ├── TabNav.stories.jsx
│ │ │ │ └── UnderlineNavAction.stories.jsx
│ │ │ └── Label
│ │ │ │ ├── LabelCounter.stories.jsx
│ │ │ │ ├── LabelDiffstat.stories.jsx
│ │ │ │ ├── IssueLabel.stories.jsx
│ │ │ │ ├── LabelStates.stories.jsx
│ │ │ │ └── Label.stories.jsx
│ │ ├── ui-patterns
│ │ │ └── ActionList
│ │ │ │ ├── ActionListTreeFeatures.stories.jsx
│ │ │ │ ├── uipatterns.stories.mdx
│ │ │ │ ├── ActionListDividerFeatures.stories.jsx
│ │ │ │ └── ActionListFeatures.stories.jsx
│ │ └── GettingStarted.stories.mdx
│ ├── objects-image.svg
│ ├── @primer
│ │ └── gatsby-theme-doctocat
│ │ │ └── components
│ │ │ ├── hero.js
│ │ │ └── live-preview-wrapper.js
│ ├── utilities-image.svg
│ ├── table.js
│ ├── spacing-image.svg
│ ├── color-image.svg
│ └── components-image.svg
├── .babelrc
├── content
│ ├── tools
│ │ ├── index.md
│ │ ├── testing.md
│ │ └── deprecations.md
│ ├── marketing
│ │ └── index.md
│ ├── support
│ │ ├── variables.mdx
│ │ └── index.md
│ ├── utilities
│ │ ├── index.md
│ │ ├── marketing-filters.md
│ │ ├── marketing-layout.md
│ │ └── details.md
│ └── components
│ │ ├── index.md
│ │ ├── loaders.md
│ │ ├── branch-name.md
│ │ ├── breadcrumb.md
│ │ └── pagination.md
├── gatsby-node.js
├── .eslintrc.json
├── postcss.config.js
├── .storybook
│ ├── main.js
│ └── preview-head.html
├── script
│ └── build-storybook
├── gatsby-config.js
├── gatsby-browser.js
└── package.json
├── .eslintrc.json
├── __tests__
├── .eslintrc.json
├── docs.test.js
├── css.test.js
├── utils
│ └── docs.js
└── build.test.js
├── .changeset
├── neat-wasps-whisper.md
├── config.json
└── README.md
├── stylelint.config.cjs
├── .npmignore
├── .gitignore
├── postcss.config.cjs
├── deprecations.js
├── LICENSE
└── RELEASING.md
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | * @primer/css-reviewers
2 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | git-tag-version=false
2 | package-lock=false
3 |
--------------------------------------------------------------------------------
/src/table-object/index.scss:
--------------------------------------------------------------------------------
1 | @import './table-object.scss';
2 |
--------------------------------------------------------------------------------
/prettier.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = require('@github/prettier-config')
2 |
--------------------------------------------------------------------------------
/.vercelignore:
--------------------------------------------------------------------------------
1 | .*.sw?
2 | .changelog/
3 | dist/
4 | docs/dist
5 | docs/public/
6 |
--------------------------------------------------------------------------------
/script/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "no-console": 0
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/src/header/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './header.scss';
3 |
--------------------------------------------------------------------------------
/src/toasts/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './toasts.scss';
3 |
--------------------------------------------------------------------------------
/src/dropdown/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './dropdown.scss';
3 |
--------------------------------------------------------------------------------
/src/loaders/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './loaders.scss';
3 |
--------------------------------------------------------------------------------
/src/marketing/utilities/filters.scss:
--------------------------------------------------------------------------------
1 | .grayscale {
2 | filter: grayscale(100%);
3 | }
4 |
--------------------------------------------------------------------------------
/src/overlay/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './overlay.scss';
3 |
--------------------------------------------------------------------------------
/src/tooltips/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './tooltips.scss';
3 |
--------------------------------------------------------------------------------
/src/truncate/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './truncate.scss';
3 |
--------------------------------------------------------------------------------
/src/blankslate/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './blankslate.scss';
3 |
--------------------------------------------------------------------------------
/src/timeline/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './timeline-item.scss';
3 |
--------------------------------------------------------------------------------
/docs/src/readme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ValentineFernandes/css-design/HEAD/docs/src/readme.png
--------------------------------------------------------------------------------
/src/toggle-switch/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './toggle-switch.scss';
3 |
--------------------------------------------------------------------------------
/src/alerts/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './flash.scss';
4 |
--------------------------------------------------------------------------------
/src/links/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './link.scss';
4 |
--------------------------------------------------------------------------------
/src/marketing/support/index.scss:
--------------------------------------------------------------------------------
1 | @import '../../support/index.scss';
2 | @import './variables.scss';
3 |
--------------------------------------------------------------------------------
/docs/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "babel-preset-gatsby",
4 | "@babel/preset-react"
5 | ]
6 | }
7 |
--------------------------------------------------------------------------------
/src/popover/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './popover.scss';
4 |
--------------------------------------------------------------------------------
/src/progress/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './progress.scss';
4 |
--------------------------------------------------------------------------------
/src/subhead/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './subhead.scss';
4 |
--------------------------------------------------------------------------------
/src/box/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './box.scss';
3 | @import './box-overlay.scss';
4 |
--------------------------------------------------------------------------------
/src/branch-name/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './branch-name.scss';
4 |
--------------------------------------------------------------------------------
/src/breadcrumb/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './breadcrumb.scss';
4 |
--------------------------------------------------------------------------------
/src/marketing/links/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './link.scss';
4 |
--------------------------------------------------------------------------------
/src/pagination/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './pagination.scss';
4 |
--------------------------------------------------------------------------------
/src/select-menu/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './select-menu.scss';
4 |
--------------------------------------------------------------------------------
/docs/src/typography-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ValentineFernandes/css-design/HEAD/docs/src/typography-image.png
--------------------------------------------------------------------------------
/src/marketing/buttons/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './button.scss';
4 |
--------------------------------------------------------------------------------
/src/marketing/type/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './typography.scss';
4 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "root": true,
3 | "parserOptions": {
4 | "sourceType": "module",
5 | "ecmaVersion": "latest"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/autocomplete/index.scss:
--------------------------------------------------------------------------------
1 | // support files
2 | @import '../support/index.scss';
3 | @import './autocomplete.scss';
4 | @import './suggester.scss';
5 |
--------------------------------------------------------------------------------
/src/buttons/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './button.scss';
3 | @import './button-group.scss';
4 | @import './misc.scss';
5 |
--------------------------------------------------------------------------------
/__tests__/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": [
3 | "plugin:jest/recommended"
4 | ],
5 | "rules": {
6 | "eslint-comments/no-use": 0
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/docs/content/tools/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Tools
3 | path: tools/index
4 | ---
5 |
6 | Design and development tools for working with the GitHub CSS toolkit.
7 |
--------------------------------------------------------------------------------
/.changeset/neat-wasps-whisper.md:
--------------------------------------------------------------------------------
1 | ---
2 | "@primer/css": patch
3 | ---
4 |
5 | Make .form-control elements render as disabled when a parent fieldset is disabled
6 |
--------------------------------------------------------------------------------
/src/base/octicons.scss:
--------------------------------------------------------------------------------
1 | .octicon {
2 | display: inline-block;
3 | overflow: visible !important;
4 | vertical-align: text-bottom;
5 | fill: currentColor;
6 | }
7 |
--------------------------------------------------------------------------------
/script/pretest:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 |
4 | mkdir -p tmp
5 | cd tmp
6 | echo "{\"package\":\"tmp\",\"version\":\"0.0.0\"}" > package.json
7 | yarn add --force @primer/css@latest
8 |
--------------------------------------------------------------------------------
/src/marketing/utilities/borders.scss:
--------------------------------------------------------------------------------
1 | // Marketing border utilities
2 |
3 | // XXX If you're looking for responsive border utilities, they've moved to
4 | // ../../utilities/borders.scss
5 |
--------------------------------------------------------------------------------
/stylelint.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extends: ['@primer/stylelint-config'],
3 | ignoreFiles: ['**/*.js', '**/*.cjs'],
4 | rules: {
5 | 'primer/no-override': false
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/base/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './normalize.scss';
3 | @import './base.scss';
4 | @import './kbd.scss';
5 | @import './typography-base.scss';
6 | @import './octicons.scss';
7 |
--------------------------------------------------------------------------------
/src/marketing/utilities/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | // utilities
3 | @import './animations.scss';
4 | @import './borders.scss';
5 | @import './filters.scss';
6 | @import './layout.scss';
7 |
--------------------------------------------------------------------------------
/src/color-modes/themes/dark.scss:
--------------------------------------------------------------------------------
1 | @import '../../support/index.scss';
2 | @import '@primer/primitives/dist/scss/colors/_dark.scss';
3 |
4 | @include color-mode-theme(dark) {
5 | @include primer-colors-dark;
6 | }
7 |
--------------------------------------------------------------------------------
/src/avatars/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 |
3 | // Avatars
4 | @import './avatar.scss';
5 | @import './avatar-parent-child.scss';
6 | @import './avatar-stack.scss';
7 | @import './circle-badge.scss';
8 |
--------------------------------------------------------------------------------
/src/color-modes/themes/light.scss:
--------------------------------------------------------------------------------
1 | @import '../../support/index.scss';
2 | @import '@primer/primitives/dist/scss/colors/_light.scss';
3 |
4 | @include color-mode-theme(light, true) {
5 | @include primer-colors-light;
6 | }
7 |
--------------------------------------------------------------------------------
/docs/content/marketing/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Marketing
3 | path: marketing/index
4 | ---
5 |
6 | The marketing components and utilities are meant for marketing pages. Note that on github.com they are not available for product pages.
7 |
--------------------------------------------------------------------------------
/src/labels/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './mixins.scss';
3 | @import './issue-labels.scss';
4 | @import './labels.scss';
5 | @import './states.scss';
6 | @import './counters.scss';
7 | @import './diffstat.scss';
8 |
--------------------------------------------------------------------------------
/src/layout/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './mixins.scss';
3 | @import './container.scss';
4 | @import './grid.scss';
5 | @import './grid-offset.scss';
6 | @import './layout.scss';
7 | @import './page-layout.scss';
8 |
--------------------------------------------------------------------------------
/src/color-modes/themes/dark_dimmed.scss:
--------------------------------------------------------------------------------
1 | @import '../../support/index.scss';
2 | @import '@primer/primitives/dist/scss/colors/_dark_dimmed.scss';
3 |
4 | @include color-mode-theme(dark_dimmed) {
5 | @include primer-colors-dark_dimmed;
6 | }
7 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | __tests__/
2 | .changeset/
3 | .github/
4 | docs/
5 | script/
6 | # we ignore this because everything in src/ is copied out in script/prepublish
7 | src/
8 | tmp/
9 | docs.scss
10 | .*
11 | *.log
12 | vercel.json
13 | *.config.js
14 |
--------------------------------------------------------------------------------
/src/color-modes/themes/dark_colorblind.scss:
--------------------------------------------------------------------------------
1 | @import '../../support/index.scss';
2 | @import '@primer/primitives/dist/scss/colors/_dark_colorblind.scss';
3 |
4 | @include color-mode-theme(dark_colorblind) {
5 | @include primer-colors-dark_colorblind;
6 | }
7 |
--------------------------------------------------------------------------------
/src/color-modes/themes/dark_tritanopia.scss:
--------------------------------------------------------------------------------
1 | @import '../../support/index.scss';
2 | @import '@primer/primitives/dist/scss/colors/_dark_tritanopia.scss';
3 |
4 | @include color-mode-theme(dark_tritanopia) {
5 | @include primer-colors-dark_tritanopia;
6 | }
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.log
2 | *.tgz
3 | .DS_Store
4 | .cache/
5 | .changelog/
6 | .next/
7 | .sass-cache
8 | .storybuild/
9 | .stylelintcache
10 | _site
11 | dist/
12 | docs/dist
13 | node_modules/
14 | public/
15 | searchIndex.js
16 | package-lock.json
17 | tmp
18 |
--------------------------------------------------------------------------------
/src/actionlist/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './action-list-variables.scss';
3 | @import './action-list.scss';
4 | @import './action-list-tree.scss';
5 | @import './action-list-item.scss';
6 | @import './action-list-item-divider.scss';
7 |
--------------------------------------------------------------------------------
/src/color-modes/themes/light_colorblind.scss:
--------------------------------------------------------------------------------
1 | @import '../../support/index.scss';
2 | @import '@primer/primitives/dist/scss/colors/_light_colorblind.scss';
3 |
4 | @include color-mode-theme(light_colorblind) {
5 | @include primer-colors-light_colorblind;
6 | }
7 |
--------------------------------------------------------------------------------
/src/color-modes/themes/light_tritanopia.scss:
--------------------------------------------------------------------------------
1 | @import '../../support/index.scss';
2 | @import '@primer/primitives/dist/scss/colors/_light_tritanopia.scss';
3 |
4 | @include color-mode-theme(light_tritanopia) {
5 | @include primer-colors-light_tritanopia;
6 | }
7 |
--------------------------------------------------------------------------------
/src/navigation/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | // Navigation
3 | @import './menu.scss';
4 | @import './tabnav.scss';
5 | @import './filter-list.scss';
6 | @import './sidenav.scss';
7 | @import './subnav.scss';
8 | @import './underline-nav.scss';
9 |
--------------------------------------------------------------------------------
/src/color-modes/themes/dark_high_contrast.scss:
--------------------------------------------------------------------------------
1 | @import '../../support/index.scss';
2 | @import '@primer/primitives/dist/scss/colors/_dark_high_contrast.scss';
3 |
4 | @include color-mode-theme(dark_high_contrast) {
5 | @include primer-colors-dark_high_contrast;
6 | }
7 |
--------------------------------------------------------------------------------
/src/color-modes/themes/light_high_contrast.scss:
--------------------------------------------------------------------------------
1 | @import '../../support/index.scss';
2 | @import '@primer/primitives/dist/scss/colors/_light_high_contrast.scss';
3 |
4 | @include color-mode-theme(light_high_contrast) {
5 | @include primer-colors-light_high_contrast;
6 | }
7 |
--------------------------------------------------------------------------------
/script/prepublish:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 |
4 | # generate the build directory
5 | yarn dist > /dev/null
6 |
7 | files=$(git ls-files src | sed -e 's#^src/##' | sed -e 's#/.*$##' | sort -u)
8 | echo $files > publish-files.log
9 | cd src
10 | cp -rv $files ..
11 | cd -
12 |
--------------------------------------------------------------------------------
/docs/src/stories/helpers/useToggle.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | export default function useToggle(initialValue = false) {
3 | const [value, setValue] = React.useState(initialValue)
4 | const toggle = React.useCallback(() => {
5 | setValue(v => !v)
6 | }, [])
7 | return [value, toggle]
8 | }
9 |
--------------------------------------------------------------------------------
/src/markdown/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './markdown-body.scss';
3 | @import './headings.scss';
4 | @import './lists.scss';
5 | @import './tables.scss';
6 | @import './images.scss';
7 | @import './code.scss';
8 | @import './blob-csv.scss';
9 | @import './footnotes.scss';
10 |
--------------------------------------------------------------------------------
/docs/src/stories/helpers/ConditionalWrapper.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | // reference https://gist.github.com/kitze/23d82bb9eb0baabfd03a6a720b1d637f
4 |
5 | const ConditionalWrapper = ({condition, wrap, children}) => (condition ? wrap(children) : children)
6 |
7 | export default ConditionalWrapper
8 |
--------------------------------------------------------------------------------
/docs/gatsby-node.js:
--------------------------------------------------------------------------------
1 | exports.onCreateWebpackConfig = ({actions, stage, plugins}) => {
2 | actions.setWebpackConfig({
3 | node: {
4 | fs: 'empty'
5 | },
6 | plugins: [
7 | plugins.define({
8 | __DEV__: stage === 'develop' || stage === 'develop-html'
9 | })
10 | ]
11 | })
12 | }
13 |
--------------------------------------------------------------------------------
/src/forms/index.scss:
--------------------------------------------------------------------------------
1 | @import '../support/index.scss';
2 | @import './form-control.scss';
3 | @import './form-select.scss';
4 | @import './form-group.scss';
5 | @import './form-validation.scss';
6 | @import './input-group.scss';
7 | @import './radio-group.scss';
8 | // new pvc components
9 | @import './FormControl.scss';
10 |
--------------------------------------------------------------------------------
/src/support/index.scss:
--------------------------------------------------------------------------------
1 | // variables
2 | @import './variables/typography.scss';
3 | @import './variables/layout.scss';
4 | @import './variables/misc.scss';
5 |
6 | // mixins
7 | @import './mixins/color-modes.scss';
8 | @import './mixins/typography.scss';
9 | @import './mixins/layout.scss';
10 | @import './mixins/misc.scss';
11 |
--------------------------------------------------------------------------------
/.changeset/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://unpkg.com/@changesets/config@1.5.0/schema.json",
3 | "changelog": ["@changesets/changelog-github", {"repo": "primer/css"}],
4 | "commit": false,
5 | "linked": [],
6 | "access": "public",
7 | "baseBranch": "main",
8 | "updateInternalDependencies": "patch",
9 | "ignore": []
10 | }
11 |
--------------------------------------------------------------------------------
/.github/release_template.md:
--------------------------------------------------------------------------------
1 | Preparing for a release.
2 |
3 | ### Checklist
4 |
5 | Make sure these items are checked before merging.
6 |
7 | - [ ] Preview the docs change.
8 | - [ ] Preview npm release candidate.
9 | - [ ] CI passes on the release PR.
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/script/primer-css-compiler.js:
--------------------------------------------------------------------------------
1 | import postcss from 'postcss'
2 | import postCssConfig from '../postcss.config.cjs'
3 |
4 | export default async function compiler(css, options) {
5 | const { plugins, ...config } = postCssConfig
6 |
7 | const result = await postcss(plugins).process(css, {
8 | ...config,
9 | ...options
10 | })
11 | return result
12 | }
13 |
--------------------------------------------------------------------------------
/script/build-docs:
--------------------------------------------------------------------------------
1 | #!/bin/bash -e
2 |
3 | # Build the base project so we can pull out the JSON data
4 | yarn dist
5 | cp -rf dist docs
6 |
7 | # Now build the docs site using that data
8 | cd docs
9 |
10 | if [ -n "$1" ]; then
11 | CI=true yarn gatsby build && yarn build:storybook preview
12 | else
13 | CI=true yarn gatsby build --prefix-paths && yarn build:storybook
14 | fi
15 |
--------------------------------------------------------------------------------
/docs/src/stories/helpers/storybook-styles.scss:
--------------------------------------------------------------------------------
1 | // color blocks
2 |
3 | .colorBlockWrap {
4 | display: flex;
5 | flex-direction: row;
6 | flex-wrap: wrap;
7 | gap: 1rem;
8 | }
9 |
10 | .colorBlockItem {
11 | aspect-ratio: 1/1;
12 | width: 100px;
13 | }
14 |
15 | .toc {
16 | list-style: none !important;
17 | padding: 0 !important;
18 | li {
19 | margin-left: 0 !important;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/docs.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Primer CSS
3 | * https://primer.style
4 | *
5 | * Released under MIT license.
6 | */
7 |
8 | // Docs styles
9 | // Only meant for the docs at https://primer.style/css
10 |
11 | // CSS color variables
12 | @import './color-modes/index.scss';
13 |
14 | // Global requirements
15 | @import './core/index.scss';
16 | @import './product/index.scss';
17 | @import './marketing/index.scss';
18 |
--------------------------------------------------------------------------------
/src/marketing/index.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * @primer/css/marketing
3 | * http://primer.style/css
4 | *
5 | * Released under MIT license. Copyright (c) 2019 GitHub Inc.
6 | */
7 |
8 | // Global requirements
9 | @import './support/index.scss';
10 |
11 | // marketing specific css modules
12 | @import './type/index.scss';
13 | @import './buttons/index.scss';
14 | @import './links/index.scss';
15 | @import './utilities/index.scss';
16 |
--------------------------------------------------------------------------------
/docs/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": [
3 | "plugin:react/recommended",
4 | "plugin:jsx-a11y/recommended"
5 | ],
6 | "rules": {
7 | "import/no-namespace": 0,
8 | "no-unused-vars": ["error", {
9 | "ignoreRestSiblings": true
10 | }]
11 | },
12 | "settings": {
13 | "react": {
14 | "version": "detect"
15 | }
16 | },
17 | "globals": {
18 | "__DEV__": "readonly"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/loaders/loaders.scss:
--------------------------------------------------------------------------------
1 | // Loaders
2 |
3 | // Animated Ellipsis
4 |
5 | .AnimatedEllipsis {
6 | display: inline-block;
7 | overflow: hidden;
8 | vertical-align: bottom;
9 |
10 | &::after {
11 | display: inline-block;
12 | content: '...';
13 | animation: AnimatedEllipsis-keyframes 1.2s steps(4, jump-none) infinite;
14 | }
15 |
16 | @keyframes AnimatedEllipsis-keyframes {
17 | 0% { transform: translateX(-100%); }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/color-modes/index.scss:
--------------------------------------------------------------------------------
1 | // All themes
2 |
3 | @import './themes/light.scss';
4 | @import './themes/light_colorblind.scss';
5 | @import './themes/light_high_contrast.scss';
6 | @import './themes/light_tritanopia.scss';
7 | @import './themes/dark.scss';
8 | @import './themes/dark_dimmed.scss';
9 | @import './themes/dark_high_contrast.scss';
10 | @import './themes/dark_colorblind.scss';
11 | @import './themes/dark_tritanopia.scss';
12 | @import './native.scss';
13 |
--------------------------------------------------------------------------------
/docs/postcss.config.js:
--------------------------------------------------------------------------------
1 | // This config file is necessary to get postcss-loader to work in
2 | // ./src/@primer/gatsby-theme-doctocat/components/live-preview-wrapper.js.
3 | const path = require('path')
4 |
5 | module.exports = {
6 | parser: 'postcss-scss',
7 | plugins: [
8 | require('postcss-node-sass')({
9 | includePaths: [path.join(__dirname, 'node_modules')],
10 | outputStyle: 'compressed'
11 | }),
12 | require('autoprefixer')
13 | ]
14 | }
15 |
--------------------------------------------------------------------------------
/.github/workflows/next_major.yml:
--------------------------------------------------------------------------------
1 | name: Next Major Pull Request
2 | on:
3 | push:
4 | branches:
5 | - 'changeset-release/next_major'
6 |
7 | jobs:
8 | next_major_pr:
9 | runs-on: ubuntu-latest
10 | steps:
11 | - name: Don't Merge
12 | run: |
13 | echo "Don't merge the next_major, changeset pr into next_major. Instead when you're ready to release a new major version, change the base of this pr to main, and merge."
14 | exit 1
15 |
--------------------------------------------------------------------------------
/src/labels/issue-labels.scss:
--------------------------------------------------------------------------------
1 | // Issue Labels
2 |
3 | // TODO: Replace with .Label once solid backgrounds are supported
4 |
5 | .IssueLabel {
6 | @include labels-base;
7 |
8 | .g-emoji {
9 | position: relative;
10 | top: -0.05em;
11 | display: inline-block;
12 | font-size: 1em;
13 | line-height: $lh-condensed-ultra;
14 | }
15 |
16 | &:hover {
17 | text-decoration: none;
18 | }
19 | }
20 |
21 | .IssueLabel--big {
22 | @include labels-large;
23 | }
24 |
--------------------------------------------------------------------------------
/docs/.storybook/main.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
3 | addons: [
4 | '@storybook/addon-a11y',
5 | '@storybook/addon-links',
6 | '@storybook/addon-essentials',
7 | '@storybook/preset-scss',
8 | '@whitespace/storybook-addon-html',
9 | 'storybook-addon-designs',
10 | 'storybook-color-picker'
11 | ],
12 | framework: '@storybook/react',
13 | core: {
14 | builder: 'webpack5'
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/docs/script/build-storybook:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 | # Add base url to be able to serve static files
4 | if [ -n "$1" ]; then
5 | echo '
22 | ```
23 |
--------------------------------------------------------------------------------
/docs/src/stories/ui-patterns/ActionList/uipatterns.stories.mdx:
--------------------------------------------------------------------------------
1 | import {Meta} from '@storybook/addon-docs'
2 |
3 |
4 |
5 | ## UI Patterns
6 |
7 | This directory contains pattern level stories that are used to compose component level stories. In general these stories consist of all markup/css that make up an overall "pattern" while component stories are more refined and focused on their own features and intent.
8 |
9 | As an example, Overlay is a pattern used by Dialog, Anchored overlay, and "dropdown" type scenarios. Overlay is a set of styles reused for those core components, and provides its own set of stories to be inherited from the UI Patterns directory.
10 |
11 | Consider these stories "private API" and use the stories within the `Components` directory as an official API reference.
12 |
--------------------------------------------------------------------------------
/src/primitives/index.scss:
--------------------------------------------------------------------------------
1 | @import '@primer/primitives/tokens-v2-private/css/tokens/base/size/size.css';
2 | @import '@primer/primitives/tokens-v2-private/css/tokens/base/typography/typography.css';
3 | @import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/border.css';
4 | @import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/breakpoints.css';
5 | @import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/size-coarse.css';
6 | @import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/size-fine.css';
7 | @import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/size.css';
8 | @import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/viewport.css';
9 | @import '@primer/primitives/tokens-v2-private/css/tokens/functional/typography/typography.css';
10 |
--------------------------------------------------------------------------------
/src/breadcrumb/breadcrumb.scss:
--------------------------------------------------------------------------------
1 | .breadcrumb-item {
2 | display: inline-block;
3 | // stylelint-disable-next-line primer/spacing
4 | margin-left: -0.35em;
5 | white-space: nowrap;
6 | list-style: none;
7 |
8 | &::after {
9 | display: inline-block;
10 | height: 0.8em;
11 | margin: 0 $em-spacer-5;
12 | content: '';
13 | // stylelint-disable-next-line primer/borders
14 | border-right: 0.1em $border-style var(--color-fg-muted);
15 | transform: rotate(15deg);
16 | }
17 |
18 | &:first-child {
19 | margin-left: 0;
20 | }
21 | }
22 |
23 | .breadcrumb-item-selected,
24 | .breadcrumb-item[aria-current]:not([aria-current='false']) {
25 | &::after {
26 | content: none;
27 | }
28 | }
29 |
30 | // stylelint-disable selector-max-type
31 | .breadcrumb-item-selected a {
32 | color: var(--color-fg-default);
33 | }
34 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for all configuration options:
4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5 |
6 | version: 2
7 | updates:
8 | - package-ecosystem: "npm" # See documentation for possible values
9 | directory: "/docs" # Location of package manifests
10 | schedule:
11 | interval: "monthly"
12 |
13 | # Maintain dependencies for GitHub Actions
14 | - package-ecosystem: "github-actions"
15 | directory: "/"
16 | schedule:
17 | interval: "monthly"
18 |
19 | # Maintain dependencies for npm
20 | - package-ecosystem: "npm"
21 | directory: "/"
22 | schedule:
23 | interval: "monthly"
24 |
--------------------------------------------------------------------------------
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 | ### What are you trying to accomplish?
2 |
3 |
4 |
5 | ### What approach did you choose and why?
6 |
7 |
8 |
9 | ### What should reviewers focus on?
10 |
11 |
12 |
13 | ### Can these changes ship as is?
14 |
15 |
16 |
17 | - [ ] Yes, this PR does not depend on additional changes. 🚢
18 |
--------------------------------------------------------------------------------
/docs/.storybook/preview-head.html:
--------------------------------------------------------------------------------
1 |
34 |
--------------------------------------------------------------------------------
/src/branch-name/branch-name.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable selector-max-type, selector-no-qualifying-type
2 |
3 | // A nice way to display branch names inside the UI. Can be a link or not.
4 |
5 | .branch-name {
6 | display: inline-block;
7 | // stylelint-disable-next-line primer/spacing
8 | padding: 2px 6px;
9 | font: 12px $mono-font;
10 | color: var(--color-fg-muted);
11 | word-break: break-all;
12 | background-color: var(--color-accent-subtle);
13 | border-radius: $border-radius;
14 |
15 | .octicon {
16 | // stylelint-disable-next-line primer/spacing
17 | margin: 1px -2px 0 0;
18 | color: var(--color-fg-muted);
19 | }
20 | }
21 |
22 | // When a branch name is a link
23 |
24 | a.branch-name {
25 | color: var(--color-accent-fg);
26 | background-color: var(--color-accent-subtle);
27 |
28 | .octicon {
29 | color: var(--color-accent-fg);
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/docs/content/components/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Components
3 | path: components/index
4 | ---
5 |
6 | Components make it easier to mark up a set of elements that are commonly grouped together with similar visual styles. Their base styles are shared and variants are added with modifier classes, so usually components are comprised of multiple classes. Most importantly, components should be highly reusable across the site, rather than built for specific pages or features. To achieve this:
7 |
8 | * **Separate structure and skin:** This means to define repeating visual features (like background and border styles) as separate “skins” that you can mix-and-match with your various components to achieve a large amount of visual variety without much code.
9 | * **Separate container and content:** Essentially, this means “rarely use location-dependent styles”. A component should look the same no matter where you put it.
10 |
--------------------------------------------------------------------------------
/src/core/index.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * @primer/css/core
3 | * http://primer.style/css
4 | *
5 | * Released under MIT license. Copyright (c) 2019 GitHub Inc.
6 | */
7 |
8 | // Global requirements
9 | @import '../support/index.scss';
10 |
11 | // Color modes
12 |
13 | // Core modules
14 | @import '../actionlist/index.scss';
15 | @import '../base/index.scss';
16 | @import '../box/index.scss';
17 | @import '../breadcrumb/index.scss';
18 | @import '../buttons/index.scss';
19 | @import '../table-object/index.scss';
20 | @import '../forms/index.scss';
21 | @import '../layout/index.scss';
22 | @import '../links/index.scss';
23 | @import '../navigation/index.scss';
24 | @import '../pagination/index.scss';
25 | @import '../tooltips/index.scss';
26 | @import '../truncate/index.scss';
27 | @import '../overlay/index.scss';
28 |
29 | // Utilities always go last so that they can override components
30 | @import '../utilities/index.scss';
31 |
--------------------------------------------------------------------------------
/src/markdown/tables.scss:
--------------------------------------------------------------------------------
1 | // Needs refactoring
2 | // stylelint-disable selector-max-type
3 | .markdown-body {
4 | // Tables
5 | table {
6 | display: block;
7 | width: 100%; // keep for backwards compatibility
8 | width: max-content;
9 | max-width: 100%;
10 | overflow: auto;
11 |
12 | th {
13 | font-weight: $font-weight-bold;
14 | }
15 |
16 | th,
17 | td {
18 | // stylelint-disable-next-line primer/spacing
19 | padding: 6px 13px;
20 | border: $border-width $border-style var(--color-border-default);
21 | }
22 |
23 | tr {
24 | background-color: var(--color-canvas-default);
25 | border-top: $border-width $border-style var(--color-border-muted);
26 |
27 | &:nth-child(2n) {
28 | background-color: var(--color-canvas-subtle);
29 | }
30 | }
31 |
32 | img {
33 | background-color: transparent;
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/product/index.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * @primer/css/product
3 | * http://primer.style/css
4 | *
5 | * Released under MIT license. Copyright (c) 2019 GitHub Inc.
6 | */
7 |
8 | // Global requirements
9 | @import '../support/index.scss';
10 |
11 | // Product specific css modules
12 | @import '../alerts/index.scss';
13 | @import '../autocomplete/index.scss';
14 | @import '../avatars/index.scss';
15 | @import '../blankslate/index.scss';
16 | @import '../branch-name/index.scss';
17 | @import '../dropdown/index.scss';
18 | @import '../header/index.scss';
19 | @import '../labels/index.scss';
20 | @import '../loaders/index.scss';
21 | @import '../markdown/index.scss';
22 | @import '../popover/index.scss';
23 | @import '../progress/index.scss';
24 | @import '../select-menu/index.scss';
25 | @import '../subhead/index.scss';
26 | @import '../timeline/index.scss';
27 | @import '../toasts/index.scss';
28 | @import '../toggle-switch/index.scss';
29 |
--------------------------------------------------------------------------------
/docs/src/@primer/gatsby-theme-doctocat/components/hero.js:
--------------------------------------------------------------------------------
1 | import {Box, Heading, Text, ThemeProvider} from '@primer/components'
2 | import {Container} from '@primer/gatsby-theme-doctocat'
3 | import React from 'react'
4 | import {version} from '../../../../../package.json'
5 | import {ReactComponent as HeroIllustration} from '../../../hero-illustration.svg'
6 |
7 | function Hero() {
8 | return (
9 | s)
33 | > code {
34 | padding: 0;
35 | margin: 0;
36 | word-break: normal;
37 | white-space: pre;
38 | background: transparent;
39 | border: 0;
40 | }
41 | }
42 |
43 | .highlight {
44 | margin-bottom: $spacer-3;
45 |
46 | pre {
47 | margin-bottom: 0;
48 | word-break: normal;
49 | }
50 | }
51 |
52 | .highlight pre,
53 | pre {
54 | padding: $spacer-3;
55 | overflow: auto;
56 | // stylelint-disable-next-line primer/typography
57 | font-size: 85%;
58 | // stylelint-disable-next-line primer/typography
59 | line-height: 1.45;
60 | background-color: var(--color-canvas-subtle);
61 | border-radius: $border-radius;
62 | }
63 |
64 | pre code,
65 | pre tt {
66 | display: inline;
67 | max-width: auto;
68 | padding: 0;
69 | margin: 0;
70 | overflow: visible;
71 | line-height: inherit;
72 | word-wrap: normal;
73 | background-color: transparent;
74 | border: 0;
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/docs/content/utilities/marketing-layout.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Marketing layout
3 | sort_title: Layout Marketing
4 | path: utilities/marketing-layout
5 | status: Stable
6 | source: 'https://github.com/primer/css/blob/main/src/marketing/utilities/layout.scss'
7 | bundle: marketing-utilities
8 | ---
9 |
10 | Marketing layout utilities build on top of [primer-core utilities](/utilities/layout#position), adding the option of responsive positioning.
11 |
12 |
13 |
14 | ## Position elements with spacing utilities
15 |
16 | Position elements from all four element edges (`top`, `right`, `bottom`, and `left`) using any spacing utility from the global spacing scale and the marketing spacing scale (from `$spacer-1` to `$spacer-12`), including negative and 0 values.
17 |
18 | Use these with `.position-absolute` to position decorative assets and shapes on marketing sites.
19 |
20 | In an effort to reduce the size of our CSS, responsive breakpoints are only supported for `md` and `lg` breakpoints. **There is no support for `sm` and `xl` breakpoints.**
21 |
22 | ```html live
23 |
24 | .top-2
25 | .right-md-4
26 | .left-lg-1
27 |
28 | ```
29 |
30 | ## Negative offset columns
31 |
32 | Using column offset classes can pull a div over X number of columns to the left. Negative offsets are available in [spacings from 1](../support/spacing/#spacing-scale) [to 7](../support/spacing/#extended-spacing-scale).
33 |
34 | ```html live
35 |
36 | .offset-n1
37 | .offset-n2
38 |
39 | ```
40 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 | on:
3 | push:
4 | branches:
5 | - main
6 | pull_request:
7 | jobs:
8 | stylelint:
9 | runs-on: ubuntu-latest
10 | steps:
11 | - uses: actions/checkout@v3
12 | - uses: actions/setup-node@v3
13 | with:
14 | node-version: 14
15 | - run: yarn
16 | - run: yarn dist
17 | - name: Lint source files
18 | run: yarn stylelint --fix
19 | - name: Look for unused stylelint:disable lines
20 | run: yarn stylelint -- --report-needless-disables
21 | - name: Push up any fixes
22 | if: ${{ github.event_name == 'pull_request' }}
23 | run: |
24 | set +e
25 | git status | grep modified
26 | if [ $? -eq 0 ]
27 | then
28 | set -e
29 | git stash
30 | git remote update
31 | git fetch
32 | git checkout --track origin/$GITHUB_HEAD_REF
33 | git config --local user.email "actions@github.com"
34 | git config --local user.name "Actions Auto Build"
35 | git stash pop
36 | git add src
37 | git commit -m "Stylelint auto-fixes"
38 | git push
39 | else
40 | set -e
41 | echo "No changes since last run"
42 | fi
43 |
44 | eslint:
45 | runs-on: ubuntu-latest
46 | steps:
47 | - uses: actions/checkout@v3
48 | - uses: actions/setup-node@v3
49 | with:
50 | node-version: 14
51 | - run: yarn
52 | - name: Lint workflow files
53 | run: yarn eslint
54 |
55 | test:
56 | runs-on: ubuntu-latest
57 | steps:
58 | - uses: actions/checkout@v3
59 | - uses: actions/setup-node@v3
60 | with:
61 | node-version: 14
62 | - run: yarn
63 | - name: Jest
64 | run: yarn test
65 |
--------------------------------------------------------------------------------
/src/blankslate/blankslate.scss:
--------------------------------------------------------------------------------
1 | // stylelint-disable selector-max-type
2 | .blankslate {
3 | position: relative;
4 | padding: $spacer-5;
5 | text-align: center;
6 |
7 | p {
8 | color: var(--color-fg-muted);
9 | }
10 |
11 | code {
12 | // stylelint-disable-next-line primer/spacing
13 | padding: 2px 5px 3px;
14 | font-size: $h5-size;
15 | background: var(--color-canvas-default);
16 | border: $border-width $border-style var(--color-border-muted);
17 | border-radius: $border-radius;
18 | }
19 |
20 | img {
21 | width: 56px;
22 | height: 56px;
23 | }
24 | }
25 |
26 | .blankslate-icon {
27 | margin-right: $spacer-1;
28 | margin-bottom: $spacer-2;
29 | margin-left: $spacer-1;
30 | color: var(--color-fg-muted);
31 | }
32 |
33 | .blankslate-image {
34 | margin-bottom: $spacer-3;
35 | }
36 |
37 | .blankslate-heading {
38 | margin-bottom: $spacer-1;
39 | }
40 |
41 | .blankslate-action {
42 | margin-top: $spacer-3;
43 |
44 | &:first-of-type {
45 | margin-top: $spacer-4;
46 | }
47 |
48 | &:last-of-type {
49 | margin-bottom: $spacer-2;
50 | }
51 | }
52 |
53 | .blankslate-capped {
54 | border-radius: 0 0 $border-radius $border-radius;
55 | }
56 |
57 | .blankslate-spacious {
58 | padding: ($spacer-6 * 2) $spacer-6;
59 | }
60 |
61 | .blankslate-narrow {
62 | max-width: 485px;
63 | margin: 0 auto;
64 | }
65 |
66 | // was .large-format
67 | // QUESTION: should we deprecate this?
68 | .blankslate-large {
69 | img {
70 | width: 80px;
71 | height: 80px;
72 | }
73 |
74 | h3 {
75 | margin: $spacer-3 0;
76 | //font-size: $h3-size; // This doesn't actually make the text larger. Should this be $h2-size?
77 | font-size: $h2-size;
78 | }
79 |
80 | p {
81 | font-size: $h4-size;
82 | }
83 | }
84 |
85 | // was .clean-background
86 | // TO DO: deprecate this and use utility instead
87 | .blankslate-clean-background {
88 | border: 0;
89 | }
90 |
--------------------------------------------------------------------------------
/.github/workflows/deploy_preview.yml:
--------------------------------------------------------------------------------
1 | name: Deploy
2 | on:
3 | pull_request:
4 |
5 | permissions:
6 | contents: write
7 | pages: write
8 | id-token: write
9 | deployments: write
10 | issues: write
11 | statuses: write
12 | checks: write
13 |
14 | jobs:
15 | deploy:
16 | if: ${{ github.repository == 'primer/css' }}
17 | uses: primer/.github/.github/workflows/deploy_preview.yml@main
18 | name: Deploy preview
19 | with:
20 | node_version: 14
21 | install: yarn && cd docs && yarn && cd ..
22 | build: yarn build:docs:preview
23 | output_dir: docs/public
24 |
25 | deploy-storybook:
26 | if: ${{ github.repository == 'primer/css' }}
27 | name: Preview Storybook
28 | runs-on: ubuntu-latest
29 | needs: deploy
30 | steps:
31 | - uses: actions/checkout@v3
32 |
33 | - uses: chrnorm/deployment-action@v1.2.0
34 | name: Create GitHub deployment for storybook
35 | id: storybook
36 | with:
37 | token: ${{ secrets.GITHUB_TOKEN }}
38 | environment: Storybook Preview
39 | target_url: '${{ needs.deploy.outputs.deployment_url }}/storybook'
40 |
41 | - name: Update storybook deployment status (success)
42 | if: success()
43 | uses: chrnorm/deployment-status@v2.0.0
44 | with:
45 | token: ${{ secrets.GITHUB_TOKEN }}
46 | environment_url: '${{ needs.deploy.outputs.deployment_url }}/storybook'
47 | target_url: '${{ needs.deploy.outputs.deployment_url }}/storybook'
48 | state: 'success'
49 | deployment_id: ${{ steps.storybook.outputs.deployment_id }}
50 |
51 | - name: Update storybook deployment status (failure)
52 | if: failure()
53 | uses: chrnorm/deployment-status@v2.0.0
54 | with:
55 | token: ${{ secrets.GITHUB_TOKEN }}
56 | state: 'failure'
57 | deployment_id: ${{ steps.storybook.outputs.deployment_id }}
58 |
--------------------------------------------------------------------------------
/src/marketing/utilities/layout.scss:
--------------------------------------------------------------------------------
1 | // Layout utilities
2 | // stylelint-disable block-opening-brace-space-before
3 |
4 | // Responsive utilities to position content
5 | // No utilities for sm and xl breakpoints
6 | @each $breakpoint, $variant in $marketing-position-variants {
7 | @include breakpoint($breakpoint) {
8 | @each $scale, $size in $spacer-map-extended {
9 | @if ($size != 0 or $variant != '') {
10 | .top#{$variant}-#{$scale} { top: $size !important; }
11 | .right#{$variant}-#{$scale} { right: $size !important; }
12 | .bottom#{$variant}-#{$scale} { bottom: $size !important; }
13 | .left#{$variant}-#{$scale} { left: $size !important; }
14 | }
15 |
16 | @if ($size != 0) {
17 | .top#{$variant}-n#{$scale} { top: -$size !important; }
18 | .right#{$variant}-n#{$scale} { right: -$size !important; }
19 | .bottom#{$variant}-n#{$scale} { bottom: -$size !important; }
20 | .left#{$variant}-n#{$scale} { left: -$size !important; }
21 | }
22 | }
23 | }
24 | }
25 |
26 | // Negative offset columns
27 | @each $breakpoint, $variant in $responsive-variants {
28 | @include breakpoint($breakpoint) {
29 | @for $offset from 1 through 7 {
30 | // stylelint-disable-next-line primer/spacing
31 | .offset#{$variant}-n#{$offset} { margin-left: -($offset * 0.0833333333 * 100%); }
32 | }
33 | }
34 | }
35 |
36 | // Width and height utilities, especially needed when the
37 | // dimensions of an image are set in HTML
38 | .width-auto { width: auto !important; }
39 | .height-auto { height: auto !important; }
40 |
41 | // Make an object fill its parent
42 | .object-fit-cover { object-fit: cover !important; }
43 |
44 | // Handling z-index
45 | .z-1 { z-index: 1 !important; }
46 | .z-2 { z-index: 2 !important; }
47 | .z-3 { z-index: 3 !important; }
48 |
49 | // Negative z-index
50 | .z-n1 { z-index: -1 !important; }
51 | .z-n2 { z-index: -2 !important; }
52 |
--------------------------------------------------------------------------------
/src/labels/labels.scss:
--------------------------------------------------------------------------------
1 | // Labels
2 |
3 | // Provide a wrapper to ensure labels stick together
4 | .labels {
5 | position: relative;
6 | }
7 |
8 | // Default label
9 |
10 | .label, // TODO: Deprecate
11 | .Label {
12 | @include labels-base;
13 |
14 | border-color: var(--color-border-default);
15 |
16 | &:hover {
17 | text-decoration: none;
18 | }
19 | }
20 |
21 | // Large
22 |
23 | .Label--large {
24 | @include labels-large;
25 | }
26 |
27 | // Inline
28 |
29 | .Label--inline {
30 | @include labels--inline;
31 | }
32 |
33 | // Contrast
34 |
35 | .Label--primary {
36 | color: var(--color-fg-default);
37 | border-color: var(--color-neutral-emphasis);
38 | }
39 |
40 | .Label--secondary {
41 | color: var(--color-fg-muted);
42 | border-color: var(--color-border-default);
43 | }
44 |
45 | // Colors
46 |
47 | .Label--info, // TODO: deprecate
48 | .Label--accent {
49 | color: var(--color-accent-fg);
50 | border-color: var(--color-accent-emphasis);
51 | }
52 |
53 | .Label--success {
54 | color: var(--color-success-fg);
55 | border-color: var(--color-success-emphasis);
56 | }
57 |
58 | .Label--warning, // TODO: deprecate
59 | .Label--attention {
60 | color: var(--color-attention-fg);
61 | border-color: var(--color-attention-emphasis);
62 | }
63 |
64 | .Label--severe {
65 | color: var(--color-severe-fg);
66 | border-color: var(--color-severe-emphasis);
67 | }
68 |
69 | .Label--danger {
70 | color: var(--color-danger-fg);
71 | border-color: var(--color-danger-emphasis);
72 | }
73 |
74 | .Label--open {
75 | color: var(--color-open-fg);
76 | border-color: var(--color-open-emphasis);
77 | }
78 |
79 | .Label--closed {
80 | color: var(--color-closed-fg);
81 | border-color: var(--color-closed-emphasis);
82 | }
83 |
84 | .Label--done {
85 | color: var(--color-done-fg);
86 | border-color: var(--color-done-emphasis);
87 | }
88 |
89 | .Label--sponsors {
90 | color: var(--color-sponsors-fg);
91 | border-color: var(--color-sponsors-emphasis);
92 | }
93 |
--------------------------------------------------------------------------------
/.github/workflows/release_candidate.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 | on:
3 | push:
4 | branches:
5 | - 'changeset-release/**'
6 |
7 | jobs:
8 | release-candidate:
9 | name: Candidate
10 | if: ${{ github.repository == 'primer/css' }}
11 |
12 | runs-on: ubuntu-latest
13 | steps:
14 | - name: Checkout repository
15 | uses: actions/checkout@v3
16 | with:
17 | # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits
18 | fetch-depth: 0
19 |
20 | - name: Set up Node.js
21 | uses: actions/setup-node@v3
22 | with:
23 | node-version: 14.x
24 |
25 | - name: Install dependencies
26 | run: yarn
27 |
28 | - name: Create .npmrc
29 | run: |
30 | cat << EOF > "$HOME/.npmrc"
31 | //registry.npmjs.org/:_authToken=$NPM_TOKEN
32 | EOF
33 | env:
34 | NPM_TOKEN: ${{ secrets.NPM_AUTH_TOKEN_SHARED }}
35 |
36 | - name: Publish release candidate
37 | run: |
38 | version=$(jq -r .version package.json)
39 | echo "$( jq ".version = \"$(echo $version)-rc.$(git rev-parse --short HEAD)\"" package.json )" > package.json
40 | yarn publish --tag next
41 | env:
42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
43 |
44 | - name: Output candidate version number
45 | uses: actions/github-script@v6
46 | with:
47 | script: |
48 | const package = require(`${process.env.GITHUB_WORKSPACE}/package.json`)
49 | github.rest.repos.createCommitStatus({
50 | owner: context.repo.owner,
51 | repo: context.repo.repo,
52 | sha: context.sha,
53 | state: 'success',
54 | context: `Published ${package.name}`,
55 | description: package.version,
56 | target_url: `https://unpkg.com/${package.name}@${package.version}/`
57 | })
58 |
--------------------------------------------------------------------------------
/docs/src/stories/components/Label/LabelStates.stories.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import clsx from 'clsx'
3 |
4 | export default {
5 | title: 'Components/Label/States',
6 | excludeStories: ['LabelStatesTemplate'],
7 | argTypes: {
8 | state: {
9 | options: [0, 1, 2, 3, 4], // iterator
10 | mapping: ['', 'State--draft', 'State--open', 'State--merged', 'State--closed'], // values
11 | control: {
12 | type: 'select',
13 | labels: ['default', 'draft', 'open', 'merged', 'closed'] // public labels
14 | },
15 | // description: 'Colors & icons',
16 | table: {
17 | category: 'CSS'
18 | }
19 | },
20 | size: {
21 | options: [0, 1], // iterator
22 | mapping: ['', 'State--small'], // values
23 | control: {
24 | type: 'select',
25 | labels: ['default', 'small'] // public labels
26 | },
27 | description: 'Size',
28 | table: {
29 | category: 'CSS'
30 | }
31 | },
32 | text: {
33 | name: 'text',
34 | type: 'string',
35 | description: 'Label text',
36 | table: {
37 | category: 'HTML'
38 | }
39 | },
40 | icon: {
41 | defaultValue: '',
42 | name: 'icon',
43 | type: 'string',
44 | description: 'Paste [Octicon](https://primer.style/octicons/) in control field',
45 | table: {
46 | category: 'HTML'
47 | }
48 | }
49 | }
50 | }
51 |
52 | // build every component case here in the template (private api)
53 | export const LabelStatesTemplate = ({state, size, text, icon}) => (
54 |
55 | <>
56 | {icon && } {text}
57 | >
58 |
59 | )
60 |
61 | // create a "playground" demo page that may set some defaults and allow story to access component controls
62 | export const Playground = LabelStatesTemplate.bind({})
63 | Playground.args = {
64 | text: 'Draft',
65 | state: 'State--draft'
66 | }
67 |
--------------------------------------------------------------------------------
/docs/src/stories/ui-patterns/ActionList/ActionListFeatures.stories.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import clsx from 'clsx'
3 | import {ListTemplate} from './ActionList.stories'
4 | import {ListItemTemplate} from './ActionListItem.stories'
5 |
6 | export default {
7 | title: 'UI Patterns/ActionList/ActionList/Features'
8 | }
9 |
10 | export const PatternShowDividers = ListTemplate.bind({})
11 | PatternShowDividers.storyName = 'Show dividers'
12 | PatternShowDividers.args = {
13 | showDividers: true,
14 | children: (
15 | <>
16 |
17 |
18 |
19 | >
20 | )
21 | }
22 |
23 | export const PatternInsetPadding = ListTemplate.bind({})
24 | PatternInsetPadding.storyName = 'Inset padding'
25 | PatternInsetPadding.args = {
26 | listPadding: null,
27 | children: (
28 | <>
29 |
30 |
31 |
32 | >
33 | )
34 | }
35 |
36 | export const PatternFullBleed = ListTemplate.bind({})
37 | PatternFullBleed.storyName = 'Full bleed'
38 | PatternFullBleed.args = {
39 | listPadding: 'ActionList--full',
40 | children: (
41 | <>
42 |
43 |
44 |
45 | >
46 | )
47 | }
48 |
49 | export const PatternNestedGroup = ListTemplate.bind({})
50 | PatternNestedGroup.storyName = 'Nested group'
51 | PatternNestedGroup.args = {
52 | listType: 'nested',
53 | children: (
54 | <>
55 |
56 |
57 |
58 | >
59 | )
60 | }
61 |
--------------------------------------------------------------------------------
/src/forms/form-select.scss:
--------------------------------------------------------------------------------
1 | // Custom select
2 | //
3 | // Apply `.select` to any `