0.0.130 • Published 7 years ago

eureka-browser v0.0.130

Weekly downloads
85
License
BSD-3-Clause
Repository
github
Last release
7 years ago

Eureka 🌲

Build Status npm version

Eureka is a progressively enhanced flexible media browser. Connected to your media sources through a REST API, this accessible web component allows users to browse media sources, upload files, and choose media items.

🤗 Try the demo. As to be found in Redactor 3.0 for MODX by modmore. Contributions welcomed.

With eureka.js users will be saying "I found it!" in no time. @mrktps

💬 Discuss

Join the conversation in our public Gitter chat room.

Join the chat at https://gitter.im/jpdevries/eureka

📚 Wiki

Don't forget to browse the Wiki for more information on the REST API, patterns, screenshots and more.

🍻 Support

The Eureka Media Browser and supporting resources are provided free as in beer.
Gratuities are accepted through Square Cash.

🏋️‍♀️ Weigh In

The Eureka Media Browser is pretty lightweight all things considered.

AssetWeight (GZIP minified)
CSS Stylesheet5.18kB
SVG Icons5.04kB
React Component47.40kB

📄 HTMLfirst

As a progressively enhanced web component, Eureka is functional HTMLfirst. This means that technically anything other than the initial HTML layer is a noncritical enhancement. Critical features supported by the HTML layer, such as browse, upload, and choose, are universally supported and do not depend on modern browsers, CSS styles, or script.

😲 Take a gander at Eureka in the nued by waking our incredibly lightweight raw HTML example.

We also encourage you to temporarily disable JavaScript in your browser and party with Eureka like it's 1999.

Powered By 🚀

  • Progressively Enhanced from HTML components
  • Allnew Virtual DOM powered by React/Redux
  • Node Server Side Rendering
  • Node testing server

Highlights 🖋

  • Configurable Rest API endpoints
  • Browse multiple media sources for images
  • Drag and Drop Upload Support
  • Flexible Layout
  • Responsive Design
  • Configurable Styles via CSS Variables
  • Accessible
    • supports mobile and touch devices
    • supports .no-js via server side rendering
    • ARIA & Keyboard Support
    • high contrast themes

🚥 Features

The level of isomorphism between the client and server side one can achieve with Node is unmatched. Eureka takes advantage of this unique strength of Node by, through an isomorphic server and standard synchronous forms, achieving full support for critical features.

No features rely solely on sight or the use of a mouse. Keyboard use is supported. Accommodations are taken for users that benefit from high contrast themes. Visually hidden text is used to convey aspects of the interface that are otherwise visually implied to screen readers and assistive technology.

The semantic HTML layer remains usable even absent of style as pure HTML.

🛠 Usage

npm install eureka-browser --save

Bower

You can also install Eureka via Bower, which is a good way to fetch its stylesheet and icon sprite. There is also a UMD export of the EurekaMediaBrowser component for the unlikely case you'll need it.

npm install -g bower
bower install eureka-browser#release-2.0
ls bower_components/eureka-browser/client/build/assets/css/ # default eureka theme
ls bower_components/eureka-browser/client/build/assets/img # icon sprite
ls bower_components/eureka-browser/client/build/assets/js # bundled and unbundled UMD exports of EurekaMediaBrowser component

HTML

The <EurekaMediaBrowser> React component is styled by a standard CSS stylesheet. Include the CSS for the appropriate version of the media browser. Reference the theming section for more information on styling Eureka.

<link rel="stylesheet" type="text/css" media="screen" href="bower_components/eureka-browser/client/build/assets/css/eureka.0.0.20.min.css">
<div id="eureka-root">
  <!-- for performance, optimization, and accessibility it best to support server-side rendering by initially delivering a base HTML layer
  see server-side rendering below -->
</div>

JS

import React from 'react';
import ReactDOM from 'react-dom';
import { EurekaMediaBrowser } from 'eureka-browser';

ReactDOM.render(
  <EurekaMediaBrowser />,
  document.getElementById('eureka-root')
);

Eureka will then be injected into the DOM and eagerly reach out to the REST API for the JSON data it needs to offer the interface.

Configure the EurekaMediaBrowser via the optional attributes found in the default configuration below:

  <EurekaMediaBrowser
    basePath="/"
    allowUploads={true}
    treeHidden={true}
    useLocalStorage={true}
    storagePrefix="eureka__"
    allowRename={true}
    allowDelete={true}
    confirmBeforeDelete={false}
    locale="en-US"
    mediaSource="0"
    currentDirectory="/"
    headers={{
        'Powered-By': 'Eureka by Markup.tips'
    }}
    intervals={{
      searchBarPlaceholder: false,
      fetchDirectoryContents: 18000,
      updateSourceTree: false
    }}
  />

⚙️ Options

OptionDefaultDescription
basePath"/"Prepended to URLs for XHR requests to the Rest API.Set to the absolute path of your Rest API.
allowUploadstrueWhether or not to allow uploading of media items
treeHiddentrueWhether or not the Media Source Panel "sidebar" should be initially closed
useLocalStoragetrueWhether or not to use the JavaScript localStorage API to remember session data such as the last visited directory and view mode preference
storagePrefix"eureka__"Prepended to localStorage keys
allowRenametrueWhether or not to offer users the ability to rename directories and media items
allowDeletetrueWhether or not to offer users the ability to delete directories and media items
allowDownloadfalseWhether or not to add a download button to media items
confirmBeforeDeletefalseWhether or not to confirm intent before users delete directories and media items
locale"en-US"The localization to use. See Lexicons.
mediaSourceundefinedThe default initial media source id to use
currentDirectory"/"The default initial directory to use
uid"0"A unique identifier used to ensure multiple <EurekaMediaBrowser> components on the same page do not share the same DOM ids
assetsBasePath"./assets/"Relative path to the Eureka assets directory
iconSVG"./img/icons.svg"Path, relative to assetsBasePath, to the Eureka icon sprite sheet
callbacks{close: undefined, choose: undefined}Object containing close and choose callbacks
headers{'Powered-By': 'Eureka by Markup.tips'}Additional request headers sent with XHR requests
intervals{searchBarPlaceholder: false,fetchDirectoryContents: 18000,updateSourceTree: false}Intervals for whether or not and how often to do things like hit the REST API for updated data or update the placeholder attribute based on the current directory listing
enlargeFocusedRowsfalseWhether or not to enlarge thumbnails of focused rows
mode"table"Initial view mode (table, thumb, grid, list)
sort"name"Initial column to sort media items on
allowFullscreentrueWhether or not the interface should offer a fullscreen button
emphasisFocusedMediaItemtrueWhether or not to emphasis selected media items (defaults to emphasizing the filename, only applies to table and list view modes)
doDragNDroptrueWhether or not to enable drag 'n drop features
allowChooseMultipletrueWhether or not to allow multiple files to be chosen
allowInvertSelectiontrueWhether or not to allow selection of multiple items to be inverted
allowDownloadMultipletrueWhether or not to allow multiple selected items to be download as a zip file

Please take note that when useLocalStorage is true any options manually passed in as props will take precedent.

🌐 Browser Support

The server side rendering and HTMLfirst design patterns begin progressively enhancing a universally supported HTML layer. So basic features are supported in any browser. JavaScript support begins at IE9. Desired CSS layout requires Flexbox and is further enhanced with Grid Layout.

🔡 i18n

Eureka is on Crowdin. Please contribute to our translations if you are able.

♿️ Accessibility Proclaimer

Eureka strives for WCAG Level AA success criteria in all scenarios with some accessibility preference features leaning towards Level AAA. Please log any a11y issues here.

✅ Getting Started

We're going to use yarn so make sure that is installed.

npm install yarn -g

To fire up a testing server run the following:

git clone -b release-2.0 git://github.com/jpdevries/eureka.git
cd eureka
yarn prestart
yarn build
yarn serve # start the  development server
# open http://localhost:3001 # Node server

To host the compiled production server run

yarn start # install, fetch sources, build

or

yarn prod # fire up the production server

The testing server hosts the sources and client/build directories along with a REST API to GET, POST, PUT, DELETE media items.

npm.io

⚒ Development

The Eureka component is created with create-react-app and found in the client directory. There you can run React tests, build the React component, and start the development server.

Firstly, you'll need the testing server running for the REST API:

cd eureka
yarn server

Now, in another terminal tab:

cd client
yarn build
yarn test
yarn start
# open http://localhost:3000 # development server

The development server, like any other React app created with create-react-app, will automatically inject changes as you save changes to your source files.

🗄 REST API

Eureka is hungry for remote media sources. It needs a REST API to feed it JSON data.
Find docs at the REST API wiki page.

💄 Decorating Actions

Eureka's core Redux actions assume you'll be using a REST API. If REST isn't really your thing, or you need to modify the Redux actions for some other reason, you can decorate the actions Eureka will use. This is done using a Higher Order Component that wraps EurekaMediaBrowser and injects a decoratedActions property which will be applied as a shallow merge on top of the default actions. Reference this Gist example of decorating actions for an example.

📠 Server Side Rendering

Eureka is progressively enhanced with React to be asynchronous and a richer experience in capable browsers that successfully execute scripts. But Eureka's support doesn't end at modern browsers because its design process doesn't start there. Eureka is a semantic and synchronous HTML form before it is an enhanced Virtual DOM.

Reference the Server Side Rendering Wiki page for documentations and examples on achieving world wide support.

⌨️ Keyboard Shortcuts

Eureka uses JavaScript events to enrich the user experience of keyboard users.

ShortcutCommand
Toggle Sidebarctrl+;
Change Viewctrl+alt+(1-5)
Change Media Sourcealt+(1-9)
Delete Itembackspace
Expand Itemspacebar
Choose Itemreturn
Create Directoryctrl+n
Create filectrl+shift+n
Upload Filesctrl+u
Rename Itemctrl+r
Filter Itemsctrl+f
Sort Ascendingalt+up
Sort Descendingalt+down
Sort by filenamealt+n
Sort by dimensionsalt+d
Sort by file sizealt+f
Sort by edited onalt+e
Set Choose Mode to Singlealt+s
Set Choose Mode to Multiplealt+m
Invert Selectionalt+i

🎨 Theming

Request additional theming options and share your themes by opening an issue or joining the discussion on Gitter.

VariableDescription
--activeColor used to highlight activated components such as the drop area
--border-widthGeneric border width for panels, components, inputs
--border-styleGeneric border style for panels, components, inputs
--border-colorGeneric border color for panels, components, inputs
--button-bgBackground color of button elements
--button-colorColor of button text
--colorDefault text color
--dangerousColor to use for warnings and errors
--light-bgGeneric light background color, used for panels
--link-colorDefault anchor text color
--panel-border-colorBorder color of panel components
--subtleSubtle color, used for Media Source Panel
--very-subtleVery subtle color, used for drop zone area
--very-subtle-icon-opacityOpacity for very subtle icons

📣 Audible Interface

Eureka uses a combination of ARIA attributes and .visually-hidden text to offer an experience that is as accessible visually as it is audibly.

The Eureka Browser interface without as seen by a screen reader includes  descriptive text for an accessible experience

There is one Achilles heel here. Depending on your media source API, you might not be able to provide alternative text for images and media items. In the event that no alt text is provided, Eureka will to the best it can. For example:

schildpad.jpg displays at 336x125, weighs 37 KB, and was edited on Sunday, April 02, 2017, Central European Summer Time

📺 Fullscreen Mode

To maximize usability Eureka leverages the Fullscreen API.

🏞 Masonry Layout

Eureka is enhanced by a Masonry Layout mode.

If you are using Eureka as a UMD Module (probably not) you'll need to load Masonry first. If you would not like Masonry to be included in your bundle, add Masonry to your Webpack excludes. Eureka will only enable the Masonry Layout if Masonry is available.

externals: {
  "react": "React",
  "react-dom":"ReactDOM",
  "redux":"Redux",
  "react-redux":"ReactRedux",
  "react-masonry-component":"Masonry"
}

👀 Accessible Themes

Eureka is empowered by themes which make it more accessible to users with particular physical or contextual disabilities or preferences.

Black on White

npm.io

White on Black

npm.io

0.0.130

7 years ago

0.0.129

7 years ago

0.0.128

7 years ago

0.0.127

7 years ago

0.0.126

7 years ago

0.0.125

7 years ago

0.0.124

7 years ago

0.0.123

7 years ago

0.0.122

7 years ago

0.0.121

7 years ago

0.0.119

7 years ago

0.0.118

7 years ago

0.0.117

7 years ago

0.0.116

7 years ago

0.0.115

7 years ago

0.0.113

7 years ago

0.0.112

7 years ago

0.0.110

7 years ago

0.0.108

7 years ago

0.0.103

7 years ago

0.0.101

7 years ago

0.0.100

7 years ago

0.0.94

7 years ago

0.0.93

7 years ago

0.0.90

7 years ago

0.0.89

7 years ago

0.0.88

7 years ago

0.0.85

7 years ago

0.0.84

7 years ago

0.0.83

7 years ago

0.0.79

7 years ago

0.0.78

7 years ago

0.0.77

7 years ago

0.0.76

7 years ago

0.0.75

7 years ago

0.0.74

7 years ago

0.0.73

7 years ago

0.0.72

7 years ago

0.0.71

7 years ago

0.0.70

7 years ago

0.0.69

7 years ago

0.0.67

7 years ago

0.0.66

7 years ago

0.0.65

7 years ago

0.0.61

7 years ago

0.0.60

7 years ago

0.0.59

7 years ago

0.0.56

7 years ago

0.0.46

7 years ago

0.0.45

7 years ago

0.0.44

7 years ago

0.0.43

7 years ago

0.0.42

7 years ago

0.0.41

7 years ago

0.0.37

7 years ago

0.0.36

7 years ago

0.0.28

7 years ago

0.0.27

7 years ago

0.0.26

7 years ago

0.0.25

7 years ago

0.0.24

7 years ago

0.0.23

7 years ago

0.0.22

7 years ago

0.0.21

7 years ago

0.0.20

7 years ago

0.0.19

7 years ago

0.0.18

7 years ago

0.0.17

7 years ago

0.0.16

7 years ago

0.0.15

7 years ago

0.0.14

7 years ago

0.0.13

7 years ago

0.0.12

7 years ago

0.0.11

7 years ago

0.0.10

7 years ago

0.0.9

7 years ago

0.0.8

7 years ago

0.0.7

7 years ago

0.0.6

7 years ago

0.0.5

7 years ago

0.0.4

7 years ago

0.0.3

7 years ago

0.0.1

7 years ago

0.0.0

7 years ago